package org.simantics.g3d.scl;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Deque;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
*
* @param <E>
*/
-public abstract class ScriptNodeMap<E extends INode> implements NodeMap<Object,E>, IMappingListener, NodeListener {
+public abstract class ScriptNodeMap<DBObject,E extends INode> implements NodeMap<DBObject,Object,E>, IMappingListener, NodeListener {
private static final boolean DEBUG = false;
protected Session session;
- protected IMapping<Object,E> mapping;
+ protected IMapping<DBObject,INode> mapping;
protected ParentNode<E> rootNode;
private boolean dirty = false;
- public ScriptNodeMap(Session session, IMapping<Object,E> mapping, ParentNode<E> rootNode) {
+ public ScriptNodeMap(Session session, IMapping<DBObject,INode> mapping, ParentNode<E> rootNode) {
this.session = session;
this.mapping = mapping;
this.rootNode = rootNode;
return Collections.EMPTY_LIST;
}
- @SuppressWarnings("unchecked")
@Override
public ParentNode<E> getRootNode() {
- return (ParentNode<E>)rootNode;
+ return rootNode;
}
private boolean rangeModified = false;
- @SuppressWarnings("unchecked")
@Override
public void updateRenderObjectsFor(E node) {
- nodes.add((E)node);
-
+ nodes.add(node);
}
@SuppressWarnings("unchecked")
repaint();
}
- @SuppressWarnings("unchecked")
private void receiveUpdate(E node, String id, boolean db) {
if (DEBUG) System.out.println("receiveUpdate " + debugString(node) + " " + id + " " + db);
synchronized (syncMutex) {
synchronized (syncMutex) {
graphUpdates = true;
mapping.getRangeModified().clear();
- for (Object o : mapping.getDomain())
+ for (DBObject o : mapping.getDomain())
mapping.domainModified(o);
mapping.updateRange(graph);
graphModified.clear();
if (DEBUG) System.out.println("Graph update start");
synchronized (syncMutex) {
graphUpdates = true;
- for (Object domainObject : mapping.getDomainModified()) {
- E rangeObject = mapping.get(domainObject);
+ for (DBObject domainObject : mapping.getDomainModified()) {
+ @SuppressWarnings("unchecked")
+ E rangeObject = (E) mapping.get(domainObject);
if (rangeObject != null)
graphModified.add(rangeObject);
}
doCommit();
}
session.syncRequest(new ReadRequest() {
- @SuppressWarnings("unchecked")
@Override
public void run(ReadGraph graph) throws DatabaseException {
update(graph);
* This code here synchronizes removed and added objects to collect deletable objects. (a deletable object is one which is removed but not added).
*
*/
+ @SuppressWarnings("unused")
protected void syncDeletes() {
deleteUC.clear();
for (Pair<E, String> n : removed) {
/**
* Clears deletable objects from mapping cache.
*/
+ @SuppressWarnings("unused")
protected void clearDeletes() {
if (DEBUG && delete.size() > 0) System.out.println("Delete");
for (E n : delete) {
synchronized (syncMutex) {
+ // Check for overlapping additions and deletions, prevent deleting objects that are also added.
+ Deque<E> stack = new ArrayDeque<E>();
+ for (Pair<E, String> n : added) {
+ stack.add(n.first);
+ }
+ while (!stack.isEmpty()) {
+ E n = stack.pop();
+ for (int i = removed.size()-1; i >= 0; i--) {
+ if (removed.get(i).first == n) {
+ removed.remove(i);
+ break;
+ }
+ }
+ if (n instanceof ParentNode) {
+ ParentNode<INode> pn = (ParentNode<INode>)n;
+ for (INode cn : pn.getNodes()) {
+ stack.push((E)cn);
+ }
+ }
+ }
+
rem.addAll(removed);
add.addAll(added);
for (E e : updated.getKeys()) {
}
- public IMapping<Object,E> getMapping() {
+ @Override
+ public IMapping<DBObject,INode> getMapping() {
return mapping;
}