1 package org.simantics.interop.update.model;
3 import java.util.ArrayList;
4 import java.util.HashMap;
7 import java.util.Stack;
9 import org.simantics.db.ReadGraph;
10 import org.simantics.db.Resource;
11 import org.simantics.db.Session;
12 import org.simantics.db.Statement;
13 import org.simantics.db.WriteGraph;
14 import org.simantics.db.common.request.ReadRequest;
15 import org.simantics.db.exception.DatabaseException;
16 import org.simantics.interop.test.GraphChanges;
20 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
23 public abstract class UpdateOperations {
25 private List<UpdateOp> operations = new ArrayList<UpdateOp>();
26 private Map<Resource, UpdateOp> resourceMap = new HashMap<Resource, UpdateOp>();
27 private Map<Statement, UpdateOp> statementMap = new HashMap<Statement, UpdateOp>();
28 private GraphChanges changes;
30 public UpdateOperations(GraphChanges changes) {
31 this.changes = changes;
34 public UpdateOp getUpdateOp(Resource r) {
35 return resourceMap.get(r);
38 public UpdateOp getUpdateOp(Statement s) {
39 return statementMap.get(s);
42 public void applyAll(WriteGraph g) throws DatabaseException {
43 for (UpdateOp op : operations) {
48 public void applySelected(WriteGraph g) throws DatabaseException {
49 for (UpdateOp op : operations) {
55 public List<UpdateOp> getOperations() {
59 public GraphChanges getChanges() {
63 public Map<Resource, UpdateOp> getResourceMap() {
67 public Map<Statement, UpdateOp> getStatementMap() {
71 private void apply(WriteGraph g, UpdateOp op) throws DatabaseException {
72 Stack<UpdateOp> stack = new Stack<UpdateOp>();
76 private void _apply(WriteGraph g, Stack<UpdateOp> stack, UpdateOp op) throws DatabaseException {
79 if (stack.contains(op)) {
84 for (UpdateOp pop : op.getParentOps())
85 if (op.requiresOp(pop)) {
87 _apply(g, stack, pop);
89 for (UpdateOp sop : op.getSubOps())
90 if (op.requiresOp(sop)) {
92 _apply(g, stack, sop);
98 protected List<UpdateOp> getOps() {
99 List<UpdateOp> list = new ArrayList<UpdateOp>(operations.size());
100 list.addAll(operations);
104 protected void addOp(Resource r, UpdateOp op) {
105 resourceMap.put(r, op);
109 protected void addOp(Statement s, UpdateOp op) {
110 statementMap.put(s, op);
114 protected void replaceOp(Resource r, UpdateOp op) {
115 UpdateOp oldOp = resourceMap.remove(r);
117 operations.remove(oldOp);
119 resourceMap.put(r, op);
123 protected UpdateOp getOP(Resource r) {
124 return resourceMap.get(r);
127 protected UpdateOp getOP(Statement r) {
128 return statementMap.get(r);
131 public abstract void populate(ReadGraph g) throws DatabaseException;
134 * Secondary populate method. Override this for chunked DB operations.
136 * @throws DatabaseException
138 public void populate(Session session) throws DatabaseException {
139 session.syncRequest(new ReadRequest() {
142 public void run(ReadGraph graph) throws DatabaseException {
148 protected boolean compares(Resource r1, Resource r2) {
151 if (changes.getComparable().contains(r1, r2))