]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.simulator.toolkit/src/org/simantics/simulator/toolkit/StandardNodeManager.java
Support pending values in NodeManager
[simantics/platform.git] / bundles / org.simantics.simulator.toolkit / src / org / simantics / simulator / toolkit / StandardNodeManager.java
index b8a549087fdb1c745cb6287f95b5faf7ba88a892..e09b3136e6307c7750f81f2ab1271ed340e4a2b4 100644 (file)
@@ -51,8 +51,8 @@ public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport
 
     private static final Logger LOGGER = LoggerFactory.getLogger(StandardNodeManager.class);
 
-    private final Node root;
-    private final StandardRealm<Node,Engine> realm;
+    protected final Node root;
+    protected final StandardRealm<Node,Engine> realm;
 
     static final Binding NO_BINDING = new VariantBinding() {
 
@@ -116,7 +116,7 @@ public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport
 
     };
 
-    THashMap<Node, Variant> valueCache = new THashMap<>();
+    protected THashMap<Node, Variant> valueCache = new THashMap<>();
     protected THashMap<Node, THashSet<Runnable>> listeners = new THashMap<>();
 
     AtomicBoolean fireNodeListenersScheduled = new AtomicBoolean(false);
@@ -194,7 +194,10 @@ public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport
     @Override
     public Object getValue(Node node, Binding binding) throws NodeManagerException, BindingException {
         try {
-            return getValue(node).getValue(binding);
+            Variant value = getValue(node);
+            if(NodeManager.PENDING_NODE_VALUE == value)
+                return value;
+            return value.getValue(binding);
         } catch (AdaptException e) {
             throw new BindingException(e);
         }
@@ -296,6 +299,8 @@ public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport
         Variant variant = valueCache.get(node);
         if(variant == null) {
             Object value = realm.getEngine().getEngineValue(node);
+            if(NodeManager.PENDING_NODE_VALUE == value)
+                return (Variant)value;
             Binding binding = realm.getEngine().getEngineBinding(node);
             variant = new Variant(binding, value);
             valueCache.put(node, variant);