Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -ra971e4d1589b71a7a479e340e89d9fddadc72b12 -r64f3c42cf2bf0f73d35618cc3a11f7945782b3ac --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision a971e4d1589b71a7a479e340e89d9fddadc72b12) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 64f3c42cf2bf0f73d35618cc3a11f7945782b3ac) @@ -149,6 +149,7 @@ + Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java =================================================================== diff -u -r34b959260a0f8f8285793a4481a95ca3580eabc5 -r64f3c42cf2bf0f73d35618cc3a11f7945782b3ac --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java (.../AuthoringActivityDTO.java) (revision 34b959260a0f8f8285793a4481a95ca3580eabc5) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/dto/AuthoringActivityDTO.java (.../AuthoringActivityDTO.java) (revision 64f3c42cf2bf0f73d35618cc3a11f7945782b3ac) @@ -121,6 +121,9 @@ /** Instructions for OptionsActivity*/ private String optionsInstructions; + /** The tool_signature of the activity */ + private String toolSignature; + /** The tool_id of the activity */ private Long toolID; @@ -199,7 +202,7 @@ Long learningLibraryID, Date createDateTime, Boolean runOffline, String languageFile, Integer maxOptions, Integer minOptions, - String optionsInstructions, Long toolID, Long toolContentID, + String optionsInstructions, String toolSignature, Long toolID, Long toolContentID, Integer activityCategoryID, Integer gateActivityLevelID, Boolean gateOpen, Long gateStartTimeOffset, Long gateEndTimeOffset, Date gateStartDateTime, Date gateEndDateTime, @@ -230,6 +233,7 @@ this.maxOptions = maxOptions; this.minOptions = minOptions; this.optionsInstructions = optionsInstructions; + this.toolSignature = toolSignature; this.toolID = toolID; this.toolContentID = toolContentID; this.activityCategoryID = activityCategoryID; @@ -329,7 +333,8 @@ } private void addToolActivityAttributes(ToolActivity toolActivity){ this.toolContentID = toolActivity.getToolContentId(); - this.toolID = toolActivity.getTool().getToolId(); + this.toolID = toolActivity.getTool().getToolId(); + this.toolSignature = toolActivity.getTool().getToolSignature(); this.authoringURL = toolActivity.getTool().getAuthorUrl(); this.monitoringURL = toolActivity.getTool().getMonitorUrl(); this.contributeURL = toolActivity.getTool().getContributeUrl(); @@ -898,4 +903,10 @@ public void setModerationURL(String moderationURL) { this.moderationURL = moderationURL; } + public String getToolSignature() { + return toolSignature; + } + public void setToolSignature(String toolSignature) { + this.toolSignature = toolSignature; + } } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== diff -u -r67d223336fe0ab1cf22b8102c40ec3805aafe6e2 -r64f3c42cf2bf0f73d35618cc3a11f7945782b3ac --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 67d223336fe0ab1cf22b8102c40ec3805aafe6e2) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 64f3c42cf2bf0f73d35618cc3a11f7945782b3ac) @@ -50,9 +50,11 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.contentrepository.InvalidParameterException; import org.lamsfoundation.lams.contentrepository.ItemNotFoundException; import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; +import org.lamsfoundation.lams.contentrepository.client.ToolContentHandler; import org.lamsfoundation.lams.contentrepository.dao.hibernate.WorkspaceDAO; import org.lamsfoundation.lams.contentrepository.service.IRepositoryService; import org.lamsfoundation.lams.learningdesign.Activity; @@ -70,6 +72,11 @@ import org.lamsfoundation.lams.learningdesign.SynchGateActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; +import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; +import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO; +import org.lamsfoundation.lams.learningdesign.dao.ILearningDesignDAO; +import org.lamsfoundation.lams.learningdesign.dao.ILicenseDAO; +import org.lamsfoundation.lams.learningdesign.dao.ITransitionDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.GroupingDAO; import org.lamsfoundation.lams.learningdesign.dao.hibernate.LearningDesignDAO; @@ -82,10 +89,15 @@ import org.lamsfoundation.lams.lesson.LessonClass; import org.lamsfoundation.lams.tool.Tool; import org.lamsfoundation.lams.tool.ToolContent; +import org.lamsfoundation.lams.tool.ToolContentIDGenerator; import org.lamsfoundation.lams.tool.ToolContentManager; +import org.lamsfoundation.lams.tool.dao.IToolContentDAO; +import org.lamsfoundation.lams.tool.dao.IToolDAO; +import org.lamsfoundation.lams.tool.dao.hibernate.ToolContentDAO; import org.lamsfoundation.lams.tool.dao.hibernate.ToolDAO; import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; +import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dao.IWorkspaceFolderDAO; import org.lamsfoundation.lams.util.FileUtil; @@ -99,6 +111,7 @@ import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; /** * Export tool content service bean. * @author Steve.Ni @@ -123,55 +136,72 @@ private List fileHandleClassList; //spring injection properties - private ActivityDAO activityDAO; - private ToolDAO toolDAO; + private IActivityDAO activityDAO; + private IToolDAO toolDAO; + private IToolContentDAO toolContentDAO; private IWorkspaceFolderDAO workspaceFolderDAO; - private LicenseDAO licenseDAO; - private GroupingDAO groupingDAO; - private TransitionDAO transitionDAO; - private LearningDesignDAO learningDesignDAO; - + private ILicenseDAO licenseDAO; + private IGroupingDAO groupingDAO; + private ITransitionDAO transitionDAO; + private ILearningDesignDAO learningDesignDAO; /** * Class of tool attachment file handler information container. */ private class FileHandleClassInfo{ //the Class instance according to className. - public Class handlerClass; public String className; public String uuidFieldName; public String versionFieldName; + public String fileNameFieldName; + public String mimeTypeFieldName; + public String filePropertyFieldName; + public String initalItemFieldName; public FileHandleClassInfo(String className, String uuidFieldName, String versionFieldName){ this.className = className; this.uuidFieldName = uuidFieldName; this.versionFieldName = versionFieldName; } + public FileHandleClassInfo(String className, String uuidFieldName, String versionFieldName, + String fileNameFieldName, String mimeTypeFieldName, String filePropertyFieldName, + String initalItemFieldName) { + this.className = className; + this.uuidFieldName = uuidFieldName; + this.versionFieldName = versionFieldName; + this.fileNameFieldName = fileNameFieldName; + this.filePropertyFieldName = filePropertyFieldName; + this.mimeTypeFieldName = mimeTypeFieldName; + this.initalItemFieldName = initalItemFieldName; + } } /** * File node information container. */ private class FileNodeInfo{ - private Long fileUuid; - private Long fileVersionId; + public Long fileUuid; + public Long fileVersionId; + public String fileName; + public String mimeType; + public String fileProperty; + public String initalItem; + public FileNodeInfo(){} + public FileNodeInfo(Long uuid, Long versionId){ this.fileUuid = uuid; this.fileVersionId = versionId; } - public Long getFileUuid() { - return fileUuid; + public FileNodeInfo(Long uuid, Long versionId, String fileName, String mimeType, String fileProperty, String initalItem){ + this.fileUuid = uuid; + this.fileVersionId = versionId; + this.fileName = fileName; + this.fileProperty = fileProperty; + this.mimeType = mimeType; + this.initalItem = initalItem; } - public void setFileUuid(Long fileUuid) { - this.fileUuid = fileUuid; - } - public Long getFileVersionId() { - return fileVersionId; - } - public void setFileVersionId(Long fileVersionId) { - this.fileVersionId = fileVersionId; - } + } /** @@ -201,6 +231,55 @@ } } } + if(StringUtils.equals(method.getName(),"unmarshal")){ + //During deserialize XML file into object, it will save file node into fileNodes + for(FileHandleClassInfo info:fileHandleClassList){ + short flag = 0; + HierarchicalStreamReader reader = (HierarchicalStreamReader) args[0]; + if(info.className.equals(reader.getNodeName())){ + FileNodeInfo node = ExportToolContentService.this.new FileNodeInfo(); + while (reader.hasMoreChildren()) { + reader.moveDown(); + if(StringUtils.equals(reader.getNodeName(),info.uuidFieldName)){ + node.fileUuid = NumberUtils.createLong(reader.getValue()); + flag++; + } + if(StringUtils.equals(reader.getNodeName(),info.versionFieldName)){ + node.fileVersionId = NumberUtils.createLong(reader.getValue()); + flag++; + } + if(StringUtils.equals(reader.getNodeName(),info.fileNameFieldName)){ + node.fileName = reader.getValue(); + flag++; + } + if(StringUtils.equals(reader.getNodeName(),info.filePropertyFieldName)){ + node.fileProperty = reader.getValue(); + flag++; + } + if(StringUtils.equals(reader.getNodeName(),info.initalItemFieldName)){ + node.initalItem = reader.getValue(); + flag++; + } + if(StringUtils.equals(reader.getNodeName(),info.mimeTypeFieldName)){ + node.mimeType = reader.getValue(); + flag++; + } + + reader.moveUp(); + //already get all relative info. Need not continue to look + if(flag == 6) + break; + } + //at least get uuid + if(flag > 0){ + fileNodes.add(node); + } + //if find matched FileNode class, then need not continue find other FileNode in file handler list. + break; + } + + } + } if(StringUtils.equals(method.getName(),"canConvert")){ boolean flag = false; for(FileHandleClassInfo info:fileHandleClassList){ @@ -230,18 +309,22 @@ } public void setFileHandleClassList(List fileHandleClassList) { this.fileHandleClassList = fileHandleClassList; - - //initial class instance. - for(FileHandleClassInfo info:fileHandleClassList){ - try { - info.handlerClass = Class.forName(info.className); - } catch (ClassNotFoundException e) { - throw new RuntimeException("unexpected invocation exception: " + e.getMessage()); - } - } } } /** + * This class is just for later system extent tool compaiblity strategy use. Currently, it just + * simple to get tool by same signature. + * + * @author Steve.Ni + * + * @version $Revision$ + */ + public class ToolCompatibleStrategy{ + public Tool getTool(String toolSignature){ + return toolDAO.getToolBySignature(toolSignature); + } + } + /** * Default contructor method. */ public ExportToolContentService(){ @@ -327,8 +410,8 @@ //get out the fileNodes List list = handler.getFileNodes(); for(FileNodeInfo fileNode:list){ - log.debug("Tool attachement file is going to save : " + fileNode.getFileUuid()); - toolContentHandler.saveFile(fileNode.getFileUuid(),toolPath+File.separator+fileNode.getFileUuid()); + log.debug("Tool attachement file is going to save : " + fileNode.fileUuid); + toolContentHandler.saveFile(fileNode.fileUuid,FileUtil.getFullPath(toolPath,fileNode.fileUuid.toString())); } list.clear(); } catch (ItemNotFoundException e) { @@ -349,10 +432,15 @@ /** * @see org.lamsfoundation.lams.authoring.service.IExportToolContentService.registerFileHandleClass(String,String,String) */ - public void registerFileHandleClass(String fileNodeClassName,String fileUuidFieldName, String fileVersionFieldName){ + public void registerFileClassForExport(String fileNodeClassName,String fileUuidFieldName, String fileVersionFieldName){ fileHandleClassList.add(this.new FileHandleClassInfo(fileNodeClassName,fileUuidFieldName,fileVersionFieldName)); - } + public void registerFileClassForImport(String fileNodeClassName, String fileUuidFieldName, + String fileVersionFieldName, String fileNameFieldName, String filePropertyFieldName, String mimeTypeFieldName, + String initialItemFieldName) { + fileHandleClassList.add(this.new FileHandleClassInfo(fileNodeClassName, fileUuidFieldName, fileVersionFieldName, + fileNameFieldName, filePropertyFieldName, mimeTypeFieldName, initialItemFieldName)); + } /** * @throws ExportToolContentException * @see org.lamsfoundation.lams.authoring.service.IExportToolContentService.importLearningDesign(String) @@ -371,23 +459,90 @@ List activities = ldDto.getActivities(); for(AuthoringActivityDTO activity : activities){ String toolPath = FileUtil.getFullPath(learningDesignPath,activity.getToolContentID().toString()); - ToolContentManager contentManager = (ToolContentManager) findToolService(toolDAO.getToolByID(activity.getToolID())); - log.debug("Tool import content : " + activity.getTitle() +" by contentID :" + activity.getToolContentID()); - //change xml to Tool POJO - XStream toolXml = new XStream(); - Reader toolFile = new FileReader(new File(FileUtil.getFullPath(toolPath,TOOL_FILE_NAME)));; - Object toolPOJO = toolXml.fromXML(toolFile); - contentManager.importToolContent(toolPOJO); + //To create a new toolContent according to imported tool signature name. + //get tool by signature + Tool newTool = new ToolCompatibleStrategy().getTool(activity.getToolSignature()); + ToolContent newContent = new ToolContent(newTool); + toolContentDAO.saveToolContent(newContent); + + //put new toolContent and it is old toolContentID into + toolMapper.put(activity.getToolContentID(),newContent); + + //Invoke tool's importToolContent() method. + ToolContentManager contentManager = (ToolContentManager) findToolService(newTool); + log.debug("Tool begin to import content : " + activity.getTitle() +" by contentID :" + activity.getToolContentID()); + contentManager.importToolContent(toolPath); + log.debug("Tool content import success."); } - saveLearningDesign(ldDto,importer,workspaceFolderUid,toolMapper); +// saveLearningDesign(ldDto,importer,workspaceFolderUid,toolMapper); + }catch (ToolException e) { + throw new ImportToolContentException(e); } catch (FileNotFoundException e) { throw new ImportToolContentException(e); - } catch (ToolException e) { + } + + } + public Object importToolContent(String toolContentPath,IToolContentHandler toolContentHandler) throws ImportToolContentException{ + Object toolPOJO = null; +// change xml to Tool POJO + XStream toolXml = new XStream(); + + Converter c = toolXml.getConverterLookup().defaultConverter(); + //create proxy class + FileInvocationHandler handler = new FileInvocationHandler(c); + handler.setFileHandleClassList(fileHandleClassList); + Converter myc = (Converter) Proxy.newProxyInstance(c.getClass().getClassLoader(),new Class[]{Converter.class},handler); + //registry to new proxy convert to XStream + toolXml.registerConverter(myc); + + try { + Reader toolFile = new FileReader(new File(FileUtil.getFullPath(toolContentPath,TOOL_FILE_NAME))); + toolPOJO = toolXml.fromXML(toolFile); + + //upload file node if has + List list = handler.getFileNodes(); + for(FileNodeInfo fileNode:list){ + log.debug("Tool attachement files/packages are going to upload to repository " + fileNode.fileUuid); + + String fileName = fileNode.fileUuid.toString(); + String fullFileName = FileUtil.getFullPath(toolContentPath,fileName); + + //to check if the file is package (with extension name ".zip") or single file (no extension name). + File file = new File(fullFileName); + boolean isPackage = false; + if(!file.exists()){ + file = new File(fullFileName+EXPORT_TOOLCONTNET_ZIP_SUFFIX); + fileName = fileName + EXPORT_TOOLCONTNET_ZIP_SUFFIX; + isPackage = true; + if(!file.exists()) + throw new ImportToolContentException("Content attached file/package can not be found: " + fullFileName + "(.zip)"); + } + InputStream is = new FileInputStream(file); + //upload to repository: file or pacakge + if(!isPackage) + toolContentHandler.uploadFile(is,fileName,fileNode.mimeType,fileNode.fileProperty); + else{ + String packageDirectory = ZipFileUtil.expandZip(is, fileName); + toolContentHandler.uploadPackage(packageDirectory,fileNode.initalItem); + } + } + list.clear(); + } catch (FileNotFoundException e) { throw new ImportToolContentException(e); + } catch (InvalidParameterException e) { + throw new ImportToolContentException(e); + } catch (RepositoryCheckedException e) { + throw new ImportToolContentException(e); + } catch (ZipFileUtilException e) { + throw new ImportToolContentException(e); + }finally{ + if(fileHandleClassList != null) + fileHandleClassList.clear(); } + return toolPOJO; } //****************************************************************** @@ -595,7 +750,8 @@ switch(type){ case Activity.TOOL_ACTIVITY_TYPE: act = new ToolActivity(); - ToolContent content = toolMapper.get(actDto.getToolID()); + //get back the toolContent in new system by toolContentID in old system. + ToolContent content = toolMapper.get(actDto.getToolContentID()); ((ToolActivity)act).setTool(content.getTool()); ((ToolActivity)act).setToolContentId(content.getToolContentId()); ((ToolActivity)act).setToolSessions(null); @@ -686,48 +842,55 @@ //****************************************************************** // Spring injection properties set/get //****************************************************************** - public ActivityDAO getActivityDAO() { + public IActivityDAO getActivityDAO() { return activityDAO; } - public void setActivityDAO(ActivityDAO activityDAO) { + public void setActivityDAO(IActivityDAO activityDAO) { this.activityDAO = activityDAO; } - public ToolDAO getToolDAO() { - return toolDAO; + public IGroupingDAO getGroupingDAO() { + return groupingDAO; } - public void setToolDAO(ToolDAO toolDAO) { - this.toolDAO = toolDAO; + public void setGroupingDAO(IGroupingDAO groupingDAO) { + this.groupingDAO = groupingDAO; } - public IWorkspaceFolderDAO getWorkspaceFolderDAO() { - return workspaceFolderDAO; + public ILearningDesignDAO getLearningDesignDAO() { + return learningDesignDAO; } - public void setWorkspaceFolderDAO(IWorkspaceFolderDAO workspaceFolderDAO) { - this.workspaceFolderDAO = workspaceFolderDAO; + public void setLearningDesignDAO(ILearningDesignDAO learningDesignDAO) { + this.learningDesignDAO = learningDesignDAO; } - public LicenseDAO getLicenseDAO() { + public ILicenseDAO getLicenseDAO() { return licenseDAO; } - public void setLicenseDAO(LicenseDAO licenseDAO) { + public void setLicenseDAO(ILicenseDAO licenseDAO) { this.licenseDAO = licenseDAO; } - public GroupingDAO getGroupingDAO() { - return groupingDAO; + public IToolContentDAO getToolContentDAO() { + return toolContentDAO; } - public void setGroupingDAO(GroupingDAO groupingDAO) { - this.groupingDAO = groupingDAO; + public void setToolContentDAO(IToolContentDAO toolContentDAO) { + this.toolContentDAO = toolContentDAO; } - public LearningDesignDAO getLearningDesignDAO() { - return learningDesignDAO; + public IToolDAO getToolDAO() { + return toolDAO; } - public void setLearningDesignDAO(LearningDesignDAO learningDesignDAO) { - this.learningDesignDAO = learningDesignDAO; + public void setToolDAO(IToolDAO toolDAO) { + this.toolDAO = toolDAO; } - public TransitionDAO getTransitionDAO() { + public ITransitionDAO getTransitionDAO() { return transitionDAO; } - public void setTransitionDAO(TransitionDAO transitionDAO) { + public void setTransitionDAO(ITransitionDAO transitionDAO) { this.transitionDAO = transitionDAO; } + public IWorkspaceFolderDAO getWorkspaceFolderDAO() { + return workspaceFolderDAO; + } + public void setWorkspaceFolderDAO(IWorkspaceFolderDAO workspaceFolderDAO) { + this.workspaceFolderDAO = workspaceFolderDAO; + } + } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java =================================================================== diff -u -r67d223336fe0ab1cf22b8102c40ec3805aafe6e2 -r64f3c42cf2bf0f73d35618cc3a11f7945782b3ac --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java (.../IExportToolContentService.java) (revision 67d223336fe0ab1cf22b8102c40ec3805aafe6e2) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java (.../IExportToolContentService.java) (revision 64f3c42cf2bf0f73d35618cc3a11f7945782b3ac) @@ -75,7 +75,12 @@ * @param fileUuidFieldName The POJO properties name for get fileUuid. There must be a get method to access this property. * @param fileVersionFieldName The POJO properties name for get fileVersion. There must be a get method to access this property. */ - void registerFileHandleClass(String fileNodeClassName,String fileUuidFieldName, String fileVersionFieldName); - + void registerFileClassForExport(String fileNodeClassName,String fileUuidFieldName, String fileVersionFieldName); + void registerFileClassForImport(String fileNodeClassName, String fileUuidFieldName, + String fileVersionFieldName, String fileNameFieldName, String filePropertyFieldName, String mimeTypeFieldName, + String initialItemFieldName); + void importLearningDesign(String learningDesignPath,User importer, Integer workspaceFolderUid) throws ImportToolContentException; + + Object importToolContent(String toolContentPath,IToolContentHandler toolContentHandler) throws ImportToolContentException; } Index: lams_common/src/java/org/lamsfoundation/lams/tool/ToolContentManager.java =================================================================== diff -u -rf17ef475206dfa5950b19434ec135b157201c987 -r64f3c42cf2bf0f73d35618cc3a11f7945782b3ac --- lams_common/src/java/org/lamsfoundation/lams/tool/ToolContentManager.java (.../ToolContentManager.java) (revision f17ef475206dfa5950b19434ec135b157201c987) +++ lams_common/src/java/org/lamsfoundation/lams/tool/ToolContentManager.java (.../ToolContentManager.java) (revision 64f3c42cf2bf0f73d35618cc3a11f7945782b3ac) @@ -111,7 +111,7 @@ * for the content. * @throws ToolException if any other error occurs */ - public void importToolContent(Object toolContnetPOJO) + public void importToolContent(String toolContentPath) throws ToolException;