X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.modeling%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fmapping%2FComponentCopyAdvisor.java;h=96aa3f134b7dff7e0aef854b24546f216618622f;hp=524bf294b91b05a99df399b22231a1ecb2096d6c;hb=3a10ce856f7124f83cf03d6e7f7576da237a7cbb;hpb=969bd23cab98a79ca9101af33334000879fb60c5 diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/ComponentCopyAdvisor.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/ComponentCopyAdvisor.java index 524bf294b..96aa3f134 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/ComponentCopyAdvisor.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/ComponentCopyAdvisor.java @@ -1,139 +1,140 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.modeling.mapping; - -import gnu.trove.map.hash.THashMap; - -import java.util.Map; - -import org.simantics.Simantics; -import org.simantics.databoard.Bindings; -import org.simantics.datatypes.literal.GUID; -import org.simantics.db.Resource; -import org.simantics.db.WriteGraph; -import org.simantics.db.exception.DatabaseException; -import org.simantics.diagram.synchronization.ISynchronizationContext; -import org.simantics.diagram.synchronization.SynchronizationException; -import org.simantics.diagram.synchronization.SynchronizationHints; -import org.simantics.diagram.synchronization.graph.BasicResources; -import org.simantics.diagram.synchronization.graph.CopyAdvisorUtil; -import org.simantics.diagram.synchronization.graph.GraphCopyAdvisor; -import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints; -import org.simantics.layer0.Layer0; -import org.simantics.modeling.ComponentUtils; -import org.simantics.modeling.services.ComponentNamingUtil; -import org.simantics.modeling.services.NamingException; -import org.simantics.project.IProject; -import org.simantics.structural.stubs.StructuralResource2; - -/** - * @author Tuukka Lehtonen - */ -public class ComponentCopyAdvisor extends GraphCopyAdvisor { - - @Override - public Evaluation canCopy(ISynchronizationContext context, WriteGraph graph, Resource source, - Resource sourceContainer, Resource targetContainer) throws DatabaseException { - BasicResources br = context.get(GraphSynchronizationHints.BASIC_RESOURCES); - return (graph.isInstanceOf(source, br.STR.Component) || graph.isInstanceOf(source, br.STR.Connection)) - ? Evaluation.SUPPORTED : Evaluation.NOT_SUPPORTED; - } - - @Override - public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, - Resource targetContainer) throws DatabaseException { - return copy(context, graph, source, sourceContainer, targetContainer, new THashMap()); - } - - @Override - public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, - Resource targetContainer, Map map) throws DatabaseException { - StructuralResource2 STR = StructuralResource2.getInstance(graph); - Resource copy = null; - if (graph.isInstanceOf(source, STR.Connection)) { - // Configuration connections are not named, can't use TG copy for - // them at the moment. - copy = CopyAdvisorUtil.copy2(graph, source, null, map); - } else { -// Resource model = graph.syncRequest(new PossibleModel(targetContainer)); -// copy = CopyAdvisorUtil.copy4(graph, source, model); - copy = CopyAdvisorUtil.copy2(graph, source, null, map); - } - - Layer0 L0 = Layer0.getInstance(graph); - if (graph.hasStatement(sourceContainer, L0.ConsistsOf, source)) - graph.claim(targetContainer, L0.ConsistsOf, copy); - - graph.claimLiteral(copy, L0.identifier, L0.identifier_Inverse, L0.GUID, GUID.random(), GUID.BINDING); - if (context.get(SynchronizationHints.NO_RENAME) == null) - renameComponent(context, graph, source, copy, sourceContainer, targetContainer); - return copy; - } - - public static String renameComponent(ISynchronizationContext context, WriteGraph graph, Resource source, - Resource copy, Resource sourceContainer, Resource targetContainer) throws DatabaseException { - return renameComponent(context, graph, source, copy, sourceContainer, targetContainer, - Layer0.getInstance(graph).HasName); - } - - public static String renameComponent(ISynchronizationContext context, WriteGraph graph, Resource source, - Resource copy, Resource sourceContainer, Resource targetContainer, Resource nameProperty) - throws DatabaseException { - BasicResources br = context.get(GraphSynchronizationHints.BASIC_RESOURCES); - - Resource sourceComponentType = graph.getPossibleType(source, br.STR.Component); - if (sourceComponentType == null) - return null; - - // Try to obtain a ComponentNamingStrategy for renaming the copied object. - IProject project = context.get(SynchronizationHints.PROJECT); - if (project == null) - project = Simantics.getProject(); - - // Try to give a valid or at least unique name for the new component. - //Resource configurationRoot = ComponentUtils.getComponentConfigurationRoot(graph, copy); - //Resource composite = ComponentUtils.tryGetComponentContainer(graph, copy); - Resource configurationRoot = ComponentUtils.getCompositeConfigurationRoot(graph, targetContainer); - Resource composite = targetContainer; - - if (configurationRoot != null) { - try { - String name = ComponentNamingUtil.findFreshInstanceName(graph, project, configurationRoot, composite, sourceComponentType); - graph.claimLiteral(copy, nameProperty, name, Bindings.STRING); - return name; - } catch (NamingException e) { - // This will produce duplicate names in the model, - // should not happen if we don't run out of names. - throw new SynchronizationException(e); - } - } - return null; - } - - @Override - public Object cut(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, - Resource targetContainer) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - - if (sourceContainer.equals(targetContainer)) - return null; - - // This handles e.g. connections, which are not part of container - if(graph.hasStatement(sourceContainer, L0.ConsistsOf, source)) { - graph.deny(sourceContainer, L0.ConsistsOf, source); - graph.claim(targetContainer, L0.ConsistsOf, source); - } - - return source; - } - -} +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.modeling.mapping; + +import gnu.trove.map.hash.THashMap; + +import java.util.Map; + +import org.simantics.Simantics; +import org.simantics.databoard.Bindings; +import org.simantics.datatypes.literal.GUID; +import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.util.Layer0Utils; +import org.simantics.diagram.synchronization.ISynchronizationContext; +import org.simantics.diagram.synchronization.SynchronizationException; +import org.simantics.diagram.synchronization.SynchronizationHints; +import org.simantics.diagram.synchronization.graph.BasicResources; +import org.simantics.diagram.synchronization.graph.CopyAdvisorUtil; +import org.simantics.diagram.synchronization.graph.GraphCopyAdvisor; +import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints; +import org.simantics.layer0.Layer0; +import org.simantics.modeling.ComponentUtils; +import org.simantics.modeling.services.ComponentNamingUtil; +import org.simantics.modeling.services.NamingException; +import org.simantics.project.IProject; +import org.simantics.structural.stubs.StructuralResource2; + +/** + * @author Tuukka Lehtonen + */ +public class ComponentCopyAdvisor extends GraphCopyAdvisor { + + @Override + public Evaluation canCopy(ISynchronizationContext context, WriteGraph graph, Resource source, + Resource sourceContainer, Resource targetContainer) throws DatabaseException { + BasicResources br = context.get(GraphSynchronizationHints.BASIC_RESOURCES); + return (graph.isInstanceOf(source, br.STR.Component) || graph.isInstanceOf(source, br.STR.Connection)) + ? Evaluation.SUPPORTED : Evaluation.NOT_SUPPORTED; + } + + @Override + public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, + Resource targetContainer) throws DatabaseException { + return copy(context, graph, source, sourceContainer, targetContainer, new THashMap()); + } + + @Override + public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, + Resource targetContainer, Map map) throws DatabaseException { + StructuralResource2 STR = StructuralResource2.getInstance(graph); + Resource copy = null; + if (graph.isInstanceOf(source, STR.Connection)) { + // Configuration connections are not named, can't use TG copy for + // them at the moment. + copy = CopyAdvisorUtil.copy2(graph, source, null, map); + } else { +// Resource model = graph.syncRequest(new PossibleModel(targetContainer)); +// copy = CopyAdvisorUtil.copy4(graph, source, model); + copy = CopyAdvisorUtil.copy2(graph, source, null, map); + } + + Layer0 L0 = Layer0.getInstance(graph); + if (graph.hasStatement(sourceContainer, L0.ConsistsOf, source)) + graph.claim(targetContainer, L0.ConsistsOf, copy); + + Layer0Utils.addL0Identifier(graph, copy); + if (context.get(SynchronizationHints.NO_RENAME) == null) + renameComponent(context, graph, source, copy, sourceContainer, targetContainer); + return copy; + } + + public static String renameComponent(ISynchronizationContext context, WriteGraph graph, Resource source, + Resource copy, Resource sourceContainer, Resource targetContainer) throws DatabaseException { + return renameComponent(context, graph, source, copy, sourceContainer, targetContainer, + Layer0.getInstance(graph).HasName); + } + + public static String renameComponent(ISynchronizationContext context, WriteGraph graph, Resource source, + Resource copy, Resource sourceContainer, Resource targetContainer, Resource nameProperty) + throws DatabaseException { + BasicResources br = context.get(GraphSynchronizationHints.BASIC_RESOURCES); + + Resource sourceComponentType = graph.getPossibleType(source, br.STR.Component); + if (sourceComponentType == null) + return null; + + // Try to obtain a ComponentNamingStrategy for renaming the copied object. + IProject project = context.get(SynchronizationHints.PROJECT); + if (project == null) + project = Simantics.getProject(); + + // Try to give a valid or at least unique name for the new component. + //Resource configurationRoot = ComponentUtils.getComponentConfigurationRoot(graph, copy); + //Resource composite = ComponentUtils.tryGetComponentContainer(graph, copy); + Resource configurationRoot = ComponentUtils.getCompositeConfigurationRoot(graph, targetContainer); + Resource composite = targetContainer; + + if (configurationRoot != null) { + try { + String name = ComponentNamingUtil.findFreshInstanceName(graph, project, configurationRoot, composite, sourceComponentType); + graph.claimLiteral(copy, nameProperty, name, Bindings.STRING); + return name; + } catch (NamingException e) { + // This will produce duplicate names in the model, + // should not happen if we don't run out of names. + throw new SynchronizationException(e); + } + } + return null; + } + + @Override + public Object cut(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, + Resource targetContainer) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + + if (sourceContainer.equals(targetContainer)) + return null; + + // This handles e.g. connections, which are not part of container + if(graph.hasStatement(sourceContainer, L0.ConsistsOf, source)) { + graph.deny(sourceContainer, L0.ConsistsOf, source); + graph.claim(targetContainer, L0.ConsistsOf, source); + } + + return source; + } + +}