diff --git a/pom.xml b/pom.xml index c1c187000b38647dc3bda3531a9714de0bd0759d..8f3a2770a6036eb083c0fb3c6a758f62068d8927 100644 --- a/pom.xml +++ b/pom.xml @@ -1100,11 +1100,6 @@ <url>https://maven.java.net/content/groups/public/</url> <layout>default</layout> </repository> - <repository> - <id>nexus.codehaus.org</id> - <name>Codehaus nexus repo</name> - <url>https://nexus.codehaus.org/content/groups/public</url> - </repository> <repository> <id>jboss-public-repository-group</id> <name>JBoss Public Maven Repository Group</name> diff --git a/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java b/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java index 9777e18509a78a201f20c97924b9247a7b55dfdb..074135dbf7c14af8ccaeb7d249e923f02e39db13 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java +++ b/src/main/java/org/olat/core/commons/services/notifications/NotificationHelper.java @@ -33,6 +33,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.User; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.cache.CacheWrapper; import org.olat.core.util.coordinate.CoordinatorManager; @@ -132,7 +133,12 @@ public class NotificationHelper { String[] properties = new String[propertyHandlers.size()]; for (int i = 0; i < propertyHandlers.size(); i++) { UserPropertyHandler propHandler = propertyHandlers.get(i); - properties[i] = propHandler.getUserProperty(user, trans.getLocale()); + String prop = propHandler.getUserProperty(user, trans.getLocale()); + if(StringHelper.containsNonWhitespace(prop)) { + properties[i] = prop; + } else { + properties[i] = "-"; + } } formattedName = trans.translate("user.formatted", properties); } diff --git a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java index 61ba5102e0e0968c668c75c8e27c41abaef4dd2c..71fe27d81280a1ad21ae665b9de534cb491bb937 100644 --- a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java +++ b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java @@ -45,6 +45,7 @@ import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.logging.LogDelegator; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; @@ -99,6 +100,10 @@ public class ForumNotificationsHandler extends LogDelegator implements Notificat String name; if(modifier != null) { name = NotificationHelper.getFormatedName(modifier); + } else if(StringHelper.containsNonWhitespace(mInfo.getPseudonym())) { + name = mInfo.getPseudonym(); + } else if(mInfo.isGuest()) { + name = translator.translate("anonymous.poster"); } else { name = NotificationHelper.getFormatedName(creator); } diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java index e404f2be37924c86b8d40990752dc5f3ac6dffb6..56ac4e6215d81dd3a3d2e4b73363f04b13f7dcf4 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -141,12 +141,6 @@ public class ForumManager { return dbQuery.getResultList(); } - public List<Long> getAllForumKeys(){ - return dbInstance.getCurrentEntityManager() - .createNamedQuery("getAllForumKeys", Long.class) - .getResultList(); - } - /** * * @param forum_id @@ -280,7 +274,10 @@ public class ForumManager { .append(" ) as numOfMessages") .append(" , (select max(replies.lastModified) from fomessage as replies") .append(" where replies.threadtop.key=msg.key and replies.forum.key=:forumKey") - .append(" ) as lastModified"); + .append(" ) as lastModified") + .append(" , (select count(read.key) from foreadmessage as read, fomessage as posts") + .append(" where (posts.threadtop.key=msg.key or posts.key=msg.key) and read.message.key=posts.key and read.identity.key=:identityKey") + .append(" ) as numOfReadMessages"); if(identity != null) { sb.append(" ,(select count(mark.key) from ").append(MarkImpl.class.getName()).append(" as mark ") .append(" where mark.creator.key=:identityKey and mark.resId=:forumKey and msg.key = cast(mark.resSubPath as long) and mark.resName='Forum'") @@ -293,10 +290,9 @@ public class ForumManager { TypedQuery<Object[]> objectsQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Object[].class) - .setParameter("forumKey", forum.getKey()); - if(identity != null) { - objectsQuery.setParameter("identityKey", identity.getKey()); - } + .setParameter("forumKey", forum.getKey()) + .setParameter("identityKey", identity.getKey()); + List<Object[]> objects = objectsQuery.getResultList(); List<ForumThread> threadList = new ArrayList<>(objects.size()); @@ -307,9 +303,13 @@ public class ForumManager { int numOfMessages = numOfMessagesLong == null ? 1 : numOfMessagesLong.intValue() + 1; String creator = userManager.getUserDisplayName(msg.getCreator()); ForumThread thread = new ForumThread(msg, creator, lastModifed, numOfMessages); + + Number readMessages = (Number)object[3]; + int numOfReadMessages = readMessages == null ? 0 : readMessages.intValue(); + thread.setNewMessages(numOfMessages - numOfReadMessages); if(identity != null) { - Number numOfMarkedMessagesLong = (Number)object[3]; + Number numOfMarkedMessagesLong = (Number)object[4]; int numOfMarkedMessages = numOfMarkedMessagesLong == null ? 0 : numOfMarkedMessagesLong.intValue(); thread.setMarkedMessages(numOfMarkedMessages); } @@ -347,20 +347,6 @@ public class ForumManager { return pseudonyms == null || pseudonyms.isEmpty() ? null : pseudonyms.get(0); } - public MessageLight getLightMessageById(Long messageKey) { - StringBuilder query = new StringBuilder(); - query.append("select msg from fomessage as msg") - .append(" left join fetch msg.creator as creator") - .append(" left join fetch msg.modifier as modifier") - .append(" where msg.key=:messageKey "); - - List<MessageLight> messages = dbInstance.getCurrentEntityManager() - .createQuery(query.toString(), MessageLight.class) - .setParameter("messageKey", messageKey) - .getResultList(); - return messages == null || messages.isEmpty() ? null : messages.get(0); - } - public List<MessageLight> getLightMessagesByForum(Forum forum) { StringBuilder query = new StringBuilder(); query.append("select msg from folightmessage as msg") diff --git a/src/main/java/org/olat/modules/fo/model/ForumImpl.java b/src/main/java/org/olat/modules/fo/model/ForumImpl.java index 35716ef06de369b927b86236e7c9544ad9440def..0ee927494f0367ca5b5a2bf13cc941762ca1abff 100644 --- a/src/main/java/org/olat/modules/fo/model/ForumImpl.java +++ b/src/main/java/org/olat/modules/fo/model/ForumImpl.java @@ -30,8 +30,6 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @@ -51,9 +49,7 @@ import org.olat.modules.fo.Forum; */ @Entity(name="forum") @Table(name="o_forum") -@NamedQueries({ - @NamedQuery(name="getAllForumKeys", query="select fo.key from forum as fo") -}) +//@NamedQueries({}) public class ForumImpl implements Forum, CreateInfo, Persistable{ private static final long serialVersionUID = 3240047228287740990L; diff --git a/src/main/java/org/olat/modules/fo/model/ForumThread.java b/src/main/java/org/olat/modules/fo/model/ForumThread.java index 0f9762692ec23e4660f8342210415696c9aceb20..bdc198ea6a5c26725401711ba8f4670234fd8cd8 100644 --- a/src/main/java/org/olat/modules/fo/model/ForumThread.java +++ b/src/main/java/org/olat/modules/fo/model/ForumThread.java @@ -32,14 +32,14 @@ import org.olat.modules.fo.MessageRef; */ public class ForumThread implements MessageRef { - private int type; - private Long key; - private String title; - private Date lastModified; + private final int type; + private final Long key; + private final String title; + private final Date lastModified; - private boolean guest; - private String pseudonym; - private String creatorFullname; + private final boolean guest; + private final String pseudonym; + private final String creatorFullname; private int markedMessages; private int newMessages; @@ -55,6 +55,7 @@ public class ForumThread implements MessageRef { this.lastModified = lastModified; } this.guest = message.isGuest(); + this.pseudonym = message.getPseudonym(); this.creatorFullname = creatorFullname; this.numOfPosts = numOfPosts; } diff --git a/src/main/java/org/olat/modules/fo/ui/ForumController.java b/src/main/java/org/olat/modules/fo/ui/ForumController.java index d20ed7b72147e6cf1981607ada5e3d35983b8337..67d9b37c25e5c197475bb61f4174ceb4f2a9d3bd 100644 --- a/src/main/java/org/olat/modules/fo/ui/ForumController.java +++ b/src/main/java/org/olat/modules/fo/ui/ForumController.java @@ -295,7 +295,7 @@ public class ForumController extends BasicController implements GenericEventList viewCtrl = new MessageListController(ureq, bbwControl, forum, focallback); viewCtrl.loadThread(ureq, thread); viewCtrl.scrollTo(scrollTo); - viewCtrl.doShowMarked(); + viewCtrl.doShowNew(); listenTo(viewCtrl); putContent(viewCtrl); addToHistory(ureq, viewCtrl); diff --git a/src/main/java/org/olat/modules/fo/ui/MessageListController.java b/src/main/java/org/olat/modules/fo/ui/MessageListController.java index 3d491d8ec33a94d5cd04d5186662adcef26983e2..31d7b4e9e06af2370db6404d8738b8649b8e7225 100644 --- a/src/main/java/org/olat/modules/fo/ui/MessageListController.java +++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java @@ -1114,10 +1114,9 @@ public class MessageListController extends BasicController implements GenericEve mainVC.contextPut("threadMode", Boolean.FALSE); mainVC.contextPut("mode", "new"); - Set<Long> rms = forumManager.getReadSet(getIdentity(), forum); List<MessageView> views = new ArrayList<>(); for(MessageView view:backupViews) { - if(!rms.contains(view.getKey())) { + if(view.isNewMessage()) { views.add(view); } } diff --git a/src/main/java/org/olat/modules/fo/ui/MessageView.java b/src/main/java/org/olat/modules/fo/ui/MessageView.java index 39ccffb7a6bb8d61c1bd142e309b08d47aad1ecb..1c2ee21dcc7f220fb858ac7ff2963319a7191a15 100644 --- a/src/main/java/org/olat/modules/fo/ui/MessageView.java +++ b/src/main/java/org/olat/modules/fo/ui/MessageView.java @@ -88,7 +88,7 @@ public class MessageView extends MessageLightView { this.formattedLastModified = formattedLastModified; } - public boolean getNewMessage() { + public boolean isNewMessage() { return newMessage; } diff --git a/src/main/java/org/olat/modules/fo/ui/ThreadListController.java b/src/main/java/org/olat/modules/fo/ui/ThreadListController.java index e3def678e6402e091b598f23426fce665b2632e3..2c8b95211ba71ce73187769ef11ed87e479dffa1 100644 --- a/src/main/java/org/olat/modules/fo/ui/ThreadListController.java +++ b/src/main/java/org/olat/modules/fo/ui/ThreadListController.java @@ -26,6 +26,7 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.commons.persistence.SortKey; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; @@ -117,11 +118,11 @@ public class ThreadListController extends FormBasicController { userListButton.setElementCssClass("o_sel_forum_filter"); } - if(!guestOnly && formLayout instanceof FormLayoutContainer) { + if(formLayout instanceof FormLayoutContainer) { SearchServiceUIFactory searchServiceUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class); searchController = searchServiceUIFactory.createInputController(ureq, getWindowControl(), DisplayOption.STANDARD, mainForm); listenTo(searchController); - ((FormLayoutContainer)formLayout).put("search_input", searchController.getInitialComponent()); + ((FormLayoutContainer)formLayout).add("search_input", searchController.getFormItem()); } FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); @@ -165,6 +166,14 @@ public class ThreadListController extends FormBasicController { } } + @Override + public void event(UserRequest ureq, Component source, Event event) { + if(searchController != null) { + searchController.event(ureq, source, event); + } + super.event(ureq, source, event); + } + @Override protected void event(UserRequest ureq, Controller source, Event event) { if(newThreadCtrl == source) { diff --git a/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java b/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java index 5606d294c1b02c240c42f7384eb1763e557b2372..94a35e4f634a413bf575cf6cbe7c54848a5fe3d8 100644 --- a/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java +++ b/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java @@ -44,7 +44,7 @@ import org.olat.modules.fo.model.ForumThread; public class ThreadListDataModel extends DefaultFlexiTableDataModel<ForumThread> implements SortableFlexiTableDataModel<ForumThread> { - private Translator translator; + private final Translator translator; public ThreadListDataModel(FlexiTableColumnModel columnModel, Translator translator) { super(columnModel); diff --git a/src/main/java/org/olat/search/ui/ResultsSearchController.java b/src/main/java/org/olat/search/ui/ResultsSearchController.java index ace255d35c3108706befb2169af651d1823f986d..e2b810c250efb13679f054d9d100661fabad24f7 100644 --- a/src/main/java/org/olat/search/ui/ResultsSearchController.java +++ b/src/main/java/org/olat/search/ui/ResultsSearchController.java @@ -116,7 +116,7 @@ public class ResultsSearchController extends SearchInputController { } @Override - protected void formOK(UserRequest ureq) { + public void formOK(UserRequest ureq) { doSearch(ureq); } @@ -126,7 +126,7 @@ public class ResultsSearchController extends SearchInputController { } @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + public void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == searchButton) { doSearch(ureq); } else if (didYouMeanLinks != null && didYouMeanLinks.contains(source)) { diff --git a/src/main/java/org/olat/search/ui/SearchInputController.java b/src/main/java/org/olat/search/ui/SearchInputController.java index 0d0c43d10fc5885ceb71d342385bbe8ddef2a6eb..f068623d1fa19b66ecb4bcdaabb2383d03c2ebcf 100644 --- a/src/main/java/org/olat/search/ui/SearchInputController.java +++ b/src/main/java/org/olat/search/ui/SearchInputController.java @@ -268,7 +268,7 @@ public class SearchInputController extends FormBasicController implements Generi } @Override - protected void formOK(UserRequest ureq) { + public void formOK(UserRequest ureq) { doSearch(ureq); } @@ -278,7 +278,7 @@ public class SearchInputController extends FormBasicController implements Generi } @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + public void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == searchButton) { doSearch(ureq); } else if (didYouMeanLinks != null && didYouMeanLinks.contains(source)) { @@ -289,10 +289,7 @@ public class SearchInputController extends FormBasicController implements Generi } protected void doSearch(UserRequest ureq) { - if (resultCtlr != null) { - removeAsListenerAndDispose(resultCtlr); - resultCtlr = null; - } + if (resultCtlr != null) return; String oldSearchString = null; Properties props = getPersistedSearch(); @@ -410,7 +407,7 @@ public class SearchInputController extends FormBasicController implements Generi } @Override - protected void event(UserRequest ureq, Controller source, Event event) { + public void event(UserRequest ureq, Controller source, Event event) { if (source == resultCtlr) { if (event instanceof SearchEvent) { SearchEvent goEvent = (SearchEvent)event; @@ -420,6 +417,7 @@ public class SearchInputController extends FormBasicController implements Generi setSearchString(resultCtlr.getSearchString()); } } else if (source == searchDialogBox) { + cleanUp(); fireEvent(ureq, Event.DONE_EVENT); } } @@ -427,10 +425,17 @@ public class SearchInputController extends FormBasicController implements Generi public void closeSearchDialogBox() { if(searchDialogBox != null) { searchDialogBox.deactivate(); - searchDialogBox = null; + cleanUp(); } } + private void cleanUp() { + removeAsListenerAndDispose(searchDialogBox); + removeAsListenerAndDispose(resultCtlr); + searchDialogBox = null; + resultCtlr = null; + } + /** * * @param ureq @@ -438,7 +443,7 @@ public class SearchInputController extends FormBasicController implements Generi */ public void gotoSearchResult(UserRequest ureq, ResultDocument document) { try { - // attach the launcher data + // attach the launcher data closeSearchDialogBox(); String url = document.getResourceUrl(); if(!StringHelper.containsNonWhitespace(url)) { @@ -446,8 +451,8 @@ public class SearchInputController extends FormBasicController implements Generi getWindowControl().setWarning(getTranslator().translate("error.resource.could.not.found")); } else { BusinessControl bc = BusinessControlFactory.getInstance().createFromString(url); - WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); - NewControllerFactory.getInstance().launch(ureq, bwControl); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); + NewControllerFactory.getInstance().launch(ureq, bwControl); } } catch (Exception ex) { log.debug("Document not found"); diff --git a/src/test/java/org/olat/modules/fo/ForumManagerTest.java b/src/test/java/org/olat/modules/fo/ForumManagerTest.java index 143a8ff7d5e7d0427e11b0eab5d161b58218dd67..302935dc930c88dfa9700757f10a09f4f4eeb0d7 100644 --- a/src/test/java/org/olat/modules/fo/ForumManagerTest.java +++ b/src/test/java/org/olat/modules/fo/ForumManagerTest.java @@ -29,12 +29,17 @@ package org.olat.modules.fo; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.Locale; +import java.util.UUID; import org.junit.Assert; import org.junit.Test; +import org.olat.basesecurity.BaseSecurity; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.model.ForumThread; +import org.olat.modules.fo.model.ForumUserStatistics; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.olat.user.UserManager; @@ -54,9 +59,11 @@ public class ForumManagerTest extends OlatTestCase { public UserManager userManager; @Autowired public ForumManager forumManager; + @Autowired + public BaseSecurity securityManager; @Test - public void testGetThread() { + public void getThread() { Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-4"); Forum fo = forumManager.addAForum(); dbInstance.commit(); @@ -77,21 +84,21 @@ public class ForumManagerTest extends OlatTestCase { } @Test - public void testCreateAndGetMessages_loadForumID() throws Exception { + public void createAndGetMessages_loadForumID() throws Exception { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); Forum fo = forumManager.addAForum(); dbInstance.commit(); Message topMessage = forumManager.createMessage(fo, id1, false); - topMessage.setTitle("stufe 0: subject 0"); - topMessage.setBody("body/n dep 0"); + topMessage.setTitle("Create and get message"); + topMessage.setBody("Create and get message"); forumManager.addTopMessage(topMessage); dbInstance.commit(); Message reply = forumManager.createMessage(fo, id2, false); - reply.setTitle("stufe 0: subject 0"); - reply.setBody("body/n dep 0"); + reply.setTitle("Re: Create and get message"); + reply.setBody("Create and get message"); forumManager.replyToMessage(reply, topMessage); dbInstance.commitAndCloseSession(); @@ -107,36 +114,394 @@ public class ForumManagerTest extends OlatTestCase { } @Test - public void testCountMessagesByForumID() { + public void getForumThreads() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get forum threads"); + thread1.setBody("Get forum threads"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get forum threads"); + reply.setBody("Get forum threads"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + Message thread2 = forumManager.createMessage(forum, id1, false); + thread2.setTitle("More on get forum threads"); + thread2.setBody("More on get forum threads"); + forumManager.addTopMessage(thread2); + dbInstance.commit(); + + List<ForumThread> forumThreads = forumManager.getForumThreads(forum, id1); + Assert.assertNotNull(forumThreads); + Assert.assertEquals(2, forumThreads.size()); + + ForumThread forumThread1 = null; + ForumThread forumThread2 = null; + for(ForumThread forumThread:forumThreads) { + if(forumThread.getKey().equals(thread1.getKey())) { + forumThread1 = forumThread; + } else if(forumThread.getKey().equals(thread2.getKey())) { + forumThread2 = forumThread; + } + } + + Assert.assertNotNull(forumThread1); + Assert.assertNotNull(forumThread2); + } + + @Test + public void getForumUserStatistics() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get forum user statistics"); + thread1.setBody("Get forum user statistics"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get forum user statistics"); + reply.setBody("Get forum user statistics and other usefull stuff to we need"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + List<ForumUserStatistics> userStatistics = forumManager.getForumUserStatistics(forum); + Assert.assertNotNull(userStatistics); + Assert.assertEquals(2, userStatistics.size()); + + ForumUserStatistics userStatistic1 = null; + ForumUserStatistics userStatistic2 = null; + for(ForumUserStatistics userStatistic:userStatistics) { + if(userStatistic.getIdentity().getKey().equals(id1.getKey())) { + userStatistic1 = userStatistic; + } else if(userStatistic.getIdentity().getKey().equals(id2.getKey())) { + userStatistic2 = userStatistic; + } + } + + Assert.assertNotNull(userStatistic1); + Assert.assertNotNull(userStatistic2); + + //stats user 1 + Assert.assertEquals(1, userStatistic1.getNumOfThreads()); + Assert.assertEquals(0, userStatistic1.getNumOfReplies()); + Assert.assertTrue(userStatistic1.getNumOfWords() > 1); + Assert.assertTrue(userStatistic1.getNumOfCharacters() > 1); + + //stats user 2 + Assert.assertEquals(0, userStatistic2.getNumOfThreads()); + Assert.assertEquals(1, userStatistic2.getNumOfReplies()); + Assert.assertTrue(userStatistic2.getNumOfWords() > 1); + Assert.assertTrue(userStatistic2.getNumOfCharacters() > 1); + } + + @Test + public void getLightMessagesByForum() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get messages light by forum"); + thread1.setBody("Get messages light by forum"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get messages light by forum"); + reply.setBody("Get messages light by forum and other usefull stuff we need"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + //load and check the messages + List<MessageLight> messages = forumManager.getLightMessagesByForum(forum); + dbInstance.commitAndCloseSession(); + + MessageLight message1 = null; + MessageLight message2 = null; + for(MessageLight message:messages) { + if(message.getKey().equals(thread1.getKey())) { + message1 = message; + } else if(message.getKey().equals(reply.getKey())) { + message2 = message; + } + } + + //check thread + Assert.assertNotNull(message1); + Assert.assertEquals(thread1.getKey(), message1.getKey()); + Assert.assertEquals(thread1.getTitle(), message1.getTitle()); + Assert.assertEquals(thread1.getBody(), message1.getBody()); + Assert.assertEquals(thread1.getCreator(), id1); + Assert.assertNull(message1.getThreadtop()); + + //check reply + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(message2); + Assert.assertEquals(reply.getKey(), message2.getKey()); + Assert.assertEquals(reply.getTitle(), message2.getTitle()); + Assert.assertEquals(reply.getBody(), message2.getBody()); + Assert.assertEquals(reply.getCreator(), id2); + Assert.assertNotNull(message2.getThreadtop()); + Assert.assertEquals(thread1.getKey(), message2.getThreadtop().getKey()); + } + + @Test + public void getLightMessagesByThread() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get messages light by thread"); + thread1.setBody("Get messages light by thread"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get messages light by thread"); + reply.setBody("Get messages light by thread and other usefull stuff we need"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + //load and check the messages + List<MessageLight> messages = forumManager.getLightMessagesByThread(forum, thread1); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(messages); + Assert.assertEquals(1, messages.size()); + MessageLight message = messages.get(0); + Assert.assertNotNull(message); + Assert.assertEquals(reply.getKey(), message.getKey()); + Assert.assertEquals(reply.getTitle(), message.getTitle()); + Assert.assertEquals(reply.getBody(), message.getBody()); + Assert.assertEquals(reply.getCreator(), id2); + Assert.assertNotNull(message.getThreadtop()); + Assert.assertEquals(thread1.getKey(), message.getThreadtop().getKey()); + } + + @Test + public void getLightMessagesOfGuests() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity guest2 = securityManager.getAndUpdateAnonymousUserForLanguage(Locale.ENGLISH); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get messages light of guests"); + thread1.setBody("Get messages light of guests"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, guest2, true); + reply.setTitle("Re: Get messages light of guests"); + reply.setBody("Get messages light of guests and other usefull stuff we need"); + reply.setPseudonym("Guest pseudo 1289"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + //load and check the messages + List<MessageLight> messages = forumManager.getLightMessagesOfGuests(forum); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(messages); + Assert.assertEquals(1, messages.size()); + MessageLight message = messages.get(0); + Assert.assertNotNull(message); + Assert.assertEquals(reply.getKey(), message.getKey()); + Assert.assertEquals(reply.getTitle(), message.getTitle()); + Assert.assertEquals(reply.getBody(), message.getBody()); + Assert.assertEquals("Guest pseudo 1289", message.getPseudonym()); + Assert.assertNull(message.getCreator()); + Assert.assertTrue(message.isGuest()); + Assert.assertNotNull(message.getThreadtop()); + Assert.assertEquals(thread1.getKey(), message.getThreadtop().getKey()); + } + + @Test + public void getLightMessagesByUser() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Identity id3 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-3"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get messages light by user"); + thread1.setBody("Get messages light by user"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get messages light by user"); + reply.setBody("Get messages light by user and other usefull stuff we need"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + Message replyPseudo = forumManager.createMessage(forum, id3, false); + replyPseudo.setTitle("Re: Get messages light by user"); + replyPseudo.setBody("Get messages light by user and other usefull stuff we need"); + replyPseudo.setPseudonym("Id pseudo 3476"); + forumManager.replyToMessage(replyPseudo, thread1); + dbInstance.commitAndCloseSession(); + + //load and check the messages of first user + List<MessageLight> messagesOfUser1 = forumManager.getLightMessagesByUser(forum, id1); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(messagesOfUser1); + Assert.assertEquals(1, messagesOfUser1.size()); + MessageLight messageOfUser1 = messagesOfUser1.get(0); + Assert.assertNotNull(messageOfUser1); + Assert.assertEquals(thread1.getKey(), messageOfUser1.getKey()); + Assert.assertEquals(thread1.getTitle(), messageOfUser1.getTitle()); + Assert.assertEquals(thread1.getBody(), messageOfUser1.getBody()); + Assert.assertNotNull(messageOfUser1.getCreator()); + Assert.assertEquals(id1, messageOfUser1.getCreator()); + Assert.assertFalse(messageOfUser1.isGuest()); + Assert.assertNull(messageOfUser1.getThreadtop()); + + //load and check the messages of second user + List<MessageLight> messagesOfUser2 = forumManager.getLightMessagesByUser(forum, id2); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(messagesOfUser2); + Assert.assertEquals(1, messagesOfUser2.size()); + MessageLight messageOfUser2 = messagesOfUser2.get(0); + Assert.assertNotNull(messageOfUser2); + Assert.assertEquals(reply.getKey(), messageOfUser2.getKey()); + Assert.assertEquals(reply.getTitle(), messageOfUser2.getTitle()); + Assert.assertEquals(reply.getBody(), messageOfUser2.getBody()); + Assert.assertNotNull(messageOfUser2.getCreator()); + Assert.assertEquals(id2, messageOfUser2.getCreator()); + Assert.assertFalse(messageOfUser2.isGuest()); + Assert.assertNotNull(messageOfUser2.getThreadtop()); + Assert.assertEquals(thread1.getKey(), messageOfUser2.getThreadtop().getKey()); + + //load and check the messages of third user which use a pseudo + List<MessageLight> messagesOfUser3 = forumManager.getLightMessagesByUser(forum, id3); + dbInstance.commitAndCloseSession(); + Assert.assertNotNull(messagesOfUser3); + Assert.assertTrue(messagesOfUser3.isEmpty()); + } + + @Test + public void getLightMessagesByUserUnderPseudo() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum forum = forumManager.addAForum(); + dbInstance.commit(); + + Message thread1 = forumManager.createMessage(forum, id1, false); + thread1.setTitle("Get messages light by user with pseudo"); + thread1.setBody("Get messages light by user with pseudo"); + forumManager.addTopMessage(thread1); + dbInstance.commit(); + + Message reply = forumManager.createMessage(forum, id2, false); + reply.setTitle("Re: Get messages light by user with pseudo"); + reply.setBody("Get messages light by user and other usefull stuff we need"); + forumManager.replyToMessage(reply, thread1); + dbInstance.commitAndCloseSession(); + + Message replyPseudo = forumManager.createMessage(forum, id2, false); + replyPseudo.setTitle("Re: Get messages light by user with pseudo"); + replyPseudo.setBody("Get messages light by user and other usefull stuff we need"); + String pseudo = "Id pseudo " + UUID.randomUUID(); + replyPseudo.setPseudonym(pseudo); + forumManager.replyToMessage(replyPseudo, thread1); + dbInstance.commitAndCloseSession(); + + //load and check the messages of user with pseudo + List<MessageLight> messagesOfUser2 = forumManager.getLightMessagesByUserUnderPseudo(forum, id2, pseudo); + dbInstance.commitAndCloseSession(); + + Assert.assertNotNull(messagesOfUser2); + Assert.assertEquals(1, messagesOfUser2.size()); + MessageLight messageUnderPseudo = messagesOfUser2.get(0); + Assert.assertNotNull(messageUnderPseudo); + Assert.assertEquals(replyPseudo.getKey(), messageUnderPseudo.getKey()); + Assert.assertEquals(replyPseudo.getTitle(), messageUnderPseudo.getTitle()); + Assert.assertEquals(replyPseudo.getBody(), messageUnderPseudo.getBody()); + Assert.assertNotNull(messageUnderPseudo.getCreator()); + Assert.assertEquals(id2, messageUnderPseudo.getCreator()); + Assert.assertFalse(messageUnderPseudo.isGuest()); + Assert.assertNotNull(messageUnderPseudo.getThreadtop()); + Assert.assertEquals(thread1.getKey(), messageUnderPseudo.getThreadtop().getKey()); + } + + @Test + public void countMessagesByForumID() { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); Forum fo = forumManager.addAForum(); dbInstance.commit(); Message topMessage = forumManager.createMessage(fo, id1, false); - topMessage.setTitle("stufe 0: subject 0"); - topMessage.setBody("body/n dep 0"); + topMessage.setTitle("Messages count by forum"); + topMessage.setBody("Messages count by forum"); forumManager.addTopMessage(topMessage); dbInstance.commit(); Message reply = forumManager.createMessage(fo, id2, false); - reply.setTitle("stufe 1: subject 0"); - reply.setBody("body/n dep 0"); + reply.setTitle("Re: Messages count by forum"); + reply.setBody("Messages count by forum"); forumManager.replyToMessage(reply, topMessage); dbInstance.commit(); Message reply2 = forumManager.createMessage(fo, id1, false); - reply2.setTitle("stufe 1: subject 0"); - reply2.setBody("body/n dep 0"); + reply2.setTitle("Re: Re: Messages count by forum"); + reply2.setBody("Messages count by forum"); forumManager.replyToMessage(reply2, reply); dbInstance.commit(); int numOfMessages = forumManager.countMessagesByForumID(fo.getKey()); Assert.assertEquals("Not the right number of messages for this forum", 3, numOfMessages); } + + @Test + public void countThreadsByForumID() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("Threads count by forum"); + topMessage.setBody("Threads count by forum"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("Re: Threads count by forum"); + reply.setBody("Threads count by forum"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commit(); + + Message topMessage2 = forumManager.createMessage(fo, id2, false); + topMessage2.setTitle("More on threads count by forum"); + topMessage2.setBody("More on threads count by forum"); + forumManager.addTopMessage(topMessage2); + dbInstance.commit(); + + int numOfThreads = forumManager.countThreadsByForumID(fo.getKey()); + Assert.assertEquals("Not the right number of threads for this forum", 2, numOfThreads); + } @Test - public void testGetNewMessageInfo() { + public void getNewMessageInfo() { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-5"); Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-6"); Forum fo = forumManager.addAForum(); @@ -169,7 +534,7 @@ public class ForumManagerTest extends OlatTestCase { } @Test - public void testDeleteMessageTree() { + public void deleteMessageTree() { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-5"); Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-6"); Forum fo = forumManager.addAForum(); @@ -203,7 +568,7 @@ public class ForumManagerTest extends OlatTestCase { } @Test - public void testDeleteForum() { + public void deleteForum() { Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-7"); Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-8"); Forum fo = forumManager.addAForum(); diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java index a8b503a5a0081edfcc3368acd4c2b7da4004e665..697ddc6694345a7f30fcb05efff09f227e81eecc 100644 --- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java +++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java @@ -176,7 +176,7 @@ public class OOGraphene { public static final void waitAndCloseBlueMessageWindow(WebDriver browser) { try { - OOGraphene.waitElement(closeBlueBoxButtonBy, 1, browser); + waitElement(closeBlueBoxButtonBy, 1, browser); } catch (Exception e) { e.printStackTrace(); } @@ -188,10 +188,10 @@ public class OOGraphene { for(WebElement closeButton:closeButtons) { if(closeButton.isDisplayed()) { try { - clickCloseButton(closeButton); + clickCloseButton(browser, closeButton); } catch (TimeoutException e) { try { - clickCloseButton(closeButton); + clickCloseButton(browser, closeButton); } catch(Exception e2) { // } @@ -200,10 +200,10 @@ public class OOGraphene { } } - private static final void clickCloseButton(WebElement closeButton) { + private static final void clickCloseButton(WebDriver browser, WebElement closeButton) { try { closeButton.click(); - Graphene.waitModel() + Graphene.waitModel(browser) .withTimeout(1000, TimeUnit.MILLISECONDS) .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS) .until(new CloseAlertInfoPredicate()); @@ -211,4 +211,14 @@ public class OOGraphene { //e.printStackTrace(); } } + + /*public static void closeOffCanvas(WebDriver browser) { + By closeBy = By.cssSelector("a.o_offcanvas_close"); + List<WebElement> closeButtons = browser.findElements(closeBy); + if(closeButtons.size() == 1 && closeButtons.get(0).isDisplayed()) { + closeButtons.get(0).click(); + By bodyBy = By.xpath("//body[contains(@class,'o_offcanvas_right_visible')]"); + OOGraphene.waitElementDisappears(bodyBy, 2, browser); + } + }*/ } diff --git a/src/test/java/org/olat/selenium/page/group/GroupPage.java b/src/test/java/org/olat/selenium/page/group/GroupPage.java index 393ddee294610135434ba1b6392993c7a46b6f05..d4036a2252b7e311f29fab92a45855d41ba145f8 100644 --- a/src/test/java/org/olat/selenium/page/group/GroupPage.java +++ b/src/test/java/org/olat/selenium/page/group/GroupPage.java @@ -49,6 +49,7 @@ public class GroupPage { private static final By toolsBy = By.className("o_sel_collab_tools"); private static final By editDetails = By.className("o_sel_group_edit_title"); private static final By bookingConfigBy = By.className("o_sel_accesscontrol_create"); + private static final By memberMenuItem = By.cssSelector("li.o_sel_group_members a"); private WebDriver browser; @@ -148,30 +149,29 @@ public class GroupPage { OOGraphene.waitBusy(browser); } - public GroupPage setVisibility(boolean owners, boolean participants, boolean waitingList) { + public GroupPage setVisibility(boolean owners, boolean participants, boolean waitingList) { if(owners) { By showOwnersBy = By.cssSelector(".o_sel_group_show_owners input[type='checkbox']"); browser.findElement(showOwnersBy).click(); OOGraphene.waitBusy(browser); - OOGraphene.closeBlueMessageWindow(browser); + OOGraphene.waitElement(memberMenuItem, 2, browser); } if(participants) { By showParticipants = By.cssSelector(".o_sel_group_show_participants input[type='checkbox']"); browser.findElement(showParticipants).click(); OOGraphene.waitBusy(browser); - OOGraphene.closeBlueMessageWindow(browser); + OOGraphene.waitElement(memberMenuItem, 2, browser); } if(waitingList) { By showWaitingListBy = By.cssSelector(".o_sel_group_show_waiting_list input[type='checkbox']"); browser.findElement(showWaitingListBy).click(); OOGraphene.waitBusy(browser); - OOGraphene.closeBlueMessageWindow(browser); + OOGraphene.waitElement(memberMenuItem, 2, browser); } OOGraphene.waitBusy(browser); - OOGraphene.closeBlueMessageWindow(browser); return this; } @@ -276,9 +276,7 @@ public class GroupPage { public GroupPage assertParticipantList() { By participantListBy = By.id("o_sel_group_participants"); List<WebElement> participantListEl = browser.findElements(participantListBy); - if(participantListEl.size() == 0) { - System.out.println(); - } + Assert.assertFalse(participantListEl.isEmpty()); return this; } diff --git a/src/test/java/org/olat/selenium/page/user/UserAdminPage.java b/src/test/java/org/olat/selenium/page/user/UserAdminPage.java index 1a0628b43c35f1a7cc57d8151c75e79dbdeb0dce..3a502c369903ccb9ca77e4eddfa1ba2647111a62 100644 --- a/src/test/java/org/olat/selenium/page/user/UserAdminPage.java +++ b/src/test/java/org/olat/selenium/page/user/UserAdminPage.java @@ -123,6 +123,7 @@ public class UserAdminPage { By saveBy = By.cssSelector(".o_sel_id_create button.btn-primary"); browser.findElement(saveBy).click(); OOGraphene.waitBusy(browser); + OOGraphene.waitAndCloseBlueMessageWindow(browser); return this; } diff --git a/src/test/java/org/olat/test/rest/UserRestClient.java b/src/test/java/org/olat/test/rest/UserRestClient.java index 6cd270ad104bb3eb03d11f5576fa55ae652615f8..01f14fa46afc1b55c5e4bd3e12e42dcde7eea1fc 100644 --- a/src/test/java/org/olat/test/rest/UserRestClient.java +++ b/src/test/java/org/olat/test/rest/UserRestClient.java @@ -111,7 +111,7 @@ public class UserRestClient { UserVO vo = new UserVO(); String rndUsername = (name + "-" + uuid).substring(0, 24); - vo.setLogin(rndUsername); + vo.setLogin(rndUsername.toLowerCase()); String rndPassword = ("passwd-" + uuid).substring(0, 24); vo.setPassword(rndPassword); vo.setFirstName(name + "-"+ role + "-" + uuid);