diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java index 3c543a8abfc64ccee438c0e9808df8a6a4e74e12..ed476520e9d8b826c8e602d454e2d4ce6b95b71a 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnect9Provider.java @@ -19,6 +19,8 @@ */ package org.olat.modules.adobeconnect.manager; +import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault; + import java.net.URI; import java.util.List; @@ -88,8 +90,8 @@ public class AdobeConnect9Provider extends AbstractAdobeConnectProvider { UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder(); builder .queryParam("action", "principal-update") - .queryParam("first-name", identity.getUser().getFirstName()) - .queryParam("last-name", identity.getUser().getLastName()); + .queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John")) + .queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe")); if(!adobeConnectModule.isLoginCompatibilityMode()) { builder .queryParam("email", identity.getUser().getEmail()); diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java index 86ff21c7baaf3fa8ef12ce4ba2cba3537b025374..e1bb7d3d0f666db418a2b1d1f3cbc1561cac868f 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtils.java @@ -220,6 +220,10 @@ public class AdobeConnectUtils { } } + protected static String orDefault(String val, String defaultValue) { + return StringHelper.containsNonWhitespace(val) ? val : defaultValue; + } + protected static void print(Document document) { if(log.isDebugEnabled()) { try(StringWriter writer = new StringWriter()) { diff --git a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java index 21d9f3ceae60e56f3dbcfc7fee863e3293568ca4..28e72595220b9911ef1636b28a1696d60850201d 100644 --- a/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java +++ b/src/main/java/org/olat/modules/adobeconnect/manager/DFNprovider.java @@ -19,6 +19,9 @@ */ package org.olat.modules.adobeconnect.manager; +import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault; + + import java.util.List; import javax.ws.rs.core.UriBuilder; @@ -39,7 +42,6 @@ import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal; import org.olat.modules.adobeconnect.model.AdobeConnectSco; import org.olat.modules.adobeconnect.model.BreezeSession; import org.springframework.stereotype.Service; - /** * * Initial date: 17 avr. 2019<br> @@ -92,8 +94,8 @@ public class DFNprovider extends AbstractAdobeConnectProvider { builder .queryParam("action", "lms-user-create") .queryParam("login", identity.getUser().getEmail()) - .queryParam("first-name", identity.getUser().getFirstName()) - .queryParam("last-name", identity.getUser().getLastName()); + .queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John")) + .queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe")); HttpGet get = createAdminMethod(builder, errors); List<AdobeConnectPrincipal> users = null; diff --git a/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java b/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java index e0fa376ee41ab873a7cfd37f4b93a67b9e4586af..da8ac85911e370abb6c5dadb2c43d9524a220c1d 100644 --- a/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java +++ b/src/main/java/org/olat/modules/qpool/manager/QItemQueriesDAO.java @@ -300,6 +300,19 @@ public class QItemQueriesDAO { sb.and(); PersistenceHelper.appendFuzzyLike(sb, "item.topic", "topic", dbInstance.getDbVendor()); } + if(StringHelper.containsNonWhitespace(params.getOwner())) { + sb.and() + .append(" exists (select mship.key from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as mship ") + .append(" inner join mship.identity as oIdent") + .append(" inner join oIdent.user as oUser") + .append(" where mship.securityGroup.key=item.ownerGroup.key and ("); + PersistenceHelper.appendFuzzyLike(sb, "oUser.firstName", "owner", dbInstance.getDbVendor()); + sb.append(" or "); + PersistenceHelper.appendFuzzyLike(sb, "oUser.lastName", "owner", dbInstance.getDbVendor()); + sb.append(" or "); + PersistenceHelper.appendFuzzyLike(sb, "oIdent.name", "owner", dbInstance.getDbVendor()); + sb.append(" ))"); + } if(StringHelper.containsNonWhitespace(params.getKeywords())) { sb.and(); PersistenceHelper.appendFuzzyLike(sb, "item.keywords", "keywords", dbInstance.getDbVendor()); @@ -427,6 +440,10 @@ public class QItemQueriesDAO { String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getTopic()); query.setParameter("topic", fuzzySearch); } + if(StringHelper.containsNonWhitespace(params.getOwner())) { + String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getOwner()); + query.setParameter("owner", fuzzySearch); + } if(StringHelper.containsNonWhitespace(params.getKeywords())) { String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getKeywords()); query.setParameter("keywords", fuzzySearch); diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java index 5b3d2922c2cb80bc2c24693bbfa2f48f2bf4352a..c4739b487afe8230b27b2c482febfd15c16449fd 100644 --- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java +++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java @@ -29,6 +29,7 @@ import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.TypedQuery; +import org.apache.logging.log4j.Logger; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.SecurityGroupMembershipImpl; @@ -36,6 +37,7 @@ import org.olat.basesecurity.manager.SecurityGroupDAO; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.services.mark.impl.MarkImpl; import org.olat.core.id.Identity; +import org.olat.core.logging.Tracing; import org.olat.group.BusinessGroup; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItem2Resource; @@ -60,6 +62,8 @@ import org.springframework.stereotype.Service; @Service("questionDao") public class QuestionItemDAO { + private static final Logger log = Tracing.createLoggerFor(QuestionItemDAO.class); + @Autowired private DB dbInstance; @Autowired @@ -177,6 +181,8 @@ public class QuestionItemDAO { for(Identity author:authors) { if(!securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) { securityGroupDao.addIdentityToSecurityGroup(author, secGroup); + log.info(Tracing.M_AUDIT, "Added owner identity '{}' to item with key {} ({}, {})", + author.getKey(), item.getKey(), item.getTitle(), item.getTopic()); } } dbInstance.commit(); @@ -190,6 +196,8 @@ public class QuestionItemDAO { for(Identity author:authors) { if(securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) { securityGroupDao.removeIdentityFromSecurityGroup(author, secGroup); + log.info(Tracing.M_AUDIT, "Removed owner identity '{}' from item with key {} ({}, {})", + author.getKey(), item.getKey(), item.getTitle(), item.getTopic()); } } dbInstance.commit(); @@ -261,6 +269,7 @@ public class QuestionItemDAO { for(QuestionItemShort item:items) { QuestionItem refItem = loadLazyReferenceId(item.getKey()); if(refItem != null) { + log.info(Tracing.M_AUDIT, "Delete question item {} ({}, {})", item.getKey(), item.getTitle(), item.getTopic()); em.remove(refItem); } } diff --git a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java index 367c6eadea40d468cd52d9dd8287e18d72f7b639..0f49b80eec6b90f2f47eaea833e029ff4fecd263 100644 --- a/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java +++ b/src/main/java/org/olat/modules/qpool/model/SearchQuestionItemParams.java @@ -48,6 +48,7 @@ public class SearchQuestionItemParams implements Cloneable { private Identity author; private String title; private String topic; + private String owner; private String keywords; private String coverage; private String informations; @@ -146,6 +147,14 @@ public class SearchQuestionItemParams implements Cloneable { this.topic = topic; } + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + public String getKeywords() { return keywords; } @@ -345,6 +354,9 @@ public class SearchQuestionItemParams implements Cloneable { if(StringHelper.containsNonWhitespace(searchString)) { clone.searchString = searchString; } + if(StringHelper.containsNonWhitespace(owner)) { + clone.owner = owner; + } if(favoritOnly) { clone.favoritOnly = favoritOnly; } diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties index 4cba538728e884aac7e2c49dc7c1d7cb9e8e1dc9..8e44b5825b0c92b5a044a715a9619167f0fba8ce 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_de.properties @@ -201,6 +201,7 @@ my.share=Meine Shares new.item=Frage erstellen next=N\u00E4chste numberOfRatings=Anzahl Bewertungen +owner=Autor pool.add.to.source=Fragen zum Pool "{0}" hinzuf\u00FCgen pool.key=ID pool.name=Name diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties index f514b7bec39f10095e546d8bb10222334f9ed640..4443009f18c55e82932b52a787ed582a7867e1d6 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties @@ -201,6 +201,7 @@ my.share=My shares new.item=Create question next=Next numberOfRatings=Number of ratings +owner=Author pool.add.to.source=Add questions to pool "{0}" pool.key=ID pool.name=Name diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java index 2ec0a4a4f6e0e9ed8cde0d534bb973a1cf844fd1..2b25b5efa67c3f6c172abfc7b5f8693d7cdc5919 100644 --- a/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java +++ b/src/main/java/org/olat/modules/qpool/ui/metadata/ExtendedSearchController.java @@ -334,6 +334,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext attributes.add(new SearchAttribute("classification.taxonomy.level", new TaxonomicFieldQueryParameter())); attributes.add(new SearchAttribute("classification.taxonomic.path.incl", new TaxonomicPathQueryParameter())); } + attributes.add(new SearchAttribute("owner", new StringQueryParameter(AbstractOlatDocument.AUTHOR_FIELD_NAME))); //educational if (qPoolSecurityCallback.canUseEducationalContext()) { attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter())); @@ -400,6 +401,8 @@ public class ExtendedSearchController extends FormBasicController implements Ext searchParams.setTopic(val); } else if(QItemDocument.KEYWORDS_FIELD.equals(docAttribute)) { searchParams.setKeywords(val); + } else if(AbstractOlatDocument.AUTHOR_FIELD_NAME.equals(docAttribute)) { + searchParams.setOwner(val); } else if(QItemDocument.COVERAGE_FIELD.equals(docAttribute)) { searchParams.setCoverage(val); } else if(QItemDocument.ADD_INFOS_FIELD.equals(docAttribute)) { @@ -461,7 +464,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext private final LicenseSelectionConfig config; public LicenseQueryParameter() { - super(QItemDocument.LICENSE_TYPE_FIELD_NAME); + super(AbstractOlatDocument.LICENSE_TYPE_FIELD_NAME); config = LicenseUIFactory.createLicenseSelectionConfig(licenseHandler); } diff --git a/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java b/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e4d1d4768d2b67163f78b10c228329ff6faaaee3 --- /dev/null +++ b/src/test/java/org/olat/modules/adobeconnect/manager/AdobeConnectUtilsTest.java @@ -0,0 +1,45 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.adobeconnect.manager; + +import org.junit.Assert; +import org.junit.Test; + +/** + * + * Initial date: 12 mars 2020<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AdobeConnectUtilsTest { + + @Test + public void orDefault() { + String val = AdobeConnectUtils.orDefault("my-value", "a-default-value"); + Assert.assertEquals("my-value", val); + } + + @Test + public void orDefault_default() { + String val = AdobeConnectUtils.orDefault(null, "a-default-value"); + Assert.assertEquals("a-default-value", val); + } + +} diff --git a/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java b/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java index d546edd606ad0d3db78e2ee8171d041d7e9ed3d2..b76b547a23851f14bd9b97a68b623ac1d04fe317 100644 --- a/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java +++ b/src/test/java/org/olat/modules/qpool/manager/QItemQueriesDAOTest.java @@ -327,6 +327,41 @@ public class QItemQueriesDAOTest extends OlatTestCase { } } + @Test + public void getItemsByOwner() { + //create an author with 2 items + Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwner-and-only-2-"); + QuestionItem item = questionDao.createAndPersist(id, "NGC 7837", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType); + dbInstance.commitAndCloseSession(); + + SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH); + params.setOwner("Owner-and-only"); + + SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true); + List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc); + Assert.assertNotNull(views); + Assert.assertFalse(views.isEmpty()); + boolean match = views.stream().anyMatch(view -> item.getKey().equals(view.getKey())); + Assert.assertTrue(match); + } + + @Test + public void getItemsByOwner_negativeTest() { + //create an author with 2 items + Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwn-29-"); + QuestionItem item = questionDao.createAndPersist(id, "NGC 7838", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType); + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(item); + + SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH); + params.setOwner(UUID.randomUUID().toString()); + + SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true); + List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc); + Assert.assertNotNull(views); + Assert.assertTrue(views.isEmpty()); + } + @Test public void getItemsOfPool() { Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Poolman-"); diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index a7e62c4b13987bb40a10b076a2a9af69e4ed3151..b0b4b39db45157831ff786c7cac501d549841a82 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -204,6 +204,7 @@ import org.junit.runners.Suite; org.olat.modules.adobeconnect.manager.AdobeConnectProviderTest.class, org.olat.modules.adobeconnect.manager.AdobeConnectUserDAOTest.class, org.olat.modules.adobeconnect.manager.AdobeConnectMeetingDAOTest.class, + org.olat.modules.adobeconnect.manager.AdobeConnectUtilsTest.class, org.olat.modules.iq.IQManagerTest.class, org.olat.modules.fo.ForumManagerTest.class,//fail org.olat.modules.wiki.WikiUnitTest.class,