Sync git svn branch with SVN repository r33366.
[simantics/platform.git] / bundles / org.simantics.structural.synchronization.client / src / org / simantics / structural / synchronization / base / UpdateComponentUids.java
index 840d9ec4c7dc5bd688f382939d04734e8c1fa998..5ace8a2c345374035754e3ca8fa90de8d24a51ef 100644 (file)
@@ -1,6 +1,8 @@
 package org.simantics.structural.synchronization.base;\r
 \r
+import org.eclipse.core.runtime.IProgressMonitor;\r
 import org.simantics.db.ReadGraph;\r
+import org.simantics.db.exception.CancelTransactionException;\r
 import org.simantics.db.exception.DatabaseException;\r
 import org.simantics.db.layer0.variable.Variable;\r
 \r
@@ -11,17 +13,67 @@ import org.simantics.db.layer0.variable.Variable;
  * and resource ids have been changed.\r
  * \r
  * @author Hannu Niemistö\r
+ * @author Tuukka Lehtonen\r
  */\r
-public class UpdateComponentUids {\r
-    \r
-    public static <T extends ComponentBase<T>> void update(ReadGraph graph, T component, Variable variable) throws DatabaseException {\r
+public class UpdateComponentUids<T extends ComponentBase<T>> {\r
+\r
+    public static interface ComponentUpdateProgressMonitor {\r
+        void componentsDone(int components, int componentCount);\r
+    }\r
+\r
+    private IProgressMonitor monitor;\r
+    private ComponentUpdateProgressMonitor componentMonitor;\r
+    private ReadGraph graph;\r
+       private int componentCount;\r
+    private int counter;\r
+\r
+    private UpdateComponentUids(IProgressMonitor monitor, ReadGraph graph, int componentCount) {\r
+        this.monitor = monitor;\r
+        this.componentMonitor = monitor instanceof ComponentUpdateProgressMonitor ? (ComponentUpdateProgressMonitor) monitor : null;\r
+        this.graph = graph;\r
+        this.componentCount = componentCount;\r
+    }\r
+\r
+    private void update(T component, Variable variable) throws DatabaseException {\r
         component.uid = variable.getRVI(graph).toString();\r
+\r
+        // Handle progress monitoring and cancellation\r
+        counter++;\r
+        if (monitor != null) {\r
+            if (componentMonitor != null)\r
+                componentMonitor.componentsDone(counter, componentCount);\r
+            if (monitor.isCanceled())\r
+                throw new CancelTransactionException();\r
+        }\r
+\r
         for(Variable childVariable : variable.getChildren(graph)) {\r
             String childName = childVariable.getName(graph);\r
             T childComponent = component.getChild(childName);\r
             if(childComponent != null)\r
-                update(graph, childComponent, childVariable);\r
+                update(childComponent, childVariable);\r
         }\r
     }\r
-    \r
+\r
+    public static <T extends ComponentBase<T>> void update(ReadGraph graph, T component, Variable variable) throws DatabaseException {\r
+        update(null, graph, component, variable);\r
+    }\r
+\r
+    public static <T extends ComponentBase<T>> void update(IProgressMonitor monitor, ReadGraph graph, T component, Variable variable) throws DatabaseException {\r
+        new UpdateComponentUids<T>(monitor, graph, countComponents(component)).update(component, variable);\r
+    }\r
+\r
+    public static <T extends ComponentBase<T>> int countComponents(T component) {\r
+        return new Counter<T>().count(component);\r
+    }\r
+\r
+    private static class Counter<T extends ComponentBase<T>> {\r
+        int counter;\r
+        int count(T component) {\r
+            ++counter;\r
+            for (T child : component.getChildren())\r
+                count(child);\r
+            return counter;\r
+        }\r
+    }\r
+\r
 }\r