]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.migration.ui/src/org/simantics/migration/ui/MigrationAnalysis.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.migration.ui / src / org / simantics / migration / ui / MigrationAnalysis.java
diff --git a/bundles/org.simantics.migration.ui/src/org/simantics/migration/ui/MigrationAnalysis.java b/bundles/org.simantics.migration.ui/src/org/simantics/migration/ui/MigrationAnalysis.java
new file mode 100644 (file)
index 0000000..7532bb5
--- /dev/null
@@ -0,0 +1,98 @@
+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