]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/changeset/MetadataUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / changeset / MetadataUtils.java
diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/changeset/MetadataUtils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/changeset/MetadataUtils.java
new file mode 100644 (file)
index 0000000..31f2955
--- /dev/null
@@ -0,0 +1,186 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.db.layer0.changeset;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.db.ChangeSetIdentifier;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.UndoMetadata;\r
+import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.genericrelation.DependencyChanges;\r
+import org.simantics.db.layer0.genericrelation.DependencyChanges.Change;\r
+import org.simantics.db.layer0.request.IsLinkedTo;\r
+import org.simantics.db.service.ManagementSupport;\r
+\r
+public class MetadataUtils {\r
+       \r
+       public static final boolean DEBUG = false;\r
+       public static final boolean DEBUG_IDS = false;\r
+\r
+       public static Map<Long, Map<String,byte[]>> getMetadatas(ReadGraph graph, ManagementSupport support, long fromRevisionId, long toRevisionId) throws DatabaseException {\r
+\r
+           TreeMap<Long, Map<String,byte[]>> result = new TreeMap<Long, Map<String,byte[]>>(); \r
+                   \r
+           Collection<ChangeSetIdentifier> csis = support.getChangeSetIdentifiers(fromRevisionId, toRevisionId);\r
+        for(ChangeSetIdentifier csi : csis) {\r
+            if(csi.getId() < fromRevisionId) {\r
+                System.err.println("ManagementSupport.getChangeSetIdentifiers returned identifiers outside of the requested range.");\r
+                continue;\r
+            }\r
+            Map<String,byte[]> metadata = csi.getMetadata();\r
+            if(metadata != null) result.put(csi.getId(), metadata);\r
+        }\r
+        long toBeRevision = support.getHeadRevisionId()+1;\r
+        if(toBeRevision >= fromRevisionId && toBeRevision <= toRevisionId) {\r
+            if(graph instanceof WriteGraph) {\r
+                WriteGraph writeGraph = (WriteGraph)graph;\r
+                Map<String,byte[]> metadata = writeGraph.getMetadata();\r
+                if(metadata != null)\r
+                    result.put(toBeRevision, metadata);\r
+            }\r
+        }\r
+        \r
+        return result;\r
+           \r
+       }\r
+       \r
+       public static Map<Resource, Collection<Change>> getDependencyChangesFrom(ReadGraph graph, long revisionId) throws DatabaseException {\r
+               ManagementSupport support = graph.getService(ManagementSupport.class);\r
+               \r
+        Map<Resource, Collection<Change>> result = new HashMap<Resource, Collection<Change>>();\r
+               Map<Long, Map<String,byte[]>> metadatas = getMetadatas(graph, support, revisionId, Long.MAX_VALUE);\r
+               \r
+               for(Map.Entry<Long, Map<String,byte[]>> e : metadatas.entrySet()) {\r
+                   long csid = e.getKey();\r
+                       Map<String,byte[]> metadata = e.getValue();\r
+                       if(metadata != null) {\r
+                               byte[] changesData = metadata.get(DependencyChanges.class.getName());\r
+                               if(changesData != null && changesData.length > 0) {\r
+                                       DependencyChanges changes = DependencyChanges.deserialise(graph.getSession(), changesData);\r
+                                       if (changes == null)\r
+                                               continue;\r
+                                       if(DEBUG_IDS) System.err.println("-DependencyChanges[" + csid + "]");\r
+                                       for(Map.Entry<Resource, Change[]> entry : changes.modelChanges.entrySet()) {\r
+                                               Collection<Change> list = result.get(entry.getKey());\r
+                                               if(list == null) {\r
+                                                       list = new ArrayList<Change>();\r
+                                                       result.put(entry.getKey(), list);\r
+                                               }\r
+                                               for(Change c : entry.getValue()) {\r
+                                                       if(DEBUG) System.err.println("-" + c);\r
+                                                       list.add(c);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+    \r
+       public static void visitDependencyChangesFrom2(ReadGraph graph,\r
+                       Resource model, Change[] changes, ChangeVisitor changeVisitor) throws DatabaseException {\r
+       for(Change change : changes) {\r
+               changeVisitor.visit(graph, change, false);\r
+       }\r
+       }\r
+\r
+    /**\r
+     * Finds all changes made to the given {@code model} from the given revision and calls \r
+     * the {@code visitor} for them.\r
+     */\r
+    public static void visitDependencyChangesFrom(ReadGraph graph, Resource model, long fromRevision,\r
+            ChangeVisitor visitor) throws DatabaseException {\r
+        visitDependencyChangesBetween(graph, model, fromRevision, Long.MAX_VALUE, visitor, false);\r
+    }\r
+\r
+    private static void visitDependencyChangesBetween(ReadGraph graph, Resource model, long fromRevision, long toRevision,\r
+            ChangeVisitor visitor, boolean inverted) throws DatabaseException {\r
+        ManagementSupport support = graph.getService(ManagementSupport.class);\r
+//        System.err.println("visitDependencyChangesBetween " + fromRevision + " " + toRevision);\r
+//        Collection<ChangeSetIdentifier> csis = support.getChangeSetIdentifiers(fromRevision, toRevision);\r
+        \r
+        Map<Long, Map<String,byte[]>> metadatas = getMetadatas(graph, support, fromRevision, toRevision);\r
+\r
+//        Map<Resource, Collection<Change>> result = new HashMap<Resource, Collection<Change>>();\r
+//        Map<Long, Map<String,byte[]>> metadatas = getMetadatas(graph, support, revisionId, Long.MAX_VALUE);\r
+        \r
+        for(Map.Entry<Long, Map<String,byte[]>> e : metadatas.entrySet()) {\r
+//            System.err.println("metadata " + e.getKey() + " " + e.getValue());\r
+//            long csid = e.getKey();\r
+            Map<String,byte[]> metadata = e.getValue();\r
+//          if(metadata == null) \r
+//          continue;\r
+//            if(metadata != null) {\r
+        \r
+//        for(ChangeSetIdentifier csi : csis) {\r
+//            if(csi.getId() < fromRevision) { // TODO remove this test when DB api is fixed\r
+//                System.err.println("ManagementSupport.getChangeSetIdentifiers returned identifiers outside of the requested range.");\r
+//                continue;\r
+//            }\r
+//            Map<String,byte[]> metadata = getMetadata(graph, support, csi);\r
+//            if(metadata == null) \r
+//                continue;\r
+            \r
+            browseChanges: {\r
+                byte[] changesData = metadata.get(DependencyChanges.class.getName());\r
+                if(changesData == null || changesData.length == 0) \r
+                    break browseChanges;\r
+                DependencyChanges changes = DependencyChanges.deserialise(graph.getSession(), changesData);\r
+                if (changes == null)\r
+                    break browseChanges;\r
+                for(Map.Entry<Resource, Change[]> entry : changes.modelChanges.entrySet())\r
+                    if(graph.syncRequest(new IsLinkedTo(model, entry.getKey()),\r
+                            TransientCacheListener.<Boolean>instance()))\r
+                        for(Change change : entry.getValue())\r
+                            visitor.visit(graph, change, inverted);\r
+            }\r
+            \r
+            browseUndos: {\r
+                byte[] undoMetadata = metadata.get(UndoMetadata.class.getName());\r
+                if(undoMetadata == null || undoMetadata.length == 0) \r
+                    break browseUndos;\r
+                UndoMetadata undo = UndoMetadata.deserialise(graph.getSession(), undoMetadata);\r
+                visitDependencyChangesBetween(graph, model, undo.getBeginCSId(), undo.getEndCSId(), visitor, \r
+                        undo.isRedo() ? inverted : !inverted);\r
+            }\r
+        }\r
+       }\r
+\r
+//     public static Map<Resource, Collection<Change>> getDependencyChangeIndexFrom(ReadGraph graph, long revisionId) throws DatabaseException {\r
+//\r
+//             \r
+//             \r
+//             Map<Resource, Collection<Change>> index = new HashMap<Resource, Collection<Change>>();\r
+//\r
+//             for(Map<Resource, Collection<Change>> entry : getDependencyChangesFrom(graph, revisionId)) {\r
+//                     if(DEBUG) System.out.println("getDependencyChangeIndexFrom process " + entry);\r
+//                     Collection<DependencyChangeEntry> list = index.get(entry.getOwner());\r
+//                     if(list == null) {\r
+//                             list = new ArrayList<DependencyChangeEntry>();\r
+//                             index.put(entry.getOwner(), list);\r
+//                     }\r
+//                     list.add(entry);\r
+//             }\r
+//             \r
+//             return index;\r
+//             \r
+//     }\r
+       \r
+}\r