1
2
3
4
5
6
7
8
9
10
11 package de.jaret.util.date.timemachine;
12
13 import java.util.Date;
14 import java.util.List;
15 import java.util.Vector;
16
17
18
19
20
21
22
23
24 public class TimeMachine implements ITimeProvider {
25
26 private volatile long _currentTime;
27
28 private List<ITimeMachineListener> _listeners = new Vector<ITimeMachineListener>();
29
30
31 private boolean _forwardOnly = true;
32
33 private boolean _autoIncrement = false;
34
35 private boolean _realTime = false;
36
37
38
39
40
41
42 public TimeMachine(long initialTime) {
43 _currentTime = initialTime;
44 }
45
46
47
48
49 public long getCurrentTime() {
50 if (_realTime) {
51 return System.currentTimeMillis();
52 }
53 if (_autoIncrement) {
54 synchronized (this) {
55 long time = _currentTime;
56 increment();
57 return time;
58 }
59 } else {
60 return _currentTime;
61 }
62 }
63
64
65
66
67 public Date getCurentTimeAsDate() {
68 return new Date(getCurrentTime());
69 }
70
71 private void increment() {
72 _currentTime++;
73 fireTimeChanged(_currentTime - 1, _currentTime);
74 }
75
76
77
78
79
80
81 public synchronized void setTime(long time) {
82 if (_realTime) {
83 throw new IllegalArgumentException("Time machine is in real time mode.");
84 }
85 if (_forwardOnly && time < _currentTime) {
86 throw new IllegalArgumentException("Time must move forward");
87 }
88 long oldTime = _currentTime;
89 _currentTime = time;
90 fireTimeChanged(oldTime, _currentTime);
91 }
92
93
94
95
96
97
98 public synchronized void addTimeMachineListener(ITimeMachineListener timeMachineListener) {
99 if (!_listeners.contains(timeMachineListener)) {
100 _listeners.add(timeMachineListener);
101 }
102 }
103
104
105
106
107
108
109 public synchronized void remTimeMachineListener(ITimeMachineListener timeMachineListener) {
110 _listeners.remove(timeMachineListener);
111 }
112
113
114
115
116
117
118
119 protected void fireTimeChanged(long oldTime, long newTime) {
120 for (ITimeMachineListener listener : _listeners) {
121 listener.timeChanged(this, oldTime, newTime);
122 }
123 }
124
125
126
127
128
129
130 public boolean isForwardOnly() {
131 return _forwardOnly;
132 }
133
134
135
136
137
138
139
140 public void setForwardOnly(boolean forwardOnly) {
141 _forwardOnly = forwardOnly;
142 }
143
144
145
146
147
148
149 public boolean isAutoIncrement() {
150 return _autoIncrement;
151 }
152
153
154
155
156
157
158
159 public void setAutoIncrement(boolean autoIncrement) {
160 _autoIncrement = autoIncrement;
161 }
162
163
164
165
166
167
168
169 public boolean isRealTime() {
170 return _realTime;
171 }
172
173
174
175
176
177
178
179 public void setRealTime(boolean realTime) {
180 _realTime = realTime;
181 }
182 }