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
* 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