]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/SLNamespaceMigrationStep.java
Alternative Namespace migration step for Shared Libs
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / migration / SLNamespaceMigrationStep.java
diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/SLNamespaceMigrationStep.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/migration/SLNamespaceMigrationStep.java
new file mode 100644 (file)
index 0000000..ebec505
--- /dev/null
@@ -0,0 +1,91 @@
+package org.simantics.db.layer0.migration;
+
+import java.io.PrintWriter;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.Statement;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.DelayedWriteRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.graph.query.Path;
+import org.simantics.graph.refactoring.MappingSpecification;
+import org.simantics.graph.refactoring.MappingSpecification.MappingRule;
+import org.simantics.layer0.Layer0;
+
+public class SLNamespaceMigrationStep extends NamespaceMigrationStep{
+
+    public SLNamespaceMigrationStep(ReadGraph graph, Resource step) throws DatabaseException {
+        super(graph, step);
+    }
+    
+    @Override
+    public void applyTo(IProgressMonitor monitor, Session session, MigrationState state) throws DatabaseException {
+        final Collection<Resource> roots = state.getProperty(MigrationStateKeys.CURRENT_ROOT_RESOURCES);
+        if (roots.isEmpty())
+            return;
+        final PrintWriter log = MigrationUtils.getProperty(state, MigrationStateKeys.MESSAGE_LOG_WRITER, NullWriter.PRINT_INSTANCE);
+        
+        session.sync(new DelayedWriteRequest() {
+            @Override
+            public void perform(WriteGraph graph) throws DatabaseException {
+                create(monitor, graph, roots, log);
+            }
+        });
+    }
+    
+    private void create(IProgressMonitor monitor, WriteGraph graph, Collection<Resource> roots, PrintWriter log) throws DatabaseException {
+        MappingSpecification mappingSpec = new MappingSpecification(rules);
+        
+        log.println("## NameSpace migration for a Shared Library ##");
+        Map<Path, Resource> pathMap = new HashMap<Path, Resource>();
+        for (MappingRule mr : mappingSpec.rules) {
+            if (!pathMap.containsKey(mr.from)) {
+                String uri = mr.from.toString();
+                Resource res = graph.getResource(uri);
+                pathMap.put(mr.from, res);
+                if (res == null)
+                    log.print("Didn't find " + mr.from);
+            }
+            if (!pathMap.containsKey(mr.to)) {
+                String uri = mr.to.toString();
+                Resource res = graph.getResource(uri);
+                pathMap.put(mr.to, res);
+                if (res == null)
+                    log.print("Didn't find " + mr.to);
+            }
+        }
+        
+        Layer0 L0 = Layer0.getInstance(graph);
+        
+        Deque<Resource> stack = new ArrayDeque<>();
+        stack.addAll(roots);
+        while (!stack.isEmpty()) {
+            Resource r = stack.pop();
+            stack.addAll(graph.getObjects(r, L0.ConsistsOf));
+            for (MappingRule mr : mappingSpec.rules) {
+                Resource fromPred = pathMap.get(mr.from);
+                Resource toPred = pathMap.get(mr.to);
+                if (fromPred == null || toPred == null)
+                    continue;
+                Collection<Statement> stms = graph.getStatements(r, fromPred);
+                for (Statement stm : stms) {
+                    if (!stm.isAsserted(r)) {
+                        graph.deny(stm);
+                        graph.claim(stm.getSubject(), toPred, stm.getObject());
+                    }
+                }
+            }
+        }
+    }
+    
+    
+
+}