Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -rf4c79beeec8eea50e99a8d2cde21c27d45aa446d -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r1a2d0829cd190acb13d0531c34199d4ca02e9e4c -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/OrganisationDTOFactory.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/OrganisationDTOFactory.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/OrganisationDTOFactory.java (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -0,0 +1,135 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.workspace.service; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.Vector; + +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; + +public class OrganisationDTOFactory { + + /** Convert the given list of organisation objects to organisationDTOs, and put in the organisationDTOs set. + * If organisationDTOs is null, then creates a new set. This allows the call function to build up + * an overall set of organisations more efficiently. + * + * Returns the organisationDTOs set. + * @param organisations + * @param organisationDTOs + */ + public static Set convertToDTOs(List organisations, Set organisationDTOs) { + Set newDTOs = organisationDTOs != null ? organisationDTOs : new HashSet(); + Iterator iterator = organisations.iterator(); + + while (iterator.hasNext()) { + Organisation organisation = (Organisation) iterator.next(); + newDTOs.add(organisation.getOrganisationDTO()); + } + + return newDTOs; + + } + /** Convert the given list of organisation DTOs to a hierarchy of OrganisationDTOs. */ + public static OrganisationDTO createTree(Collection orgs, OrganisationDTO root){ + Vector neworgs = new Vector(); + OrganisationDTO rootOrgDTO = root; + Iterator it = orgs.iterator(); + while(it.hasNext()){ + if(rootOrgDTO == null) { + OrganisationDTO rt = new OrganisationDTO(new Integer(-1), new Integer(-1), "Root", "Root Description"); + OrganisationDTO initial = (OrganisationDTO) it.next(); + rt.addNode(initial); + rootOrgDTO = rt; + } else { + OrganisationDTO organisationDTO = (OrganisationDTO) it.next(); + + OrganisationDTO parent = findParent(rootOrgDTO, organisationDTO); + if(parent!=null) { + rootOrgDTO = parent; + } else { + neworgs.add(organisationDTO); + } + } + } + + if(neworgs.size() > 0){ + if(orgs.size() == neworgs.size()) + rootOrgDTO.addNodes(orgs); + else + return createTree(neworgs, rootOrgDTO); + } + + return rootOrgDTO; + } + + private static OrganisationDTO findParent(OrganisationDTO root, OrganisationDTO tmp){ + if(root.getOrganisationID().equals(tmp.getParentID())){ + root.addNode(tmp); + return root; + } else if(root.getParentID().equals(tmp.getOrganisationID())){ + tmp.addNode(root); + return tmp; + } else { + // check to see if can add to tree + if(checkNodes(root, tmp)) + return root; + else + return null; + } + } + + private static boolean checkNodes(OrganisationDTO root, OrganisationDTO tmp){ + Vector nodes = root.getNodes(); + if(nodes.size() > 0){ + Iterator it = nodes.iterator(); + while(it.hasNext()){ + OrganisationDTO child = (OrganisationDTO) it.next(); + + if(child.getOrganisationID().equals(tmp.getParentID())) { + child.addNode(tmp); + return true; + } else if(child.getParentID().equals(tmp.getOrganisationID())) { + OrganisationDTO temp = child; + it.remove(); + tmp.addNode(temp); + root.addNode(tmp); + return true; + } else { + if(checkNodes(child, tmp)) + return true; + } + } + + } + + return false; + } + +} Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java =================================================================== diff -u -r4d45967cbfe2e48757cf6a4a1b2f9ba49576427f -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision 4d45967cbfe2e48757cf6a4a1b2f9ba49576427f) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -1403,30 +1403,24 @@ public String getOrganisationsByUserRole(Integer userID, String[] roles) throws IOException { User user = userDAO.getUserById(userID); - Set organisations = new HashSet(); - + Set organisations = new HashSet(); + if (user!=null) { for(int i=0; i orgs = new Vector(organisations); - flashMessage = new FlashMessage( - MSG_KEY_ORG_BY_ROLE, orgs); + MSG_KEY_ORG_BY_ROLE, OrganisationDTOFactory.createTree(organisations, null)); } else flashMessage = FlashMessage.getNoSuchUserExists( MSG_KEY_ORG_BY_ROLE, userID); return flashMessage.serializeMessage(); } - + /** * @see org.lamsfoundation.lams.workspace.service.IWorkspaceManagementService#getUsersFromOrganisationByRole(Integer, String) */ Index: lams_central/test/java/org/lamsfoundation/lams/authoring/service/TestAuthoringService.java =================================================================== diff -u -rde1940e60766f8901436c6ab567c692685d5b35c -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd --- lams_central/test/java/org/lamsfoundation/lams/authoring/service/TestAuthoringService.java (.../TestAuthoringService.java) (revision de1940e60766f8901436c6ab567c692685d5b35c) +++ lams_central/test/java/org/lamsfoundation/lams/authoring/service/TestAuthoringService.java (.../TestAuthoringService.java) (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -56,6 +56,7 @@ } protected String[] getContextConfigLocation() { return new String[] {"org/lamsfoundation/lams/localApplicationContext.xml", + "org/lamsfoundation/lams/toolApplicationContext.xml", "org/lamsfoundation/lams/authoring/authoringApplicationContext.xml"}; } public void testCopyLearningdesign()throws UserException, WorkspaceFolderException, LearningDesignException, IOException{ Index: lams_central/test/java/org/lamsfoundation/lams/authoring/web/TestAuthoringAction.java =================================================================== diff -u -rde1940e60766f8901436c6ab567c692685d5b35c -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd --- lams_central/test/java/org/lamsfoundation/lams/authoring/web/TestAuthoringAction.java (.../TestAuthoringAction.java) (revision de1940e60766f8901436c6ab567c692685d5b35c) +++ lams_central/test/java/org/lamsfoundation/lams/authoring/web/TestAuthoringAction.java (.../TestAuthoringAction.java) (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -43,7 +43,9 @@ XmlWebApplicationContext.class.getName()); context.setInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, - "/org/lamsfoundation/lams/localApplicationContext.xml,/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml"); + "/org/lamsfoundation/lams/localApplicationContext.xml," + + "org/lamsfoundation/lams/toolApplicationContext.xml," + + "/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml"); ctxLoader.initWebApplicationContext(context); } public void testGetLearningDesign(){ Index: lams_central/test/java/org/lamsfoundation/lams/workspace/service/BaseWorkspaceTest.java =================================================================== diff -u -rde1940e60766f8901436c6ab567c692685d5b35c -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd --- lams_central/test/java/org/lamsfoundation/lams/workspace/service/BaseWorkspaceTest.java (.../BaseWorkspaceTest.java) (revision de1940e60766f8901436c6ab567c692685d5b35c) +++ lams_central/test/java/org/lamsfoundation/lams/workspace/service/BaseWorkspaceTest.java (.../BaseWorkspaceTest.java) (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -73,6 +73,7 @@ protected String[] getContextConfigLocation() { return new String[] {"org/lamsfoundation/lams/contentrepository/applicationContext.xml", "org/lamsfoundation/lams/localApplicationContext.xml", + "org/lamsfoundation/lams/toolApplicationContext.xml", "org/lamsfoundation/lams/authoring/authoringApplicationContext.xml", "org/lamsfoundation/lams/workspace/workspaceApplicationContext.xml"}; } Index: lams_central/test/java/org/lamsfoundation/lams/workspace/service/TestWorkspaceManagement.java =================================================================== diff -u -rde1940e60766f8901436c6ab567c692685d5b35c -rac080bcbd7d03cc64ea0b43091472ddbf23b30fd --- lams_central/test/java/org/lamsfoundation/lams/workspace/service/TestWorkspaceManagement.java (.../TestWorkspaceManagement.java) (revision de1940e60766f8901436c6ab567c692685d5b35c) +++ lams_central/test/java/org/lamsfoundation/lams/workspace/service/TestWorkspaceManagement.java (.../TestWorkspaceManagement.java) (revision ac080bcbd7d03cc64ea0b43091472ddbf23b30fd) @@ -50,25 +50,27 @@ private static final Integer PICTURES_WORKSPACE_FOLDER = new Integer(9); private static final Integer MANPREETS_WORKSPACE = new Integer(6); - private static final Integer USER_ID = new Integer(4); + private static final Integer MMM_USER_ID = new Integer(4); + private static final Integer TEST1_USER_ID = new Integer(5); + public TestWorkspaceManagement(String name){ super(name); } public void testGetAccessibleWorkspaceFolders()throws IOException{ - Vector vector = workspaceManagementService.getAccessibleOrganisationWorkspaceFolders(USER_ID); + Vector vector = workspaceManagementService.getAccessibleOrganisationWorkspaceFolders(MMM_USER_ID); assertTrue("Accessible workspace folders exists",vector!=null && vector.size()>0); } public void testGetFolderContents()throws Exception{ WorkspaceFolder folder = workspaceFolderDAO.getWorkspaceFolderByID(LAMS_WORKSPACE_FOLDER); - Vector vector = workspaceManagementService.getFolderContents(USER_ID,folder,WorkspaceManagementService.AUTHORING); + Vector vector = workspaceManagementService.getFolderContents(MMM_USER_ID,folder,WorkspaceManagementService.AUTHORING); assertTrue("FolderContents exist",vector!=null && vector.size()>0); } // TODO why does copyfolder seem to take so long public void testCopyFolder() throws IOException{ - String packet = workspaceManagementService.copyFolder(MACQ_UNI_WORKSPACE_FOLDER,DOCUMENTS_WORKSPACE_FOLDER,USER_ID); + String packet = workspaceManagementService.copyFolder(MACQ_UNI_WORKSPACE_FOLDER,DOCUMENTS_WORKSPACE_FOLDER,MMM_USER_ID); Map ids = extractIdMapFromWDDXPacket(packet); assertTrue("Two ids returned as expected", ids != null && ids.size()==2); @@ -84,7 +86,7 @@ public void testDeleteFolder() throws Exception{ // create a folder so we can delete it. String folderName = "testDeleteFolder"; - String packet = workspaceManagementService.createFolderForFlash(MANPREETS_WORKSPACE_FOLDER,folderName,USER_ID); + String packet = workspaceManagementService.createFolderForFlash(MANPREETS_WORKSPACE_FOLDER,folderName,MMM_USER_ID); Map ids = extractIdMapFromWDDXPacket(packet); assertNotNull(ids); Double id = (Double) ids.get("folderID"); @@ -94,7 +96,7 @@ // okay - got the right folder. now delete it. Integer folderId = new Integer(id.intValue()); - workspaceManagementService.deleteFolder(folderId, USER_ID); + workspaceManagementService.deleteFolder(folderId, MMM_USER_ID); try{ workspaceFolderDAO.getWorkspaceFolderByID(folderId); fail("Exception should be raised because this object has already been deleted"); @@ -115,7 +117,7 @@ newWorkspaceFolderId = MACQ_UNI_WORKSPACE_FOLDER.intValue(); } - workspaceManagementService.moveFolder(MANPREETS_WORKSPACE_FOLDER,new Integer(newWorkspaceFolderId), USER_ID); + workspaceManagementService.moveFolder(MANPREETS_WORKSPACE_FOLDER,new Integer(newWorkspaceFolderId), MMM_USER_ID); WorkspaceFolder workspaceFolder = workspaceFolderDAO.getWorkspaceFolderByID(MANPREETS_WORKSPACE_FOLDER); assertEquals(workspaceFolder.getParentWorkspaceFolder().getWorkspaceFolderId().intValue(), newWorkspaceFolderId); } @@ -326,5 +328,41 @@ return new NodeKey(new Long(uuid.longValue()), new Long(version.longValue())); } + /** Test the getOrganisationsByUserRoleOneTree call for the mmm user, who has all their orgs in one hierarchy */ + public void testGetOrganisationsByUserRoleOneTree() { + try { + String packet = workspaceManagementService.getOrganisationsByUserRole(MMM_USER_ID,new String[]{"TEACHER","STAFF"}); + System.out.println("getOrganisationsByUserRole: mmm: "+packet); + checkContainsOnce(packet, "Macquarie University"); + checkContainsOnce(packet, "Macquarie E-Learning Centre Of Excellence"); + checkContainsOnce(packet, "LAMS Project Team"); + checkContainsOnce(packet, "MAMS Project Team"); + } catch ( IOException e ) { + e.printStackTrace(); + fail("IOException thrown"+e.getMessage()); + } + + } + + private void checkContainsOnce(String packet, String name) { + int firstIndexOf = packet.indexOf(name); + int lastIndexOf = packet.lastIndexOf(name); + assertTrue("Packet contains "+name+" exactly once.", firstIndexOf>-1 && firstIndexOf==lastIndexOf); + } + /** Test the getOrganisationsByUserRoleOneTree call for the test1 user, whose orgs are spread over two hierarchies */ + public void testGetOrganisationsByUserRoleTwoTrees() { + try { + String packet = workspaceManagementService.getOrganisationsByUserRole(TEST1_USER_ID,new String[]{"TEACHER","STAFF"}); + System.out.println("getOrganisationsByUserRole: test1: "+packet); + checkContainsOnce(packet, "LAMS Project Team"); + checkContainsOnce(packet, "Computing Courses"); + checkContainsOnce(packet, "Intro Computing"); + checkContainsOnce(packet, "Computing Science"); + } catch ( IOException e ) { + e.printStackTrace(); + fail("IOException thrown"+e.getMessage()); + } + + } }