]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/ge/ObjectChildRule.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / ge / ObjectChildRule.java
1 package org.simantics.document.linking.ge;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 \r
6 import org.simantics.db.ReadGraph;\r
7 import org.simantics.db.Resource;\r
8 import org.simantics.db.exception.DatabaseException;\r
9 import org.simantics.db.layer0.variable.StandardGraphChildVariable;\r
10 import org.simantics.db.layer0.variable.Variable;\r
11 import org.simantics.document.linking.ontology.DocumentLink;\r
12 import org.simantics.document.linking.utils.SourceLinkUtil;\r
13 \r
14 /**\r
15  * A rule for browsing document links of an object. Properties are not included.\r
16  * \r
17  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
18  *\r
19  */\r
20 public class ObjectChildRule implements org.simantics.browsing.ui.model.children.ChildRule{\r
21         \r
22         private boolean showOnlyCheckable = false;\r
23         \r
24         @Override\r
25         public boolean isCompatible(Class<?> contentType) {\r
26                 return contentType.equals(Resource.class) || contentType.equals(Variable.class);\r
27         }\r
28         \r
29         public void setShowOnlyCheckable(boolean showOnlyCheckable) {\r
30                 this.showOnlyCheckable = showOnlyCheckable;\r
31         }\r
32         \r
33         @Override\r
34         public Collection<?> getChildren(ReadGraph graph, Object obj)\r
35                         throws DatabaseException {\r
36 \r
37                 ArrayList<Variable> children = new ArrayList<Variable>();\r
38                 \r
39 \r
40                 Resource resource = null;\r
41                 Variable variable = null;\r
42                 if (obj instanceof Resource) {\r
43                         resource = (Resource)obj;\r
44                         try {\r
45                                 variable = graph.adapt(resource, Variable.class);\r
46                         } catch (Throwable t) {\r
47                                 return children;\r
48                         }\r
49                         children.add(new StandardGraphChildVariable(variable, null, resource));\r
50                         return children;\r
51                 } else {\r
52                         variable = (Variable)obj;\r
53                         resource = variable.getPossibleRepresents(graph);\r
54                 }\r
55                 \r
56         \r
57                 DocumentLink sl = DocumentLink.getInstance(graph);\r
58                 if (graph.isInstanceOf(resource, sl.Source))\r
59                         return children;\r
60                 \r
61                 \r
62                 //find sources declared on parentResource using consernsRelation\r
63                 Variable parentVariable = variable.getParent(graph);\r
64                 Resource parentRes = null;\r
65                 Resource relation = null;\r
66                 if (parentVariable != null) {\r
67                         parentRes = parentVariable.getPossibleRepresents(graph);\r
68                         relation = variable.getPossiblePredicateResource(graph);\r
69                 }\r
70                 \r
71                 if (parentRes != null && relation != null) {\r
72                         Collection<Resource> sources = graph.getObjects(parentRes, sl.hasSource);\r
73                         for (Resource source : sources) {\r
74                                 Resource rel = graph.getPossibleObject(source, sl.consernsRelation);\r
75                                 if (rel != null && rel.equals(relation)) {\r
76                                         if (showOnlyCheckable && \r
77                                                 (SourceLinkUtil.isValidSource(graph, source) &&\r
78                                                  SourceLinkUtil.isUpToDateSource(graph, source)))\r
79                                                 continue;\r
80                                         children.add(new StandardGraphChildVariable(variable, null, source));\r
81                                 }\r
82                         }\r
83                 }\r
84                 //find sources declared on this resource, ie. sources that do not have consernsRelation.\r
85                 Collection<Resource> sources = graph.getObjects(resource, sl.hasSource);\r
86                 for (Resource source : sources) {\r
87                         Resource rel = graph.getPossibleObject(source, sl.consernsRelation);\r
88                         if (rel == null) {\r
89                                 if (showOnlyCheckable && \r
90                                    (SourceLinkUtil.isValidSource(graph, source) &&\r
91                                     SourceLinkUtil.isUpToDateSource(graph, source)))\r
92                                         continue;\r
93                                 children.add(new StandardGraphChildVariable(variable, null, source));\r
94                         }\r
95                 }\r
96                 while (children.remove(variable)) {\r
97                         \r
98                 }\r
99                 \r
100 \r
101                 return children;\r
102         }\r
103         \r
104         @Override\r
105         public Collection<?> getParents(ReadGraph graph, Object child)\r
106                         throws DatabaseException {\r
107                 return new ArrayList<Resource>();\r
108         }\r
109 \r
110 }\r