package org.simantics.structural.synchronization.base; import org.eclipse.core.runtime.IProgressMonitor; import org.simantics.db.ReadGraph; import org.simantics.db.exception.CancelTransactionException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; /** * Utility for updating UIDs in the given component to correspond * the RVIs of the given variable. This operation is needed when * the mapping is part of a model that is imported to a new database * and resource ids have been changed. * * @author Hannu Niemistö * @author Tuukka Lehtonen */ public class UpdateComponentUids> { public static interface ComponentUpdateProgressMonitor { void componentsDone(int components, int componentCount); } private IProgressMonitor monitor; private ComponentUpdateProgressMonitor componentMonitor; private ReadGraph graph; private int componentCount; private int counter; private UpdateComponentUids(IProgressMonitor monitor, ReadGraph graph, int componentCount) { this.monitor = monitor; this.componentMonitor = monitor instanceof ComponentUpdateProgressMonitor ? (ComponentUpdateProgressMonitor) monitor : null; this.graph = graph; this.componentCount = componentCount; } private void update(T component, Variable variable) throws DatabaseException { component.uid = variable.getRVI(graph).toString(); // Handle progress monitoring and cancellation counter++; if (monitor != null) { if (componentMonitor != null) componentMonitor.componentsDone(counter, componentCount); if (monitor.isCanceled()) throw new CancelTransactionException(); } for(Variable childVariable : variable.getChildren(graph)) { String childName = childVariable.getName(graph); T childComponent = component.getChild(childName); if(childComponent != null) update(childComponent, childVariable); } } public static > void update(ReadGraph graph, T component, Variable variable) throws DatabaseException { update(null, graph, component, variable); } public static > void update(IProgressMonitor monitor, ReadGraph graph, T component, Variable variable) throws DatabaseException { new UpdateComponentUids(monitor, graph, countComponents(component)).update(component, variable); } public static > int countComponents(T component) { return new Counter().count(component); } private static class Counter> { int counter; int count(T component) { ++counter; for (T child : component.getChildren()) count(child); return counter; } } }