]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/issue/StandardIssue.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / issue / StandardIssue.java
1 package org.simantics.db.common.issue;\r
2 \r
3 import java.text.DateFormat;\r
4 import java.text.SimpleDateFormat;\r
5 import java.util.Arrays;\r
6 import java.util.Calendar;\r
7 import java.util.Collection;\r
8 import java.util.HashSet;\r
9 import java.util.Set;\r
10 import java.util.UUID;\r
11 \r
12 import org.simantics.databoard.Bindings;\r
13 import org.simantics.databoard.util.ObjectUtils;\r
14 import org.simantics.db.Issue;\r
15 import org.simantics.db.Resource;\r
16 import org.simantics.db.WriteGraph;\r
17 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
18 import org.simantics.db.common.request.IndexRoot;\r
19 import org.simantics.db.common.utils.ListUtils;\r
20 import org.simantics.db.exception.DatabaseException;\r
21 import org.simantics.issues.ontology.IssueResource;\r
22 import org.simantics.layer0.Layer0;\r
23 \r
24 public class StandardIssue implements Issue {\r
25 \r
26         public final Resource type;\r
27         public final Resource[] contexts;\r
28         public final int hash;\r
29 \r
30         public StandardIssue(Resource type, Resource ... contexts) {\r
31                 this.type = type;\r
32                 this.contexts = contexts;\r
33                 this.hash = makeHashCode();\r
34         }\r
35 \r
36         public StandardIssue(Resource type, Collection<Resource> contexts) {\r
37                 this.type = type;\r
38                 this.contexts = contexts.toArray(new Resource[contexts.size()]);\r
39                 this.hash = makeHashCode();\r
40         }\r
41 \r
42         public void writeAdditionalContext(WriteGraph graph, Resource issue) throws DatabaseException {\r
43 \r
44                 IssueResource IR = IssueResource.getInstance(graph);\r
45 \r
46                 // The main context\r
47                 graph.claim(issue, IR.Issue_HasContext, IR.Issue_HasContext_Inverse, contexts[0]);\r
48                 // A possible parent\r
49                 Layer0 L0 = Layer0.getInstance(graph);\r
50                 Resource parent = graph.getPossibleObject(contexts[0], L0.PartOf);\r
51                 if(parent != null) {\r
52                         graph.claim(issue, IR.Issue_HasContext, IR.Issue_HasContext_Inverse, parent);\r
53                 }\r
54 \r
55         }\r
56 \r
57         @Override\r
58         public Resource write(WriteGraph graph, Resource source) throws DatabaseException {\r
59 \r
60                 Layer0 L0 = Layer0.getInstance(graph);\r
61                 IssueResource IR = IssueResource.getInstance(graph);\r
62 \r
63                 Resource model = graph.syncRequest(new IndexRoot(source), TransientCacheListener.<Resource>instance());\r
64 \r
65                 Resource issue = graph.newResource();\r
66                 graph.claim(issue, L0.InstanceOf, null, type);\r
67                 graph.addLiteral(issue, L0.HasName, L0.NameOf, L0.String, UUID.randomUUID().toString(), Bindings.STRING);\r
68 \r
69                 graph.claim(issue, IR.Issue_HasContexts, IR.Issue_HasContexts_Inverse, ListUtils.create(graph, L0.List, contexts));\r
70 \r
71                 writeAdditionalContext(graph, issue);\r
72 \r
73                 DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");\r
74                 String created = format.format(Calendar.getInstance().getTime());\r
75                 graph.addLiteral(issue, IR.Issue_creationTime, IR.Issue_creationTime_Inverse, L0.String, created, Bindings.STRING);\r
76                 graph.claim(source, IR.IssueSource_Manages, IR.IssueSource_Manages_Inverse, issue);\r
77                 graph.claim(model, L0.ConsistsOf, L0.PartOf, issue);\r
78                 \r
79                 return issue;\r
80 \r
81         }\r
82 \r
83         @Override\r
84         public String toString() {\r
85                 return Arrays.toString(contexts);\r
86         }\r
87 \r
88         @Override\r
89         public Resource getType() {\r
90                 return type;\r
91         }\r
92 \r
93         @Override\r
94         public Object getMainContext() {\r
95                 return contexts[0];\r
96         }\r
97 \r
98         @Override\r
99         public Set<Resource> getContexts() {\r
100                 HashSet<Resource> result = new HashSet<Resource>();\r
101                 for(Resource context : contexts) result.add(context);\r
102                 return result;\r
103         }\r
104 \r
105         private int makeHashCode() {\r
106                 return type.hashCode() ^ Arrays.hashCode(contexts);\r
107         }\r
108 \r
109         @Override\r
110         public int hashCode() {\r
111                 return hash;\r
112         }\r
113 \r
114         @Override\r
115         public boolean equals(Object obj) {\r
116                 if(this == obj) return true;\r
117                 if(!(obj instanceof StandardIssue)) return false;\r
118                 StandardIssue other = (StandardIssue)obj;\r
119                 if(!ObjectUtils.objectEquals(type, other.type)) return false;\r
120                 if(!Arrays.equals(contexts, other.contexts)) return false;\r
121                 return true;\r
122         }\r
123 \r
124 }\r