diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java index dbf5c15c562ad920e5216c37a5afdbdef48a45c9..898c1763f9da179f820b897c174fdb8616192e0a 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java @@ -558,7 +558,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen FileResourceManager frm = FileResourceManager.getInstance(); File fUnzippedDirRoot = frm.unzipFileResource(session.getTestEntry().getOlatResource()); URI assessmentObjectUri = qtiService.createAssessmentTestUri(fUnzippedDirRoot); - File submissionDir = qtiService.getAssessmentResultFile(session); + File submissionDir = qtiService.getSubmissionDirectory(session); String mapperUri = registerCacheableMapper(ureq, "QTI21CNResults::" + session.getTestEntry().getKey(), new ResourcesMapper(assessmentObjectUri, submissionDir)); diff --git a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java index ca6b3dd307116a1bf765ef23ffa725547ae40df2..2a6a8a2c5eec27fcc380268c1146928637baf94f 100644 --- a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java +++ b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java @@ -44,6 +44,7 @@ import org.olat.core.util.StringHelper; public class ResourcesMapper implements Mapper { private static final Logger log = Tracing.createLoggerFor(ResourcesMapper.class); + private static final String SUBMISSION_SUBPATH = "submissions/"; private final URI assessmentObjectUri; private final File submissionDirectory; @@ -92,14 +93,15 @@ public class ResourcesMapper implements Mapper { } else { resource = new ForbiddenMediaResource(); } - } else if(filename.endsWith("/raw/_noversion_/images/transparent.gif")) { + } else if(filename != null && filename.endsWith("/raw/_noversion_/images/transparent.gif")) { String realPath = request.getServletContext().getRealPath("/static/images/transparent.gif"); resource = new FileMediaResource(new File(realPath), true); } else { String submissionName = null; File storage = null; - if(filename.startsWith("submissions/")) { - String submission = filename.substring("submissions/".length()); + if(filename != null && filename.contains(SUBMISSION_SUBPATH)) { + int submissionIndex = filename.indexOf(SUBMISSION_SUBPATH) + SUBMISSION_SUBPATH.length(); + String submission = filename.substring(submissionIndex); int candidateSessionIndex = submission.indexOf('/'); if(candidateSessionIndex > 0) { submissionName = submission.substring(candidateSessionIndex + 1); @@ -109,7 +111,7 @@ public class ResourcesMapper implements Mapper { String sessionKey = submission.substring(0, candidateSessionIndex); if(StringHelper.isLong(sessionKey)) { try { - storage = submissionDirectoryMaps.get(new Long(sessionKey)); + storage = submissionDirectoryMaps.get(Long.valueOf(sessionKey)); } catch (Exception e) { log.error("", e); } diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java index 8a1bb0809535a8b1cd25c604f637734db5c856ae..d95fc58e03929cb74e0f9e64a0f0612bac436005 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java @@ -194,7 +194,7 @@ public class AssessmentObjectVelocityRenderDecorator extends VelocityRenderDecor } public String convertSubmissionLinkFull(String uri) { - return AssessmentRenderFunctions.convertSubmissionLink(avc, resolvedAssessmentItem, uri); + return AssessmentRenderFunctions.convertSubmissionLink(avc, uri); } public String getFormDispatchFieldId() { diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java index 678f3ebafd3b82e0691fae6ad449c984629aa092..d54ef1081e39e8df7f3ee834401fd4a95686805e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java @@ -661,10 +661,9 @@ public class AssessmentRenderFunctions { return component.getMapperUri() + "/" + relativePath + "?href=" + relativePath; } - public static final String convertSubmissionLink(AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, String uri) { + public static final String convertSubmissionLink(AssessmentObjectComponent component, String uri) { String filename = getLinkFilename(uri); - String relativePath = component.relativePathTo(resolvedAssessmentItem); - return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + relativePath + (uri == null ? "" : uri); + return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + (uri == null ? "" : uri); } private static final String getLinkFilename(String uri) { diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumService.java b/src/main/java/org/olat/modules/curriculum/CurriculumService.java index ff15ce66fba072e8e44564e7bd31d2c44342694e..29451c064d0f9620b40246db8266fcaf8c7b148b 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumService.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumService.java @@ -331,7 +331,8 @@ public interface CurriculumService { * @param newParent The new parent or null if root * @param siblingBefore The sibling before the new position or null if at the first place */ - public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, CurriculumElement siblingBefore); + public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, + CurriculumElement siblingBefore, Curriculum targetCurriculum); /** * Move a root curriculum element from a curriculum to an other. This operation diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java index 5f492a5c111ebedd659db13c2b28122cf6f46719..b3d80fb3be460c8719f5010cba302630cb887263 100644 --- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java +++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java @@ -215,21 +215,24 @@ public class CurriculumElementDAO { return rootElement; } - public CurriculumElement move(CurriculumElement elementToMove, CurriculumElement newParentElement, CurriculumElement siblingBefore) { + public CurriculumElement move(CurriculumElement elementToMove, CurriculumElement newParentElement, + CurriculumElement siblingBefore, Curriculum targetCurriculum) { CurriculumElement parentElement = elementToMove.getParent(); CurriculumElementImpl element = (CurriculumElementImpl)elementToMove; + CurriculumImpl curriculum = loadCurriculumByKey(targetCurriculum.getKey()); + + String keysPath = element.getMaterializedPathKeys(); + List<CurriculumElement> descendants = getDescendants(element); if(parentElement == null && newParentElement == null) { // reorder curriculum children - CurriculumImpl curriculum = loadCurriculumByKey(element); List<CurriculumElement> rootElements = curriculum.getRootElements(); reorderList(element, rootElements, siblingBefore); dbInstance.getCurrentEntityManager().merge(curriculum); } else if(parentElement == null) { // move from curriculum as root to a curriculum element - CurriculumImpl curriculum = loadCurriculumByKey(element); List<CurriculumElement> rootElements = curriculum.getRootElements(); element.setCurriculumParent(null); rootElements.remove(element); @@ -249,7 +252,6 @@ public class CurriculumElementDAO { element.setParent(null); dbInstance.getCurrentEntityManager().merge(parentElement); - CurriculumImpl curriculum = loadCurriculumByKey(element); element.setCurriculumParent(curriculum); List<CurriculumElement> rootElements = curriculum.getRootElements(); reorderList(element, rootElements, siblingBefore); @@ -276,12 +278,10 @@ public class CurriculumElementDAO { dbInstance.getCurrentEntityManager().merge(newParentElement); } - String keysPath = element.getMaterializedPathKeys(); - List<CurriculumElement> descendants = getDescendants(element); - element.setLastModified(new Date()); String newKeysPath = getMaterializedPathKeys(newParentElement, element); element.setMaterializedPathKeys(newKeysPath); + element.setCurriculum(curriculum); element = dbInstance.getCurrentEntityManager().merge(element); for(CurriculumElement descendant:descendants) { @@ -291,6 +291,7 @@ public class CurriculumElementDAO { String updatedPath = newKeysPath + end; ((CurriculumElementImpl)descendant).setMaterializedPathKeys(updatedPath); } + ((CurriculumElementImpl)descendant).setCurriculum(curriculum); dbInstance.getCurrentEntityManager().merge(descendant); } dbInstance.commit(); diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java index af7adb3108d3ac91cad6a006df9026abc27a0a4f..96a144001154811f3d8f1384a8cdd00f051c1341 100644 --- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java +++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java @@ -416,17 +416,22 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat } @Override - public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, CurriculumElement siblingBefore) { - CurriculumElement element = curriculumElementDao.move(elementToMove, newParent, siblingBefore); + public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, + CurriculumElement siblingBefore, Curriculum targetCurriculum) { + Curriculum reloadedTargetCurriculum = curriculumDao.loadByKey(targetCurriculum.getKey()); + CurriculumElement element = curriculumElementDao + .move(elementToMove, newParent, siblingBefore, reloadedTargetCurriculum); // propagate inheritance of the new parent - List<GroupMembership> memberships = groupDao.getMemberships(newParent.getGroup()); List<GroupMembership> membershipsToPropagate = new ArrayList<>(); Map<IdentityToRoleKey,GroupMembership> identityRoleToNewParentMembership = new HashMap<>(); - for(GroupMembership membership:memberships) { - if(membership.getInheritanceMode() == GroupMembershipInheritance.inherited || membership.getInheritanceMode() == GroupMembershipInheritance.root) { - membershipsToPropagate.add(membership); - identityRoleToNewParentMembership.put(new IdentityToRoleKey(membership), membership); + if(newParent != null) { + List<GroupMembership> memberships = groupDao.getMemberships(newParent.getGroup()); + for(GroupMembership membership:memberships) { + if(membership.getInheritanceMode() == GroupMembershipInheritance.inherited || membership.getInheritanceMode() == GroupMembershipInheritance.root) { + membershipsToPropagate.add(membership); + identityRoleToNewParentMembership.put(new IdentityToRoleKey(membership), membership); + } } } diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java index 0d06e8682b514d7430c4d1bcbdb0d6dbb39e1fe3..b44bd84e51da308acfb8e6fbb2dde42b94ca5358 100644 --- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java +++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java @@ -256,13 +256,14 @@ public class CurriculumElementsWebService { elementToSave.setBeginDate(curriculumElement.getBeginDate()); elementToSave.setEndDate(curriculumElement.getEndDate()); elementToSave.setType(type); - if(parentElement != null && elementToSave.getParent() != null - && !elementToSave.getParent().getKey().equals(parentElement.getKey())) { + if((parentElement != null && elementToSave.getParent() != null && !elementToSave.getParent().getKey().equals(parentElement.getKey()))) { move = true; } else if(parentElement == null && elementToSave.getParent() == null && (elementToSave.getCurriculum() != null && !elementToSave.getCurriculum().getKey().equals(curriculum.getKey()))) { // this is a root curriculum element and it get a new curriculum as home moveAsCurriculumRoot = true; + } else if(!elementToSave.getCurriculum().getKey().equals(curriculumElement.getCurriculumKey())) { + move = true; } } @@ -279,7 +280,7 @@ public class CurriculumElementsWebService { } CurriculumElement savedElement = curriculumService.updateCurriculumElement(elementToSave); if(move) { - curriculumService.moveCurriculumElement(savedElement, parentElement, null); + curriculumService.moveCurriculumElement(savedElement, parentElement, null, curriculum); dbInstance.commit(); savedElement = curriculumService.getCurriculumElement(savedElement); } else if(moveAsCurriculumRoot) { diff --git a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java index 0ed4f972ce71d09fda70776027eb3a78dde1ffc2..d9c08fd541730410599a1ff54d2f735c66a589e4 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java @@ -300,7 +300,7 @@ public class MoveCurriculumElementController extends FormBasicController { } for(CurriculumElement elementToMove:curriculumElementsToMove) { - curriculumService.moveCurriculumElement(elementToMove, newParent, siblingBefore); + curriculumService.moveCurriculumElement(elementToMove, newParent, siblingBefore, curriculum); dbInstance.commit(); } } diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java index d9bdf53ad8d1599aa49acd65042eb5e45ac61791..d192662e7df41274a35f8de3b55a1e5ac34f289e 100644 --- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java +++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java @@ -412,7 +412,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { dbInstance.commitAndCloseSession(); // move element1_1 under element2 - curriculumElementDao.move(element1_1, element2, null); + curriculumElementDao.move(element1_1, element2, null, curriculum); dbInstance.commit(); // check parent line of element1_1_2 @@ -452,7 +452,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { dbInstance.commitAndCloseSession(); // move element1_1 at third posistion - curriculumElementDao.move(element1_2, rootElement, element1_4); + curriculumElementDao.move(element1_2, rootElement, element1_4, curriculum); dbInstance.commit(); CurriculumElementImpl element = (CurriculumElementImpl)curriculumElementDao.loadByKey(rootElement.getKey()); @@ -482,7 +482,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { dbInstance.commitAndCloseSession(); // move element1_5 at third position - curriculumElementDao.move(element1_5, rootElement, element1_2); + curriculumElementDao.move(element1_5, rootElement, element1_2, curriculum); dbInstance.commit(); CurriculumElementImpl element = (CurriculumElementImpl)curriculumElementDao.loadByKey(rootElement.getKey()); @@ -511,7 +511,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { dbInstance.commitAndCloseSession(); // move element1_1 under element2 - curriculumElementDao.move(element2, null, element4); + curriculumElementDao.move(element2, null, element4, curriculum); dbInstance.commit(); // check parent line of element1_1_2 @@ -547,7 +547,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { // move element1_1 under element2 CurriculumElement reloadedElement1_1 = curriculumElementDao.loadByKey(element1_1.getKey()); - curriculumElementDao.move(rootElement2, reloadedElement1_1, element1_1_1); + curriculumElementDao.move(rootElement2, reloadedElement1_1, element1_1_1, curriculum); dbInstance.commit(); // check children element1_1 @@ -584,7 +584,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { // move element1_1 under element2 CurriculumElement reloadedElement1_1_3 = curriculumElementDao.loadByKey(element1_1_3.getKey()); - curriculumElementDao.move(reloadedElement1_1_3, null, rootElement1); + curriculumElementDao.move(reloadedElement1_1_3, null, rootElement1, curriculum); dbInstance.commit(); // check children element1_1 @@ -706,6 +706,133 @@ public class CurriculumElementDAOTest extends OlatTestCase { Assert.assertTrue(stayingElements.contains(stayingElement1_1)); } + @Test + public void moveCurriculumElement_elementCurriculumToCurriculum() { + Curriculum curriculum = curriculumDao.createAndPersist("cur-start-", "Curriculum to start", "Curriculum", null); + Curriculum targetCurriculum = curriculumDao.createAndPersist("cur-new-home-", "Curriculum as new home", "Curriculum", null); + + CurriculumElement stayingElement1 = curriculumElementDao.createCurriculumElement("Element-1", "1. Element", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement stayingElement1_1 = curriculumElementDao.createCurriculumElement("Element-1-1", "1.1. Element", CurriculumElementStatus.active, + null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_2 = curriculumElementDao.createCurriculumElement("Element-1-2", "1.2. Element", CurriculumElementStatus.active, + null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_2_1 = curriculumElementDao.createCurriculumElement("Element-1-2-1", "1.2.1. Element", CurriculumElementStatus.active, + null, null, element1_2, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_2_2 = curriculumElementDao.createCurriculumElement("Element-1-2-2", "1.2.2 Element", CurriculumElementStatus.active, + null, null, element1_2, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + + CurriculumElement stayingElement2 = curriculumElementDao.createCurriculumElement("T-Element-2", "2. Element", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement stayingElement2_1 = curriculumElementDao.createCurriculumElement("T-Element-2-1", "2.1. Element", CurriculumElementStatus.active, + null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + + CurriculumElement targetElement1 = curriculumElementDao.createCurriculumElement("Ta-Element-3", "3. Element", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum); + CurriculumElement targetElement1_1 = curriculumElementDao.createCurriculumElement("Ta-Element-3-1", "3.1. Element", CurriculumElementStatus.active, + null, null, targetElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum); + dbInstance.commitAndCloseSession(); + + // move element1 under its new curriculum + curriculumElementDao.move(element1_2, targetElement1_1, null, targetCurriculum); + dbInstance.commitAndCloseSession(); + + // check the source curriculum + CurriculumImpl reloadedCurriculum = (CurriculumImpl)curriculumDao.loadByKey(curriculum.getKey()); + List<CurriculumElement> rootElements = reloadedCurriculum.getRootElements(); + Assert.assertEquals(2, rootElements.size()); + Assert.assertTrue(rootElements.contains(stayingElement1)); + Assert.assertTrue(rootElements.contains(stayingElement2)); + + // check the target curriculum + CurriculumImpl reloadedTargetCurriculum = (CurriculumImpl)curriculumDao.loadByKey(targetCurriculum.getKey()); + List<CurriculumElement> targetRootElements = reloadedTargetCurriculum.getRootElements(); + Assert.assertEquals(1, targetRootElements.size()); + Assert.assertTrue(targetRootElements.contains(targetElement1)); + + List<CurriculumElement> targetElements = curriculumElementDao.loadElements(reloadedTargetCurriculum, CurriculumElementStatus.values()); + Assert.assertEquals(5, targetElements.size()); + // current ones + Assert.assertTrue(targetElements.contains(targetElement1)); + Assert.assertTrue(targetElements.contains(targetElement1_1)); + // check curriculum references + Assert.assertEquals(targetCurriculum, targetElement1.getCurriculum()); + Assert.assertEquals(targetCurriculum, targetElement1_1.getCurriculum()); + // moved ones + Assert.assertTrue(targetElements.contains(element1_2)); + Assert.assertTrue(targetElements.contains(element1_2_1)); + Assert.assertTrue(targetElements.contains(element1_2_2)); + // check curriculum reference + for(CurriculumElement targetElement:targetElements) { + Assert.assertEquals(targetCurriculum, targetElement.getCurriculum()); + } + // check parent + CurriculumElement reloadedElement1_2 = curriculumElementDao.loadByKey(element1_2.getKey()); + Assert.assertEquals(targetElement1_1, reloadedElement1_2.getParent()); + + List<CurriculumElement> stayingElements = curriculumElementDao.loadElements(curriculum, CurriculumElementStatus.values()); + Assert.assertEquals(4, stayingElements.size()); + // current ones + Assert.assertTrue(stayingElements.contains(stayingElement1)); + Assert.assertTrue(stayingElements.contains(stayingElement1_1)); + Assert.assertTrue(stayingElements.contains(stayingElement2)); + Assert.assertTrue(stayingElements.contains(stayingElement2_1)); + // check curriculum references + Assert.assertEquals(curriculum, stayingElement1.getCurriculum()); + Assert.assertEquals(curriculum, stayingElement1_1.getCurriculum()); + Assert.assertEquals(curriculum, stayingElement2.getCurriculum()); + Assert.assertEquals(curriculum, stayingElement2_1.getCurriculum()); + } + + @Test + public void moveCurriculumElement_elementToRootOtherCurriculum() { + Curriculum curriculum = curriculumDao.createAndPersist("cur-for-el-7", "Curriculum for element", "Curriculum", null); + CurriculumElement rootElement1 = curriculumElementDao.createCurriculumElement("Element-10-1", "10.1 Element", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1", "10.1.1 Element", CurriculumElementStatus.active, + null, null, rootElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_1_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1-1", "10.1.1.1 Element", CurriculumElementStatus.active, + null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_1_2 = curriculumElementDao.createCurriculumElement("Element-10-1-1-2", "10.1.1.2 Element", CurriculumElementStatus.active, + null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_1_3 = curriculumElementDao.createCurriculumElement("Element-10-1-1-3", "10.1.1.3 Element", CurriculumElementStatus.active, + null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + CurriculumElement element1_1_3_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1-3-1", "10.1.1.3.1 Element", CurriculumElementStatus.active, + null, null, element1_1_3, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + + Curriculum targetCurriculum = curriculumDao.createAndPersist("cur-for-el-8", "Target curriculum for element", "Curriculum", null); + CurriculumElement rootElement2 = curriculumElementDao.createCurriculumElement("Element-10-2", "10.2 Element", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum); + dbInstance.commit(); + + // move element1_1_3 under the target curriculum + CurriculumElement reloadedElement1_1_3 = curriculumElementDao.loadByKey(element1_1_3.getKey()); + curriculumElementDao.move(reloadedElement1_1_3, null, rootElement2, targetCurriculum); + dbInstance.commit(); + + // check children element1_1 + CurriculumElementImpl reloadElement1_1 = (CurriculumElementImpl)curriculumElementDao.loadByKey(element1_1.getKey()); + List<CurriculumElement> element11children = reloadElement1_1.getChildren(); + Assert.assertEquals(2, element11children.size()); + Assert.assertEquals(element1_1_1, element11children.get(0)); + Assert.assertEquals(element1_1_2, element11children.get(1)); + + // check target curriculum + List<CurriculumElement> targetElements = curriculumElementDao.loadElements(targetCurriculum, CurriculumElementStatus.values()); + Assert.assertEquals(3, targetElements.size()); + // check elements + Assert.assertTrue(targetElements.contains(rootElement2)); + Assert.assertTrue(targetElements.contains(element1_1_3)); + Assert.assertTrue(targetElements.contains(element1_1_3_1)); + + // check children curriculum + CurriculumImpl reloadedTargetCurriculum = (CurriculumImpl)curriculumDao.loadByKey(targetCurriculum.getKey()); + List<CurriculumElement> rootElements = reloadedTargetCurriculum.getRootElements(); + Assert.assertEquals(2, rootElements.size()); + Assert.assertEquals(rootElement2, rootElements.get(0)); + Assert.assertEquals(element1_1_3, rootElements.get(1)); + } + @Test public void getMembersIdentity() { Identity supervisor = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-supervisor-1");