package org.simantics.simulator.toolkit;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* StandardNodeManager gives default implementations to some methods
* of NodeManager.
- *
+ *
* @author Antti Villberg
*/
-public abstract class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport<Node>> implements NodeManager<Node> {
+public class StandardNodeManager<Node, Engine extends StandardNodeManagerSupport<Node>> implements NodeManager<Node> {
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() {
return System.identityHashCode(o1);
} else {
if(o1.equals(o2)) return 0;
- return System.identityHashCode(o1) - System.identityHashCode(o2);
+ return System.identityHashCode(o1) - System.identityHashCode(o2);
}
}
}
};
- THashMap<Node, Variant> valueCache = new THashMap<>();
- protected THashMap<Node, THashSet<Runnable>> listeners = new THashMap<>();
+ protected THashMap<Node, Variant> valueCache = new THashMap<>();
+ protected THashMap<Node, THashSet<Runnable>> listeners = new THashMap<>();
AtomicBoolean fireNodeListenersScheduled = new AtomicBoolean(false);
Runnable fireNodeListeners = new Runnable() {
}
};
- Runnable clearValueCache = () -> valueCache.clear();
+ Runnable clearValueCache = () -> valueCache.clear();
public StandardNodeManager(StandardRealm<Node,Engine> realm, Node root) {
assert(realm != null);
}
}
+ public void refreshVariable(Node node) {
+ realm.asyncExec(() -> {
+ valueCache.remove(node);
+ synchronized(listeners) {
+ THashSet<Runnable> runnables = listeners.get(node);
+ if (runnables != null) {
+ for (Runnable r : runnables) {
+ r.run();
+ }
+ }
+ }
+ });
+ }
+
public void refreshVariables() {
realm.asyncExec(clearValueCache);
fireNodeListeners();
@Override
public void setValue(Node node, Object value, Binding binding)
throws NodeManagerException {
+ updateValueInner(node, value, binding);
+ refreshVariable(node);
+ }
+
+ //Update the value of the node and remove from valueCache only the references nodes
+ public void setValueAndFireSelectedListeners(Node node, Object value, Binding binding, Set<Node> references) throws NodeManagerException {
+ if(references.size() > 0) {
+ for(Node n : references) {
+ valueCache.remove(n);
+ }
+ }
+ updateValueInner(node, value, binding);
+ fireNodeListenersSync();
+ }
+
+ //Update the value of the node helper method
+ private void updateValueInner(Node node, Object value, Binding binding) throws NodeManagerException {
checkThreadAccess();
Binding targetBinding = realm.getEngine().getEngineBinding(node);
if(binding.equals(targetBinding)) {
throw new NodeManagerException(e);
}
}
- refreshVariables();
}
@Override
String id = getRealmId();
int lastSlash = id.lastIndexOf("/");
if(lastSlash == -1) throw new IllegalStateException("Invalid realm id " + id);
- String name = id.substring(lastSlash+1);
+ String name = id.substring(lastSlash+1);
return name;
} else {
return realm.getEngine().getName(node);
listeners.clear();
}
+ @Override
+ public Set<String> getClassifications(Node node) throws NodeManagerException {
+ return Collections.emptySet();
+ }
+
}
\ No newline at end of file