1 package org.simantics.interop.update.model;
3 import org.simantics.db.Resource;
4 import org.simantics.db.Statement;
5 import org.simantics.db.WriteGraph;
6 import org.simantics.db.exception.DatabaseException;
7 import org.simantics.interop.test.GraphChanges;
8 import org.simantics.layer0.Layer0;
9 import org.simantics.utils.datastructures.Pair;
11 public class PropertyChange {
12 protected GraphChanges changes;
13 protected Resource leftSubject;
14 protected Resource rightSubject;
15 protected Pair<Statement, Statement> pair;
16 protected boolean applied = false;
17 protected boolean selected = false;
18 protected boolean visible = true;
19 protected boolean enabled = true;
20 protected Object customValue = null;
23 public PropertyChange(GraphChanges changes, Resource left, Statement first, Resource right, Statement second) {
24 if (first == null && second == null)
25 throw new IllegalArgumentException("At least one of the stamenents must be non null.");
26 if (left == null || right == null)
27 throw new IllegalArgumentException("Subject resources cannot be null.");
28 this.pair = new Pair<Statement, Statement>(first, second);
29 this.changes = changes;
30 this.leftSubject = left;
31 this.rightSubject = right;
34 public PropertyChange(GraphChanges changes, Resource left, Resource right, Pair<Statement, Statement> change) {
35 if (change == null || (change.first == null && change.second == null))
36 throw new IllegalArgumentException("At least one of the stamenents must be non null.");
37 if (left == null || right == null)
38 throw new IllegalArgumentException("Subject resources cannot be null.");
40 this.changes = changes;
41 this.leftSubject = left;
42 this.rightSubject = right;
46 public Resource getFirstSubject() {
50 public Statement getFirst() {
54 public Resource getSecondSubject() {
58 public Statement getSecond() {
62 public Resource getPredicate() {
63 if (pair.first != null)
64 return pair.first.getPredicate();
65 return pair.second.getPredicate();
68 public GraphChanges getChanges() {
73 public int hashCode() {
74 return pair.hashCode();
78 public boolean equals(Object obj) {
81 if (obj.getClass() != this.getClass())
83 PropertyChange c = (PropertyChange)obj;
84 return pair.equals(c.pair);
87 public void apply(WriteGraph graph) throws DatabaseException {
90 if (pair.second == null) {
91 graph.deny(leftSubject, pair.first.getPredicate(),pair.first.getObject());
94 Layer0 L0 = Layer0.getInstance(graph);
95 Resource s = leftSubject;
96 if (graph.isInstanceOf(pair.second.getObject(), L0.Literal)) {
98 if (customValue != null)
100 else if (graph.hasValue(pair.second.getObject())) {
101 value = graph.getValue(pair.second.getObject());
103 Resource pred = pair.second.getPredicate();
104 if (getChanges().getComparable().containsRight(pred))
105 pred = getChanges().getComparable().getLeft(pred);
109 graph.claimLiteral(s, pred, value);
113 } else if (graph.isInstanceOf(pair.second.getObject(), L0.SCLValue)) {
114 Resource pred = pair.second.getPredicate();
116 Resource valueResource = graph.newResource();
117 graph.claim(valueResource, L0.InstanceOf, graph.getSingleObject(pair.second.getObject(), L0.InstanceOf));
118 AddDeleteUpdateOp.copyProperties(graph, pair.second.getObject(), valueResource);
119 graph.claim(s, pred, valueResource);
125 * Sets selected state.
127 * @return true if selection state was changed
129 public boolean select(boolean select) {
134 this.selected = select;
139 * Is change selected.
142 public boolean selected() {
147 * Has change been applied
150 public boolean applied() {
158 public boolean isVisible() {
162 public void setVisible(boolean visible) {
163 this.visible = visible;
167 * Is change enabled. Disabled changes do not allow changing selected state.
170 public boolean enabled() {
174 public void setEnabled(boolean enabled) {
175 this.enabled = enabled;
179 public String toString() {
180 String s = "PropertyChange";
181 if (pair.first != null)
182 s += " L(" + (leftSubject) + " , " + pair.first.getPredicate() + " , " + pair.first.getObject() + ")";
183 if (pair.second != null)
184 s += " R(" + (rightSubject) + " , " + pair.second.getPredicate() + " , " + pair.second.getObject() + ")";
196 public Object getCustomValue() {
200 public void setCustomValue(Object customValue) {
201 this.customValue = customValue;