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