Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== diff -u -r854d3d90fea3ac43dd486d51d339d0dad5adbf9e -r859ed64687ae5058206794c706bdc4daa0e9f721 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 854d3d90fea3ac43dd486d51d339d0dad5adbf9e) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 859ed64687ae5058206794c706bdc4daa0e9f721) @@ -42,22 +42,22 @@ import java.lang.reflect.Proxy; import java.net.URLEncoder; import java.util.ArrayList; -import java.util.Comparator; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import java.util.Vector; import org.apache.commons.beanutils.BeanUtils; 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.NodeKey; import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; @@ -139,6 +139,10 @@ private static final String ERROR_TOOL_NOT_FOUND = "error.import.matching.tool.not.found"; private static final String ERROR_SERVICE_ERROR = "error.import.tool.service.fail"; + private static final String ERROR_NO_VALID_TOOL = "error.no.valid.tool"; + private static final String FILTER_METHOD_PREFIX_DOWN = "down"; + private static final String FILTER_METHOD_PREFIX_UP = "up"; + private static final String FILTER_METHOD_MIDDLE = "To"; private Logger log = Logger.getLogger(ExportToolContentService.class); @@ -148,6 +152,7 @@ //save list of all tool file node class information. One tool may have over one file node, such as //in share resource tool, it has contnent attachment and shared resource item attachement. private List fileHandleClassList; + private Class filterClass; //spring injection properties private IActivityDAO activityDAO; @@ -461,8 +466,10 @@ fileHandleClassList.add(this.new NameInfo(fileNodeClassName, fileUuidFieldName, fileVersionFieldName, fileNameFieldName, filePropertyFieldName, mimeTypeFieldName, initialItemFieldName)); } - - + public void registerImportVersionFilterClass(Class filterClass) { + this.filterClass = filterClass; + } + /** * Import 1.0.2 learning design * @return learningDesingID @@ -517,6 +524,7 @@ removedActMap.put(activity.getActivityID(), activity); continue; } + //save Tool into lams_tool table. ToolContent newContent = new ToolContent(newTool); toolContentDAO.saveToolContent(newContent); @@ -525,9 +533,16 @@ //Invoke tool's importToolContent() method. try{ + //begin to import ToolContentManager contentManager = (ToolContentManager) findToolService(newTool); log.debug("Tool begin to import content : " + activity.getActivityTitle() +" by contentID :" + activity.getToolContentID()); - contentManager.importToolContent(newContent.getToolContentId(),importer.getUserId(),toolPath); + + //tool's importToolContent() method + //get from and to version + String toVersion = newTool.getToolVersion(); + String fromVersion = activity.getToolVersion(); + contentManager.importToolContent(newContent.getToolContentId(),importer.getUserId(),toolPath,fromVersion,toVersion); + log.debug("Tool content import success."); }catch (Exception e) { String error = getMessageService().getMessage(ERROR_SERVICE_ERROR,new Object[]{newTool.getToolDisplayName(),e.toString()}); @@ -538,6 +553,12 @@ } } //end all activities import + //all activities can not imported, ignore this LD + if(removedActMap.size() == activities.size() ){ + toolsErrorMsgs.add(getMessageService().getMessage(ERROR_NO_VALID_TOOL)); + return -1L; + } + // begin fckeditor content folder import try { String contentZipFileName = EXPORT_LDCONTENT_ZIP_PREFIX + ldDto.getContentFolderID() + EXPORT_LDCONTENT_ZIP_SUFFIX; @@ -589,7 +610,7 @@ /** * Import tool content */ - public Object importToolContent(String toolContentPath, IToolContentHandler toolContentHandler) throws ImportToolContentException{ + public Object importToolContent(String toolContentPath, IToolContentHandler toolContentHandler,String fromVersion,String toVersion) throws ImportToolContentException{ Object toolPOJO = null; // change xml to Tool POJO XStream toolXml = new XStream(); @@ -608,7 +629,16 @@ List valueList = null; try { - Reader toolFile = new InputStreamReader(new FileInputStream(FileUtil.getFullPath(toolContentPath,TOOL_FILE_NAME)),"UTF-8"); + //tool.xml full path + String toolFilePath = FileUtil.getFullPath(toolContentPath,TOOL_FILE_NAME); + if(filterClass != null){ + filterVersion(toolFilePath,fromVersion,toVersion); + } + //clear and ensure next activity can get correct filter thru registerImportVersionFilterClass(). + filterClass = null; + + //read tool file after transform. + Reader toolFile = new InputStreamReader(new FileInputStream(toolFilePath),"UTF-8"); toolPOJO = toolXml.fromXML(toolFile); //upload file node if has @@ -681,22 +711,8 @@ BeanUtils.setProperty(fileNode.instance,fileNode.name.versionFieldName,key.getVersion()); } } - } catch (FileNotFoundException e) { + } catch (Exception 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); - } catch (IllegalAccessException e) { - throw new ImportToolContentException(e); - } catch (InvocationTargetException e) { - throw new ImportToolContentException(e); - } catch (NoSuchMethodException e) { - throw new ImportToolContentException(e); - } catch (UnsupportedEncodingException e) { - throw new ImportToolContentException(e); }finally{ if(fileHandleClassList != null) fileHandleClassList.clear(); @@ -716,7 +732,65 @@ //****************************************************************** // Private methods //****************************************************************** + /** + * Tansform tool XML file to correct version format. + * @param toVersion + * @param fromVersion + * @throws IllegalAccessException + * @throws InstantiationException + */ + private void filterVersion(String toolFilePath, String fromVersion, String toVersion) throws Exception { + float from = 0; + try { + from = NumberUtils.createFloat(fromVersion); + } catch (Exception e) {} + float to = 0; + try { + to = NumberUtils.createFloat(toVersion); + } catch (Exception e) {} + + String filterMethodPrefix; + if(from > to) + filterMethodPrefix = FILTER_METHOD_PREFIX_DOWN; + else + filterMethodPrefix = FILTER_METHOD_PREFIX_UP; + + log.debug("Version filter class will filter from version " + from + " to " + to); + + Object filter = filterClass.newInstance(); + Method[] methods = filterClass.getDeclaredMethods(); + Map methodNeeds = new TreeMap(); + for (Method method : methods) { + String name = method.getName(); + if(name.startsWith(filterMethodPrefix)){ + String[] ver = name.split(filterMethodPrefix+"|"+FILTER_METHOD_MIDDLE); + Float mf = 0f; + Float mt = 0f; + for (int idx=0;idx idx) + mt = NumberUtils.createFloat(ver[++idx]); + break; + } + if(mf >= from && mt <= to){ + methodNeeds.put(mf,method); + } + } + } + Collection calls = methodNeeds.values(); + for (Method method : calls) { + method.invoke(filter, new Object[]{}); + log.debug("Version filter class method " + method.getName() +" is executed."); + } + Method transform = filterClass.getMethod("transformXML",new Class[]{String.class}); + transform.invoke(filter, new Object[]{toolFilePath}); + + + } + /** * If there are any errors happen during tool exporting content. Writing failed message to file. */ private void writeErrorToToolFile(String rootPath,Long toolContentId, String msg) { @@ -1288,5 +1362,4 @@ public void setSystemToolDAO(ISystemToolDAO systemToolDAO) { this.systemToolDAO = systemToolDAO; } - } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java =================================================================== diff -u -r08950e1090443c3423a3d1c587416a2fccd8bbdf -r859ed64687ae5058206794c706bdc4daa0e9f721 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java (.../IExportToolContentService.java) (revision 08950e1090443c3423a3d1c587416a2fccd8bbdf) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/IExportToolContentService.java (.../IExportToolContentService.java) (revision 859ed64687ae5058206794c706bdc4daa0e9f721) @@ -82,6 +82,8 @@ String fileVersionFieldName, String fileNameFieldName, String filePropertyFieldName, String mimeTypeFieldName, String initialItemFieldName); + void registerImportVersionFilterClass(Class filterClass); + /** Import the learning design from the given path. Set the importer as the creator. If the workspaceFolderUid is * null then saves the design in the user's own workspace folder. * @@ -97,7 +99,7 @@ * Import the tool content. This is called by tools to do the actual content import, once the tool * has set up whatever it needs to do. */ - Object importToolContent(String toolContentPath, IToolContentHandler toolContentHandler) + Object importToolContent(String toolContentPath, IToolContentHandler toolContentHandler,String fromVersion,String toVersion) throws ImportToolContentException; /** Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java =================================================================== diff -u -re6467356d40fb0b6402bde8a6700e633167c3693 -r859ed64687ae5058206794c706bdc4daa0e9f721 --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java (.../ToolContentVersionFilter.java) (revision e6467356d40fb0b6402bde8a6700e633167c3693) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java (.../ToolContentVersionFilter.java) (revision 859ed64687ae5058206794c706bdc4daa0e9f721) @@ -11,16 +11,30 @@ import java.util.List; import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import com.thoughtworks.xstream.XStream; - +/** + * Super class for all Import content Version Filter. The child class method must follow name conversion. + *
    + *
  1. upXXXToXXX
  2. + *
  3. downXXXToXXX
  4. + *
