Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r309a597eada52a4079f2985e0d97beedf9adda42 Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rc5afbded875388afbb25dcdc972af56bf021658a -r309a597eada52a4079f2985e0d97beedf9adda42 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -rc6d16edc1cba5543927ac410c568f0af56b98507 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision c6d16edc1cba5543927ac410c568f0af56b98507) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -25,6 +25,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -38,6 +39,7 @@ import java.util.Vector; import java.util.Date; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.hibernate.Hibernate; import org.hibernate.id.Configurable; @@ -705,30 +707,76 @@ if(workspaceFolder==null) throw new WorkspaceFolderException(messageService.getMessage("no.such.workspace.exist",new Object[]{workspaceFolderID})); - return copyLearningDesign(originalDesign,copyType,user,workspaceFolder, setOriginalDesign); + return copyLearningDesign(originalDesign,copyType,user,workspaceFolder, setOriginalDesign,null); } /** - * @see org.lamsfoundation.lams.authoring.service.IAuthoringService#copyLearningDesign(org.lamsfoundation.lams.learningdesign.LearningDesign, java.lang.Integer, org.lamsfoundation.lams.usermanagement.User, org.lamsfoundation.lams.usermanagement.WorkspaceFolder) + * @see org.lamsfoundation.lams.authoring.service.IAuthoringService#copyLearningDesign(org.lamsfoundation.lams.learningdesign.LearningDesign, java.lang.Integer, org.lamsfoundation.lams.usermanagement.User, org.lamsfoundation.lams.usermanagement.WorkspaceFolder, java.lang.Boolean, java.lang.String) */ - public LearningDesign copyLearningDesign(LearningDesign originalLearningDesign,Integer copyType,User user, WorkspaceFolder workspaceFolder, boolean setOriginalDesign) + public LearningDesign copyLearningDesign(LearningDesign originalLearningDesign,Integer copyType,User user, WorkspaceFolder workspaceFolder, + boolean setOriginalDesign, String newDesignName) throws LearningDesignException { - LearningDesign newLearningDesign = LearningDesign.createLearningDesignCopy(originalLearningDesign,copyType, setOriginalDesign); + String newTitle = newDesignName; + if ( newTitle == null ) { + newTitle = getUniqueNameForLearningDesign(originalLearningDesign.getTitle(), workspaceFolder!=null?workspaceFolder.getWorkspaceFolderId():null); + } + + LearningDesign newLearningDesign = LearningDesign.createLearningDesignCopy(originalLearningDesign,copyType,setOriginalDesign); + newLearningDesign.setTitle(newTitle); newLearningDesign.setUser(user); newLearningDesign.setWorkspaceFolder(workspaceFolder); + newLearningDesign.setEditOverrideLock(false); // clear the live edit flag learningDesignDAO.insert(newLearningDesign); - HashMap newActivities = updateDesignActivities(originalLearningDesign,newLearningDesign); - updateDesignTransitions(originalLearningDesign,newLearningDesign, newActivities); + + HashMap newActivities = updateDesignActivities(originalLearningDesign,newLearningDesign,0); + updateDesignTransitions(originalLearningDesign,newLearningDesign, newActivities,0); // set first activity assumes that the transitions are all set up correctly. newLearningDesign.setFirstActivity(newLearningDesign.calculateFirstActivity()); newLearningDesign.setLearningDesignUIID(originalLearningDesign.getLearningDesignUIID()); + return newLearningDesign; + } + + /** + * @throws UserException + * @throws WorkspaceFolderException + * @throws IOException + * @see org.lamsfoundation.lams.authoring.service.IAuthoringService#insertLearningDesign(java.lang.Long, java.lang.Long, java.lang.Integer, java.lang.Boolean, java.lang.String, java.lang.Integer) + */ + public LearningDesign insertLearningDesign(Long originalDesignID, Long designToImportID, Integer userID, boolean createNewLearningDesign, String newDesignName, Integer workspaceFolderID) throws UserException, WorkspaceFolderException, IOException { + + User user = (User)baseDAO.find(User.class,userID); + if(user==null) + throw new UserException(messageService.getMessage("no.such.user.exist",new Object[]{userID})); + + LearningDesign mainDesign = learningDesignDAO.getLearningDesignById(originalDesignID); + if(mainDesign==null) + throw new LearningDesignException(messageService.getMessage("no.such.learningdesign.exist",new Object[]{originalDesignID})); + + if ( createNewLearningDesign) { + WorkspaceFolder workspaceFolder = (WorkspaceFolder)baseDAO.find(WorkspaceFolder.class,workspaceFolderID); + if(workspaceFolder==null) + throw new WorkspaceFolderException(messageService.getMessage("no.such.workspace.exist",new Object[]{workspaceFolderID})); + + mainDesign = copyLearningDesign(mainDesign, LearningDesign.COPY_TYPE_NONE, user, workspaceFolder, false, newDesignName ); + } - copyLearningDesignToolContent(newLearningDesign, originalLearningDesign, copyType); + + LearningDesign designToImport = learningDesignDAO.getLearningDesignById(designToImportID); + if(designToImport==null) + throw new LearningDesignException(messageService.getMessage("no.such.learningdesign.exist",new Object[]{designToImportID})); + + // now dump the import design into our main sequence. Leave the first activity ui id for the design as it is. + int uiidOffset = mainDesign.getMaxID().intValue(); + HashMap newActivities = updateDesignActivities(designToImport,mainDesign,uiidOffset); + updateDesignTransitions(designToImport,mainDesign, newActivities,uiidOffset); + mainDesign.setMaxID(LearningDesign.addOffset(designToImport.getMaxID(),uiidOffset)); + mainDesign.setValidDesign(Boolean.FALSE); + learningDesignDAO.update(mainDesign); - return newLearningDesign; + return mainDesign; + } - /** * @see org.lamsfoundation.lams.authoring.service.IAuthoringService#copyLearningDesignToolContent(org.lamsfoundation.lams.learningdesign.LearningDesign, org.lamsfoundation.lams.learningdesign.LearningDesign, java.lang.Integer) */ @@ -737,60 +785,74 @@ for (Iterator i = design.getActivities().iterator(); i.hasNext();) { Activity currentActivity = (Activity) i.next(); - if (currentActivity.isToolActivity()) + if (currentActivity.isToolActivity()) { - try { - ToolActivity toolActivity = (ToolActivity) currentActivity; - // copy the content, but don't set the define later flags if it is preview - Long newContentId = lamsCoreToolService.notifyToolToCopyContent(toolActivity, copyType.intValue() != LearningDesign.COPY_TYPE_PREVIEW); - toolActivity.setToolContentId(newContentId); - - // clear read only field - toolActivity.setReadOnly(false); - - } catch (DataMissingException e) { - String error = "Unable to initialise the lesson. Data is missing for activity "+currentActivity.getActivityUIID() - +" in learning design "+originalLearningDesign.getLearningDesignId() - +" default content may be missing for the tool. Error was " - +e.getMessage(); - log.error(error,e); - throw new LearningDesignException(error,e); - } catch (ToolException e) { - String error = "Unable to initialise the lesson. Tool encountered an error copying the data is missing for activity " - +currentActivity.getActivityUIID() - +" in learning design "+originalLearningDesign.getLearningDesignId() - +" default content may be missing for the tool. Error was " - +e.getMessage(); - log.error(error,e); - throw new LearningDesignException(error,e); - } - + copyActivityToolContent(currentActivity, design.getCopyTypeID(), originalLearningDesign.getLearningDesignId()); } } return design; } + + /** + * @param originalLearningDesign + * @param copyType + * @param currentActivity + */ + private void copyActivityToolContent(Activity activity, Integer ldCopyType, Long originalLearningDesignId) { + try { + ToolActivity toolActivity = (ToolActivity) activity; + // copy the content, but don't set the define later flags if it is preview + Long newContentId = lamsCoreToolService.notifyToolToCopyContent(toolActivity, ldCopyType != LearningDesign.COPY_TYPE_PREVIEW); + toolActivity.setToolContentId(newContentId); + + // clear read only field + toolActivity.setReadOnly(false); + + } catch (DataMissingException e) { + String error = "Unable to copy a design / initialise the lesson. Data is missing for activity "+activity.getActivityUIID() + +" in learning design "+originalLearningDesignId + +" default content may be missing for the tool. Error was " + +e.getMessage(); + log.error(error,e); + throw new LearningDesignException(error,e); + } catch (ToolException e) { + String error = "Unable to copy a design / initialise the lesson. Tool encountered an error copying the data is missing for activity " + +activity.getActivityUIID() + +" in learning design "+originalLearningDesignId + +" default content may be missing for the tool. Error was " + +e.getMessage(); + log.error(error,e); + throw new LearningDesignException(error,e); + } + } /** * Updates the Activity information in the newLearningDesign based * on the originalLearningDesign. This any grouping details. * + * As new activities are created, the UIID is incremented by the uiidOffset. If we are just copying a sequence this will + * be set to 0. But if we are importing a sequence into another sequence, this will be an offset value so we new ids guaranteed + * to be outside of the range of the main sequence (this may mean gaps in the uiids but that doesn't matter). + * * @param originalLearningDesign The LearningDesign to be copied * @param newLearningDesign The copy of the originalLearningDesign * @return Map of all the new activities, where the key is the UIID value. This is used as an input to updateDesignTransitions */ - private HashMap updateDesignActivities(LearningDesign originalLearningDesign, LearningDesign newLearningDesign){ + private HashMap updateDesignActivities(LearningDesign originalLearningDesign, LearningDesign newLearningDesign, int uiidOffset){ HashMap newActivities = new HashMap(); // key is UIID HashMap newGroupings = new HashMap(); // key is UIID // as we create the activities, we need to record any "first child" UIID's for the sequence activity to process later Map firstChildUIIDToSequence = new HashMap(); + Set oldParentActivities = originalLearningDesign.getParentActivities(); if ( oldParentActivities != null ) { Iterator iterator = oldParentActivities.iterator(); while(iterator.hasNext()){ - processActivity((Activity)iterator.next(), newLearningDesign, newActivities, newGroupings, null); + processActivity((Activity)iterator.next(), newLearningDesign, newActivities, newGroupings, null, + originalLearningDesign.getLearningDesignId(), uiidOffset); } } @@ -799,9 +861,8 @@ // Go back and find all the grouped activities and assign them the new groupings, based on the UIID. Can't // be done as we go as the grouping activity may be processed after the grouped activity. for ( Activity activity : activities) { - Integer groupingUIID = activity.getGroupingUIID(); - if ( groupingUIID != null ) { - activity.setGrouping(newGroupings.get(groupingUIID)); + if ( activity.getGroupingUIID() != null ) { + activity.setGrouping(newGroupings.get(activity.getGroupingUIID())); } } @@ -812,12 +873,12 @@ ComplexActivity newComplex = (ComplexActivity) activity; Activity oldDefaultActivity = newComplex.getDefaultActivity(); if ( oldDefaultActivity != null ) { - Activity newDefaultActivity = newActivities.get(oldDefaultActivity.getActivityUIID()); + Activity newDefaultActivity = newActivities.get(LearningDesign.addOffset(oldDefaultActivity.getActivityUIID(), uiidOffset)); newComplex.setDefaultActivity(newDefaultActivity); } } - if ( activity.isSequenceActivity() ) { + if ( activity.isSequenceActivity() ) { SequenceActivity newSequenceActivity = (SequenceActivity) activity; // Need to check if the sets are not null as these are new objects and Hibernate may not have backed them with collections yet. if ( newSequenceActivity.getBranchEntries() != null && newSequenceActivity.getBranchEntries().size() > 0 ) { @@ -827,12 +888,12 @@ // the condition was copied by the sequence activity copy BranchActivityEntry entry = (BranchActivityEntry) beIter.next(); BranchingActivity oldBranchingActivity = entry.getBranchingActivity(); - entry.setBranchingActivity((BranchingActivity) newActivities.get(oldBranchingActivity.getActivityUIID())); + entry.setBranchingActivity((BranchingActivity) newActivities.get(LearningDesign.addOffset(oldBranchingActivity.getActivityUIID(), uiidOffset))); Group oldGroup = entry.getGroup(); if ( oldGroup != null ) { Grouping oldGrouping = oldGroup.getGrouping(); - Grouping newGroouping = newGroupings.get(oldGrouping.getGroupingUIID()); - entry.setGroup(newGroouping.getGroup(oldGroup.getGroupUIID())); + Grouping newGroouping = newGroupings.get(LearningDesign.addOffset(oldGrouping.getGroupingUIID(), uiidOffset)); + entry.setGroup(newGroouping.getGroup(LearningDesign.addOffset(oldGroup.getGroupUIID(), uiidOffset))); } } } @@ -843,7 +904,7 @@ Iterator inputIter = activity.getInputActivities().iterator(); while (inputIter.hasNext()) { Activity elem = (Activity) inputIter.next(); - newInputActivities.add(newActivities.get(elem.getActivityUIID())); + newInputActivities.add(newActivities.get(LearningDesign.addOffset(elem.getActivityUIID(), uiidOffset))); } activity.getInputActivities().clear(); activity.getInputActivities().addAll(newInputActivities); @@ -853,36 +914,47 @@ // The activities collection in the learning design may already exist (as we have already done a save on the design). // If so, we can't just override the existing collection as the cascade causes an error. // newLearningDesign.getActivities() will create a new TreeSet(new ActivityOrderComparator()) if there isn't an existing set - newLearningDesign.getActivities().clear(); + // If the uiidOffset is > 0, then we are adding activities, so we don't want to clear first. + if ( uiidOffset == 0 ) { + newLearningDesign.getActivities().clear(); + } newLearningDesign.getActivities().addAll(activities); return newActivities; } - + /** As part of updateDesignActivities(), process an activity and, via recursive calls, the activity's child activities. Need to keep track - * of any new groupings created so we can go back and update the grouped activities with their new groupings at the end. + * of any new groupings created so we can go back and update the grouped activities with their new groupings at the end. Also copies the + * tool content. * * @param activity Activity to process. May not be null. * @param newLearningDesign The new learning design. May not be null. * @param newActivities Temporary set of new activities - as activities are processed they are added to the set. May not be null. * @param newGroupings Temporary set of new groupings. Key is the grouping UUID. May not be null. * @param parentActivity This activity's parent activity (if one exists). May be null. */ - private void processActivity(Activity activity, LearningDesign newLearningDesign, Map newActivities, Map newGroupings, Activity parentActivity) { - Activity newActivity = getActivityCopy(activity, newGroupings); + private void processActivity(Activity activity, LearningDesign newLearningDesign, Map newActivities, Map newGroupings, + Activity parentActivity, Long originalLearningDesignId, int uiidOffset) { + Activity newActivity = getActivityCopy(activity, newGroupings, uiidOffset); + newActivity.setActivityUIID( newActivity.getActivityUIID() ); newActivity.setLearningDesign(newLearningDesign); + newActivity.setReadOnly(false); if ( parentActivity != null ) { newActivity.setParentActivity(parentActivity); newActivity.setParentUIID(parentActivity.getActivityUIID()); } newActivities.put(newActivity.getActivityUIID(),newActivity); - + + if (newActivity.isToolActivity()) { + copyActivityToolContent(newActivity, newLearningDesign.getCopyTypeID(), originalLearningDesignId); + } + Set oldChildActivities = getChildActivities((Activity)activity); if ( oldChildActivities != null ) { Iterator childIterator = oldChildActivities.iterator(); while(childIterator.hasNext()){ - processActivity((Activity)childIterator.next(), newLearningDesign, newActivities, newGroupings, newActivity); + processActivity((Activity)childIterator.next(), newLearningDesign, newActivities, newGroupings, newActivity, originalLearningDesignId, uiidOffset); } } } @@ -894,13 +966,13 @@ * @param originalLearningDesign The LearningDesign to be copied * @param newLearningDesign The copy of the originalLearningDesign */ - public void updateDesignTransitions(LearningDesign originalLearningDesign, LearningDesign newLearningDesign, HashMap newActivities){ + public void updateDesignTransitions(LearningDesign originalLearningDesign, LearningDesign newLearningDesign, HashMap newActivities, int uiidOffset){ HashSet newTransitions = new HashSet(); Set oldTransitions = originalLearningDesign.getTransitions(); Iterator iterator = oldTransitions.iterator(); while(iterator.hasNext()){ Transition transition = (Transition)iterator.next(); - Transition newTransition = Transition.createCopy(transition); + Transition newTransition = Transition.createCopy(transition, uiidOffset); Activity toActivity = null; Activity fromActivity=null; if(newTransition.getToUIID()!=null) { @@ -920,8 +992,11 @@ // The transitions collection in the learning design may already exist (as we have already done a save on the design). // If so, we can't just override the existing collection as the cascade causes an error. + // If the uiidOffset is > 0, then we are adding transitions (rather than replacing), so we don't want to clear first. if ( newLearningDesign.getTransitions() != null ) { - newLearningDesign.getTransitions().clear(); + if ( uiidOffset == 0 ) { + newLearningDesign.getTransitions().clear(); + } newLearningDesign.getTransitions().addAll(newTransitions); } else { newLearningDesign.setTransitions(newTransitions); @@ -935,23 +1010,24 @@ * @param newGroupings Temporary set of new groupings. Key is the grouping UUID. May not be null. * @return Activity The new deep-copied Activity object */ - private Activity getActivityCopy(final Activity activity, Map newGroupings){ + private Activity getActivityCopy(final Activity activity, Map newGroupings, int uiidOffset){ if ( Activity.GROUPING_ACTIVITY_TYPE == activity.getActivityTypeId().intValue() ) { - GroupingActivity newGroupingActivity = (GroupingActivity) activity.createCopy(); + GroupingActivity newGroupingActivity = (GroupingActivity) activity.createCopy(uiidOffset); // now we need to manually add the grouping to the session, as we can't easily // set up a cascade Grouping grouping = newGroupingActivity.getCreateGrouping(); + grouping.setGroupingUIID(grouping.getGroupingUIID()); if ( grouping != null ) { groupingDAO.insert(grouping); newGroupings.put(grouping.getGroupingUIID(), grouping); } return newGroupingActivity; } else - return activity.createCopy(); + return activity.createCopy(uiidOffset); } /** - * Returns a set of child activities for the given parent activitity + * Returns a set of child activities for the given parent activity * * @param parentActivity The parent activity * @return HashSet Set of the activities that belong to the parentActivity @@ -1178,6 +1254,40 @@ return flashMessage.serializeMessage(); } + /** + * Get a unique name for a learning design, based on the names of the learning designs in the folder. + * If the learning design has duplicated name in same folder, then the new name will have a timestamp. + * The new name format will be oldname_ddMMYYYY_idx. The idx will be auto incremental index number, start from 1. + * Warning - this may be quite intensive as it gets all the learning designs in a folder. + * @param originalLearningDesign + * @param workspaceFolder + * @param copyType + * @return + */ + public String getUniqueNameForLearningDesign(String originalTitle, Integer workspaceFolderId) { + String newName = originalTitle; + if(workspaceFolderId != null ){ + List ldTitleList = learningDesignDAO.getLearningDesignTitlesByWorkspaceFolder(workspaceFolderId); + int idx = 1; + + Calendar calendar = Calendar.getInstance(); + int mth = calendar.get(Calendar.MONTH) + 1; + String mthStr = new Integer(mth).toString(); + if(mth < 10) + mthStr = "0" + mthStr; + int day = calendar.get(Calendar.DAY_OF_MONTH); + String dayStr = new Integer(day).toString(); + if(day < 10) + dayStr = "0" + dayStr; + String nameMid = dayStr + mthStr + calendar.get(Calendar.YEAR); + while ( ldTitleList.contains(newName) ) { + newName = originalTitle + "_" + nameMid + "_" + idx; + idx++; + } + } + return newName; + } + } \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java =================================================================== diff -u -r9214a5d232a6d9d60d5a482517b168724ce40f50 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 9214a5d232a6d9d60d5a482517b168724ce40f50) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -47,6 +47,7 @@ /** Message key returned by the storeLearningDesignDetails() method */ public static final String STORE_LD_MESSAGE_KEY = "storeLearningDesignDetails"; + public static final String INSERT_LD_MESSAGE_KEY = "insertLearningDesign"; public static final String START_EDIT_ON_FLY_MESSAGE_KEY = "startEditOnFly"; /** @@ -73,7 +74,8 @@ * @param setOriginalDesign If true, then sets the originalLearningDesign field in the new design * @return LearningDesign The new copy of learning design. */ - public LearningDesign copyLearningDesign(LearningDesign originalLearningDesign,Integer copyType,User user, WorkspaceFolder workspaceFolder, boolean setOriginalDesign); + public LearningDesign copyLearningDesign(LearningDesign originalLearningDesign,Integer copyType,User user, + WorkspaceFolder workspaceFolder, boolean setOriginalDesign, String newDesignName); /** * Create a copy of learning design as per the requested learning design @@ -94,9 +96,25 @@ * @return new LearningDesign */ public LearningDesign copyLearningDesign(Long originalLearningDesignID,Integer copyType, - Integer userID, Integer workspaceFolder, boolean setOriginalDesign)throws UserException, LearningDesignException, - WorkspaceFolderException, IOException; + Integer userID, Integer workspaceFolder, boolean setOriginalDesign) + throws UserException, LearningDesignException, WorkspaceFolderException, IOException; + /** + * Insert a learning design into another learning design. This is a copy and paste type of copy - it just dumps the contents (with modified + * activity ui ids) in the main learning design. It doesn't wrap up the contents in a sequence activity. Always sets the type to COPY_TYPE_NONE. + * @param originalDesignID The design to be "modified". Required. + * @param designToImportID The design to be imported into originalLearningDesign. Required. + * @param userId Current User. Required. + * @param createNewLearningDesign If true, then a copy of the originalLearningDesign is made and the copy modified. If it is false, then + * the originalLearningDesign is modified. Required. + * @param newDesignName New name for the design if a new design is being create. Optional. + * @param workspaceFolderID The folder in which to put the new learning design if createNewLearningDesign = true. May be null if createNewLearningDesign = false + * @return New / updated learning design + */ + public LearningDesign insertLearningDesign(Long originalDesignID, Long designToImportID, Integer userID, + boolean createNewLearningDesign, String newDesignName, Integer workspaceFolderID) throws UserException, LearningDesignException, + WorkspaceFolderException, IOException; + /** * @return List Returns the list of all the available LearningDesign's * */ @@ -298,5 +316,17 @@ /** Get the message service, which gives access to the I18N text */ public MessageService getMessageService(); - + + /** + * Get a unique name for a learning design, based on the names of the learning designs in the folder. + * If the learning design has duplicated name in same folder, then the new name will have a timestamp. + * The new name format will be oldname_ddMMYYYY_idx. The idx will be auto incremental index number, start from 1. + * Warning - this may be quite intensive as it gets all the learning designs in a folder. + * @param originalLearningDesign + * @param workspaceFolder + * @param copyType + * @return + */ + public String getUniqueNameForLearningDesign(String originalTitle, Integer workspaceFolderId); + } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java =================================================================== diff -u -rb01b55c28cf872fabcd146845693907e541fa38d -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision b01b55c28cf872fabcd146845693907e541fa38d) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -37,6 +37,9 @@ import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.authoring.service.IAuthoringService; +import org.lamsfoundation.lams.learningdesign.LearningDesign; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.FileUtilException; import org.lamsfoundation.lams.util.WebUtil; @@ -99,7 +102,7 @@ String wddxPacket; IAuthoringService authoringService = getAuthoringService(); try { - Long toolContentID = new Long(WebUtil.readLongParam(request,"toolContentID")); + Long toolContentID = WebUtil.readLongParam(request,"toolContentID",false); wddxPacket = authoringService.getToolOutputDefinitions(toolContentID); @@ -116,7 +119,7 @@ String wddxPacket; IAuthoringService authoringService = getAuthoringService(); try { - Long learningDesignID = new Long(WebUtil.readLongParam(request,"learningDesignID")); + Long learningDesignID = WebUtil.readLongParam(request,"learningDesignID",false); wddxPacket = authoringService.getLearningDesignDetails(learningDesignID); } catch (Exception e) { @@ -133,7 +136,7 @@ String wddxPacket; IAuthoringService authoringService = getAuthoringService(); try { - Long learningDesignID = new Long(WebUtil.readLongParam(request,"learningDesignID")); + Long learningDesignID = WebUtil.readLongParam(request,"learningDesignID",false); wddxPacket = authoringService.finishEditOnFly(learningDesignID, getUserId()); @@ -199,7 +202,7 @@ String wddxPacket; IAuthoringService authoringService = getAuthoringService(); try { - Long toolID = new Long(WebUtil.readLongParam(request,"toolID")); + Long toolID = WebUtil.readLongParam(request,"toolID",false); wddxPacket = authoringService.getToolContentID(toolID); } catch (Exception e) { wddxPacket = handleException(e, "getAllLearningLibraryDetails", authoringService).serializeMessage(); @@ -218,7 +221,7 @@ String wddxPacket; IAuthoringService authoringService = getAuthoringService(); try { - long toolContentID = WebUtil.readLongParam(request,AttributeNames.PARAM_TOOL_CONTENT_ID); + long toolContentID = WebUtil.readLongParam(request,AttributeNames.PARAM_TOOL_CONTENT_ID,false); wddxPacket = authoringService.copyToolContent(toolContentID); } catch (Exception e) { wddxPacket = handleException(e, "copyToolContent", authoringService).serializeMessage(); Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/InsertLDServlet.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/InsertLDServlet.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/InsertLDServlet.java (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -0,0 +1,109 @@ +/*************************************************************************** + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * ************************************************************************ + */ +/* $$Id$$ */ +package org.lamsfoundation.lams.authoring.web; + +import java.util.Hashtable; +import java.util.Vector; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.authoring.dto.StoreLearningDesignResultsDTO; +import org.lamsfoundation.lams.authoring.service.IAuthoringService; +import org.lamsfoundation.lams.learningdesign.LearningDesign; +import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; +import org.lamsfoundation.lams.learningdesign.dto.AuthoringActivityDTO; + +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.util.wddx.FlashMessage; +import org.lamsfoundation.lams.util.wddx.WDDXProcessor; +import org.lamsfoundation.lams.util.wddx.WDDXTAGS; +import org.lamsfoundation.lams.web.servlet.AbstractStoreWDDXPacketServlet; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + + +/** + * Insert a learning design into another learning design. This is a copy and paste type of copy - it just dumps the contents (with modified + * activity ui ids) in the main learning design. It doesn't wrap up the contents in a sequence activity. Always sets the type to COPY_TYPE_NONE. + * + * @author Fiona Malikoff + * + * @web:servlet name="insertLearningDesign" + * @web:servlet-mapping url-pattern="/servlet/authoring/insertLearningDesign" + */ +public class InsertLDServlet extends AbstractStoreWDDXPacketServlet { + +// private static final long serialVersionUID = -2298959991408815691L; + private static Logger log = Logger.getLogger(InsertLDServlet.class); + + private Integer getUserId() { + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + return user != null ? user.getUserID() : null; + } + + public IAuthoringService getAuthoringService(){ + WebApplicationContext webContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); + return (IAuthoringService) webContext.getBean(AuthoringConstants.AUTHORING_SERVICE_BEAN_NAME); + } + + protected String process(String wddxPacket, HttpServletRequest request) + throws Exception + { + String returnPacket = null; + IAuthoringService authoringService = getAuthoringService(); + + try { + Hashtable table = (Hashtable)WDDXProcessor.deserialize(wddxPacket); + + Long originalLearningDesignID = WDDXProcessor.convertToLong(table,WDDXTAGS.LEARNING_DESIGN_ID); + Long designToImportID = WDDXProcessor.convertToLong(table,WDDXTAGS.LEARNING_DESIGN_TO_IMPORT_ID); + boolean createNewLearningDesign = WDDXProcessor.convertToBoolean(table,WDDXTAGS.CREATE_NEW_LEARNING_DESIGN); + Integer folderID = WDDXProcessor.convertToInteger(table,WDDXTAGS.WORKSPACE_FOLDER_ID); + String title = WDDXProcessor.convertToString(table,WDDXTAGS.TITLE); + + LearningDesign updatedLearningDesign = authoringService.insertLearningDesign(originalLearningDesignID, designToImportID, getUserId(), + createNewLearningDesign, title, folderID); + return new FlashMessage(getMessageKey(wddxPacket, request), updatedLearningDesign.getLearningDesignId()).serializeMessage(); + + } catch ( Exception e) { + log.error("Authoring error. input packet was "+wddxPacket,e); + FlashMessage flashMessage = new FlashMessage(getMessageKey(wddxPacket, request), + authoringService.getMessageService().getMessage("invalid.wddx.packet",new Object[]{e.getMessage()}), + FlashMessage.ERROR); + returnPacket = flashMessage.serializeMessage(); + } + return returnPacket; + } + + protected String getMessageKey(String designDetails, HttpServletRequest request) { + return IAuthoringService.INSERT_LD_MESSAGE_KEY; + } + +} Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/StoreLDServlet.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/StoreLDServlet.java (.../StoreLDServlet.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/StoreLDServlet.java (.../StoreLDServlet.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -49,7 +49,7 @@ public class StoreLDServlet extends AbstractStoreWDDXPacketServlet { private static final long serialVersionUID = -2298959991408815691L; - private static Logger log = Logger.getLogger(AuthoringAction.class); + private static Logger log = Logger.getLogger(StoreLDServlet.class); public IAuthoringService getAuthoringService(){ WebApplicationContext webContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); Index: lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java =================================================================== diff -u -rc654b42528f2da059026895677d91efc86eb1876 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision c654b42528f2da059026895677d91efc86eb1876) +++ lams_central/src/java/org/lamsfoundation/lams/workspace/service/WorkspaceManagementService.java (.../WorkspaceManagementService.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -578,7 +578,7 @@ LearningDesign design = (LearningDesign)iterator.next(); authoringService.copyLearningDesign(design, new Integer(LearningDesign.COPY_TYPE_NONE), - user,targetWorkspaceFolder, false); + user,targetWorkspaceFolder, false, null); } } } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java =================================================================== diff -u -rac99dd8a79daaa42b1e6cdbe9b1a5fd197107b83 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision ac99dd8a79daaa42b1e6cdbe9b1a5fd197107b83) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Activity.java (.../Activity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -1008,14 +1008,16 @@ /** Create a deep copy of the this activity. It should return the same * subclass as the activity being copied. Generally doesn't copy the "link" type - * fields like transitions, learning design, etc + * fields like transitions, learning design, etc. + * @param uiidOffset - this should be added to UIID fields in any new objects. Used + * when importing a design into another design. * @return deep copy of this object */ - public abstract Activity createCopy(); + public abstract Activity createCopy(int uiidOffset); - protected void copyToNewActivity(Activity newActivity ) { + protected void copyToNewActivity(Activity newActivity, int uiidOffset ) { - newActivity.setActivityUIID(this.getActivityUIID()); + newActivity.setActivityUIID(LearningDesign.addOffset(this.getActivityUIID(),uiidOffset)); newActivity.setDescription(this.getDescription()); newActivity.setTitle(this.getTitle()); newActivity.setHelpText(this.getHelpText()); @@ -1028,7 +1030,7 @@ newActivity.setActivityCategoryID(this.getActivityCategoryID()); newActivity.setGrouping(this.getGrouping()); - newActivity.setGroupingUIID(this.getGroupingUIID()); + newActivity.setGroupingUIID(LearningDesign.addOffset(this.getGroupingUIID(),uiidOffset)); newActivity.setDefineLater(this.getDefineLater()); newActivity.setCreateDateTime(new Date()); @@ -1042,6 +1044,9 @@ newActivity.setReadOnly(this.getReadOnly()); newActivity.setStopAfterActivity(this.isStopAfterActivity()); + newActivity.setParentActivity(this.getParentActivity()); + newActivity.setParentUIID(LearningDesign.addOffset(this.getParentUIID(), uiidOffset)); + if ( this.getInputActivities()!=null && this.getInputActivities().size() > 0 ) { newActivity.setInputActivities(new HashSet()); newActivity.getInputActivities().addAll(this.getInputActivities()); @@ -1087,5 +1092,5 @@ } return null; } - + } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/BranchCondition.java =================================================================== diff -u -r30acfe9f54a7c8e0e67b987665d8e8d9e93f496c -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/BranchCondition.java (.../BranchCondition.java) (revision 30acfe9f54a7c8e0e67b987665d8e8d9e93f496c) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/BranchCondition.java (.../BranchCondition.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -204,8 +204,9 @@ } /** Create a new BranchCondition based on itself, leaving conditionId as null */ - public BranchCondition clone() { - return new BranchCondition(null, conditionUIID, orderId, name, displayName, type, startValue, endValue, exactMatchValue); + public BranchCondition clone(int uiidOffset) { + Integer newConditionUIID = LearningDesign.addOffset(conditionUIID, uiidOffset); + return new BranchCondition(null, newConditionUIID, orderId, name, displayName, type, startValue, endValue, exactMatchValue); } public int compareTo(Object arg0) { Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenBranchingActivity.java =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenBranchingActivity.java (.../ChosenBranchingActivity.java) (revision 97612142f4697066beb66064e83ff31fef1712b9) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenBranchingActivity.java (.../ChosenBranchingActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -131,11 +131,11 @@ * Makes a copy of the BranchingActivity for authoring, preview and monitoring environment * @return BranchingActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ ChosenBranchingActivity newBranchingActivity = new ChosenBranchingActivity(); copyBranchingFields(newBranchingActivity); - copyToNewComplexActivity(newBranchingActivity); + copyToNewComplexActivity(newBranchingActivity, uiidOffset); return newBranchingActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouping.java =================================================================== diff -u -r11914f2354254e0e92e2a271453ba2f0e8a35fdc -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouping.java (.../ChosenGrouping.java) (revision 11914f2354254e0e92e2a271453ba2f0e8a35fdc) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ChosenGrouping.java (.../ChosenGrouping.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -47,10 +47,10 @@ * This method creates a deep copy of the Grouping * @return ChosenGrouping The deep copied Grouping object */ - public Grouping createCopy() + public Grouping createCopy(int uiidOffset) { ChosenGrouping chosenGrouping = new ChosenGrouping(); - copyGroupingFields(chosenGrouping); + copyGroupingFields(chosenGrouping, uiidOffset); return chosenGrouping; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ComplexActivity.java =================================================================== diff -u -r245c3e8e3ffd8e00786cd143f3467990b838ed9e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ComplexActivity.java (.../ComplexActivity.java) (revision 245c3e8e3ffd8e00786cd143f3467990b838ed9e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ComplexActivity.java (.../ComplexActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -231,8 +231,8 @@ return activityStrategy; } - protected void copyToNewComplexActivity(ComplexActivity newComplex) { - copyToNewActivity(newComplex); + protected void copyToNewComplexActivity(ComplexActivity newComplex, int uiidOffset) { + copyToNewActivity(newComplex, uiidOffset); newComplex.setDefaultActivity(this.getDefaultActivity()); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java (.../GateActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/GateActivity.java (.../GateActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -250,9 +250,9 @@ this.systemTool = systemTool; } - protected void copyToNewActivity(GateActivity newActivity ) { + protected void copyToNewActivity(GateActivity newActivity, int uiidOffset) { - super.copyToNewActivity(newActivity); + super.copyToNewActivity(newActivity, uiidOffset); newActivity.setSystemTool(this.getSystemTool()); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupBranchingActivity.java =================================================================== diff -u -r30acfe9f54a7c8e0e67b987665d8e8d9e93f496c -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupBranchingActivity.java (.../GroupBranchingActivity.java) (revision 30acfe9f54a7c8e0e67b987665d8e8d9e93f496c) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupBranchingActivity.java (.../GroupBranchingActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -134,11 +134,11 @@ * Makes a copy of the BranchingActivity for authoring, preview and monitoring environment * @return BranchingActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ GroupBranchingActivity newBranchingActivity = new GroupBranchingActivity(); copyBranchingFields(newBranchingActivity); - copyToNewComplexActivity(newBranchingActivity); + copyToNewComplexActivity(newBranchingActivity, uiidOffset); return newBranchingActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouping.java =================================================================== diff -u -r87ec6bd0708e9da634182eacca8c74e442bc748f -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouping.java (.../Grouping.java) (revision 87ec6bd0708e9da634182eacca8c74e442bc748f) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouping.java (.../Grouping.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -121,23 +121,24 @@ * * @return deep copy of this object */ - public abstract Grouping createCopy(); + public abstract Grouping createCopy(int uiidOffset); /** * Copy all the groups within this grouping to the newGrouping object. * Copies the groups but not users in the groups. Copies any group to branch * mappings, updating the group but not the activity. Used by createCopy() * implementations. */ - protected void copyGroupingFields(Grouping newGrouping){ + protected void copyGroupingFields(Grouping newGrouping, int uiidOffset){ newGrouping.setMaxNumberOfGroups(this.getMaxNumberOfGroups()); - newGrouping.setGroupingUIID(this.getGroupingUIID()); + newGrouping.setGroupingUIID(LearningDesign.addOffset(this.getGroupingUIID(), uiidOffset)); if ( this.getGroups() != null && this.getGroups().size() > 0 ) { Iterator iter = this.getGroups().iterator(); while ( iter.hasNext() ) { Group oldGroup = (Group) iter.next(); Group newGroup = oldGroup.createCopy(newGrouping); + newGroup.setGroupUIID(LearningDesign.addOffset(newGroup.getGroupUIID(), uiidOffset)); newGrouping.getGroups().add(newGroup); } } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupingActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupingActivity.java (.../GroupingActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/GroupingActivity.java (.../GroupingActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -150,12 +150,12 @@ * * @return GroupActivity, which is copy of this activity. */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ GroupingActivity groupingActivity = new GroupingActivity(); - copyToNewActivity(groupingActivity); - groupingActivity.setCreateGroupingUIID(this.createGroupingUIID); + copyToNewActivity(groupingActivity, uiidOffset); + groupingActivity.setCreateGroupingUIID(LearningDesign.addOffset(this.createGroupingUIID, uiidOffset)); Grouping currentGrouping = this.getCreateGrouping(); - Grouping newGrouping = currentGrouping.createCopy(); + Grouping newGrouping = currentGrouping.createCopy(uiidOffset); groupingActivity.setCreateGrouping(newGrouping); return groupingActivity; } @@ -202,9 +202,9 @@ this.systemTool = systemTool; } - protected void copyToNewActivity(GroupingActivity newActivity ) { + protected void copyToNewActivity(GroupingActivity newActivity, int uiidOffset ) { - super.copyToNewActivity(newActivity); + super.copyToNewActivity(newActivity, uiidOffset); newActivity.setSystemTool(this.getSystemTool()); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningDesign.java =================================================================== diff -u -r9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningDesign.java (.../LearningDesign.java) (revision 9481bb9c6f8c0e4d6fbed6b230a41c77feda64c6) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/LearningDesign.java (.../LearningDesign.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -550,5 +550,9 @@ return new FolderContentDTO(); } + public static Integer addOffset(Integer uiid, int uiidOffset) { + return uiid != null && uiidOffset > 0 ? new Integer(uiid.intValue() + uiidOffset) : uiid; + } + } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/NullActivity.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/NullActivity.java (.../NullActivity.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/NullActivity.java (.../NullActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -42,7 +42,7 @@ * subclass as the activity being copied * @return deep copy of this object */ - public Activity createCopy() { + public Activity createCopy(int uiidOffset) { return new NullActivity(); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/OptionsActivity.java =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/OptionsActivity.java (.../OptionsActivity.java) (revision 97612142f4697066beb66064e83ff31fef1712b9) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/OptionsActivity.java (.../OptionsActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -132,9 +132,9 @@ activities); super.activityStrategy = new OptionsActivityStrategy(this); } - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ OptionsActivity newOptionsActivity = new OptionsActivity(); - copyToNewComplexActivity(newOptionsActivity); + copyToNewComplexActivity(newOptionsActivity, uiidOffset); /** OptionsActivity Specific Attributes */ newOptionsActivity.setMaxNumberOfOptions(this.getMaxNumberOfOptions()); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ParallelActivity.java =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ParallelActivity.java (.../ParallelActivity.java) (revision 97612142f4697066beb66064e83ff31fef1712b9) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ParallelActivity.java (.../ParallelActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -120,10 +120,10 @@ * Makes a copy of the ParallelActivity for authoring, preview and monitoring enviornment * @return ParallelActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ ParallelActivity newParallelActivity = new ParallelActivity(); - copyToNewComplexActivity(newParallelActivity); + copyToNewComplexActivity(newParallelActivity, uiidOffset); return newParallelActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java (.../PermissionGateActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/PermissionGateActivity.java (.../PermissionGateActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -130,9 +130,9 @@ * Makes a copy of the PermissionGateActivity for authoring, preview and monitoring enviornment * @return PermissionGateActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ PermissionGateActivity newPermissionGateActivity = new PermissionGateActivity(); - copyToNewActivity(newPermissionGateActivity); + copyToNewActivity(newPermissionGateActivity, uiidOffset); newPermissionGateActivity.setGateOpen(new Boolean(false)); newPermissionGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); return newPermissionGateActivity; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouping.java =================================================================== diff -u -r11914f2354254e0e92e2a271453ba2f0e8a35fdc -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouping.java (.../RandomGrouping.java) (revision 11914f2354254e0e92e2a271453ba2f0e8a35fdc) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/RandomGrouping.java (.../RandomGrouping.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -100,9 +100,9 @@ * This method creates a deep copy of the Grouping * @return RandomGrouping The deep copied Grouping object */ - public Grouping createCopy(){ + public Grouping createCopy(int uiidOffset){ RandomGrouping randomGrouping = new RandomGrouping(); - copyGroupingFields(randomGrouping); + copyGroupingFields(randomGrouping, uiidOffset); randomGrouping.setNumberOfGroups(this.getNumberOfGroups()); randomGrouping.setLearnersPerGroup(this.getLearnersPerGroup()); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ScheduleGateActivity.java (.../ScheduleGateActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -190,9 +190,9 @@ * Makes a copy of the ScheduleGateActivity for authoring, preview and monitoring enviornment * @return ScheduleGateActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ ScheduleGateActivity newScheduleGateActivity = new ScheduleGateActivity(); - copyToNewActivity(newScheduleGateActivity); + copyToNewActivity(newScheduleGateActivity, uiidOffset); newScheduleGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); newScheduleGateActivity.setGateOpen(new Boolean(false)); Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/SequenceActivity.java =================================================================== diff -u -rce5d845726b74fbc0cee208f716182612b1ef4e8 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/SequenceActivity.java (.../SequenceActivity.java) (revision ce5d845726b74fbc0cee208f716182612b1ef4e8) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/SequenceActivity.java (.../SequenceActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -141,9 +141,9 @@ * Makes a copy of the SequenceActivity for authoring, preview and monitoring environment * @return SequenceActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ SequenceActivity newSequenceActivity = new SequenceActivity(); - copyToNewComplexActivity(newSequenceActivity); + copyToNewComplexActivity(newSequenceActivity, uiidOffset); newSequenceActivity.defaultActivity = this.defaultActivity; newSequenceActivity.systemTool = this.systemTool; @@ -153,9 +153,12 @@ while ( iter.hasNext() ) { BranchActivityEntry oldEntry = (BranchActivityEntry) iter.next(); BranchActivityEntry newEntry = new BranchActivityEntry(null, - oldEntry.getEntryUIID(), newSequenceActivity, oldEntry.getBranchingActivity(), oldEntry.getGroup()); + LearningDesign.addOffset(oldEntry.getEntryUIID(), uiidOffset), newSequenceActivity, + oldEntry.getBranchingActivity(), oldEntry.getGroup()); if ( oldEntry.getCondition() != null ) { - newEntry.setCondition(oldEntry.getCondition().clone()); + BranchCondition newCondition = oldEntry.getCondition().clone(uiidOffset); + newEntry.setCondition(newCondition); + } newSequenceActivity.getBranchEntries().add(newEntry); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/SynchGateActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/SynchGateActivity.java (.../SynchGateActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/SynchGateActivity.java (.../SynchGateActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -128,9 +128,9 @@ * Makes a copy of the SynchGateActivity for authoring, preview and monitoring enviornment * @return SynchGateActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy() { + public Activity createCopy(int uiidOffset) { SynchGateActivity newSynchGateActivity = new SynchGateActivity(); - copyToNewActivity(newSynchGateActivity); + copyToNewActivity(newSynchGateActivity, uiidOffset); newSynchGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); newSynchGateActivity.setGateOpen(new Boolean(false)); return newSynchGateActivity; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/SystemGateActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/SystemGateActivity.java (.../SystemGateActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/SystemGateActivity.java (.../SystemGateActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -128,9 +128,9 @@ * Makes a copy of the SystemGateActivity for authoring, preview and monitoring enviornment * @return SystemGateActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy() { + public Activity createCopy(int uiidOffset) { SystemGateActivity newSysGateActivity = new SystemGateActivity(); - copyToNewActivity(newSysGateActivity); + copyToNewActivity(newSysGateActivity, uiidOffset); newSysGateActivity.setGateActivityLevelId(this.getGateActivityLevelId()); newSysGateActivity.setGateOpen(new Boolean(false)); return newSysGateActivity; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java =================================================================== diff -u -r09048f91f2dcbb6b63449f3c1fb9e1a09221a35e -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java (.../ToolActivity.java) (revision 09048f91f2dcbb6b63449f3c1fb9e1a09221a35e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolActivity.java (.../ToolActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -150,9 +150,9 @@ * * @return ToolActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ ToolActivity newToolActivity = new ToolActivity(); - copyToNewActivity(newToolActivity); + copyToNewActivity(newToolActivity, uiidOffset); newToolActivity.setTool(this.getTool()); newToolActivity.setToolContentId(this.getToolContentId()); return newToolActivity; Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolBranchingActivity.java =================================================================== diff -u -r30acfe9f54a7c8e0e67b987665d8e8d9e93f496c -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolBranchingActivity.java (.../ToolBranchingActivity.java) (revision 30acfe9f54a7c8e0e67b987665d8e8d9e93f496c) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/ToolBranchingActivity.java (.../ToolBranchingActivity.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -136,11 +136,11 @@ * Makes a copy of the BranchingActivity for authoring, preview and monitoring enviornment * @return BranchingActivity Returns a deep-copy of the originalActivity */ - public Activity createCopy(){ + public Activity createCopy(int uiidOffset){ ToolBranchingActivity newBranchingActivity = new ToolBranchingActivity(); copyBranchingFields(newBranchingActivity); - copyToNewComplexActivity(newBranchingActivity); + copyToNewComplexActivity(newBranchingActivity, uiidOffset); return newBranchingActivity; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Transition.java =================================================================== diff -u -r920894ca746cba5e080023c5cc80167d64d1653d -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Transition.java (.../Transition.java) (revision 920894ca746cba5e080023c5cc80167d64d1653d) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Transition.java (.../Transition.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -116,20 +116,20 @@ } /** - * Makes a copy of the Transition for authoring, preview and monitoring enviornment + * Makes a copy of the Transition for authoring, preview and monitoring environment * * @param originalTransition The transition to be deep-copied * @return Transition Returns a deep-copy o fthe originalTransition */ - public static Transition createCopy(Transition originalTransition){ + public static Transition createCopy(Transition originalTransition, int uiidOffset){ Transition newTransition = new Transition(); - newTransition.setTransitionUIID(originalTransition.getTransitionUIID()); + newTransition.setTransitionUIID(LearningDesign.addOffset(originalTransition.getTransitionUIID(),uiidOffset)); newTransition.setDescription(originalTransition.getDescription()); newTransition.setTitle(originalTransition.getTitle()); newTransition.setCreateDateTime(new Date()); - newTransition.setToUIID(originalTransition.getToUIID()); - newTransition.setFromUIID(originalTransition.getFromUIID()); + newTransition.setToUIID(LearningDesign.addOffset(originalTransition.getToUIID(),uiidOffset)); + newTransition.setFromUIID(LearningDesign.addOffset(originalTransition.getFromUIID(),uiidOffset)); return newTransition; } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/ILearningDesignDAO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/ILearningDesignDAO.java (.../ILearningDesignDAO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/ILearningDesignDAO.java (.../ILearningDesignDAO.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -84,4 +84,13 @@ * given original_learning_design_id */ public List getLearningDesignsByOriginalDesign(Long originalDesignID); + + /** + * Get the titles of all the learning designs in the given folder. + * @param workspaceFolderID The workspace_folder_id of the WorkspaceFolder + * from where the designs have to be fetched. + * @return List The List of titles + */ + public List getLearningDesignTitlesByWorkspaceFolder(Integer workspaceFolderID); + } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/LearningDesignDAO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/LearningDesignDAO.java (.../LearningDesignDAO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dao/hibernate/LearningDesignDAO.java (.../LearningDesignDAO.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -46,7 +46,8 @@ " where workspace_folder_id=?"; private static final String FIND_BY_ORIGINAL ="from " + TABLENAME +" in class " + LearningDesign.class.getName()+ " where original_learning_design_id=?"; - + private static final String FIND_LD_NAMES_IN_FOLDER = "select title from " + LearningDesign.class.getName()+ + " where workspace_folder_id=?"; /* * @see org.lamsfoundation.lams.learningdesign.dao.interfaces.ILearningDesignDAO#getLearningDesignById(java.lang.Long) @@ -105,4 +106,12 @@ return list; } + /** + * (non-Javadoc) + * @see org.lamsfoundation.lams.learningdesign.dao.ILearningDesignDAO#getLearningDesignTitlesByWorkspaceFolder(java.lang.Integer) + */ + public List getLearningDesignTitlesByWorkspaceFolder(Integer workspaceFolderID){ + return this.getHibernateTemplate().find(FIND_LD_NAMES_IN_FOLDER,workspaceFolderID); + } + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/LessonClass.java =================================================================== diff -u -r267ac152a113b91adbdbe98ac3601ac08b686b11 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/lesson/LessonClass.java (.../LessonClass.java) (revision 267ac152a113b91adbdbe98ac3601ac08b686b11) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/LessonClass.java (.../LessonClass.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -92,7 +92,7 @@ * This method creates a deep copy of the LessonClass * @return LessonClass The deep copied LessonClass object */ - public Grouping createCopy() + public Grouping createCopy(int uiidOffset) { LessonClass lessonClass = new LessonClass(); lessonClass.staffGroup = this.staffGroup; Index: lams_common/src/java/org/lamsfoundation/lams/util/wddx/WDDXTAGS.java =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/src/java/org/lamsfoundation/lams/util/wddx/WDDXTAGS.java (.../WDDXTAGS.java) (revision 97612142f4697066beb66064e83ff31fef1712b9) +++ lams_common/src/java/org/lamsfoundation/lams/util/wddx/WDDXTAGS.java (.../WDDXTAGS.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -213,8 +213,8 @@ public static final String CONDITION_END_VALUE = "endValue"; public static final String CONDITION_EXACT_MATCH_VALUE = "exactMatchValue"; + /** LD Import specific tags */ + public static final String LEARNING_DESIGN_TO_IMPORT_ID="learningDesignIDToImport"; + public static final String CREATE_NEW_LEARNING_DESIGN="createNewLearningDesign"; - - - } Index: lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestActivityDAO.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestActivityDAO.java (.../TestActivityDAO.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/test/java/org/lamsfoundation/lams/learningdesign/dao/TestActivityDAO.java (.../TestActivityDAO.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -101,27 +101,27 @@ }*/ public void testCreateToolActivityCopy(){ ToolActivity ta = (ToolActivity) activityDAO.getActivityByActivityId(new Long(20)); - Activity newToolActivity = ta.createCopy(); + Activity newToolActivity = ta.createCopy(0); activityDAO.insert(newToolActivity); assertNotNull(newToolActivity.getActivityId()); } public void testCreateGroupingActivityCopy(){ GroupingActivity ga = (GroupingActivity) activityDAO.getActivityByActivityId(new Long(23)); Activity newGroupingActivity = null; - newGroupingActivity = ga.createCopy(); + newGroupingActivity = ga.createCopy(0); activityDAO.insert(newGroupingActivity); assertNotNull(newGroupingActivity.getActivityId()); } public void testCreateOptionsActivityCopy(){ OptionsActivity oa = (OptionsActivity) activityDAO.getActivityByActivityId(new Long(12)); Activity optionsActivity =null; - optionsActivity = oa.createCopy(); + optionsActivity = oa.createCopy(0); activityDAO.insert(optionsActivity); assertNotNull(optionsActivity.getActivityId()); } public void testCreateParallelActivityCopy(){ ParallelActivity pa = (ParallelActivity) activityDAO.getActivityByActivityId(new Long(13)); - Activity parallelActivity = pa.createCopy(); + Activity parallelActivity = pa.createCopy(0); activityDAO.insert(parallelActivity); assertNotNull(parallelActivity.getActivityId()); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r97bcad4dce01d8533b99820e75b612bd185500ed -r309a597eada52a4079f2985e0d97beedf9adda42 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 97bcad4dce01d8533b99820e75b612bd185500ed) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 309a597eada52a4079f2985e0d97beedf9adda42) @@ -388,52 +388,13 @@ WorkspaceFolder workspaceFolder, int copyType) { -// if the learning design has duplicated name in same folder, then rename it with timestamp. - // the new name format will be oldname_ddMMYYYY_idx. The idx will be auto incremental index number, start from 1. - String newName = originalLearningDesign.getTitle(); - if(workspaceFolder != null && copyType == LearningDesign.COPY_TYPE_LESSON){ - boolean dupName; - List ldList = learningDesignDAO.getAllLearningDesignsInFolder(workspaceFolder.getWorkspaceFolderId()); - int idx = 1; - - //contruct middle part of name by timestamp - Calendar calendar = Calendar.getInstance(); - int mth = calendar.get(Calendar.MONTH) + 1; - String mthStr = new Integer(mth).toString(); - if(mth < 10) - mthStr = "0" + mthStr; - int day = calendar.get(Calendar.DAY_OF_MONTH); - String dayStr = new Integer(day).toString(); - if(day < 10) - dayStr = "0" + dayStr; - String nameMid = dayStr + mthStr + calendar.get(Calendar.YEAR); - while(true){ - dupName = false; - for(LearningDesign eld :ldList){ - if(StringUtils.equals(eld.getTitle(),newName)){ - dupName = true; - break; - } - } - if(!dupName) - break; - newName = originalLearningDesign.getTitle() + "_" + nameMid + "_" + idx; - idx++; - } - } - //copy the current learning design LearningDesign copiedLearningDesign = authoringService.copyLearningDesign(originalLearningDesign, new Integer(copyType), user, workspaceFolder, - true); - - // clear the live edit flag - copiedLearningDesign.setEditOverrideLock(false); - - copiedLearningDesign.setTitle(newName); - + true, + null); authoringService.saveLearningDesign(copiedLearningDesign); // Make all efforts to make sure it has a title