]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.model/src/org/simantics/browsing/ui/model/children/ChildContribution.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.model / src / org / simantics / browsing / ui / model / children / ChildContribution.java
1 /*******************************************************************************\r
2  * Copyright (c) 2010, 2011 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.browsing.ui.model.children;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 \r
18 import org.simantics.browsing.ui.BuiltinKeys;\r
19 import org.simantics.browsing.ui.NodeContext;\r
20 import org.simantics.browsing.ui.model.InvalidContribution;\r
21 import org.simantics.browsing.ui.model.nodetypes.NodeType;\r
22 import org.simantics.databoard.Bindings;\r
23 import org.simantics.db.ReadGraph;\r
24 import org.simantics.db.Resource;\r
25 import org.simantics.db.common.utils.NameUtils;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.db.layer0.exception.PendingVariableException;\r
28 import org.simantics.viewpoint.ontology.ViewpointResource;\r
29 \r
30 /**\r
31  * A child contribution adds child nodes to the instances of a specific node type.\r
32  * @author Hannu Niemistö\r
33  */\r
34 public class ChildContribution {\r
35         \r
36         double priority;\r
37         String identifier;\r
38     NodeType parentNodeType;\r
39     NodeType childNodeType;\r
40     ChildRule childRule;\r
41         \r
42     public ChildContribution(String identifier, double priority, NodeType parentNodeType, NodeType childNodeType,\r
43             ChildRule childRule) throws InvalidContribution {\r
44         if(!childRule.isCompatible(\r
45                 parentNodeType.getContentType()\r
46                 ))\r
47             throw new InvalidContribution("Child rule is not compatible with the parent content type.");\r
48         this.parentNodeType = parentNodeType;\r
49         this.childNodeType = childNodeType;\r
50         this.childRule = childRule;\r
51         this.identifier = identifier;\r
52         this.priority = priority;\r
53     }\r
54 \r
55     public static ChildContribution create(ReadGraph g, Resource childContributionResource) throws DatabaseException, InvalidContribution {\r
56         ViewpointResource vr = ViewpointResource.getInstance(g);\r
57         \r
58         Resource parentNodeTypeResource = g.getSingleObject(childContributionResource, vr.ChildContribution_HasParentNodeType);\r
59         NodeType parentNodeType = g.adapt(parentNodeTypeResource, NodeType.class);\r
60         \r
61         Resource childNodeTypeResource = g.getSingleObject(childContributionResource, vr.ChildContribution_HasChildNodeType);\r
62         NodeType childNodeType = g.adapt(childNodeTypeResource, NodeType.class);\r
63         \r
64         Resource childRuleResource = g.getSingleObject(childContributionResource, vr.ChildContribution_HasRule);\r
65         ChildRule childRule = g.adapt(childRuleResource, ChildRule.class);\r
66         \r
67         String identifier = g.getPossibleRelatedValue(childContributionResource, vr.ChildContribution_identifier, Bindings.STRING);\r
68         if(identifier == null) identifier = "";\r
69         if("".equals(identifier)) {\r
70                 identifier = g.getPossibleURI(childContributionResource);\r
71             if(identifier == null) identifier = NameUtils.getSafeName(g, childContributionResource, true);\r
72         }\r
73         \r
74         Double priority = g.getPossibleRelatedValue(childContributionResource, vr.ChildContribution_priority, Bindings.DOUBLE);\r
75         if(priority == null) priority = 0.0;\r
76         \r
77         return new ChildContribution(identifier, priority, parentNodeType, childNodeType, childRule);\r
78         \r
79     }\r
80 \r
81     public NodeType getParentNodeType() {\r
82         return parentNodeType;\r
83     }\r
84     \r
85     public NodeType getChildNodeType() {\r
86         return childNodeType;\r
87     }\r
88     \r
89     public String getIdentifier() {\r
90         return identifier;\r
91     }\r
92 \r
93     public double getPriority() {\r
94         return priority;\r
95     }\r
96     \r
97     /**\r
98      * Given a parent node context returns a child node contexts contributed by\r
99      * this contribution.\r
100      */\r
101     public Collection<NodeContext> getChildren(ReadGraph graph, NodeContext parent) {\r
102         try {\r
103             Object parentContent = parent.getConstant(BuiltinKeys.INPUT);\r
104             Collection<?> childContents = childRule.getChildren(graph, parentContent);\r
105             if(childContents.isEmpty())\r
106                 return Collections.emptyList();\r
107             ArrayList<NodeContext> children = new ArrayList<NodeContext>(childContents.size());\r
108             for(Object childContent : childContents) {\r
109                 NodeContext child = childNodeType.createNodeContext(graph, childContent);\r
110                 if(child != null)\r
111                     children.add(child);\r
112             }\r
113             return children;\r
114         } catch(PendingVariableException e) {\r
115             return Collections.emptyList();\r
116         } catch(DatabaseException e) {\r
117             e.printStackTrace();\r
118             // TODO return some kind of error node\r
119             return Collections.emptyList();\r
120         }\r
121     }\r
122     \r
123     /**\r
124      * Given a child node context returns a collection of possible parent node contexts.\r
125      */\r
126     public Collection<NodeContext> getParents(ReadGraph graph, NodeContext child) {\r
127         try {\r
128             Object childContent = child.getConstant(BuiltinKeys.INPUT);\r
129             Collection<?> parentContents = childRule.getParents(graph, childContent);\r
130             if(parentContents.isEmpty())\r
131                 return Collections.emptyList();\r
132             ArrayList<NodeContext> parents = new ArrayList<NodeContext>(parentContents.size());\r
133             for(Object parentContent : parentContents) {\r
134                 NodeContext parent = parentNodeType.createNodeContext(graph, parentContent);\r
135                 if(parent != null)\r
136                     parents.add(parent);\r
137             }\r
138             return parents;\r
139         } catch(DatabaseException e) {\r
140             e.printStackTrace();\r
141             return Collections.emptyList();\r
142         }\r
143     }\r
144 \r
145     public boolean hasChildren(ReadGraph graph, NodeContext parent) {\r
146         try {\r
147             Object parentContent = parent.getConstant(BuiltinKeys.INPUT);\r
148             Collection<?> childContents = childRule.getChildren(graph, parentContent);\r
149             if(childContents.isEmpty())\r
150                 return false;\r
151             for(Object childContent : childContents) {\r
152                 NodeContext child = childNodeType.createNodeContext(graph, childContent);\r
153                 if(child != null)\r
154                     return true;\r
155             }\r
156         } catch(DatabaseException e) {\r
157             e.printStackTrace();\r
158         }\r
159         return false;\r
160     }\r
161     \r
162     @Override\r
163     public String toString() {\r
164         return identifier;\r
165     }\r
166     \r
167 }\r