diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java index 4526021c59f143fe5b0efa68a86eace03eda370c..dcfbff34f375327ebc20e4c503a82ceb9ebeab13 100644 --- a/src/main/java/org/olat/repository/RepositoryService.java +++ b/src/main/java/org/olat/repository/RepositoryService.java @@ -73,6 +73,8 @@ public interface RepositoryService { public List<RepositoryEntry> loadRepositoryEntriesByExternalId(String externalId); public List<RepositoryEntry> loadRepositoryEntriesByExternalRef(String externalRef); + + public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef); public List<RepositoryEntry> loadByResourceKeys(Collection<Long> keys); diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java index 92dbbe8584871d587e0979bce62088f74aeda052..8230bb1b806251c1f33dc34eae02dc59128b8043 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java @@ -152,6 +152,18 @@ public class RepositoryEntryDAO { .getResultList(); } + public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef) { + if (externalRef == null) return Collections.emptyList(); + + String query = "select v from repositoryentry as v where v.externalRef like (:externalRef)"; + + String externalRefParamater = new StringBuilder("%").append(externalRef).append("%").toString(); + return dbInstance.getCurrentEntityManager() + .createQuery(query, RepositoryEntry.class) + .setParameter("externalRef", externalRefParamater) + .getResultList(); + } + public List<RepositoryEntry> loadRepositoryEntries(int firstResult, int maxResult) { String query = "select v from repositoryentry as v order by v.key asc"; return dbInstance.getCurrentEntityManager() diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java index e92ceb53cdf0746e6c4f2cb6320dd9c1ba24a518..ab815fc27cfc6573d98f7bd1d5c0f758e19c5e2d 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java +++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java @@ -29,6 +29,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import org.apache.logging.log4j.Logger; import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityRef; @@ -45,7 +46,6 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; import org.olat.core.id.OrganisationRef; import org.olat.core.id.Roles; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.logging.activity.LearningResourceLoggingAction; import org.olat.core.logging.activity.OlatResourceableType; @@ -376,6 +376,11 @@ public class RepositoryServiceImpl implements RepositoryService, OrganisationDat return repositoryEntryDAO.loadRepositoryEntriesByExternalRef(externalRef); } + @Override + public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef) { + return repositoryEntryDAO.loadRepositoryEntriesLikeExternalRef(externalRef); + } + @Override public List<RepositoryEntry> loadRepositoryEntries(int firstResult, int maxResult) { return repositoryEntryDAO.loadRepositoryEntries(firstResult, maxResult); diff --git a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java index 320ec96b0b566af8afbc9b23696a693f8a1cf1f1..2d37b1ac9d133a513ee9ba926e0102924eb77367 100644 --- a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java +++ b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java @@ -66,6 +66,7 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO private static final String PAYPAL_ENABLED = "method.paypal.enabled"; private static final String PAYPAL_CHECKOUT_ENABLED = "method.paypal.checkout.enabled"; private static final String AUTO_ENABLED = "method.auto.enabled"; + private static final String AUTO_EXTERNAL_REF_DELIMITER = "method.auto.external.ref.delimiter"; @Value("${resource.accesscontrol.enabled:true}") private boolean enabled; @@ -75,6 +76,8 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO private boolean freeEnabled; @Value("${method.auto.enabled:false}") private boolean autoEnabled; + @Value("${method.auto.externalRef.delimiter}") + private String autoExternalRefDelimiter; @Value("${method.token.enabled:true}") private boolean tokenEnabled; @Value("${method.paypal.enabled:false}") @@ -143,6 +146,11 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO if(StringHelper.containsNonWhitespace(autoEnabledObj)) { autoEnabled = "true".equals(autoEnabledObj); } + + String autoExternalRefDelimiterObj = getStringPropertyValue(AUTO_EXTERNAL_REF_DELIMITER, true); + if(StringHelper.containsNonWhitespace(autoExternalRefDelimiterObj)) { + autoExternalRefDelimiter = autoExternalRefDelimiterObj; + } String homeEnabledObj = getStringPropertyValue(AC_HOME_ENABLED, true); if(StringHelper.containsNonWhitespace(homeEnabledObj)) { @@ -220,6 +228,15 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO acMethodManager.enableAutoMethods(autoEnabled); } + public String getAutoExternalRefDelimiter() { + return autoExternalRefDelimiter; + } + + public void setAutoExternalRefDelimiter(String autoExternalRefDelimiter) { + this.autoExternalRefDelimiter = autoExternalRefDelimiter; + setStringProperty(AUTO_EXTERNAL_REF_DELIMITER, autoExternalRefDelimiter, true); + } + public boolean isPaypalEnabled() { return paypalEnabled; } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java index d8549833abd9b81c0e9e20371fde811df7d12c3a..749357b4be7f42b1105e481d914709d6a070c7a0 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; import javax.persistence.TypedQuery; @@ -92,33 +92,38 @@ class AdvanceOrderDAO { return advanceOrder; } - Collection<AdvanceOrder> loadPendingAdvanceOrders(Map<IdentifierKey, String> identifiers) { + Collection<AdvanceOrder> loadPendingAdvanceOrders(Collection<IdentifierKeyValue> identifiers) { if (identifiers == null || identifiers.isEmpty()) return new ArrayList<>(); StringBuilder sb = new StringBuilder(); sb.append("select advanceOrder from advanceOrder advanceOrder") .append(" where advanceOrder.status=:status") .append(" and ((1 = 2)"); - - for (Map.Entry<IdentifierKey, String> entry : identifiers.entrySet()) { - if (entry.getKey() != null && StringHelper.containsNonWhitespace(entry.getValue())) { - sb.append(" or (advanceOrder.identifierKey=:").append(entry.getKey()); - sb.append(" and advanceOrder.identifierValue=:").append(entry.getKey()).append(entry.getKey()).append(")"); - } + + List<IdentifierKeyValue> identifierList = identifiers.stream() + .collect(Collectors.toList()); + for (int i = 0; i < identifierList.size(); i++) { + IdentifierKeyValue keyValue = identifierList.get(i); + if (keyValue.getKey() != null && StringHelper.containsNonWhitespace(keyValue.getValue())) { + sb.append(" or (advanceOrder.identifierKey=:").append("key" + i); + sb.append(" and advanceOrder.identifierValue=:").append("value" + i); + sb.append(" )"); + } } sb.append(")"); - + TypedQuery<AdvanceOrder> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), AdvanceOrder.class) .setParameter("status", Status.PENDING); - - for (Map.Entry<IdentifierKey, String> entry : identifiers.entrySet()) { - if (entry.getKey() != null && StringHelper.containsNonWhitespace(entry.getValue())) { - query.setParameter(entry.getKey().toString(), entry.getKey()); - query.setParameter(entry.getKey().toString().concat(entry.getKey().toString()), entry.getValue()); + + for (int i = 0; i < identifierList.size(); i++) { + IdentifierKeyValue keyValue = identifierList.get(i); + if (keyValue.getKey() != null && StringHelper.containsNonWhitespace(keyValue.getValue())) { + query.setParameter("key" + i, keyValue.getKey()); + query.setParameter("value" + i, keyValue.getValue()); } } - + return query.getResultList(); } @@ -155,5 +160,54 @@ class AdvanceOrderDAO { return advanceOrder; } + + static final class IdentifierKeyValue { + + private final IdentifierKey key; + private final String value; + + public IdentifierKeyValue(IdentifierKey key, String value) { + super(); + this.key = key; + this.value = value; + } + + public IdentifierKey getKey() { + return key; + } + + public String getValue() { + return value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + IdentifierKeyValue other = (IdentifierKeyValue) obj; + if (key != other.key) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + } } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java index 98c15ea96a1b16bcb923d2dd91db97a4c8ee5fa3..03a3d2bbd911a69d75fc84af3fe4e677bce638ae 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java @@ -21,9 +21,9 @@ package org.olat.resource.accesscontrol.provider.auto.manager; import java.util.ArrayList; import java.util.Collection; -import java.util.EnumMap; +import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Set; import org.apache.logging.log4j.Logger; import org.olat.basesecurity.GroupRoles; @@ -42,6 +42,7 @@ import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder.Status; import org.olat.resource.accesscontrol.provider.auto.AdvanceOrderInput; import org.olat.resource.accesscontrol.provider.auto.AutoAccessManager; import org.olat.resource.accesscontrol.provider.auto.IdentifierKey; +import org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAO.IdentifierKeyValue; import org.olat.resource.accesscontrol.provider.auto.model.AutoAccessMethod; import org.olat.user.UserDataDeletable; import org.springframework.beans.factory.annotation.Autowired; @@ -108,13 +109,16 @@ public class AutoAccessManagerImpl implements AutoAccessManager, UserDataDeletab @Override public Collection<AdvanceOrder> loadPendingAdvanceOrders(RepositoryEntry entry) { if (entry == null) return new ArrayList<>(); - - Map<IdentifierKey, String> searchValues = new EnumMap<>(IdentifierKey.class); + + Set<IdentifierKeyValue> searchValues = new HashSet<>(); for (IdentifierKey key: IdentifierKey.values()) { - String value = identifierHandler.getRepositoryEntryValue(key, entry); - searchValues.put(key, value); + Set<String> values = identifierHandler.getRepositoryEntryValue(key, entry); + for (String value : values) { + IdentifierKeyValue identifierKeyValue = new IdentifierKeyValue(key, value); + searchValues.add(identifierKeyValue); + } } - + return advanceOrderDAO.loadPendingAdvanceOrders(searchValues); } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java index 8f5202ecb204a5c429a40f279de478b06068aba5..67d7acf12380603fef0ec3c25d2a45f12e5c68d7 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java @@ -20,8 +20,11 @@ package org.olat.resource.accesscontrol.provider.auto.manager; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.olat.core.util.StringHelper; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; import org.olat.resource.accesscontrol.provider.auto.IdentifierKey; @@ -59,8 +62,13 @@ class ExternalIdHandler implements IdentifierKeyHandler { } @Override - public String getRepositoryEntryValue(RepositoryEntry entry) { - return entry.getExternalId(); + public Set<String> getRepositoryEntryValue(RepositoryEntry entry) { + Set<String> values = new HashSet<>(); + String externalId = entry.getExternalId(); + if (StringHelper.containsNonWhitespace(externalId)) { + values.add(externalId); + } + return values; } } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java index 77d09bbba247cd1cb179952f768a2fe3962f98de..c372ec0f69e0b03048fc207bc04de3fa27740128 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java @@ -20,10 +20,14 @@ package org.olat.resource.accesscontrol.provider.auto.manager; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.olat.core.util.StringHelper; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; +import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.provider.auto.IdentifierKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -37,6 +41,8 @@ import org.springframework.stereotype.Component; @Component class ExternalRefHandler implements IdentifierKeyHandler { + @Autowired + private AccessControlModule accessControlModule; @Autowired private RepositoryService repositoryService; @@ -50,7 +56,12 @@ class ExternalRefHandler implements IdentifierKeyHandler { List<RepositoryEntry> entries = new ArrayList<>(); try { - entries = repositoryService.loadRepositoryEntriesByExternalRef(value); + String delimiter = accessControlModule.getAutoExternalRefDelimiter(); + if (StringHelper.containsNonWhitespace(delimiter)) { + entries = getRepositoryEntries(value, delimiter); + } else { + entries = repositoryService.loadRepositoryEntriesByExternalRef(value); + } } catch (Exception e) { // nothing to add } @@ -58,9 +69,45 @@ class ExternalRefHandler implements IdentifierKeyHandler { return entries; } + private List<RepositoryEntry> getRepositoryEntries(String value, String delimiter) { + List<RepositoryEntry> entries = repositoryService.loadRepositoryEntriesLikeExternalRef(value); + Set<RepositoryEntry> matchingEntries = new HashSet<>(); + for (RepositoryEntry entry : entries) { + for (String externalRef : entry.getExternalRef().split(delimiter)) { + if (externalRef.equals(value)) { + matchingEntries.add(entry); + } + } + } + return new ArrayList<>(matchingEntries); + } + @Override - public String getRepositoryEntryValue(RepositoryEntry entry) { - return entry.getExternalRef(); + public Set<String> getRepositoryEntryValue(RepositoryEntry entry) { + String delimiter = accessControlModule.getAutoExternalRefDelimiter(); + return StringHelper.containsNonWhitespace(delimiter) + ? getSplitedValues(entry, delimiter) + : getValue(entry); + } + + private Set<String> getValue(RepositoryEntry entry) { + Set<String> values = new HashSet<>(); + String externalRef = entry.getExternalRef(); + if (StringHelper.containsNonWhitespace(externalRef)) { + values.add(externalRef); + } + return values; } + private Set<String> getSplitedValues(RepositoryEntry entry, String delimiter) { + Set<String> values = new HashSet<>(); + String externalRef = entry.getExternalRef(); + if (StringHelper.containsNonWhitespace(externalRef)) { + for (String externalRefToken : externalRef.split(delimiter)) { + values.add(externalRefToken); + } + } + return values; + } + } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java index cdd708157d95109f9a8dc81dbcfb3f28144fa4df..1e907798a5245906453747c0c2e8381c5913fff2 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -76,16 +77,16 @@ class IdentifierHandler { log.debug("Found more then one RepositotyEntry for " + key + "=" + value + ". Keys: " + keys); } return entries; - } + } - /** - * Takes a RepostoryEntry and returns the value for a given IdenifierKey - * - * @param key - * @param entry - * @return - */ - String getRepositoryEntryValue(IdentifierKey key, RepositoryEntry entry) { + /** + * Takes a RepostoryEntry and returns the values for a given IdenifierKey + * + * @param key + * @param entry + * @return + */ + Set<String> getRepositoryEntryValue(IdentifierKey key, RepositoryEntry entry) { return handlers.get(key).getRepositoryEntryValue(entry); } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java index 6c256fdcfb77d629da71412a8e2a6a2ce4845959..a7164f4bfb1535b29e5341b26102b1e9428fd230 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java @@ -20,6 +20,7 @@ package org.olat.resource.accesscontrol.provider.auto.manager; import java.util.List; +import java.util.Set; import org.olat.repository.RepositoryEntry; import org.olat.resource.accesscontrol.provider.auto.IdentifierKey; @@ -47,11 +48,11 @@ interface IdentifierKeyHandler { public List<RepositoryEntry> find(String value); /** - * Finds the appropriate Value in the RepositoryEntry. + * Finds the appropriate values in the RepositoryEntry. * * @param entry * @return */ - public String getRepositoryEntryValue(RepositoryEntry entry); + public Set<String> getRepositoryEntryValue(RepositoryEntry entry); } diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java index 9a0482ff67f3edb48e93f16f18aa323161fb8e49..14f694bb781d149db220e3cea647f10a9f2e3193 100644 --- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java +++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java @@ -20,7 +20,9 @@ package org.olat.resource.accesscontrol.provider.auto.manager; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; @@ -62,8 +64,11 @@ class InternalIdHandler implements IdentifierKeyHandler { } @Override - public String getRepositoryEntryValue(RepositoryEntry entry) { - return Long.toString(entry.getKey()); + public Set<String> getRepositoryEntryValue(RepositoryEntry entry) { + Set<String> values = new HashSet<>(); + String internalId = Long.toString(entry.getKey()); + values.add(internalId); + return values; } } diff --git a/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java b/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java index 96a05253c8d78954b4800ec255d7101247f1ecff..0d4402e7734edd83900cb6492a9b0bb33245134c 100644 --- a/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java +++ b/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java @@ -88,12 +88,12 @@ public class ShibbolethManagerImpl implements ShibbolethManager { private void createAndBookAdvanceOrders(Identity identity, ShibbolethAttributes shibbolethAttributes) { if (acModule.isAutoEnabled()) { - createAdvanceOr(identity, shibbolethAttributes); + createAdvanceOrder(identity, shibbolethAttributes); autoAccessManager.grantAccessToCourse(identity); } } - private void createAdvanceOr(Identity identity, ShibbolethAttributes shibbolethAttributes) { + private void createAdvanceOrder(Identity identity, ShibbolethAttributes shibbolethAttributes) { ShibbolethAdvanceOrderInput input = getShibbolethAdvanceOrderInput(); input.setIdentity(identity); String rawValues = shibbolethAttributes.getAcRawValues(); diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 10610f39f9ebfc87e2f582b72c845c40fb601eaf..08db266263f543684c3e32f7439fd218c4ca28d3 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1304,6 +1304,10 @@ method.auto.shib.shib= method.auto.shib.splitter.values=Semicolon method.auto.shib.splitter= +# External eeference may have many values separated by this delimiter. +# If the value is not defined, no splitting is executed. +method.auto.externalRef.delimiter= + ######################################## # Paypal Checkout ######################################## diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java index d1902a66c8d5a91aa9afed6a9c9ba4ec5848570a..a3edc1345c21e12ac947e14ed928dbc85747ca64 100644 --- a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java +++ b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java @@ -358,6 +358,43 @@ public class RepositoryEntryDAOTest extends OlatTestCase { Assert.assertNotNull(emptyRes); Assert.assertEquals(0, emptyRes.size()); } + + @Test + public void loadRepositoryEntriesLikeExternalRef() { + String externalRef = "myExternalRef"; + + // remove old test date + String query = "update repositoryentry as v set v.externalRef=null where v.externalRef like (:externalRef)"; + String externalRefParamater = new StringBuilder("%").append(externalRef).append("%").toString(); + dbInstance.getCurrentEntityManager() + .createQuery(query) + .setParameter("externalRef", externalRefParamater) + .executeUpdate(); + + // insert test data + Organisation defOrganisation = organisationService.getDefaultOrganisation(); + RepositoryEntry re1 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8a", "", null, + RepositoryEntryStatusEnum.trash, defOrganisation); + re1.setExternalRef(externalRef); + repositoryService.update(re1); + RepositoryEntry re2 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8b", "", null, + RepositoryEntryStatusEnum.trash, defOrganisation); + re2.setExternalRef(externalRef + "123"); + repositoryService.update(re2); + RepositoryEntry re3 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8c", "", null, + RepositoryEntryStatusEnum.trash, defOrganisation); + re3.setExternalRef("abc" + externalRef + "123"); + repositoryService.update(re3); + RepositoryEntry re4 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8d", "", null, + RepositoryEntryStatusEnum.trash, defOrganisation); + re4.setExternalRef("123"); + repositoryService.update(re4); + dbInstance.commitAndCloseSession(); + + Collection<RepositoryEntry> entries = repositoryEntryDao.loadRepositoryEntriesLikeExternalRef(externalRef); + Assert.assertNotNull(entries); + Assert.assertEquals(3, entries.size()); + } @Test public void loadRepositoryEntries() { diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java index 5209ce5e456205ef75436bcf8e8993d27fe33993..a46364a4a54c4933e417eff4f3cb9d210b8fe5da 100644 --- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java @@ -23,9 +23,9 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Set; import org.junit.Before; import org.junit.Test; @@ -38,6 +38,7 @@ import org.olat.resource.accesscontrol.model.TokenAccessMethod; import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder; import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder.Status; import org.olat.resource.accesscontrol.provider.auto.IdentifierKey; +import org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAO.IdentifierKeyValue; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; @@ -150,12 +151,12 @@ public class AdvanceOrderDAOTest extends OlatTestCase { AdvanceOrder aoNotMatchingValue = sut.create(identity, IdentifierKey.internalId, "not matching", freeMethod); sut.save(aoNotMatchingValue); dbInstance.commitAndCloseSession(); - - Map<IdentifierKey, String> identifiers = new HashMap<>(); - identifiers.put(IdentifierKey.internalId, IDENTIFIER_VALUE); - identifiers.put(IdentifierKey.externalId, IDENTIFIER_VALUE); - Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(identifiers); - + + Set<IdentifierKeyValue> searchValues = new HashSet<>(); + searchValues.add(new IdentifierKeyValue(IdentifierKey.internalId, IDENTIFIER_VALUE)); + searchValues.add(new IdentifierKeyValue(IdentifierKey.externalId, IDENTIFIER_VALUE)); + Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(searchValues); + assertThat(advanceOrders).hasSize(2).contains(aoMatchingInternalId, aoMatchingExternalId); } @@ -170,13 +171,13 @@ public class AdvanceOrderDAOTest extends OlatTestCase { AdvanceOrder aoNotMatchingValue = sut.create(identity, IdentifierKey.internalId, "not matching", freeMethod); sut.save(aoNotMatchingValue); dbInstance.commitAndCloseSession(); - - Map<IdentifierKey, String> identifiers = new HashMap<>(); - identifiers.put(IdentifierKey.internalId, IDENTIFIER_VALUE); - identifiers.put(null, IDENTIFIER_VALUE); - identifiers.put(IdentifierKey.externalId, ""); - Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(identifiers); - + + Set<IdentifierKeyValue> searchValues = new HashSet<>(); + searchValues.add(new IdentifierKeyValue(IdentifierKey.internalId, IDENTIFIER_VALUE)); + searchValues.add(new IdentifierKeyValue(null, IDENTIFIER_VALUE)); + searchValues.add(new IdentifierKeyValue(IdentifierKey.externalId, "")); + Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(searchValues); + assertThat(advanceOrders).hasSize(1).contains(aoMatchingInternalId); } diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java index 0d21fc8365c1c1d1f4954b3ff1b240fc2da3ec34..cd39f1867b0e58a8c5c5ecc5ab547b7d65ba3b0a 100644 --- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java @@ -23,6 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.Set; + import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; @@ -65,10 +67,10 @@ public class ExternalIdHandlerTest { public void shouldReturnTheExternalIdFromRepositoryEntry() { String externalId = "1234"; when(entryMock.getExternalId()).thenReturn(externalId); - - String value = sut.getRepositoryEntryValue(entryMock); - - assertThat(value).isEqualTo(externalId); + + Set<String> values = sut.getRepositoryEntryValue(entryMock); + + assertThat(values.iterator().next()).isEqualTo(externalId); } } diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java index 0eb900a40eb2c2952302a1e00094e76d4fdd7ab9..8de47b171dc3b0f0e3e4bd5fc85960a0d08fd4d6 100644 --- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java @@ -23,6 +23,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; @@ -30,6 +34,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; +import org.olat.resource.accesscontrol.AccessControlModule; /** * @@ -39,6 +44,8 @@ import org.olat.repository.RepositoryService; */ public class ExternalRefHandlerTest { + @Mock + private AccessControlModule accessModulControlMock; @Mock private RepositoryService repositoryServiceMock; @Mock @@ -54,21 +61,66 @@ public class ExternalRefHandlerTest { @Test public void shouldDelegateTheSearchToRepositoryService() { + when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(""); String externalRef = "EXT-123"; sut.find(externalRef); verify(repositoryServiceMock).loadRepositoryEntriesByExternalRef(externalRef); } - + + @Test + public void shouldFilterExactMatchingExternalRef() { + when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(","); + + String externalRef = "EXT-123"; + List<RepositoryEntry> entries = new ArrayList<>(); + RepositoryEntry re1 = new RepositoryEntry(); + re1.setExternalRef("EXT-123"); + entries.add(re1); + RepositoryEntry re2 = new RepositoryEntry(); + re2.setExternalRef("EXT-123,abc"); + entries.add(re2); + RepositoryEntry re3 = new RepositoryEntry(); + re3.setExternalRef("abc,EXT-123"); + entries.add(re3); + RepositoryEntry re4 = new RepositoryEntry(); + re4.setExternalRef("EXT-1234"); + entries.add(re4); + RepositoryEntry re5 = new RepositoryEntry(); + re5.setExternalRef("EXT-123,oo,EXT-123"); + entries.add(re5); + when(repositoryServiceMock.loadRepositoryEntriesLikeExternalRef(externalRef)) + .thenReturn(entries); + + List<RepositoryEntry> foundEntries = sut.find(externalRef); + + assertThat(foundEntries) + .containsExactlyInAnyOrder(re1, re2, re3, re5) + .doesNotContain(re4); + } + @Test public void shouldReturnTheExternalRefFromRepositoryEntry() { + when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(""); String externalRef = "1234"; when(entryMock.getExternalRef()).thenReturn(externalRef); - String value = sut.getRepositoryEntryValue(entryMock); + Set<String> values = sut.getRepositoryEntryValue(entryMock); - assertThat(value).isEqualTo(externalRef); + assertThat(values.iterator().next()).isEqualTo(externalRef); + } + + @Test + public void shouldReturnSplitedExternalRefsFromRepositoryEntry() { + when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(","); + String externalRef = "1234,1234,123,12,1.1"; + when(entryMock.getExternalRef()).thenReturn(externalRef); + + Set<String> values = sut.getRepositoryEntryValue(entryMock); + + List<String> valueList = new ArrayList<>(values); + assertThat(valueList).containsExactlyInAnyOrder("1234","123","12","1.1"); } } diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java index ff4c8c89a1731cde50fdf96af71fe9d785b96d13..4013cb6fa17e7437321fdc1c9341f58ce6ae1ad6 100644 --- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collection; +import java.util.Set; import org.junit.Before; import org.junit.Test; @@ -75,10 +76,11 @@ public class InternalIdHandlerTest { public void shouldReturnTheExternalIdFromRepositoryEntry() { Long key = 1234L; when(entryMock.getKey()).thenReturn(key); - - String value = sut.getRepositoryEntryValue(entryMock); - + + Set<String> values = sut.getRepositoryEntryValue(entryMock); + String keyAsString = Long.toString(key); - assertThat(value).isEqualTo(keyAsString); + assertThat(values.iterator().next()).isEqualTo(keyAsString); } + }