Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r8b8155cc92145959a0fd2fd2aef6689c68ddbc22 -r671c0123933f9264962a7a2a9aba940ded111d57 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringController.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r671c0123933f9264962a7a2a9aba940ded111d57 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringController.java (.../AuthoringController.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringController.java (.../AuthoringController.java) (revision 671c0123933f9264962a7a2a9aba940ded111d57) @@ -57,6 +57,7 @@ import org.lamsfoundation.lams.learningdesign.dto.LearningDesignDTO; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; +import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.security.ISecurityService; @@ -194,15 +195,15 @@ @RequestMapping("/openLearningDesign") @ResponseBody public String openLearningDesign(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws ServletException, IOException, ImportToolContentException { long learningDesignID = WebUtil.readLongParam(request, AttributeNames.PARAM_LEARNINGDESIGN_ID); LearningDesignDTO learningDesignDTO = learningDesignService.getLearningDesignDTO(learningDesignID, getUserLanguage()); // some old LDs may not have learning library IDs filled in, try to find them for (AuthoringActivityDTO activity : (List) learningDesignDTO.getActivities()) { if (activity.getLearningLibraryID() == null) { - learningDesignService.fillLearningLibraryID(activity); + learningDesignService.fillLearningLibraryID(activity, learningDesignDTO.getActivities()); } } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningLibrary.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r671c0123933f9264962a7a2a9aba940ded111d57 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningLibrary.java (.../LearningLibrary.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningLibrary.java (.../LearningLibrary.java) (revision 671c0123933f9264962a7a2a9aba940ded111d57) @@ -25,13 +25,11 @@ import java.io.Serializable; import java.util.Date; -import java.util.List; import java.util.Set; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; -import org.lamsfoundation.lams.learningdesign.dto.LearningLibraryDTO; /** * @author Manpreet Minhas Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r671c0123933f9264962a7a2a9aba940ded111d57 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 671c0123933f9264962a7a2a9aba940ded111d57) @@ -145,7 +145,6 @@ import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.converters.reflection.ReflectionConverter; - import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.StaxDriver; @@ -707,7 +706,7 @@ ldDto.setDescription(ldDto.getDescription().replaceAll(oldResourcePath, newResourcePath)); } for (AuthoringActivityDTO activity : activities) { - getLearningDesignService().fillLearningLibraryID(activity); + getLearningDesignService().fillLearningLibraryID(activity, activities); // skip non-tool activities if (!activity.getActivityTypeID().equals(Activity.TOOL_ACTIVITY_TYPE)) { continue; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r671c0123933f9264962a7a2a9aba940ded111d57 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java (.../ILearningDesignService.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ILearningDesignService.java (.../ILearningDesignService.java) (revision 671c0123933f9264962a7a2a9aba940ded111d57) @@ -48,7 +48,7 @@ public interface ILearningDesignService { static final String LD_SVG_TOP_DIR = FileUtil.getFullPath(Configuration.get(ConfigurationKeys.LAMS_EAR_DIR), "lams-www.war\\secure\\learning-design-images"); - + /** * Returns a populated LearningDesign object corresponding to the given learningDesignID * @@ -95,7 +95,8 @@ List getToolDTOs(boolean includeParallel, boolean includeInvalid, String userName) throws IOException; - void fillLearningLibraryID(AuthoringActivityDTO activity); + void fillLearningLibraryID(AuthoringActivityDTO activity, Collection activities) + throws ImportToolContentException; String internationaliseActivityTitle(Long learningLibraryID); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r671c0123933f9264962a7a2a9aba940ded111d57 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 671c0123933f9264962a7a2a9aba940ded111d57) @@ -30,8 +30,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.Vector; import org.apache.log4j.Logger; @@ -40,6 +42,7 @@ import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.LearningLibrary; import org.lamsfoundation.lams.learningdesign.LearningLibraryGroup; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO; @@ -85,10 +88,6 @@ protected ILearningLibraryDAO learningLibraryDAO; protected ILoadedMessageSourceService toolActMessageService; - // words found both in current complex learning library descriptions and in old exported LD XML files - private static final String[][] COMPLEX_LEARNING_LIBRARY_KEY_WORDS = { { "Share", "Forum" }, { "Chat", "Scribe" }, - { "Forum", "Scribe" } }; - /* * Default constructor * @@ -148,7 +147,7 @@ /********************************************** * Service Methods *******************************************/ - + @Override public LearningDesign getLearningDesign(Long learningDesignID) { return learningDesignDAO.getLearningDesignById(learningDesignID); @@ -334,29 +333,55 @@ * Guess missing Learning Library ID based on other activity details. Old LDs may not contain this value. */ @Override - public void fillLearningLibraryID(AuthoringActivityDTO activity) { + public void fillLearningLibraryID(AuthoringActivityDTO activity, Collection activities) + throws ImportToolContentException { if (activity.getLearningLibraryID() == null) { switch (activity.getActivityTypeID()) { case Activity.PARALLEL_ACTIVITY_TYPE: - String description = activity.getDescription(); - // recognise learning libraries by their word description + // find child activities referring to the imported parallel activity + List components = new LinkedList<>(); + for (AuthoringActivityDTO componentCandidate : activities) { + if (componentCandidate.getParentUIID() != null + && componentCandidate.getParentUIID().equals(activity.getActivityUIID())) { + components.add(componentCandidate); + if (components.size() == 2) { + break; + } + } + } + // find matching parallel activity in existing DB for (LearningLibrary library : learningLibraryDAO.getAllLearningLibraries()) { - for (String[] keyWords : COMPLEX_LEARNING_LIBRARY_KEY_WORDS) { - boolean found = false; - for (String keyWord : keyWords) { - found = description.contains(keyWord) && library.getDescription().contains(keyWord); - if (!found) { - break; + Activity libraryActivity = (Activity) activityDAO + .getActivitiesByLibraryID(library.getLearningLibraryId()).get(0); + if (!libraryActivity.isParallelActivity()) { + continue; + } + short componentsFound = 0; + for (Activity libraryComponent : (Set) ((ParallelActivity) libraryActivity) + .getActivities()) { + ToolActivity toolLibraryCompoment = (ToolActivity) libraryComponent; + for (AuthoringActivityDTO component : components) { + // match with tool signature of children + if (toolLibraryCompoment.getTool().getToolSignature() + .equals(component.getToolSignature())) { + componentsFound++; } } - if (found) { - activity.setLearningLibraryID(library.getLearningLibraryId()); - return; - } } + if (componentsFound == 2) { + activity.setLearningLibraryID(library.getLearningLibraryId()); + break; + } } + if (activity.getLearningLibraryID() == null) { + throw new ImportToolContentException( + "Could not recognise learning library ID for parallel activity with UIID " + + activity.getActivityUIID()); + } break; case Activity.TOOL_ACTIVITY_TYPE: + // when importing a LD, it will overwritten by the import process + // when opening an old DB, this should work correctly Tool tool = toolDAO.getToolByID(activity.getToolID()); if (tool != null) { activity.setLearningLibraryID(tool.getLearningLibraryId());