]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java
Allow copying enumerated properties.
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / model / AddDeleteUpdateOp.java
1 package org.simantics.interop.update.model;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.List;
6
7 import org.simantics.db.Resource;
8 import org.simantics.db.Statement;
9 import org.simantics.db.WriteGraph;
10 import org.simantics.db.common.utils.ListUtils;
11 import org.simantics.db.common.utils.NameUtils;
12 import org.simantics.db.exception.DatabaseException;
13 import org.simantics.interop.test.GraphChanges;
14 import org.simantics.issues.common.IssueUtils;
15 import org.simantics.issues.ontology.IssueResource;
16 import org.simantics.layer0.Layer0;
17
18 public abstract class AddDeleteUpdateOp extends UpdateOp {
19         
20         protected boolean add;
21
22         
23         public AddDeleteUpdateOp(GraphChanges changes) {
24                 super(changes);
25         }
26         
27         public AddDeleteUpdateOp(boolean add, GraphChanges changes) {
28                 super(changes);
29                 this.add = add;
30         }
31         
32         @Override
33         public boolean isAdd() {
34                 return add;
35         }
36         
37         @Override
38         public boolean isDelete() {
39                 return !add;
40         }
41         
42         @Override
43         public boolean requiresOp(UpdateOp op) {
44             if (add) {
45                 if (getParentOps().contains(op) && op.isAdd())
46                     return true;
47             } else {
48                 if (getSubOps().contains(op) && op.isDelete())
49                 return true;
50             }
51             return false;
52         }
53         
54         @Override
55         public boolean selectOp(UpdateOp op, boolean select) {
56             if (select) {
57                 return requiresOp(op);
58             } else {
59                 return op.requiresOp(this);
60             }
61         }
62
63         public static void copyProperties(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
64                 Layer0 l0 = Layer0.getInstance(g);
65                 for (Statement s : g.getStatements(source, l0.HasProperty)) {
66                         if (s.isAsserted(source))
67                                 continue;
68                         if (g.isInstanceOf(s.getObject(), l0.Literal)) {
69                                 Object value = g.getPossibleValue(s.getObject());
70                                 System.out.println(NameUtils.getSafeName(g, s.getSubject()) + " " + NameUtils.getSafeName(g, s.getPredicate()) + " " + NameUtils.getSafeName(g, s.getObject()) + " " + value);
71                                 if (value != null) {
72                                         Statement valueStm = g.getPossibleStatement(destination, s.getPredicate());
73                                         Resource valueResource = null;
74                                         if (valueStm != null && !valueStm.isAsserted(destination))
75                                                 valueResource = valueStm.getObject();
76                                         if (valueResource == null) {
77                                                 valueResource = g.newResource();
78                                                 g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
79                                                 g.claim(destination, s.getPredicate(), valueResource);
80                                         }
81                                         g.claimValue(valueResource, value);
82                                         //g.claimLiteral(destination, s.getPredicate(), value);
83                                 }
84                         } else if (g.isInstanceOf(s.getObject(), l0.SCLValue)) {
85                                 Resource valueResource = g.newResource();
86                                 g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
87                                 g.claim(destination, s.getPredicate(), valueResource);
88                                 copyProperties(g, s.getObject(), valueResource);
89                         } else {
90                                 Resource type = g.getPossibleType(s.getObject(), l0.Value);
91                                 if (type != null && g.hasStatement(type, l0.Enumeration, type)) {
92                                         g.deny(destination, s.getPredicate());
93                                         g.claim(destination, s.getPredicate(), s.getObject());
94                                 } else {
95                                         throw new DatabaseException("Expected to copy property resource " + s.getObject());
96                                 }
97                         }
98                 }
99         }
100         
101         public static void copyTags(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
102                 Layer0 L0 = Layer0.getInstance(g);
103                 for (Statement s : g.getStatements(source, L0.IsWeaklyRelatedTo)) {
104                         if (s.getObject().equals(source)) {
105                                 g.claim(destination, s.getPredicate(), destination);
106                         }
107                 }
108         }
109         
110         public static void copyTypes(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
111                 Layer0 L0 = Layer0.getInstance(g);
112                 for (Resource r : g.getObjects(source, L0.InstanceOf))
113                         g.claim(destination, L0.InstanceOf, r);
114                 for (Resource r : g.getObjects(source, L0.Inherits))
115                         g.claim(destination, L0.Inherits, r);
116                 for (Resource r : g.getObjects(source, L0.SubrelationOf))
117                         g.claim(destination, L0.SubrelationOf, r);
118         }
119         
120         protected void copyIssues(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
121                 Layer0 l0 = Layer0.getInstance(g);
122                 IssueResource ir = IssueResource.getInstance(g);
123                 Collection<Resource> issues = g.getObjects(source, ir.Issue_HasContext_Inverse);
124                 for (Resource issue : issues) {
125                         String label = g.getRelatedValue(issue, l0.HasLabel);
126                         Resource severity = g.getSingleObject(issue, ir.Issue_HasSeverity);
127                         List<Resource> sourceContexts = ListUtils.toList(g, g.getSingleObject(issue, ir.Issue_HasContexts));
128                         List<Resource> destinationContext = new ArrayList<Resource>(sourceContexts.size());
129                         // map context resources
130                         for (Resource r : sourceContexts) {
131                                 if (r.equals(source))
132                                         destinationContext.add(destination);
133                                 else {
134                                         if (getChanges().getComparable().containsLeft(r))
135                                                 destinationContext.add(getChanges().getComparable().getRight(r));
136                                         else
137                                                 destinationContext.add(r);
138                                 }
139                         }
140                         
141                         IssueUtils.newUserIssue(g, label, severity, destinationContext);
142                 }
143         }
144 }