1 /*******************************************************************************
\r
2 * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.
\r
3 * All rights reserved. This program and the accompanying materials
\r
4 * are made available under the terms of the Eclipse Public License v1.0
\r
5 * which accompanies this distribution, and is available at
\r
6 * http://www.eclipse.org/legal/epl-v10.html
\r
9 * VTT Technical Research Centre of Finland - initial API and implementation
\r
10 *******************************************************************************/
\r
11 package org.simantics.simulation.data;
\r
13 import java.util.concurrent.locks.Lock;
\r
14 import java.util.concurrent.locks.ReentrantLock;
\r
16 import org.simantics.utils.datastructures.ListenerList;
\r
19 * @author Toni Kalajainen
\r
21 public abstract class AbstractDatasource implements Datasource {
\r
23 protected ListenerList<DatasourceListener> listeners = new ListenerList<DatasourceListener>(DatasourceListener.class);
\r
24 protected Lock readLock, writeLock;
\r
26 public AbstractDatasource() {
\r
27 // ReentrantReadWriteLock l = new ReentrantReadWriteLock();
\r
28 // this.readLock = l.readLock();
\r
29 // this.writeLock = l.writeLock();
\r
30 this.readLock = this.writeLock = new ReentrantLock();
\r
34 public void addListener(DatasourceListener listener) {
\r
35 listeners.add(listener);
\r
39 public void removeListener(DatasourceListener listener) {
\r
40 listeners.remove(listener);
\r
43 protected void notifyStep() {
\r
44 for (final DatasourceListener l : listeners.getListeners()) {
\r
45 if (l.getExecutor() == null) {
\r
46 l.onStep( AbstractDatasource.this );
\r
48 l.getExecutor().execute(new Runnable() {
\r
50 l.onStep(AbstractDatasource.this);
\r
58 public Lock readLock() {
\r