Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java =================================================================== diff -u -r7828086c1601ca9e307e9c1758a2be3fe7773943 -r951f0a5804a860ca0b359488d0b7a508d6398ecf --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 7828086c1601ca9e307e9c1758a2be3fe7773943) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ExportToolContentService.java (.../ExportToolContentService.java) (revision 951f0a5804a860ca0b359488d0b7a508d6398ecf) @@ -39,14 +39,14 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.ArrayList; -import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; @@ -63,6 +63,7 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.contentrepository.NodeKey; import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; +import org.lamsfoundation.lams.contentrepository.exception.InvalidParameterException; import org.lamsfoundation.lams.contentrepository.exception.ItemNotFoundException; import org.lamsfoundation.lams.contentrepository.exception.RepositoryCheckedException; import org.lamsfoundation.lams.dao.IBaseDAO; @@ -911,7 +912,7 @@ // if workspaceFolderUid == null use the user's default folder WorkspaceFolder folder = null; if (workspaceFolderUid != null) { - folder = (WorkspaceFolder) baseDAO.find(WorkspaceFolder.class, workspaceFolderUid); + folder = baseDAO.find(WorkspaceFolder.class, workspaceFolderUid); } if (folder == null && importer.getWorkspaceFolder() != null) { folder = importer.getWorkspaceFolder(); @@ -1075,6 +1076,7 @@ * @throws IllegalAccessException * @throws InstantiationException */ + @SuppressWarnings("unchecked") private void filterVersion(String toolFilePath, String fromVersion, String toVersion) throws Exception { float from = 0; try { @@ -1096,7 +1098,8 @@ log.debug("Version filter class will filter from version " + from + " to " + to); - Object filter = filterClass.newInstance(); + ToolContentVersionFilter filter = (ToolContentVersionFilter) filterClass.getConstructor(new Class[0]) + .newInstance(new Object[0]); Method[] methods = filterClass.getDeclaredMethods(); Map methodNeeds = new TreeMap<>(); for (Method method : methods) { @@ -1120,14 +1123,32 @@ } } } - 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 }); + for (Entry methodEntry : methodNeeds.entrySet()) { + Method method = methodEntry.getValue(); + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length == 0) { + method.invoke(filter, new Object[0]); + log.debug("Version filter class method " + method.getName() + " is executed."); + } else if (parameterTypes.length == 1 && parameterTypes[0].isAssignableFrom(String.class)) { + // We encountered a method which transforms tool XML + // First we need to flush existing stacked up changes (add/remove/rename field etc.) + Float currentVersionStep = methodEntry.getKey(); + log.debug("Flushing changes up to version " + currentVersionStep); + transform.invoke(filter, new Object[] { toolFilePath }); + // then call the method that transforms XML + log.debug("Transforming XML For version " + currentVersionStep); + method.invoke(filter, new Object[] { toolFilePath }); + // then clear flushed changes so they are not called again after iteration + filter.clearChanges(); + } else { + throw new InvalidParameterException("Can not run version filter method " + method.getName() + + ". Unsupported number or type of parameters."); + } + } + // perform final XML transformation transform.invoke(filter, new Object[] { toolFilePath }); - } /** Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java =================================================================== diff -u -r8e6d3a3c0b5962efd640cfe3845c58f5d3269857 -r951f0a5804a860ca0b359488d0b7a508d6398ecf --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java (.../ToolContentVersionFilter.java) (revision 8e6d3a3c0b5962efd640cfe3845c58f5d3269857) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/ToolContentVersionFilter.java (.../ToolContentVersionFilter.java) (revision 951f0a5804a860ca0b359488d0b7a508d6398ecf) @@ -46,12 +46,16 @@ private Map renamedClassMap; public ToolContentVersionFilter() { - removedFieldList = new ArrayList(); - addedFieldList = new ArrayList(); - renamedFieldList = new ArrayList(); - renamedClassMap = new HashMap(); + clearChanges(); } + protected void clearChanges() { + removedFieldList = new ArrayList<>(); + addedFieldList = new ArrayList<>(); + renamedFieldList = new ArrayList<>(); + renamedClassMap = new HashMap<>(); + } + // container class for removed class private class RemovedField { private String ownerClass;