Index: lams_common/conf/language/ApplicationResources.properties =================================================================== diff -u -r09733788eb4c42f4cc26c8df6638244186f8e750 -r8b0eb7d31e077c3967037073816413377b4b1d40 --- lams_common/conf/language/ApplicationResources.properties (.../ApplicationResources.properties) (revision 09733788eb4c42f4cc26c8df6638244186f8e750) +++ lams_common/conf/language/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8b0eb7d31e077c3967037073816413377b4b1d40) @@ -32,5 +32,5 @@ imported.permission.gate.title =Permission Gate imported.synchronise.gate.title =Synchronise Gate - #======= End labels: Exported 25 labels for en AU ===== +error.import.matching.tool.not.found=The activity with signature [{0}] is skipped because a matching tool cannot be found. Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== diff -u -rd8ff67b3c981c1d1b42c8d584354d3eab4006cd5 -r8b0eb7d31e077c3967037073816413377b4b1d40 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision d8ff67b3c981c1d1b42c8d584354d3eab4006cd5) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 8b0eb7d31e077c3967037073816413377b4b1d40) @@ -46,6 +46,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -161,20 +162,6 @@ private IToolImportSupportDAO toolImportSupportDAO; /** - * Class to sort activity DTO according to the rule: Paretns is before their children. - */ - private class ActDTOParentComparator implements Comparator{ - - public int compare(AuthoringActivityDTO a1, AuthoringActivityDTO a2) { - //if a1 is a2's parent, then a1 is before a2. - if(a1.getActivityID().equals(a2.getParentActivityID())) - return -1; - else - return 1; - } - - } - /** * Class of tool attachment file handler class and relative fields information container. */ private class NameInfo{ @@ -783,10 +770,16 @@ //================== Start handle activities ====================== //activity object list - Set actDtoList = new TreeSet(new ActDTOParentComparator()); //sort them to ensure parent before its children. - actDtoList.addAll(dto.getActivities()); + List actDtoList = getSortedParentList(dto.getActivities()); + if(log.isDebugEnabled()){ + int idx=0; + for (AuthoringActivityDTO activityDTO : actDtoList) { + log.debug(idx + ": ActivityID is [" + activityDTO.getActivityID() + "], parent ID is [" + activityDTO.getParentActivityID() + "]"); + idx++; + } + } Set actList = new TreeSet (new ActivityOrderComparator()); Map activityMapper = new HashMap(); @@ -804,16 +797,22 @@ if(actDto.getParentActivityID() != null){ Activity parent = activityMapper.get(actDto.getParentActivityID()); - act.setParentActivity(parent); - //also add child as Complex activity: It is useless for persist data, but helpful for validate in learning design! - if(isComplexActivity(parent)){ - Set set = ((ComplexActivity)parent).getActivities(); - if(set == null){ - set = new TreeSet(new ActivityOrderComparator()); - ((ComplexActivity)parent).setActivities(set); + //remove children if parent already removed + if(removedActMap.containsKey(parent.getActivityId())){ + act.setParentActivity(null); + act.setParentUIID(null); + }else{ + act.setParentActivity(parent); + //also add child as Complex activity: It is useless for persist data, but helpful for validate in learning design! + if(isComplexActivity(parent)){ + Set set = ((ComplexActivity)parent).getActivities(); + if(set == null){ + set = new TreeSet(new ActivityOrderComparator()); + ((ComplexActivity)parent).setActivities(set); + } + if(!removedActMap.containsKey(actDto.getActivityID())) + set.add(act); } - if(!removedActMap.containsKey(actDto.getActivityID())) - set.add(act); } } @@ -919,6 +918,43 @@ return ld.getLearningDesignId(); } + + /** + * Method to sort activity DTO according to the rule: Paretns is before their children. + * @param activities + * @return + */ + private List getSortedParentList(List activities) { + List result = new ArrayList(); + List actIdList = new ArrayList(); + + int failureToleranceCount = 5000; + while(!activities.isEmpty() && failureToleranceCount > 0){ + Iterator iter = activities.iterator(); + while (iter.hasNext()) { + AuthoringActivityDTO actDto = iter.next(); + if(actDto.getParentActivityID() == null){ + result.add(actDto); + actIdList.add(actDto.getActivityID()); + iter.remove(); + }else if(actIdList.contains(actDto.getParentActivityID())){ + result.add(actDto); + actIdList.add(actDto.getActivityID()); + iter.remove(); + } + } + failureToleranceCount--; + } + if(!activities.isEmpty()){ + log.warn("Some activities cannot found their parent actitivy."); + //just append these activies into result list + for (AuthoringActivityDTO actDto : activities) { + log.warn("Activity ID[" + actDto.getActivityID() + "] cannot found parent [" + actDto.getParentActivityID() + "]"); + } + result.addAll(activities); + } + return result; + } /** * Get learning design object from this Learning design DTO object. It also following our * import rules: