1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.simulation.experiment;
14 import java.util.UUID;
15 import java.util.concurrent.locks.Lock;
17 import org.eclipse.core.runtime.IProgressMonitor;
18 import org.simantics.databoard.accessor.Accessor;
19 import org.simantics.db.ReadGraph;
20 import org.simantics.db.Resource;
21 import org.simantics.db.exception.DatabaseException;
22 import org.simantics.db.procedure.Listener;
23 import org.simantics.db.request.ExternalRead;
24 import org.simantics.utils.datastructures.ListenerList;
26 public abstract class Experiment implements IExperiment {
28 protected Resource experiment;
29 protected Resource model;
30 protected ListenerList<IExperimentListener> listeners =
31 new ListenerList<IExperimentListener>(IExperimentListener.class);
32 protected ListenerList<IExperimentStatusListener> statusListeners =
33 new ListenerList<IExperimentStatusListener>(IExperimentStatusListener.class);
34 protected volatile ExperimentState state = ExperimentState.INITIALIZING;
35 protected String identifier;
37 public Experiment(Resource model) {
38 this(null, model, UUID.randomUUID().toString());
41 public Experiment(Resource model, String identifier) {
42 this(null, model, identifier);
45 public Experiment(Resource experiment, Resource model) {
46 this(experiment, model, UUID.randomUUID().toString());
49 public Experiment(Resource experiment, Resource model, String identifier) {
50 this.experiment = experiment;
52 this.identifier = identifier;
56 public <T> T getService(Class<T> clazz) {
61 public ExperimentState getState() {
63 System.err.println("nullstate");
68 public ExperimentState getState(ReadGraph graph) throws DatabaseException {
69 return graph.syncRequest(EXPERIMENT_STATE_READ);
72 public void changeState(ExperimentState newState) {
73 if (state == ExperimentState.DISPOSED) {
74 if (newState != ExperimentState.DISPOSED) {
75 // TODO: this might be worth logging as an error.
79 if(newState != state) {
82 for(IExperimentListener listener : listeners.getListeners())
83 listener.stateChanged(newState);
84 EXPERIMENT_STATE_READ.run();
88 protected void localStateChange() {
92 public void addListener(IExperimentListener listener) {
93 listeners.add(listener);
94 listener.stateChanged(state);
98 public Resource getResource() {
103 public Resource getModel() {
108 public void removeListener(IExperimentListener listener) {
109 listeners.remove(listener);
113 public void addStatusListener(IExperimentStatusListener listener) {
114 statusListeners.add(listener);
118 public void removeStatusListener(IExperimentStatusListener listener) {
119 statusListeners.remove(listener);
123 public void shutdown(IProgressMonitor monitor) {
124 changeState(ExperimentState.DISPOSED);
128 public Lock getDatasourceLock() {
129 throw new UnsupportedOperationException("deprecated operation");
133 public Accessor getAccessor() {
138 public String getIdentifier() {
142 static class ExperimentStateRead implements ExternalRead<ExperimentState>, Runnable {
144 final private Experiment experiment;
145 private Listener<ExperimentState> listener = null;
147 ExperimentStateRead(Experiment experiment) {
148 this.experiment = experiment;
152 public void register(ReadGraph graph, final Listener<ExperimentState> procedure) {
153 //System.out.println("IcTrackerRequest.register: " + procedure);
154 listener = procedure;
155 procedure.execute(experiment.state);
159 public void unregistered() {
160 //System.out.println("IcTrackerRequest.unregister: " + listener);
166 Listener<ExperimentState> l = listener;
167 //System.out.println("IcTrackerRequest.run: " + l);
169 l.execute(experiment.state);
173 private ExperimentStateRead EXPERIMENT_STATE_READ = new ExperimentStateRead(this);