]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.interop.update/src/org/simantics/interop/update/model/AddDeleteUpdateOp.java
Base classes for model updates
[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         boolean add;
21         
22         public AddDeleteUpdateOp(GraphChanges changes) {
23                 super(changes);
24         }
25         
26         @Override
27         public boolean isAdd() {
28                 return add;
29         }
30         
31         @Override
32         public boolean isDelete() {
33                 return !add;
34         }
35         
36         @Override
37         public boolean requiresParentOps() {
38                 return add;
39         }
40
41         @Override
42         public boolean requiresSubOps() {
43                 return !add;
44         }
45
46         protected static void copyProperties(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
47                 Layer0 l0 = Layer0.getInstance(g);
48                 for (Statement s : g.getStatements(source, l0.HasProperty)) {
49                         if (s.isAsserted(source))
50                                 continue;
51                         Object value = g.getPossibleValue(s.getObject());
52                         System.out.println(NameUtils.getSafeName(g, s.getSubject()) + " " + NameUtils.getSafeName(g, s.getPredicate()) + " " + NameUtils.getSafeName(g, s.getObject()) + " " + value);
53                         if (value != null) {
54                                 Statement valueStm = g.getPossibleStatement(destination, s.getPredicate());
55                                 Resource valueResource = null;
56                                 if (valueStm != null && !valueStm.isAsserted(destination))
57                                         valueResource = valueStm.getObject();
58                                 if (valueResource == null) {
59                                         valueResource = g.newResource();
60                                         g.claim(valueResource, l0.InstanceOf, g.getSingleObject(s.getObject(), l0.InstanceOf));
61                                         g.claim(destination, s.getPredicate(), valueResource);
62                                 }
63                                 g.claimValue(valueResource, value);
64                                 //g.claimLiteral(destination, s.getPredicate(), value);
65                         }
66                 }
67         }
68         
69         protected void copyIssues(WriteGraph g, Resource source, Resource destination) throws DatabaseException {
70                 Layer0 l0 = Layer0.getInstance(g);
71                 IssueResource ir = IssueResource.getInstance(g);
72                 Collection<Resource> issues = g.getObjects(source, ir.Issue_HasContext_Inverse);
73                 for (Resource issue : issues) {
74                         String label = g.getRelatedValue(issue, l0.HasLabel);
75                         Resource severity = g.getSingleObject(issue, ir.Issue_HasSeverity);
76                         List<Resource> sourceContexts = ListUtils.toList(g, g.getSingleObject(issue, ir.Issue_HasContexts));
77                         List<Resource> destinationContext = new ArrayList<Resource>(sourceContexts.size());
78                         // map context resources
79                         for (Resource r : sourceContexts) {
80                                 if (r.equals(source))
81                                         destinationContext.add(destination);
82                                 else {
83                                         if (getChanges().getComparable().containsLeft(r))
84                                                 destinationContext.add(getChanges().getComparable().getRight(r));
85                                         else
86                                                 destinationContext.add(r);
87                                 }
88                         }
89                         
90                         IssueUtils.newUserIssue(g, label, severity, destinationContext);
91                 }
92         }
93 }