--- /dev/null
+package org.simantics.migration.ui;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.ActionFactory;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.layer0.SoftwareConfigurationResources;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+public class MigrationAnalysis {\r
+ \r
+ public class Update implements Comparable<Update> {\r
+ Resource updateResource;\r
+ Resource parentVersion;\r
+ Resource childVersion;\r
+ String versionName;\r
+ \r
+ public Update(Resource updateResource, Resource parentVersion,\r
+ Resource childVersion, String versionName) {\r
+ this.updateResource = updateResource;\r
+ this.parentVersion = parentVersion;\r
+ this.childVersion = childVersion;\r
+ this.versionName = versionName;\r
+ }\r
+\r
+ @Override\r
+ public int compareTo(Update o) {\r
+ return versionName.compareTo(o.versionName);\r
+ }\r
+\r
+ public void execute(final Resource target) throws DatabaseException {\r
+ Update parentUpdate = updates.get(parentVersion);\r
+ if(parentUpdate != null)\r
+ parentUpdate.execute(target);\r
+ \r
+ Collection<Runnable> migrateActions = Simantics.getSession().syncRequest(new Read<Collection<Runnable>>() {\r
+ @Override\r
+ public Collection<Runnable> perform(ReadGraph graph)\r
+ throws DatabaseException {\r
+ SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(graph);\r
+ ArrayList<Runnable> result = new ArrayList<Runnable>(); \r
+ for(Resource action : graph.getObjects(updateResource, SC.Update_HasMigrationAction))\r
+ result.add(graph.adapt(action, ActionFactory.class).create(target));\r
+ return result;\r
+ } \r
+ });\r
+ for(Runnable action : migrateActions)\r
+ action.run();\r
+ }\r
+ \r
+ public void updateTargetVersion(final Resource target) throws DatabaseException {\r
+ Simantics.getSession().syncRequest(new WriteRequest() { \r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ graph.markUndoPoint();\r
+ SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(graph);\r
+ graph.deny(target, SC.IsCompatibleWith, MigrationAnalysis.this.parentVersion);\r
+ graph.claim(target, SC.IsCompatibleWith, childVersion);\r
+ }\r
+ });\r
+ }\r
+ }\r
+ \r
+ Resource parentVersion;\r
+ THashMap<Resource, Update> updates = new THashMap<Resource, Update>();\r
+\r
+ public MigrationAnalysis(ReadGraph g, Resource parentVersion) throws DatabaseException {\r
+ this.parentVersion = parentVersion;\r
+ updates.put(parentVersion, null);\r
+ findUpdatesFrom(g, parentVersion);\r
+ updates.remove(parentVersion);\r
+ }\r
+\r
+ private void findUpdatesFrom(ReadGraph g, Resource version) throws DatabaseException { \r
+ SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(g);\r
+ for(Resource update : g.getObjects(version, SC.Version_HasUpdate)) {\r
+ Resource to = g.getSingleObject(update, SC.Update_To);\r
+ if(!updates.contains(to)) {\r
+ String name = NameUtils.getSafeLabel(g, to);\r
+ updates.put(to, new Update(update, version, to, name));\r
+ findUpdatesFrom(g, to);\r
+ }\r
+ }\r
+ }\r
+ \r
+ public Collection<Update> getUpdates() {\r
+ return updates.values();\r
+ }\r
+}\r