]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.objmap2/src/org/simantics/objmap/structural/StructuralResource.java
20e9230bb1812f8e5d1503dbf85447eaa9e95b85
[simantics/3d.git] / org.simantics.objmap2 / src / org / simantics / objmap / structural / StructuralResource.java
1 package org.simantics.objmap.structural;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\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.layer0.Layer0;\r
10 \r
11 /**\r
12  * An object representing structural Resource.\r
13  * \r
14  * \r
15  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
16  *\r
17  */\r
18 public class StructuralResource  {\r
19 \r
20         private Resource resource;\r
21         private List<Resource> context = new ArrayList<Resource>(1);\r
22         \r
23         private Resource typeResource = null;\r
24         \r
25         public StructuralResource(Resource resource) {\r
26                 assert(resource != null);\r
27                 this.resource = resource;\r
28         }\r
29         public StructuralResource(ReadGraph g, Resource resource, Resource context) throws DatabaseException {\r
30                 assert(resource != null);\r
31                 this.resource = resource;\r
32                 this.context.add(context);\r
33                 resolveType(g);\r
34         }\r
35         \r
36         public StructuralResource(ReadGraph g, Resource resource, Resource... context) throws DatabaseException {\r
37                 assert(resource != null);\r
38                 this.resource = resource;\r
39                 for (Resource r : context)\r
40                         this.context.add(r);\r
41                 resolveType(g);\r
42         }\r
43         \r
44         public StructuralResource(ReadGraph g, Resource resource, List<Resource> context) throws DatabaseException {\r
45                 assert(resource != null);\r
46                 this.resource = resource;\r
47                 for (Resource r : context)\r
48                         this.context.add(r);\r
49                 resolveType(g); \r
50         }\r
51         public StructuralResource(ReadGraph g, Resource resource, List<Resource> context, Resource context2) throws DatabaseException {\r
52                 assert(resource != null);\r
53                 this.resource = resource;\r
54                 for (Resource r : context)\r
55                         this.context.add(r);\r
56                 this.context.add(context2);\r
57                 resolveType(g);\r
58         }\r
59         \r
60         private void resolveType(ReadGraph g) throws DatabaseException {\r
61                 if (this.context.contains(resource)) {\r
62                         Layer0 l0 = Layer0.getInstance(g);\r
63                         typeResource = g.getSingleObject(resource, l0.InstanceOf);\r
64                 } \r
65         }\r
66         \r
67         \r
68         /**\r
69          * The Resource in the DB.\r
70          * @return\r
71          */\r
72         public Resource getResource() {\r
73                 return resource;\r
74         }\r
75         \r
76         /**\r
77          * Context in which this resource is accessed. Each context resource represents a structural model instance. \r
78          * @return\r
79          */\r
80         public List<Resource> getContext() {\r
81                 return context;\r
82         }\r
83         \r
84         /**\r
85          * If the resource is structural model instance, this returns the type Resource. Otherwise returns null.\r
86          * @return\r
87          */\r
88         public Resource getTypeResource() {\r
89                 return typeResource;\r
90         }\r
91         \r
92         /**\r
93          * Returns true, if the resource is structural, \r
94          * @return\r
95          */\r
96         public boolean isStructural() {\r
97                 return context.size() > 0;\r
98         }\r
99         \r
100         /**\r
101          * Returns true is the Resource is root of Structural Model instance.\r
102          * In this case the resource instance is editable.\r
103          * \r
104          * @return\r
105          */\r
106         public boolean isStructuralRoot() {\r
107                 return (context.size() == 1 && context.get(0).equals(resource));\r
108         }\r
109         \r
110         /**\r
111          * Returns true,  the resource is structural model instance.\r
112          * @return\r
113          */\r
114         public boolean isStructuralInstance() {\r
115                 return typeResource != null;\r
116         }\r
117         \r
118         @Override\r
119         public int hashCode() {\r
120                 int hashCode = resource.hashCode();\r
121                 for (Resource ctx : context)\r
122                         hashCode += ctx.hashCode();\r
123                 return hashCode;\r
124         }\r
125         \r
126         @Override\r
127         public boolean equals(Object obj) {\r
128                 if (obj == this)\r
129                         return true;\r
130                 if (obj == null)\r
131                         return false;\r
132                 if (obj.getClass() != getClass())\r
133                         return false;\r
134                 StructuralResource other = (StructuralResource)obj;\r
135                 if (!resource.equals(other.resource))\r
136                         return false;\r
137                 if (context.size() != other.context.size())\r
138                         return false;\r
139                 for (int i = 0; i < context.size(); i++) {\r
140                         if (!context.get(i).equals(other.context.get(i)))\r
141                                 return false;\r
142                 }\r
143                 return true;\r
144         }\r
145         \r
146         @Override\r
147         public String toString() {\r
148                 String s = "Res: " + resource + " Context:";\r
149                 for (Resource ctx : context) \r
150                         s+= " "+ ctx;\r
151                 if (typeResource != null)\r
152                         s+= " Type: " + typeResource;\r
153                 return s;\r
154         }\r
155 \r
156 }\r