+ * + * The XXX must be integer format, which is Tool version number. + * + * @author Dapeng.Ni + * + */ public class ToolContentVersionFilter { + private static final Logger log = Logger.getLogger(ToolContentVersionFilter.class); + private List removedFieldList; private List addedFieldList; @@ -78,6 +92,7 @@ for (RemovedField remove : removedFieldList) { if(StringUtils.equals(root.getName(),remove.ownerClass.getName())){ clzRemoveFlds.add(remove.fieldname); + log.debug("Field "+ remove.fieldname+" in class " + remove.ownerClass.getName() + " is going to leave."); } } //add all new fields for this class @@ -92,21 +107,31 @@ Element eleRoot = eledoc.getRootElement(); eleRoot.setName(added.fieldname); root.addContent(eleRoot); + + log.debug("Field "+ added.fieldname+" in class " + added.ownerClass.getName() + " is add by value " + added.defaultValue); } } + //remove fields List children = root.getChildren(); for (Object child: children) { if(child instanceof Element){ Element ele = (Element)child; + //this node already removed, no necessary retrieve its children level if(clzRemoveFlds.contains(ele.getName())){ continue; } + //recusive current node's children level. retrieveXML(ele); } } - for(String name:clzRemoveFlds) - root.removeChild(name); + //retrieve all current node's children, if found some element is in removed list, then remove it. + for(String name:clzRemoveFlds){ + if(root.removeChild(name)) + log.debug("Field "+ name + " is removed."); + else + log.debug("Failed remove field "+ name + "."); + } } }