]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphEntityType.java
Added some enforcement of immutability to structural user component UI's.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / GraphEntityType.java
1 package org.simantics.modeling.scl;\r
2 \r
3 import static org.simantics.scl.compiler.elaboration.expressions.Expressions.externalConstant;\r
4 import gnu.trove.map.hash.THashMap;\r
5 \r
6 import org.simantics.databoard.Bindings;\r
7 import org.simantics.db.ReadGraph;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.exception.DatabaseException;\r
10 import org.simantics.layer0.Layer0;\r
11 import org.simantics.scl.compiler.common.names.Name;\r
12 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
13 import org.simantics.scl.compiler.elaboration.expressions.EApply;\r
14 import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
15 import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
16 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
17 import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
18 import org.simantics.scl.compiler.elaboration.java.CheckRelation;\r
19 import org.simantics.scl.compiler.elaboration.query.QAtom;\r
20 import org.simantics.scl.compiler.elaboration.query.QConjunction;\r
21 import org.simantics.scl.compiler.elaboration.query.Query;\r
22 import org.simantics.scl.compiler.elaboration.relations.SCLEntityType;\r
23 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;\r
24 import org.simantics.scl.compiler.types.Types;\r
25 \r
26 public class GraphEntityType implements SCLEntityType {\r
27 \r
28     Resource type;\r
29     THashMap<String, GraphAttribute> attributeMap = new THashMap<String, GraphAttribute>(); \r
30     \r
31     public GraphEntityType(ReadGraph graph, Resource type) throws DatabaseException {\r
32         this.type = type;\r
33         Layer0 L0 = Layer0.getInstance(graph);\r
34         for(Resource stype : graph.getSupertypes(type))\r
35             addSupertype(graph, L0, stype);\r
36         addSupertype(graph, L0, type);\r
37         addRelation(graph, L0, L0.PartOf);\r
38     }\r
39     \r
40     private void addSupertype(ReadGraph graph, Layer0 L0, Resource type) throws DatabaseException {\r
41         for(Resource relation : graph.getObjects(type, L0.DomainOf))\r
42             addRelation(graph, L0, relation);\r
43     }\r
44     \r
45     private void addRelation(ReadGraph graph, Layer0 L0, Resource relation) throws DatabaseException {\r
46         String relationName = (String)graph.getRelatedValue(relation, L0.HasName, Bindings.STRING);\r
47         attributeMap.put(relationName, new GraphAttribute(OntologyModule.createRelation(graph, relation)));\r
48     }\r
49 \r
50     private static final Name DB_isInstanceOf = Name.create("Simantics/DB", "isInstanceOf");\r
51     \r
52     @Override\r
53     public Query generateQuery(TranslationContext context, Variable base,\r
54             AttributeBinding[] attributeBindings) {\r
55         Query[] queries = new Query[attributeBindings.length+1];\r
56         for(int i=0;i<attributeBindings.length;++i) {\r
57             AttributeBinding binding = attributeBindings[i];\r
58             GraphAttribute attribute = (GraphAttribute)binding.attribute;\r
59             SCLRelation relation = attribute.relation;\r
60             queries[i] = new QAtom(relation, new EVariable(base), new EVariable(binding.variable));\r
61         }\r
62         queries[attributeBindings.length] = new QAtom(CheckRelation.INSTANCE,\r
63                 new EApply(\r
64                         new EConstant(context.getEnvironment().getValue(DB_isInstanceOf)),\r
65                         new EVariable(base),\r
66                         externalConstant(type, Types.RESOURCE)));\r
67         return new QConjunction(queries);\r
68     }\r
69 \r
70     @Override\r
71     public Attribute getAttribute(String name) {\r
72         return attributeMap.get(name);\r
73     }\r
74     \r
75     public static class GraphAttribute implements Attribute {\r
76         SCLRelation relation;\r
77         Expression[] evidence;\r
78 \r
79         public GraphAttribute(SCLRelation relation) {\r
80             this.relation = relation;\r
81         }\r
82     }\r
83 \r
84 }\r