X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.structural.synchronization.client%2Fsrc%2Forg%2Fsimantics%2Fstructural%2Fsynchronization%2Fbase%2FUpdateComponentUids.java;h=df63ada0525911d50cd84c636989f1fe8e30d34c;hp=5ace8a2c345374035754e3ca8fa90de8d24a51ef;hb=6b4432af6fe79c859dd1ddb31fd185d64c729863;hpb=602614f4502aae85ecf3967abb7152d2d62903e3 diff --git a/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/UpdateComponentUids.java b/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/UpdateComponentUids.java index 5ace8a2c3..df63ada05 100644 --- a/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/UpdateComponentUids.java +++ b/bundles/org.simantics.structural.synchronization.client/src/org/simantics/structural/synchronization/base/UpdateComponentUids.java @@ -1,79 +1,88 @@ -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; - } - } - -} +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; +import org.simantics.structural.synchronization.utils.ComponentBase; + +import gnu.trove.map.hash.THashMap; + +/** + * 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 THashMap oldToNewUids; + 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; + this.oldToNewUids = new THashMap<>(componentCount); + } + + private void update(T component, Variable variable) throws DatabaseException { + String newUid = variable.getRVI(graph).toString(); + oldToNewUids.put(component.uid, newUid); + component.uid = newUid; + + // 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 > THashMap update(ReadGraph graph, T component, Variable variable) throws DatabaseException { + return update(null, graph, component, variable); + } + + public static > THashMap update(IProgressMonitor monitor, ReadGraph graph, T component, Variable variable) throws DatabaseException { + UpdateComponentUids updateComponentUids = new UpdateComponentUids(monitor, graph, countComponents(component)); + updateComponentUids.update(component, variable); + return updateComponentUids.oldToNewUids; + } + + 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; + } + } + +}