1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package jgroup.relacs.types;
20
21 import java.io.Externalizable;
22 import java.io.IOException;
23 import java.io.ObjectInput;
24 import java.io.ObjectOutput;
25 import java.util.HashSet;
26 import java.util.Set;
27
28 import jgroup.core.MemberId;
29 import jgroup.core.View;
30
31
32
33
34
35
36
37
38
39 public class ViewImpl
40 implements View, Externalizable
41 {
42
43 private static final long serialVersionUID = 5806351416950303803L;
44
45
46
47
48
49
50 private int gid;
51
52
53 private long vid;
54
55
56 private int mergingViews;
57
58
59 private MemberId[] members;
60
61
62
63
64
65
66
67
68
69 public ViewImpl() { }
70
71
72
73
74
75 public ViewImpl(int gid)
76 {
77 this.gid = gid;
78 this.vid = 0;
79 this.mergingViews = 0;
80 members = new MemberId[0];
81 }
82
83
84
85
86
87 public ViewImpl(int gid, long vid, MemberId me)
88 {
89 this.gid = gid;
90 this.vid = vid;
91 this.mergingViews = 0;
92 members = new MemberId[1];
93 members[0] = me;
94 }
95
96
97
98
99
100
101
102
103 public ViewImpl(int gid, long vid, int mergingViews, MemberId[] members)
104 {
105 this.gid = gid;
106 this.vid = vid;
107 this.mergingViews = mergingViews;
108 this.members = members;
109 }
110
111
112
113
114 public ViewImpl(View v)
115 {
116 this.gid = v.getGid();
117 this.vid = v.getVid();
118 this.mergingViews = v.mergingViews();
119 this.members = v.getMembers();
120 }
121
122
123
124
125
126
127
128
129
130
131 public int getGid()
132 {
133 return gid;
134 }
135
136
137
138
139
140 public long getVid()
141 {
142 return vid;
143 }
144
145
146
147
148 public int mergingViews()
149 {
150 return mergingViews;
151 }
152
153
154
155
156
157 public MemberId[] getMembers()
158 {
159 return members.clone();
160 }
161
162
163
164
165 public MemberId getLeader()
166 {
167 return members[0];
168 }
169
170
171
172
173 public boolean isLeader(MemberId member)
174 {
175
176 return members.length == 1 || member.equals(members[0]);
177 }
178
179
180
181
182 public MemberId[] commonMembers(MemberId[] otherMembers)
183 {
184 if (otherMembers == null)
185 return getMembers();
186 Set<MemberId> commonMembers = new HashSet<MemberId>();
187 for (int i = 0; i < members.length; i++)
188 for (int j = 0; j < otherMembers.length; j++)
189 if (members[i].equals(otherMembers[j]))
190 commonMembers.add(members[i]);
191 return (MemberId[]) commonMembers.toArray(new MemberId[commonMembers.size()]);
192 }
193
194
195
196
197 public MemberId[] commonMembers(View view)
198 {
199 if (this.equals(view))
200 return getMembers();
201 return commonMembers(((ViewImpl) view).members);
202 }
203
204
205
206
207 public MemberId[] newMembers(View previousView)
208 {
209 if (previousView == null)
210 return getMembers();
211 if (this.equals(previousView))
212 return new MemberId[0];
213 Set<MemberId> newMembers = new HashSet<MemberId>();
214 MemberId[] previousMembers = previousView.getMembers();
215 for (int i = 0; i < members.length; i++) {
216 boolean found = false;
217 for (int j = 0; !found && j < previousMembers.length; j++) {
218 if (members[i].equals(previousMembers[j])) {
219 found = true;
220 }
221 }
222 if (!found)
223 newMembers.add(members[i]);
224 }
225 return (MemberId[]) newMembers.toArray(new MemberId[newMembers.size()]);
226 }
227
228
229
230
231 public MemberId[] oldMembers(View previousView)
232 {
233 if (previousView == null) {
234
235 return new MemberId[0];
236 }
237
238 return previousView.newMembers(this);
239 }
240
241
242
243
244 public boolean contains(MemberId memberId)
245 {
246 boolean found = false;
247 for (int i = 0; !found && i < members.length; i++) {
248 found = members[i].equals(memberId);
249 }
250 return found;
251 }
252
253
254
255
256
257 public boolean containsAll(View view)
258 {
259 if (view == null)
260 return false;
261
262 MemberId[] viewMembers = ((ViewImpl) view).members;
263
264
265
266
267 for (int i = 0; i < viewMembers.length; i++) {
268 if (!contains(viewMembers[i])) {
269 return false;
270 }
271 }
272 return true;
273 }
274
275
276
277
278
279 public boolean hasSameMembers(View prevView)
280 {
281 if (prevView == null || this.size() != prevView.size())
282 return false;
283 MemberId[] commonMembers = this.commonMembers(prevView);
284 if (commonMembers.length != prevView.size())
285 return false;
286 else
287 return true;
288 }
289
290
291
292
293
294 public int size()
295 {
296 return members.length;
297 }
298
299
300
301
302
303 public int getMemberPosition(MemberId id)
304 {
305 for (int i = 0; i < members.length; i++)
306 if (members[i].equals(id))
307 return i;
308 return -1;
309 }
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329 public boolean memberHasPosition(int pos, MemberId member)
330 {
331
332 if (pos < 0)
333 pos = members.length + pos;
334
335
336 if (pos >= 0 && pos < members.length)
337 return members[pos].equals(member);
338 else
339 return false;
340 }
341
342
343
344
345
346
347
348
349
350
351
352 public boolean equals(Object obj)
353 {
354 if (obj == null)
355 return false;
356 if (obj == this)
357 return true;
358 if (obj instanceof ViewImpl) {
359 ViewImpl view = (ViewImpl) obj;
360 return (gid == view.gid && vid == view.vid);
361 }
362 return false;
363 }
364
365
366
367
368
369 public String toString()
370 {
371 StringBuilder buf = new StringBuilder("\n [GroupId: ");
372 buf.append(gid);
373 buf.append(", ViewId: ");
374 buf.append(vid);
375 buf.append(", Partitions: ");
376 buf.append(mergingViews);
377 buf.append("]\n ");
378 for (int i = 0; i < members.length; i++) {
379 buf.append(members[i]);
380 if (i == 0)
381 buf.append(" [leader]\n ");
382 else
383 buf.append("\n ");
384 }
385 return buf.toString();
386 }
387
388
389
390
391
392
393
394
395
396
397
398
399 public void readExternal(ObjectInput in)
400 throws IOException, ClassNotFoundException
401 {
402 gid = GroupId.unmarshal(in);
403 vid = ViewId.unmarshal(in);
404 mergingViews = in.readInt();
405 int len = GroupIndex.unmarshal(in);
406 members = new MemberId[len];
407 for (int i=0; i < len; i++) {
408 members[i] = new MemberIdImpl();
409 members[i].readExternal(in);
410 }
411 }
412
413
414
415
416
417
418 public void writeExternal(ObjectOutput out)
419 throws IOException
420 {
421 GroupId.marshal(out, gid);
422 ViewId.marshal(out, vid);
423 out.writeInt(mergingViews);
424 GroupIndex.marshal(out, members.length);
425 for (int i=0; i < members.length; i++) {
426 members[i].writeExternal(out);
427 }
428 }
429
430 public Object clone()
431 {
432 ViewImpl v = new ViewImpl();
433 v.gid = gid;
434 v.vid = vid;
435 v.members = members.clone();
436 v.mergingViews = mergingViews;
437 return v;
438 }
439
440 }