Project

General

Profile

1
package eu.dnetlib.enabling.resultset;
2

    
3
import java.util.Map;
4
import java.util.WeakHashMap;
5

    
6
import eu.dnetlib.enabling.resultset.observer.DelegationObserver;
7
import eu.dnetlib.enabling.resultset.observer.Observable;
8

    
9

    
10
/**
11
 * Common stuff for resultset implementations bound to a ResultSetRegistry.
12
 * 
13
 * @author marko
14
 * 
15
 */
16
public abstract class AbstractObservableResultset implements ResultSet, Observable {
17
	/**
18
	 * true if the resultset is destroyed.
19
	 */
20
	private boolean destroyed = false;
21

    
22
	/**
23
	 * true if the resultset is open.
24
	 */
25
	private boolean open;
26

    
27
	/**
28
	 * delegate the real job to a java.util.Observable object.
29
	 */
30
	private transient final java.util.Observable observable = new DelegationObservable();
31

    
32
	/**
33
	 * weak map for removing single observers later on.
34
	 */
35
	private transient Map<ResultSetRegistry, DelegationObserver> observers = new WeakHashMap<ResultSetRegistry, DelegationObserver>();
36

    
37
	/**
38
	 * java.util.Observable requires a "change" in the object to be made for the notifyObservers methods to trigger
39
	 * actually the notification. We don't think this should be part of the base Observable/Observer pattern and thus
40
	 * hide this fact. If an user of AbstractObservable wants this behavior it should implement her own change tracking
41
	 * and avoid calling notifyObservers altogether. The rationale behind this choice is that not all dirty states can
42
	 * be expressed using a stateful boolean instance variable like that implemented by java.util.Observable; some users
43
	 * may prefer/need a lazy dirty flag instead.
44
	 * 
45
	 * @author marko
46
	 * 
47
	 */
48
	static class DelegationObservable extends java.util.Observable {
49

    
50
		/**
51
		 * {@inheritDoc}
52
		 * 
53
		 * @see java.util.Observable#notifyObservers()
54
		 */
55
		@Override
56
		public void notifyObservers() {
57
			setChanged();
58
			super.notifyObservers();
59
		}
60

    
61
		/**
62
		 * {@inheritDoc}
63
		 * 
64
		 * @see java.util.Observable#notifyObservers(java.lang.Object)
65
		 */
66
		@Override
67
		public void notifyObservers(final Object arg) {
68
			setChanged();
69
			super.notifyObservers(arg);
70
		}
71

    
72
	}	
73

    
74
	/**
75
	 * {@inheritDoc}
76
	 * 
77
	 * @see eu.dnetlib.enabling.resultset.ResultSet#destroy()
78
	 */
79
	@Override
80
	public void destroy() {
81
		if (!isDestroyed()) {
82
			setDestroyed(true);
83
			notifyObservers();
84
			deleteObservers();
85
		}
86
	}
87

    
88
	public void setDestroyed(final boolean destroyed) {
89
		this.destroyed = destroyed;
90
	}
91

    
92
	@Override
93
	public boolean isDestroyed() {
94
		return destroyed;
95
	}
96

    
97
	/**
98
	 * {@inheritDoc}
99
	 * 
100
	 * @see eu.dnetlib.enabling.resultset.ResultSet#isOpen()
101
	 */
102
	@Override
103
	public boolean isOpen() {
104
		return open;
105
	}
106

    
107
	/**
108
	 * {@inheritDoc}
109
	 * 
110
	 * @see eu.dnetlib.enabling.resultset.ResultSet#close()
111
	 */
112
	@Override
113
	public void close() {
114
		open = false;
115
	}
116

    
117
	public void setOpen(final boolean open) {
118
		this.open = open;
119
	}
120

    
121
	@Override
122
	public void addObserver(final ResultSetRegistry observer) {
123
		final DelegationObserver delegate = new DelegationObserver(this, observer);
124
		observers.put(observer, delegate);
125
		observable.addObserver(delegate);
126
	}
127

    
128
	protected void notifyObservers() {
129
		observable.notifyObservers();
130
	}
131

    
132
	protected void notifyObservers(final Object arg) {
133
		observable.notifyObservers(arg);
134
	}
135

    
136
	public int countObservers() {
137
		return observable.countObservers();
138
	}
139

    
140
	public void deleteObserver(final java.util.Observer observer) {
141
		observable.deleteObserver(observer);
142
	}
143

    
144
	public void deleteObserver(ResultSetRegistry observer) {
145
		DelegationObserver delegate = observers.get(observer);
146
		if(delegate != null) {
147
			observable.deleteObserver(delegate);
148
		}
149
	}	
150

    
151
	public void deleteObservers() {
152
		observable.deleteObservers();
153
	}
154

    
155
}
(1-1/34)