1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package jgroup.relacs.daemon;
20
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.List;
25 import java.util.Map;
26
27 import jgroup.core.EndPoint;
28
29 import org.apache.log4j.Logger;
30
31
32
33
34
35
36
37
38 final class GroupTable
39 {
40
41
42
43
44
45
46 private static final Logger log = Logger.getLogger(GroupTable.class);
47
48
49
50
51
52
53
54 private final Map<Integer,Group> totgroups = new HashMap<Integer,Group>();
55
56
57 private final Map<EndPoint,List<Group>> grouplists = new HashMap<EndPoint,List<Group>>();
58
59
60 private final Map<EndPoint,EndPoint[]> symsets = new HashMap<EndPoint,EndPoint[]>();
61
62
63
64
65
66
67 GroupTable() { }
68
69
70
71
72
73
74 @Override
75 public String toString()
76 {
77 StringBuilder buf = new StringBuilder("GroupTable: groups=");
78 for (Group group : totgroups.values()) {
79 buf.append(group.getGid());
80 buf.append(" ");
81 }
82 for (Map.Entry<EndPoint,List<Group>> groupEntry : grouplists.entrySet()) {
83 buf.append("endpoint=");
84 buf.append(groupEntry.getKey());
85 buf.append(": ");
86 for (Group group : groupEntry.getValue()) {
87 buf.append(group.getGid());
88 }
89 buf.append("; ");
90 }
91 return buf.toString();
92 }
93
94
95
96
97 void addEndpointToGroup(EndPoint endpoint, Group group)
98 {
99 if (log.isDebugEnabled())
100 log.debug("GroupTable: addGroupEndPoint: " + endpoint);
101 if (!containsGroup(group.getGid()))
102 throw new IllegalStateException("Cannot add group endpoint to a non-local group.");
103 List<Group> groups = grouplists.get(endpoint);
104 if (groups == null) {
105 groups = new ArrayList<Group>(10);
106 grouplists.put(endpoint, groups);
107 }
108 if (!groups.contains(group))
109 groups.add(group);
110
111 if (log.isDebugEnabled())
112 log.debug(toString());
113 }
114
115
116
117
118 void insertGroup(Group group)
119 {
120 totgroups.put(group.getGid(), group);
121 }
122
123
124
125
126 void removeGroup(int gid)
127 {
128 if (log.isDebugEnabled())
129 log.debug("Removing group: " + gid);
130
131 Group group = getGroup(gid);
132 for (Iterator iter = grouplists.entrySet().iterator(); iter.hasNext();) {
133 Map.Entry groupEntry = (Map.Entry) iter.next();
134 List groups = (List) groupEntry.getValue();
135 groups.remove(group);
136 if (log.isDebugEnabled())
137 log.debug("Removed group " + group.getGid() + " from host " + groupEntry.getKey());
138 if (groups.isEmpty())
139 iter.remove();
140 }
141 totgroups.remove(gid);
142
143 if (log.isDebugEnabled())
144 log.debug(toString());
145 }
146
147
148
149
150 Group getGroup(int gid)
151 {
152 return totgroups.get(gid);
153 }
154
155
156
157
158 boolean containsGroup(int gid)
159 {
160 return totgroups.containsKey(gid);
161 }
162
163
164
165
166 boolean isEmpty()
167 {
168 return totgroups.isEmpty();
169 }
170
171
172
173
174
175 Iterator iterator()
176 {
177 return totgroups.values().iterator();
178 }
179
180
181
182
183
184 Iterator getGroups(EndPoint endpoint)
185 {
186 List<Group> groups = grouplists.get(endpoint);
187
188
189
190
191 if (groups == null)
192 groups = new ArrayList<Group>(0);
193 return groups.iterator();
194 }
195
196 EndPoint[] getSymset(EndPoint endpoint)
197 {
198 return symsets.get(endpoint);
199 }
200
201 void setSymset(EndPoint host, EndPoint[] symset)
202 {
203 symsets.put(host, symset);
204 }
205
206 }