-package org.simantics.modeling.utils;\r
-\r
-import gnu.trove.map.hash.THashMap;\r
-import gnu.trove.set.hash.THashSet;\r
-\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.simantics.databoard.adapter.AdaptException;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.utils.NameUtils;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.utils.datastructures.map.Tuple;\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- */\r
-public class StructuralModelChanges {\r
-\r
- @SuppressWarnings("unused")\r
- private static final boolean TRACE_REFERENCE_FIXES = false;\r
-\r
- private Resource model;\r
- private THashMap<Resource, Resource> moves = new THashMap<Resource, Resource>();\r
- private THashMap<Resource, String> renames = new THashMap<Resource, String>();\r
-// private THashMap<Resource, Reference> references = new THashMap<Resource, Reference>();\r
-\r
- public StructuralModelChanges(Resource model) {\r
- this.model = model;\r
- }\r
-\r
- public void move(Resource component, Resource target) {\r
- moves.put(component, target);\r
- }\r
-\r
- public void rename(Resource component, String newName) {\r
- renames.put(component, newName);\r
- }\r
-\r
- static class Info extends Tuple {\r
- public Info(Resource component, String rvi) {\r
- super(component, rvi);\r
- }\r
- public Resource getComponent() {\r
- return (Resource) getField(0);\r
- }\r
- public String getRvi() {\r
- return (String) getField(1);\r
- }\r
- }\r
-\r
- public void apply(final WriteGraph graph) throws DatabaseException {\r
- final Layer0 L0 = Layer0.getInstance(graph);\r
-\r
- try {\r
- loadAllReferences(graph, model, new THashSet<Resource>());\r
- } catch (AdaptException e) {\r
- throw new DatabaseException(e);\r
- }\r
-\r
- // 1. Get information on current state of components that are about to\r
- // be modified somehow\r
-// Map<Resource, Info> before = getInfo(graph);\r
-\r
- // 2. Perform modifications\r
- for (Map.Entry<Resource, Resource> entry : moves.entrySet()) {\r
- Resource component = entry.getKey();\r
- Resource target = entry.getValue();\r
-\r
- for (Resource source : graph.getObjects(component, L0.PartOf))\r
- graph.deny(component, L0.PartOf, source);\r
- graph.claim(component, L0.PartOf, L0.ConsistsOf, target);\r
- }\r
-\r
- for (Map.Entry<Resource, String> entry : renames.entrySet()) {\r
- Resource component = entry.getKey();\r
- Resource container = graph.getSingleObject(component, L0.PartOf);\r
- String freshName = NameUtils.findFreshName(graph, entry.getValue(), container, L0.ConsistsOf, "%s%d");\r
- graph.claimLiteral(component, L0.HasName, freshName);\r
- }\r
-\r
-// // 3. Get information on the state of modified components after the modifications\r
-// Map<Resource, Info> after = getInfo(graph);\r
-// Map<String, String> toNewPath = new HashMap<String, String>();\r
-// for (Resource component : before.keySet()) {\r
-// Info b = before.get(component);\r
-// Info a = after.get(component);\r
-// toNewPath.put(b.getRvi(), a.getRvi());\r
-// }\r
-\r
- // 4. Fix all references\r
-// next_reference:\r
-// for (Reference ref : references.values()) {\r
-// for (String beforePath : toNewPath.keySet()) {\r
-// if (ref.getRVI().startsWith(beforePath)) {\r
-// String afterPath = toNewPath.get(beforePath);\r
-// String newRvi = afterPath + ref.getRVI().substring(beforePath.length());\r
-// if (TRACE_REFERENCE_FIXES)\r
-// System.out.println("FIX REFERENCE: " + ref.getRVI() + " -> " + newRvi);\r
-// writeReference(graph, ref.getReferee(), newRvi);\r
-// continue next_reference;\r
-// }\r
-// }\r
-// }\r
- }\r
-\r
-// private Map<Resource, Info> getInfo(ReadGraph graph) throws DatabaseException {\r
-// Map<Resource, Info> state = new THashMap<Resource, Info>();\r
-// Set<Resource> modifiedObjects = new THashSet<Resource>();\r
-// modifiedObjects.addAll(moves.keySet());\r
-// modifiedObjects.addAll(renames.keySet());\r
-// for (Resource component : modifiedObjects) {\r
-// Variable v = graph.getPossibleAdapter(component, Variable.class);\r
-// String rvi = Variables.getPossibleRVI(graph, v);\r
-// if (rvi != null) {\r
-// state.put(component, new Info(component, rvi));\r
-// }\r
-// }\r
-// return state;\r
-// }\r
-\r
-// private String lastChildSegment(String rvi) {\r
-// int propIndex = rvi.indexOf(Role.PROPERTY.getIdentifier());\r
-// if (propIndex == -1)\r
-// propIndex = rvi.length();\r
-// int childIndex = rvi.lastIndexOf(Role.CHILD.getIdentifier(), propIndex);\r
-// if (childIndex == -1)\r
-// return null;\r
-// return rvi.substring(childIndex);\r
-// }\r
-\r
- private void loadAllReferences(WriteGraph graph, Resource root, Set<Resource> visited) throws DatabaseException, AdaptException {\r
- if (!visited.add(root))\r
- return;\r
-\r
-// Layer0 L0 = Layer0.getInstance(graph);\r
-// ModelingResources MOD = ModelingResources.getInstance(graph);\r
-// ChartResource CHART = ChartResource.getInstance(graph);\r
-\r
-// for (Resource r : graph.getObjects(root, L0.ConsistsOf)) {\r
-// if (graph.isInstanceOf(r, MOD.Subscription)) {\r
-// loadAllReferences(graph, r, visited);\r
-// } else if (graph.isInstanceOf(r, CHART.ChartGroup)) {\r
-// loadAllReferences(graph, r, visited);\r
-// } else if (graph.isInstanceOf(r, CHART.Chart)) {\r
-// loadAllReferences(graph, r, visited);\r
-// } else if (graph.isInstanceOf(r, MOD.Subscription_Item)) {\r
-//// addPossibleReference(graph, r);\r
-// } else if (graph.isInstanceOf(r, CHART.Chart_Item)) {\r
-//// addPossibleReference(graph, r);\r
-// }\r
-// }\r
- }\r
-\r
-// public Reference addPossibleReference(ReadGraph graph, Resource referee) throws DatabaseException, AdaptException {\r
-// Reference r = readPossibleReference(graph, referee);\r
-// if (r != null) {\r
-// references.put(referee, r);\r
-// //System.out.println("FOUND REFERENCE: " + r);\r
-// }\r
-// return r;\r
-// }\r
-\r
-// public Reference readPossibleReference(ReadGraph graph, Resource referee) throws DatabaseException, AdaptException {\r
-// ModelingResources MOD = ModelingResources.getInstance(graph);\r
-// String v = graph.getPossibleRelatedValue(referee, MOD.Subscription_Item_VariableId, Bindings.STRING);\r
-// if (v == null)\r
-// return null;\r
-// return new Reference(referee, Role.CHILD.getIdentifier() + v);\r
-// }\r
-//\r
-// public void writeReference(WriteGraph graph, Resource referee, String newReference) throws DatabaseException {\r
-// if (newReference.startsWith(Role.CHILD.getIdentifier()))\r
-// newReference = newReference.substring(Role.CHILD.getIdentifier().length());\r
-// ModelingResources MOD = ModelingResources.getInstance(graph);\r
-// graph.claimLiteral(referee, MOD.Subscription_Item_VariableId, newReference, Bindings.STRING);\r
-// }\r
-\r
- static class Reference extends Tuple {\r
- public Reference(Resource referee, String rvi) {\r
- super(referee, rvi);\r
- }\r
- public Resource getReferee() {\r
- return (Resource) getField(0);\r
- }\r
- public String getRVI() {\r
- return (String) getField(1);\r
- }\r
- }\r
-\r
-}\r
+package org.simantics.modeling.utils;
+
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.set.hash.THashSet;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.layer0.Layer0;
+import org.simantics.utils.datastructures.map.Tuple;
+
+/**
+ * @author Tuukka Lehtonen
+ */
+public class StructuralModelChanges {
+
+ @SuppressWarnings("unused")
+ private static final boolean TRACE_REFERENCE_FIXES = false;
+
+ private Resource model;
+ private THashMap<Resource, Resource> moves = new THashMap<Resource, Resource>();
+ private THashMap<Resource, String> renames = new THashMap<Resource, String>();
+// private THashMap<Resource, Reference> references = new THashMap<Resource, Reference>();
+
+ public StructuralModelChanges(Resource model) {
+ this.model = model;
+ }
+
+ public void move(Resource component, Resource target) {
+ moves.put(component, target);
+ }
+
+ public void rename(Resource component, String newName) {
+ renames.put(component, newName);
+ }
+
+ static class Info extends Tuple {
+ public Info(Resource component, String rvi) {
+ super(component, rvi);
+ }
+ public Resource getComponent() {
+ return (Resource) getField(0);
+ }
+ public String getRvi() {
+ return (String) getField(1);
+ }
+ }
+
+ public void apply(final WriteGraph graph) throws DatabaseException {
+ final Layer0 L0 = Layer0.getInstance(graph);
+
+ try {
+ loadAllReferences(graph, model, new THashSet<Resource>());
+ } catch (AdaptException e) {
+ throw new DatabaseException(e);
+ }
+
+ // 1. Get information on current state of components that are about to
+ // be modified somehow
+// Map<Resource, Info> before = getInfo(graph);
+
+ // 2. Perform modifications
+ for (Map.Entry<Resource, Resource> entry : moves.entrySet()) {
+ Resource component = entry.getKey();
+ Resource target = entry.getValue();
+
+ for (Resource source : graph.getObjects(component, L0.PartOf))
+ graph.deny(component, L0.PartOf, source);
+ graph.claim(component, L0.PartOf, L0.ConsistsOf, target);
+ }
+
+ for (Map.Entry<Resource, String> entry : renames.entrySet()) {
+ Resource component = entry.getKey();
+ Resource container = graph.getSingleObject(component, L0.PartOf);
+ String freshName = NameUtils.findFreshName(graph, entry.getValue(), container, L0.ConsistsOf, "%s%d");
+ graph.claimLiteral(component, L0.HasName, freshName);
+ }
+
+// // 3. Get information on the state of modified components after the modifications
+// Map<Resource, Info> after = getInfo(graph);
+// Map<String, String> toNewPath = new HashMap<String, String>();
+// for (Resource component : before.keySet()) {
+// Info b = before.get(component);
+// Info a = after.get(component);
+// toNewPath.put(b.getRvi(), a.getRvi());
+// }
+
+ // 4. Fix all references
+// next_reference:
+// for (Reference ref : references.values()) {
+// for (String beforePath : toNewPath.keySet()) {
+// if (ref.getRVI().startsWith(beforePath)) {
+// String afterPath = toNewPath.get(beforePath);
+// String newRvi = afterPath + ref.getRVI().substring(beforePath.length());
+// if (TRACE_REFERENCE_FIXES)
+// System.out.println("FIX REFERENCE: " + ref.getRVI() + " -> " + newRvi);
+// writeReference(graph, ref.getReferee(), newRvi);
+// continue next_reference;
+// }
+// }
+// }
+ }
+
+// private Map<Resource, Info> getInfo(ReadGraph graph) throws DatabaseException {
+// Map<Resource, Info> state = new THashMap<Resource, Info>();
+// Set<Resource> modifiedObjects = new THashSet<Resource>();
+// modifiedObjects.addAll(moves.keySet());
+// modifiedObjects.addAll(renames.keySet());
+// for (Resource component : modifiedObjects) {
+// Variable v = graph.getPossibleAdapter(component, Variable.class);
+// String rvi = Variables.getPossibleRVI(graph, v);
+// if (rvi != null) {
+// state.put(component, new Info(component, rvi));
+// }
+// }
+// return state;
+// }
+
+// private String lastChildSegment(String rvi) {
+// int propIndex = rvi.indexOf(Role.PROPERTY.getIdentifier());
+// if (propIndex == -1)
+// propIndex = rvi.length();
+// int childIndex = rvi.lastIndexOf(Role.CHILD.getIdentifier(), propIndex);
+// if (childIndex == -1)
+// return null;
+// return rvi.substring(childIndex);
+// }
+
+ private void loadAllReferences(WriteGraph graph, Resource root, Set<Resource> visited) throws DatabaseException, AdaptException {
+ if (!visited.add(root))
+ return;
+
+// Layer0 L0 = Layer0.getInstance(graph);
+// ModelingResources MOD = ModelingResources.getInstance(graph);
+// ChartResource CHART = ChartResource.getInstance(graph);
+
+// for (Resource r : graph.getObjects(root, L0.ConsistsOf)) {
+// if (graph.isInstanceOf(r, MOD.Subscription)) {
+// loadAllReferences(graph, r, visited);
+// } else if (graph.isInstanceOf(r, CHART.ChartGroup)) {
+// loadAllReferences(graph, r, visited);
+// } else if (graph.isInstanceOf(r, CHART.Chart)) {
+// loadAllReferences(graph, r, visited);
+// } else if (graph.isInstanceOf(r, MOD.Subscription_Item)) {
+//// addPossibleReference(graph, r);
+// } else if (graph.isInstanceOf(r, CHART.Chart_Item)) {
+//// addPossibleReference(graph, r);
+// }
+// }
+ }
+
+// public Reference addPossibleReference(ReadGraph graph, Resource referee) throws DatabaseException, AdaptException {
+// Reference r = readPossibleReference(graph, referee);
+// if (r != null) {
+// references.put(referee, r);
+// //System.out.println("FOUND REFERENCE: " + r);
+// }
+// return r;
+// }
+
+// public Reference readPossibleReference(ReadGraph graph, Resource referee) throws DatabaseException, AdaptException {
+// ModelingResources MOD = ModelingResources.getInstance(graph);
+// String v = graph.getPossibleRelatedValue(referee, MOD.Subscription_Item_VariableId, Bindings.STRING);
+// if (v == null)
+// return null;
+// return new Reference(referee, Role.CHILD.getIdentifier() + v);
+// }
+//
+// public void writeReference(WriteGraph graph, Resource referee, String newReference) throws DatabaseException {
+// if (newReference.startsWith(Role.CHILD.getIdentifier()))
+// newReference = newReference.substring(Role.CHILD.getIdentifier().length());
+// ModelingResources MOD = ModelingResources.getInstance(graph);
+// graph.claimLiteral(referee, MOD.Subscription_Item_VariableId, newReference, Bindings.STRING);
+// }
+
+ static class Reference extends Tuple {
+ public Reference(Resource referee, String rvi) {
+ super(referee, rvi);
+ }
+ public Resource getReferee() {
+ return (Resource) getField(0);
+ }
+ public String getRVI() {
+ return (String) getField(1);
+ }
+ }
+
+}