diff --git a/src/main/java/org/olat/course/nodes/bc/BCWebService.java b/src/main/java/org/olat/course/nodes/bc/BCWebService.java index ef57f0cd2f3610c4578c790118b7c1bf088dd0ee..a02c450ff110ab1adcd752094b90a5866a8508ca 100644 --- a/src/main/java/org/olat/course/nodes/bc/BCWebService.java +++ b/src/main/java/org/olat/course/nodes/bc/BCWebService.java @@ -24,7 +24,9 @@ import static org.olat.restapi.security.RestSecurityHelper.isAuthor; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; @@ -115,26 +117,25 @@ public class BCWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.UNAUTHORIZED).build(); } - boolean subscribed = false; + final Set<String> subscribed = new HashSet<String>(); NotificationsManager man = NotificationsManager.getInstance(); List<String> notiTypes = Collections.singletonList("FolderModule"); List<Subscriber> subs = man.getSubscribers(ureq.getIdentity(), notiTypes); for(Subscriber sub:subs) { Long courseKey = sub.getPublisher().getResId(); if(courseId.equals(courseKey)) { - subscribed = true; + subscribed.add(sub.getPublisher().getSubidentifier()); break; } } - final boolean subscribed_ = subscribed; final List<FolderVO> folderVOs = new ArrayList<FolderVO>(); new CourseTreeVisitor(course, ureq.getUserSession().getIdentityEnvironment()).visit(new Visitor() { @Override public void visit(INode node) { if(node instanceof BCCourseNode) { BCCourseNode bcNode = (BCCourseNode)node; - FolderVO folder = createFolderVO(ureq.getUserSession().getIdentityEnvironment(), course, bcNode, subscribed_); + FolderVO folder = createFolderVO(ureq.getUserSession().getIdentityEnvironment(), course, bcNode, subscribed); folderVOs.add(folder); } } @@ -280,15 +281,14 @@ public class BCWebService extends AbstractCourseNodeWebService { UserRequest ureq = getUserRequest(httpRequest); boolean accessible = (new CourseTreeVisitor(course, ureq.getUserSession().getIdentityEnvironment())).isAccessible(courseNode); if(accessible) { - boolean subscribed = false; + Set<String> subscribed = new HashSet<String>(); NotificationsManager man = NotificationsManager.getInstance(); List<String> notiTypes = Collections.singletonList("FolderModule"); List<Subscriber> subs = man.getSubscribers(ureq.getIdentity(), notiTypes); for(Subscriber sub:subs) { Long courseKey = sub.getPublisher().getResId(); if(courseId.equals(courseKey)) { - subscribed = true; - break; + subscribed.add(sub.getPublisher().getSubidentifier()); } } @@ -367,14 +367,14 @@ public class BCWebService extends AbstractCourseNodeWebService { } } - public static FolderVO createFolderVO(IdentityEnvironment ienv, ICourse course, BCCourseNode bcNode, boolean subscribed) { + public static FolderVO createFolderVO(IdentityEnvironment ienv, ICourse course, BCCourseNode bcNode, Set<String> subscribed) { OlatNamedContainerImpl container = BCCourseNode.getSecurisedNodeFolderContainer(bcNode, course.getCourseEnvironment(), ienv); VFSSecurityCallback secCallback = container.getLocalSecurityCallback(); FolderVO folderVo = new FolderVO(); folderVo.setName(course.getCourseTitle()); folderVo.setDetailsName(bcNode.getShortTitle()); - folderVo.setSubscribed(subscribed); + folderVo.setSubscribed(subscribed.contains(bcNode.getIdent())); folderVo.setCourseKey(course.getResourceableId()); folderVo.setCourseNodeId(bcNode.getIdent()); folderVo.setWrite(secCallback.canWrite()); diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java index 3d6a96cf007f0ce47ff808b0ee51d7a5a6f3b5e2..5858b831a28f5cc00c1e4a382927fddef57e5f0f 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesInfosWebService.java @@ -4,7 +4,11 @@ import static org.olat.restapi.security.RestSecurityHelper.getIdentity; import static org.olat.restapi.security.RestSecurityHelper.getRoles; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.DefaultValue; @@ -23,6 +27,8 @@ import org.olat.core.id.Identity; import org.olat.core.id.IdentityEnvironment; import org.olat.core.id.Roles; import org.olat.core.util.nodes.INode; +import org.olat.core.util.notifications.NotificationsManager; +import org.olat.core.util.notifications.Subscriber; import org.olat.core.util.tree.Visitor; import org.olat.course.CourseFactory; import org.olat.course.CourseModule; @@ -43,6 +49,15 @@ import org.olat.restapi.support.vo.CourseInfoVO; import org.olat.restapi.support.vo.CourseInfoVOes; import org.olat.restapi.support.vo.FolderVO; +/** + * + * Description:<br> + * + * <P> + * Initial Date: 7 févr. 2012 <br> + * + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + */ @Path("repo/courses/infos") public class CoursesInfosWebService { @@ -73,9 +88,38 @@ public class CoursesInfosWebService { int totalCount = rm.countGenericANDQueryWithRolesRestriction(params, true); List<RepositoryEntry> repoEntries = rm.genericANDQueryWithRolesRestriction(params, start, limit, true); List<CourseInfoVO> infos = new ArrayList<CourseInfoVO>(); + + + final Set<Long> forumNotified = new HashSet<Long>(); + final Map<Long,Set<String>> courseNotified = new HashMap<Long,Set<String>>(); + NotificationsManager man = NotificationsManager.getInstance(); + {//collect subscriptions + List<String> notiTypes = new ArrayList<String>(); + notiTypes.add("FolderModule"); + notiTypes.add("Forum"); + List<Subscriber> subs = man.getSubscribers(identity, notiTypes); + for(Subscriber sub:subs) { + String publisherType = sub.getPublisher().getType(); + String resName = sub.getPublisher().getResName(); + + if("CourseModule".equals(resName)) { + if("FolderModule".equals(publisherType)) { + Long courseKey = sub.getPublisher().getResId(); + if(!courseNotified.containsKey(courseKey)) { + courseNotified.put(courseKey,new HashSet<String>()); + } + courseNotified.get(courseKey).add(sub.getPublisher().getSubidentifier()); + } else if ("Forum".equals(publisherType)) { + Long forumKey = Long.parseLong(sub.getPublisher().getData()); + forumNotified.add(forumKey); + } + } + } + } + for(RepositoryEntry entry:repoEntries) { - CourseInfoVO info = collect(identity, roles, entry); + CourseInfoVO info = collect(identity, roles, entry, forumNotified, courseNotified); if(info != null) { infos.add(info); } @@ -91,7 +135,9 @@ public class CoursesInfosWebService { } } - private CourseInfoVO collect(Identity identity, Roles roles, RepositoryEntry entry) { + private CourseInfoVO collect(final Identity identity, final Roles roles, final RepositoryEntry entry, + final Set<Long> forumNotified, final Map<Long,Set<String>> courseNotified) { + CourseInfoVO info = new CourseInfoVO(); info.setRepoEntryKey(entry.getKey()); info.setSoftKey(entry.getSoftkey()); @@ -110,10 +156,10 @@ public class CoursesInfosWebService { public void visit(INode node) { if(node instanceof BCCourseNode) { BCCourseNode bcNode = (BCCourseNode)node; - folders.add(BCWebService.createFolderVO(ienv, course, bcNode, false)); + folders.add(BCWebService.createFolderVO(ienv, course, bcNode, courseNotified.get(course.getResourceableId()))); } else if (node instanceof FOCourseNode) { FOCourseNode forumNode = (FOCourseNode)node; - forums.add(ForumCourseNodeWebService.createForumVO(course, forumNode, null)); + forums.add(ForumCourseNodeWebService.createForumVO(course, forumNode, forumNotified)); } } }); diff --git a/src/main/java/org/olat/restapi/support/vo/FolderVOes.java b/src/main/java/org/olat/restapi/support/vo/FolderVOes.java index 79c298249e9f90b94140bc0c58f98786abe81671..513bf203d34269488148d0bb5572cba70e97d326 100644 --- a/src/main/java/org/olat/restapi/support/vo/FolderVOes.java +++ b/src/main/java/org/olat/restapi/support/vo/FolderVOes.java @@ -40,7 +40,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class FolderVOes { @XmlElementWrapper(name="folders") - @XmlElement(name="folders") + @XmlElement(name="folder") private FolderVO[] folders; @XmlAttribute(name="totalCount") private int totalCount; diff --git a/src/main/java/org/olat/restapi/user/UserFoldersWebService.java b/src/main/java/org/olat/restapi/user/UserFoldersWebService.java index a3923e98ccb49a9c2623e19d49a048c0f9901884..69b849bf7f2d922c54691654a92b3d7b1584a8ef 100644 --- a/src/main/java/org/olat/restapi/user/UserFoldersWebService.java +++ b/src/main/java/org/olat/restapi/user/UserFoldersWebService.java @@ -26,8 +26,10 @@ import static org.olat.restapi.security.RestSecurityHelper.isAdmin; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -186,7 +188,7 @@ public class UserFoldersWebService { } final Map<Long,Long> groupNotified = new HashMap<Long,Long>(); - final Map<Long,Long> courseNotified = new HashMap<Long,Long>(); + final Map<Long,Set<String>> courseNotified = new HashMap<Long,Set<String>>(); NotificationsManager man = NotificationsManager.getInstance(); {//collect subscriptions List<String> notiTypes = Collections.singletonList("FolderModule"); @@ -198,7 +200,10 @@ public class UserFoldersWebService { groupNotified.put(groupKey, sub.getPublisher().getResId()); } else if("CourseModule".equals(resName)) { Long courseKey = sub.getPublisher().getResId(); - courseNotified.put(courseKey, sub.getPublisher().getResId()); + if(!courseNotified.containsKey(courseKey)) { + courseNotified.put(courseKey,new HashSet<String>()); + } + courseNotified.get(courseKey).add(sub.getPublisher().getSubidentifier()); } } } @@ -221,7 +226,7 @@ public class UserFoldersWebService { public void visit(INode node) { if(node instanceof BCCourseNode) { BCCourseNode bcNode = (BCCourseNode)node; - FolderVO folder = BCWebService.createFolderVO(ienv, course, bcNode, courseNotified.containsKey(bcNode.getIdent())); + FolderVO folder = BCWebService.createFolderVO(ienv, course, bcNode, courseNotified.get(course.getResourceableId())); folderVOs.add(folder); } } diff --git a/src/test/java/org/olat/restapi/CoursesForumsTest.java b/src/test/java/org/olat/restapi/CoursesForumsTest.java index dcf1ae0b355df2d42f4d8ec94ee49a357122a96a..babc96672e642709381132ecfaade3e688a7208c 100644 --- a/src/test/java/org/olat/restapi/CoursesForumsTest.java +++ b/src/test/java/org/olat/restapi/CoursesForumsTest.java @@ -131,21 +131,6 @@ public class CoursesForumsTest extends OlatJerseyTestCase { assertNotNull(threads); } - @Test - public void testGetCourseInfos() throws IOException, URISyntaxException { - RestConnection conn = new RestConnection(); - boolean loggedIN = conn.login("administrator", "openolat"); - assertTrue(loggedIN); - - URI uri = UriBuilder.fromUri(getContextURI()).path("repo").path("courses").path("infos").build(); - - HttpGet get = conn.createGet(uri, MediaType.APPLICATION_JSON + ";pagingspec=1.0", true); - HttpResponse response = conn.execute(get); - assertEquals(200, response.getStatusLine().getStatusCode()); - CourseInfoVOes infos = conn.parse(response, CourseInfoVOes.class); - assertNotNull(infos); - } - private URI getNodeURI() { return UriBuilder.fromUri(getContextURI()).path("repo").path("courses").path(course1.getResourceableId().toString()) .path("elements").path("forum").path(forumNode.getIdent()).build(); @@ -160,8 +145,4 @@ public class CoursesForumsTest extends OlatJerseyTestCase { return UriBuilder.fromUri(getContextURI()).path("repo").path("courses").path(course1.getResourceableId().toString()) .path("elements").path("forum").build(); } - - - - } diff --git a/src/test/java/org/olat/restapi/CoursesTest.java b/src/test/java/org/olat/restapi/CoursesTest.java index 0db1485195ac0a53a92c4e07281c586e02c26360..e7474766cfabf12e982057d9b8bfc111eb82b33d 100644 --- a/src/test/java/org/olat/restapi/CoursesTest.java +++ b/src/test/java/org/olat/restapi/CoursesTest.java @@ -34,6 +34,7 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.net.URISyntaxException; import java.util.List; import javax.ws.rs.core.MediaType; @@ -42,6 +43,8 @@ import javax.ws.rs.core.UriBuilder; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; import org.junit.Before; @@ -55,6 +58,7 @@ import org.olat.course.ICourse; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.restapi.repository.course.CoursesWebService; +import org.olat.restapi.support.vo.CourseInfoVOes; import org.olat.restapi.support.vo.CourseVO; import org.olat.restapi.support.vo.CourseVOes; import org.olat.test.OlatJerseyTestCase; @@ -149,6 +153,21 @@ public class CoursesTest extends OlatJerseyTestCase { assertNotNull(re.getOwnerGroup()); } + @Test + public void testGetCourseInfos() throws IOException, URISyntaxException { + RestConnection conn = new RestConnection(); + boolean loggedIN = conn.login("administrator", "openolat"); + assertTrue(loggedIN); + + URI uri = conn.getContextURI().path("repo").path("courses").path("infos").build(); + + HttpGet get = conn.createGet(uri, MediaType.APPLICATION_JSON + ";pagingspec=1.0", true); + HttpResponse response = conn.execute(get); + assertEquals(200, response.getStatusLine().getStatusCode()); + CourseInfoVOes infos = conn.parse(response, CourseInfoVOes.class); + assertNotNull(infos); + } + protected List<CourseVO> parseCourseArray(String body) { try { ObjectMapper mapper = new ObjectMapper(jsonFactory);