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%2FMigrateModel.java;h=4e472ded4a5d5198544a2ba6f18189db3d469ad9;hp=eb0b80709b70094fcdfff1f5900a70f35d0dee2e;hb=40b90f72c9598beb7e21a07b280c43a68adc34f2;hpb=d61c60ec63677ceb7d815ce914ff0456502b0dd2 diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/MigrateModel.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/MigrateModel.java index eb0b80709..4e472ded4 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/MigrateModel.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/MigrateModel.java @@ -11,24 +11,26 @@ *******************************************************************************/ package org.simantics.modeling; -import gnu.trove.set.hash.THashSet; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; import org.simantics.databoard.Bindings; import org.simantics.databoard.util.URIStringUtils; +import org.simantics.datatypes.literal.GUID; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.NamedResource; +import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.adapter.Instances; +import org.simantics.db.layer0.request.ChildrenByIdentifier; import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.layer0.Layer0; @@ -36,12 +38,18 @@ import org.simantics.structural.stubs.StructuralResource2; import org.simantics.structural2.modelingRules.AllowedConnectionTypes; import org.simantics.utils.ObjectUtils; import org.simantics.utils.datastructures.Triple; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import gnu.trove.set.hash.THashSet; /** * @author Antti Villberg */ public class MigrateModel { + public static final Logger LOGGER = LoggerFactory.getLogger(MigrateModel.class); + public static class MigrationOperation { public NamedResource instanceToMigrate; @@ -74,6 +82,15 @@ public class MigrateModel { private Resource getPossibleReplacement(ReadGraph graph, Resource type, Resource predicate) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); + + // Try to find a relation with the same GUID + GUID guid = graph.getPossibleRelatedValue(predicate, L0.identifier, GUID.BINDING); + Map children = graph.syncRequest(new ChildrenByIdentifier(type), TransientCacheListener.instance()); + Resource replacement = children.get(guid); + if (replacement != null) + return replacement; + + // Fall back to using relation name String name = graph.getPossibleRelatedValue(predicate, L0.HasName, Bindings.STRING); if(name == null) return null; Resource child = Layer0Utils.getPossibleChild(graph, type, name); @@ -110,6 +127,7 @@ public class MigrateModel { problems.append(" " + name + " was a property in the source type\n"); continue; } + String sourceValueType = graph.getPossibleRelatedValue(predicate, L0.RequiresValueType, Bindings.STRING); String replacementValueType = graph.getPossibleRelatedValue(replacement, L0.RequiresValueType, Bindings.STRING); if(!ObjectUtils.objectEquals(sourceValueType, replacementValueType)) { @@ -167,7 +185,29 @@ public class MigrateModel { Resource replacement = getPossibleReplacement(graph, type, predicate); graph.deny(stm); if(replacement == null) continue; - graph.claim(stm.getSubject(), replacement, stm.getObject()); + + // Filter out incompatible literal types. + // TODO: Show warning in UI + Resource object = stm.getObject(); + Resource replacementRange = graph.getPossibleObject(replacement, L0.HasRange); + if (replacementRange != null && !graph.isInstanceOf(object, replacementRange)) { + String instanceName = graph.getPossibleRelatedValue(instanceToMigrate, L0.HasName); + if (instanceName == null) instanceName = ""; + + String rangeName = graph.getPossibleRelatedValue(replacementRange, L0.HasName); + if (rangeName == null) rangeName = ""; + + Resource literalType= graph.getPossibleType(object, L0.Value); + String literalTypeName = literalType != null ? graph.getPossibleRelatedValue(literalType, L0.HasName) : null; + if (literalTypeName == null) literalTypeName = ""; + + String replacementName = graph.getRelatedValue(replacement, L0.HasName); + LOGGER.warn("{}: Ignored incompatible value of type {} for predicate {} with range {}", instanceName, literalTypeName, replacementName, rangeName); + + continue; + } + + graph.claim(stm.getSubject(), replacement, object); } }