1 package org.simantics.migration.ui;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\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
17 import gnu.trove.map.hash.THashMap;
\r
19 public class MigrationAnalysis {
\r
21 public class Update implements Comparable<Update> {
\r
22 Resource updateResource;
\r
23 Resource parentVersion;
\r
24 Resource childVersion;
\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
36 public int compareTo(Update o) {
\r
37 return versionName.compareTo(o.versionName);
\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
45 Collection<Runnable> migrateActions = Simantics.getSession().syncRequest(new Read<Collection<Runnable>>() {
\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
56 for(Runnable action : migrateActions)
\r
60 public void updateTargetVersion(final Resource target) throws DatabaseException {
\r
61 Simantics.getSession().syncRequest(new WriteRequest() {
\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
73 Resource parentVersion;
\r
74 THashMap<Resource, Update> updates = new THashMap<Resource, Update>();
\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
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
95 public Collection<Update> getUpdates() {
\r
96 return updates.values();
\r