1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.fosstrak.llrp.adaptor.util;
23
24 import java.rmi.RemoteException;
25 import java.util.LinkedList;
26 import java.util.List;
27
28 import org.fosstrak.llrp.adaptor.AsynchronousNotifiable;
29 import org.fosstrak.llrp.adaptor.exception.LLRPRuntimeException;
30
31
32
33
34
35
36
37
38
39 public class AsynchronousNotifiableList implements AsynchronousNotifiable {
40
41
42 private LinkedList<Receiver> receivers = new LinkedList<Receiver>();
43
44
45 public static final int NUM_NON_RECHABLE_ALLOWED = 3;
46
47
48 private LinkedList<Receiver> erroneous = null;
49
50
51
52
53
54
55 private class Receiver {
56
57 private int errors = 0;
58
59
60 private AsynchronousNotifiable receiver = null;
61
62
63
64
65
66 public Receiver(AsynchronousNotifiable receiver) {
67 this.receiver = receiver;
68 }
69
70
71
72
73 public void clean() {
74 errors = 0;
75 }
76
77
78
79
80 public void error() {
81 errors++;
82
83 if ((NUM_NON_RECHABLE_ALLOWED < errors) && (null == erroneous)) {
84 erroneous = new LinkedList<Receiver> ();
85 erroneous.add(this);
86 }
87 }
88
89
90
91
92 public int numErrors() {
93 return errors;
94 }
95
96
97
98
99 public AsynchronousNotifiable getReceiver() {
100 return receiver;
101 }
102 }
103
104
105
106
107
108 public void add(AsynchronousNotifiable entry) {
109 synchronized (receivers) {
110 receivers.add(new Receiver(entry));
111 }
112 }
113
114
115
116
117
118 public void remove(AsynchronousNotifiable entry) {
119 synchronized (receivers) {
120 Receiver toBeRemoved = null;
121 for (Receiver r : receivers) {
122 if (r.getReceiver().equals(entry)) {
123 toBeRemoved = r;
124 break;
125 }
126 }
127 if (null != toBeRemoved) {
128 receivers.remove(toBeRemoved);
129 }
130 }
131 }
132
133
134
135
136 private boolean isDirty() {
137 return (null == erroneous);
138 }
139
140
141
142
143 private synchronized void cleanup() {
144 if (null != erroneous) {
145 synchronized (erroneous) {
146 synchronized(receivers) {
147 for (Receiver e : erroneous) {
148 receivers.remove(e);
149 }
150 erroneous = null;
151 }
152 }
153 }
154 }
155
156
157
158
159
160
161
162 public void notify(byte[] message, String readerName)
163 throws RemoteException {
164
165 for (Receiver receiver : receivers) {
166 try {
167
168 receiver.getReceiver().notify(message, readerName);
169 } catch (RemoteException e) {
170 receiver.error();
171 }
172 receiver.clean();
173 }
174
175 if (isDirty()) {
176 cleanup();
177 }
178 }
179
180
181
182
183
184
185
186 public void notifyError(LLRPRuntimeException e, String readerName)
187 throws RemoteException {
188
189 for (Receiver receiver : receivers) {
190 try {
191 receiver.getReceiver().notifyError(e, readerName);
192 } catch (RemoteException ex) {
193 receiver.error();
194 }
195 receiver.clean();
196 }
197
198 if (isDirty()) {
199 cleanup();
200 }
201 }
202
203
204
205
206 public List<Receiver> getAll() {
207 return receivers;
208 }
209 }