1 package org.simantics.modeling;
\r
3 import org.simantics.databoard.Bindings;
\r
4 import org.simantics.db.Resource;
\r
5 import org.simantics.db.WriteGraph;
\r
6 import org.simantics.db.common.CommentMetadata;
\r
7 import org.simantics.db.common.request.PossibleIndexRoot;
\r
8 import org.simantics.db.common.utils.CommonDBUtils;
\r
9 import org.simantics.db.common.utils.NameUtils;
\r
10 import org.simantics.db.exception.DatabaseException;
\r
11 import org.simantics.db.layer0.request.InstantiateRequest;
\r
12 import org.simantics.diagram.stubs.DiagramResource;
\r
13 import org.simantics.layer0.Layer0;
\r
14 import org.simantics.operation.Layer0X;
\r
15 import org.simantics.structural.stubs.StructuralResource2;
\r
17 public class NewComponentType {
\r
19 public static Resource createComponentType(WriteGraph graph, Resource library) throws DatabaseException {
\r
21 ModelingResources MOD = ModelingResources.getInstance(graph);
\r
22 Layer0 L0 = Layer0.getInstance(graph);
\r
23 Layer0X L0X = Layer0X.getInstance(graph);
\r
24 StructuralResource2 STR = StructuralResource2.getInstance(graph);
\r
25 DiagramResource DIA = DiagramResource.getInstance(graph);
\r
27 // New component type
\r
28 CommonDBUtils.selectClusterSet(graph, library);
\r
29 Resource componentType = graph.newResource();
\r
30 graph.newClusterSet(componentType);
\r
31 CommonDBUtils.selectClusterSet(graph, componentType);
\r
33 graph.claim(componentType, L0.PartOf, library);
\r
35 Resource indexRoot = graph.sync(new PossibleIndexRoot(library));
\r
38 Resource supertype = graph.getSingleObject(indexRoot, MOD.StructuralModel_HasComponentTypeSupertype);
\r
39 graph.claim(componentType, L0.Inherits, null, supertype);
\r
42 String defaultName = graph.getRelatedValue(indexRoot, MOD.StructuralModel_HasDefaultComponentTypeName, Bindings.STRING);
\r
43 String name = NameUtils.findFreshName(graph, defaultName, library);
\r
44 graph.claimLiteral(componentType, L0.HasName, name + "@1");
\r
45 graph.claimLiteral(componentType, L0X.HasGeneratedNamePrefix, "");
\r
48 Resource substructureType = graph.getSingleObject(indexRoot, MOD.StructuralModel_HasComponentTypeSubstructureType);
\r
49 Resource composite = new InstantiateRequest(substructureType).perform(graph);
\r
50 graph.claim(componentType, STR.IsDefinedBy, composite);
\r
51 // These are added to give the configuration a proper URI.
\r
52 graph.claimLiteral(composite, L0.HasName, "Configuration");
\r
53 graph.claim(componentType, L0.ConsistsOf, composite);
\r
55 // Attach trigger to keep component type interface structures up-to-date
\r
56 Resource diagram = graph.getPossibleObject(composite, MOD.CompositeToDiagram);
\r
57 if (diagram != null) {
\r
58 Resource componentTypeUpdater = graph.newResource();
\r
59 graph.claim(componentTypeUpdater, L0.InstanceOf, null, MOD.ComponentTypeUpdater);
\r
60 graph.claim(diagram, L0X.HasTrigger, componentTypeUpdater);
\r
63 Resource symbolDiagramType = graph.getPossibleObject(indexRoot, MOD.StructuralModel_HasSymbolDiagramType);
\r
64 if(symbolDiagramType == null) symbolDiagramType = DIA.Composite;
\r
67 Resource symbol = new ModelingUtils(graph).createSymbol2("Symbol", symbolDiagramType);
\r
68 graph.claim(componentType, MOD.ComponentTypeToSymbol, symbol);
\r
69 graph.claim(componentType, L0.ConsistsOf, symbol);
\r
71 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
\r
72 graph.addMetadata(cm.add("Created new user component " + name + ", resource " + componentType));
\r
74 return componentType;
\r