import org.simantics.databoard.type.UnionType;
import org.simantics.databoard.type.VariantType;
import org.simantics.databoard.util.ObjectUtils;
+import org.simantics.datatypes.literal.GUID;
import org.simantics.db.ChangeSetIdentifier;
import org.simantics.db.Operation;
import org.simantics.db.ReadGraph;
}
+ /**
+ * Adds a random {@link GUID} as a value for <code>L0.identifier</code>
+ *
+ * @param graph
+ * @param component
+ * for which the identifier is added
+ * @param add
+ * <code>true</code> to invoke addLiteral, <code>false</code> to
+ * invoke claimLiteral
+ * @throws DatabaseException
+ */
+ public static void claimNewIdentifier(WriteGraph graph, Resource component, boolean add) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ GUID guid = GUID.random();
+ if (add)
+ graph.addLiteral(component, L0.identifier, L0.identifier_Inverse, L0.GUID, guid, GUID.BINDING);
+ else
+ graph.claimLiteral(component, L0.identifier, L0.identifier_Inverse, L0.GUID, guid, GUID.BINDING);
+ }
+
+ /**
+ * Sets a new random unique identifier for the specified entity if it already
+ * has an identifier. If the entity does not have a previous identifier, nothing
+ * is done.
+ *
+ * @param graph
+ * @param entity
+ * for which the identifier is added
+ * @return <code>true</code> if the identifier was renewed, <code>false</code>
+ * otherwise
+ * @throws DatabaseException
+ * @see {@link #claimNewIdentifier(WriteGraph, Resource, boolean)}
+ */
+ public static boolean renewIdentifier(WriteGraph graph, Resource entity) throws DatabaseException {
+ Layer0 L0 = Layer0.getInstance(graph);
+ Statement stm = graph.getPossibleStatement(entity, L0.identifier);
+ if (stm != null) {
+ graph.claimValue(stm.getObject(), GUID.random(), GUID.BINDING);
+ return true;
+ }
+ return false;
+ }
+
}
import org.simantics.db.common.request.ObjectsWithType;
import org.simantics.db.common.request.PossibleIndexRoot;
import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.function.DbConsumer;
import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;
import org.simantics.db.layer0.adapter.impl.DefaultCopyHandler;
import org.simantics.db.layer0.util.TransferableGraphConfiguration2;
if(indexRoot == null) throw new DatabaseException("Composite is not part of any index root");
String indexRootUri = graph.getURI(indexRoot);
+ DbConsumer<Resource> identifierExcluder = r -> {
+ if (r != null)
+ exclusions.addAll(graph.getObjects(r, L0.identifier));
+ };
+
for(Resource resource : resources) {
// Process all connection joins.
// This is the only way to access all of them.
for (Resource diagram : graph.getObjects(resource, MOD.CompositeToDiagram)) {
- for (Resource flag : graph.syncRequest(new ObjectsWithType(diagram, L0.ConsistsOf, DIA.Flag))) {
- for (Resource join : graph.getObjects(flag, DIA.FlagIsJoinedBy)) {
- // Joins with external references are omitted
- for (Resource comp : graph.getObjects(join, SR.JoinsComposite)) {
- if (!resourceSet.contains(comp))
- exclusions.add(join);
- }
- // This code excludes joins with flags to external
- // diagrams that are not connected (have no
- // configuration for the flag)
- for (Resource flag2 : graph.getObjects(join, DIA.JoinsFlag)) {
- Resource diagram2 = graph.getPossibleObject(flag2, L0.PartOf);
- if (diagram2 != null) {
- Resource comp = graph.getPossibleObject(diagram2, MOD.DiagramToComposite);
+ identifierExcluder.accept(diagram);
+
+ for (Resource element : graph.getObjects(diagram, L0.ConsistsOf)) {
+ identifierExcluder.accept(element);
+
+ Set<Resource> types = graph.getTypes(element);
+
+ // Check all diagram flag elements for necessary exclusions.
+ if (types.contains(DIA.Flag)) {
+ for (Resource join : graph.getObjects(element, DIA.FlagIsJoinedBy)) {
+ // Joins with external references are omitted
+ for (Resource comp : graph.getObjects(join, SR.JoinsComposite)) {
if (!resourceSet.contains(comp))
- exclusions.add(join);
+ exclusions.add(join);
+ }
+ // This code excludes joins with flags to external
+ // diagrams that are not connected (have no
+ // configuration for the flag)
+ for (Resource flag2 : graph.getObjects(join, DIA.JoinsFlag)) {
+ Resource diagram2 = graph.getPossibleObject(flag2, L0.PartOf);
+ if (diagram2 != null) {
+ Resource comp = graph.getPossibleObject(diagram2, MOD.DiagramToComposite);
+ if (!resourceSet.contains(comp))
+ exclusions.add(join);
+ }
+ }
+ }
+ }
+
+ // Check all diagram monitor elements.
+ // Any components referenced that are external to the exported diagrams must be excluded from the export.
+ // This will leave the monitors without a monitored component but export and import will work anyway.
+ if (types.contains(DIA.Monitor)) {
+ for (Resource monitoredComponent : graph.getObjects(element, DIA.HasMonitorComponent)) {
+ Resource monitoredComponentComposite = graph.getPossibleObject(monitoredComponent, L0.PartOf);
+ if (monitoredComponentComposite != null && !resourceSet.contains(monitoredComponentComposite)) {
+ exclusions.add(monitoredComponent);
}
}
}
- }
- // Check all diagram monitor elements.
- // Any components referenced that are external to the exported diagrams must be excluded from the export.
- // This will leave the monitors without a monitored component but export and import will work anyway.
- for (Resource ref : graph.syncRequest(new ObjectsWithType(diagram, L0.ConsistsOf, DIA.Monitor))) {
- for (Resource monitoredComponent : graph.getObjects(ref, DIA.HasMonitorComponent)) {
- Resource monitoredComponentComposite = graph.getPossibleObject(monitoredComponent, L0.PartOf);
- if (monitoredComponentComposite != null && !resourceSet.contains(monitoredComponentComposite)) {
- exclusions.add(monitoredComponent);
+ // Check all diagram reference elements for necessary exclusions.
+ if (types.contains(MOD.ReferenceElement)) {
+ for (Resource rel : graph.getObjects(element, L0.ConsistsOf)) {
+ identifierExcluder.accept(rel);
+ for (Resource invRel : graph.getObjects(rel, L0.ConsistsOf)) {
+ identifierExcluder.accept(invRel);
+ }
}
}
}
// Include resource as root
CompositeInfo info = CompositeInfo.fromResource(graph, resource);
roots.add(new RootSpec(resource, info.getTGName(), true, typeId(graph, L0, indexRootUri, resource)));
- Resource id = graph.getPossibleObject(resource, L0.identifier);
- if(id != null) exclusions.add(id);
+ identifierExcluder.accept(resource);
// Include components as roots
- for(Resource child : graph.sync(new ObjectsWithType(resource, L0.ConsistsOf, SR.Component))) {
- DiagramComponentInfo cinfo = DiagramComponentInfo.fromResource(graph, info, child);
- id = graph.getPossibleObject(child, L0.identifier);
- if(id != null) exclusions.add(id);
+ for (Resource child : graph.sync(new ObjectsWithType(resource, L0.ConsistsOf, SR.Component))) {
+ DiagramComponentInfo cinfo = DiagramComponentInfo.fromResource(graph, info, child);
+ identifierExcluder.accept(child);
roots.add(new RootSpec(child, cinfo.getTGName(info), true, typeId(graph, L0, indexRootUri, child)));
}
}