]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.migration.ui;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 \r
6 import org.simantics.Simantics;\r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.WriteGraph;\r
10 import org.simantics.db.common.request.WriteRequest;\r
11 import org.simantics.db.common.utils.NameUtils;\r
12 import org.simantics.db.exception.DatabaseException;\r
13 import org.simantics.db.layer0.adapter.ActionFactory;\r
14 import org.simantics.db.request.Read;\r
15 import org.simantics.layer0.SoftwareConfigurationResources;\r
16 \r
17 import gnu.trove.map.hash.THashMap;\r
18 \r
19 public class MigrationAnalysis {\r
20     \r
21     public class Update implements Comparable<Update> {\r
22         Resource updateResource;\r
23         Resource parentVersion;\r
24         Resource childVersion;\r
25         String versionName;\r
26         \r
27         public Update(Resource updateResource, Resource parentVersion,\r
28                 Resource childVersion, String versionName) {\r
29             this.updateResource = updateResource;\r
30             this.parentVersion = parentVersion;\r
31             this.childVersion = childVersion;\r
32             this.versionName = versionName;\r
33         }\r
34 \r
35         @Override\r
36         public int compareTo(Update o) {\r
37             return versionName.compareTo(o.versionName);\r
38         }\r
39 \r
40         public void execute(final Resource target) throws DatabaseException {\r
41             Update parentUpdate = updates.get(parentVersion);\r
42             if(parentUpdate != null)\r
43                 parentUpdate.execute(target);\r
44             \r
45             Collection<Runnable> migrateActions = Simantics.getSession().syncRequest(new Read<Collection<Runnable>>() {\r
46                 @Override\r
47                 public Collection<Runnable> perform(ReadGraph graph)\r
48                         throws DatabaseException {\r
49                     SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(graph);\r
50                     ArrayList<Runnable> result = new ArrayList<Runnable>(); \r
51                     for(Resource action : graph.getObjects(updateResource, SC.Update_HasMigrationAction))\r
52                         result.add(graph.adapt(action, ActionFactory.class).create(target));\r
53                     return result;\r
54                 }                \r
55             });\r
56             for(Runnable action : migrateActions)\r
57                 action.run();\r
58         }\r
59         \r
60         public void updateTargetVersion(final Resource target) throws DatabaseException {\r
61             Simantics.getSession().syncRequest(new WriteRequest() {                        \r
62                 @Override\r
63                 public void perform(WriteGraph graph) throws DatabaseException {\r
64                     graph.markUndoPoint();\r
65                     SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(graph);\r
66                     graph.deny(target, SC.IsCompatibleWith, MigrationAnalysis.this.parentVersion);\r
67                     graph.claim(target, SC.IsCompatibleWith, childVersion);\r
68                 }\r
69             });\r
70         }\r
71     }\r
72     \r
73     Resource parentVersion;\r
74     THashMap<Resource, Update> updates = new THashMap<Resource, Update>();\r
75 \r
76     public MigrationAnalysis(ReadGraph g, Resource parentVersion) throws DatabaseException {\r
77         this.parentVersion = parentVersion;\r
78         updates.put(parentVersion, null);\r
79         findUpdatesFrom(g, parentVersion);\r
80         updates.remove(parentVersion);\r
81     }\r
82 \r
83     private void findUpdatesFrom(ReadGraph g, Resource version) throws DatabaseException {        \r
84         SoftwareConfigurationResources SC = SoftwareConfigurationResources.getInstance(g);\r
85         for(Resource update : g.getObjects(version, SC.Version_HasUpdate)) {\r
86             Resource to = g.getSingleObject(update, SC.Update_To);\r
87             if(!updates.contains(to)) {\r
88                 String name = NameUtils.getSafeLabel(g, to);\r
89                 updates.put(to, new Update(update, version, to, name));\r
90                 findUpdatesFrom(g, to);\r
91             }\r
92         }\r
93     }\r
94     \r
95     public Collection<Update> getUpdates() {\r
96         return updates.values();\r
97     }\r
98 }\r