1 package org.simantics.modeling.tests.commands;
3 import org.simantics.databoard.binding.Binding;
4 import org.simantics.db.WriteGraph;
5 import org.simantics.db.common.CommentMetadata;
6 import org.simantics.db.common.request.WriteResultRequest;
7 import org.simantics.db.exception.DatabaseException;
8 import org.simantics.db.layer0.request.PossibleURIVariable;
9 import org.simantics.db.layer0.variable.Variable;
10 import org.simantics.db.testing.common.CommandSequenceEnvironment;
11 import org.simantics.db.testing.common.WriteCommand;
12 import org.simantics.diagram.adapter.DisposableListener;
13 import org.simantics.diagram.adapter.DisposableListenerAdapter;
14 import org.simantics.modeling.tests.traits.SingleResourceTrait;
16 public class WriteState extends WriteCommand<CommandSequenceEnvironment> {
18 private static final long TIMEOUT = 5000000000L;
20 transient public SingleResourceTrait run;
21 transient public String rvi;
22 transient public Object value;
23 transient public Binding binding;
25 public WriteState(SingleResourceTrait run, String rvi, Object value, Binding binding) {
29 this.binding = binding;
33 public void run(CommandSequenceEnvironment environment) throws DatabaseException {
35 long start = System.nanoTime();
36 long current = System.nanoTime();
38 final DisposableListener<Variable> listener = new DisposableListenerAdapter<Variable>();
42 while((current-start) < TIMEOUT) {
44 boolean success = environment.getSession().sync(new WriteResultRequest<Boolean>() {
47 public Boolean perform(WriteGraph graph) throws DatabaseException {
49 Variable state = graph.syncRequest(new PossibleURIVariable(graph.getURI(run.getResource(graph)) + rvi), listener);
50 if(state == null) return false;
52 state.setValue(graph, value, binding);
54 CommentMetadata cm = graph.getMetadata(CommentMetadata.class);
55 // Add comment to change set.
56 graph.addMetadata(cm.add("Set value"));
68 } catch (InterruptedException e1) {
69 throw new DatabaseException(e1);
72 current = System.nanoTime();
76 throw new DatabaseException("Timeout writing " + rvi);
80 listener.disposeListener();