import org.simantics.db.Session;
import org.simantics.db.UndoContext;
import org.simantics.db.WriteGraph;
-import org.simantics.db.common.request.ReadRequest;
+import org.simantics.db.common.request.UniqueRead;
import org.simantics.db.common.request.WriteRequest;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.layer0.util.Layer0Utils;
+import org.simantics.db.procedure.SyncProcedure;
import org.simantics.db.service.UndoRedoSupport;
import org.simantics.g3d.ontology.G3D;
import org.simantics.g3d.scenegraph.RenderListener;
if (graphUpdates)
return;
if (DEBUG)System.out.println("domainModified");
- session.asyncRequest(new ReadRequest() {
-
+ session.asyncRequest(new UniqueRead<Object>() {
+ @Override
+ public Object perform(ReadGraph graph) throws DatabaseException {
+ return new Object();
+ }
+ }, new SyncProcedure<Object>() {
@Override
- public void run(ReadGraph graph) throws DatabaseException {
+ public void execute(ReadGraph graph, Object result) throws DatabaseException {
+ // Perform all updates to the model in a single query thread
update(graph);
+ };
+
+ @Override
+ public void exception(ReadGraph graph, Throwable throwable) throws DatabaseException {
+ LOGGER.error("Failed to update pipeline changes" + throwable);
}
});
-
}
protected void reset(ReadGraph graph) throws MappingException {
private boolean useFullSyncWithUndo = false;
protected void update(ReadGraph graph) throws DatabaseException {
- synchronized (syncMutex) {
- if (DEBUG) System.out.println("Graph update start");
-
- if (runUndo && useFullSyncWithUndo) {
+ if (DEBUG) System.out.println("Graph update start");
+
+ if (runUndo && useFullSyncWithUndo) {
+ synchronized (syncMutex) {
reset(graph);
- } else {
+ }
+ } else {
+ synchronized (syncMutex) {
graphUpdates = true;
for (DBObject domainObject : mapping.getDomainModified()) {
@SuppressWarnings("unchecked")
if (rangeObject != null)
graphModified.add(rangeObject);
}
- mapping.updateRange(graph);
+
+ }
+
+ mapping.updateRange(graph);
+
+ synchronized (syncMutex) {
graphModified.clear();
syncDeletes();
- clearDeletes();
- graphUpdates = false;
- }
-
- if (mapping.isRangeModified() && !runUndo && !runRedo)
- commit((String)null);
+ }
- if (DEBUG) System.out.println("Graph update done");
+ clearDeletes();
+ graphUpdates = false;
}
+
+ if (mapping.isRangeModified() && !runUndo && !runRedo)
+ commit((String)null);
+
+ if (DEBUG) System.out.println("Graph update done");
}
@Override
* 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) {