Index: lams_central/src/java/org/lamsfoundation/lams/authoring/IObjectExtractor.java =================================================================== diff -u -r053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc -r56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d --- lams_central/src/java/org/lamsfoundation/lams/authoring/IObjectExtractor.java (.../IObjectExtractor.java) (revision 053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/IObjectExtractor.java (.../IObjectExtractor.java) (revision 56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d) @@ -35,7 +35,7 @@ public static final String OBJECT_EXTRACTOR_SPRING_BEANNAME = "ObjectExtractor"; - public abstract LearningDesign extractSaveLearningDesign(Hashtable table, WorkspaceFolder workspaceFolder, User user) + public abstract LearningDesign extractSaveLearningDesign(Hashtable table, LearningDesign existingLearningDesign, WorkspaceFolder workspaceFolder, User user) throws WDDXProcessorConversionException, ObjectExtractorException; public void setMode(Integer mode); Index: lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java =================================================================== diff -u -r053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc -r56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d --- lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/ObjectExtractor.java (.../ObjectExtractor.java) (revision 56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d) @@ -293,14 +293,11 @@ /* (non-Javadoc) * @see org.lamsfoundation.lams.authoring.IObjectExtractor#extractSaveLearningDesign(java.util.Hashtable) */ - public LearningDesign extractSaveLearningDesign(Hashtable table, WorkspaceFolder workspaceFolder, User user) throws WDDXProcessorConversionException, ObjectExtractorException { + public LearningDesign extractSaveLearningDesign(Hashtable table, LearningDesign existingLearningDesign, WorkspaceFolder workspaceFolder, User user) throws WDDXProcessorConversionException, ObjectExtractorException { - learningDesign = null; + // if the learningDesign already exists, update it, otherwise create a new one. + learningDesign = existingLearningDesign!= null ? existingLearningDesign : new LearningDesign(); - Long learningDesignId = WDDXProcessor.convertToLong(table, "learningDesignID"); - //if the learningDesignID is not null, load the existing LearningDesign object from the database, otherwise create a new one. - learningDesign = learningDesignId!= null ? learningDesignDAO.getLearningDesignById(learningDesignId) : new LearningDesign(); - // Check the copy type. Can only update it if it is COPY_TYPE_NONE (ie authoring copy) Integer copyTypeID = WDDXProcessor.convertToInteger(table,WDDXTAGS.COPY_TYPE); if ( copyTypeID == null ) { Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -r053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc -r56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 053f4adbf9e3b8f5eca3e67b4fba0350e65e78fc) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 56f0a9dbc1b2eab52b3b798c891b4bb5794d4f0d) @@ -1085,6 +1085,10 @@ * It received a WDDX packet from flash, deserializes it * and then finally persists it to the database. * + * A user may update an existing learning design if they have user/owner rights to the + * folder or they are doing live edit. A user may create a new learning design only if they + * have user/owner rights to the folder. + * * Note: it does not validate the design - that must be done * separately. * @@ -1107,15 +1111,23 @@ } WorkspaceFolder workspaceFolder = null; + boolean authorised = false; if (workspaceFolderID != null ) { - if ( ! workspaceManagementService.isUserAuthorizedToModifyFolderContents(workspaceFolderID, userID) ) { - throw new UserException("User with user_id of " + userID +" is not authorized to store a design in this workspace folder "+workspaceFolderID); - } workspaceFolder = (WorkspaceFolder)baseDAO.find(WorkspaceFolder.class,workspaceFolderID); + authorised = workspaceManagementService.isUserAuthorizedToModifyFolderContents(workspaceFolderID, userID); } + + Long learningDesignId = WDDXProcessor.convertToLong(table, "learningDesignID"); + LearningDesign existingLearningDesign = learningDesignId != null ? learningDesignDAO.getLearningDesignById(learningDesignId) : null; + if ( ! authorised && existingLearningDesign != null && Boolean.TRUE.equals(existingLearningDesign.getEditOverrideLock())) { + authorised = userID.equals(existingLearningDesign.getEditOverrideUser().getUserId()); + } + if ( ! authorised ) { + throw new UserException("User with user_id of " + userID +" is not authorized to store a design in this workspace folder "+workspaceFolderID); + } IObjectExtractor extractor = (IObjectExtractor) beanFactory.getBean(IObjectExtractor.OBJECT_EXTRACTOR_SPRING_BEANNAME); - LearningDesign design = extractor.extractSaveLearningDesign(table, workspaceFolder, user); + LearningDesign design = extractor.extractSaveLearningDesign(table, existingLearningDesign, workspaceFolder, user); if(extractor.getMode().intValue() == 1) copyLearningDesignToolContent(design, design, design.getCopyTypeID());