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);
87 protected void localStateChange() {
91 public void addListener(IExperimentListener listener) {
92 listeners.add(listener);
93 listener.stateChanged(state);
97 public Resource getResource() {
102 public Resource getModel() {
107 public void removeListener(IExperimentListener listener) {
108 listeners.remove(listener);
112 public void addStatusListener(IExperimentStatusListener listener) {
113 statusListeners.add(listener);
117 public void removeStatusListener(IExperimentStatusListener listener) {
118 statusListeners.remove(listener);
122 public void shutdown(IProgressMonitor monitor) {
123 changeState(ExperimentState.DISPOSED);
127 public Lock getDatasourceLock() {
128 throw new UnsupportedOperationException("deprecated operation");
132 public Accessor getAccessor() {
137 public String getIdentifier() {
141 static class ExperimentStateRead implements ExternalRead<ExperimentState>, Runnable {
143 final private Experiment experiment;
144 private Listener<ExperimentState> listener = null;
146 ExperimentStateRead(Experiment experiment) {
147 this.experiment = experiment;
151 public void register(ReadGraph graph, final Listener<ExperimentState> procedure) {
152 //System.out.println("IcTrackerRequest.register: " + procedure);
153 listener = procedure;
154 procedure.execute(experiment.state);
158 public void unregistered() {
159 //System.out.println("IcTrackerRequest.unregister: " + listener);
165 Listener<ExperimentState> l = listener;
166 //System.out.println("IcTrackerRequest.run: " + l);
168 l.execute(experiment.state);
172 private ExperimentStateRead EXPERIMENT_STATE_READ = new ExperimentStateRead(this);