1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.impl.ldap;
import java.util.*;
import net.java.sip.communicator.service.ldap.*;
import net.java.sip.communicator.service.ldap.event.*;
import net.java.sip.communicator.util.*;
import org.jitsi.service.configuration.*;
/**
* A thread-safe implementation of LdapDirectorySet, backed by a TreeMap
*
* @see net.java.sip.communicator.service.ldap
*
* @author Sebastien Mazy
*/
public class LdapDirectorySetImpl
extends DefaultLdapEventManager
implements LdapDirectorySet,
LdapConstants
{
/**
* the logger for this class
*/
private static Logger logger
= Logger.getLogger(LdapDirectorySetImpl.class);
/**
* internal data structure used to store LdapDirectory(s)
*/
private SortedMap<String,LdapDirectory> serverMap;
/**
* the configuration service
*/
private ConfigurationService configService;
/**
* Stores the pending searches
*
* @see LdapPendingSearch
*/
private HashMap<LdapQuery, LdapPendingSearch> pendingSearches =
new HashMap<LdapQuery, LdapPendingSearch>();
/**
* A simple constructor for this class
*/
public LdapDirectorySetImpl()
{
this(null);
}
/**
* Use this constructor if you want every change to the LdapDirectorySet
* to be propagated in the user preferences files
*
* @param configService the configuration service to use
*/
public LdapDirectorySetImpl(ConfigurationService configService)
{
this.serverMap = Collections.
synchronizedSortedMap(new TreeMap<String, LdapDirectory>());
this.configService = configService;
}
/**
* @return the LdapDirectory with name name or null
* if it isn't present in the LdapDirectorySet
*/
public LdapDirectory getServerWithName(String name)
{
return this.serverMap.get(name);
}
/**
* Tries to remove an LdapDirectory from the LdapDirectorySet
* using the name given by the getName method.
*
* @param name name of the LdapDirectory to remove
*
* @return LdapDirectory removed LdapDirectory or null if failed
*/
public LdapDirectory removeServerWithName(String name)
{
LdapDirectory removed = this.serverMap.remove(name);
if(configService != null)
removed.getSettings().persistentRemove();
return removed;
}
/**
* Tries to add an LdapDirectory to the LdapDirectorySet
*
* @param server the server to be added
*
* @return whether it succeeded
*/
public boolean addServer(LdapDirectory server)
{
/* TODO thread-safe */
this.serverMap.put(server.getSettings().getName(), server);
if(configService != null)
server.getSettings().persistentSave();
return true;
}
/**
* @param name of the server to check presence in the LdapDirectorySet
*
* @return whether the server is in the LdapDirectorySet
*/
public boolean containsServerWithName(String name)
{
/* TODO is this function useful ? */
return this.serverMap.containsKey(name);
}
/**
* Returns number of LdapDirectory(s) in the LdapDirectorySet.
*
* @return the number of LdapDirectory(s) in the LdapDirectorySet
*/
public int size()
{
return this.serverMap.size();
}
/**
* Required by LdapDirectorySet interface.
* Returns a set of the marked enabled
* LdapDirectory(s) alphabetically sorted
*
* @return a set of the enabled LdapDirectory(s)
*/
public SortedSet<LdapDirectory> getEnabledServers()
{
SortedSet<LdapDirectory> enabledServers = new TreeSet<LdapDirectory>();
for(LdapDirectory server : this)
{
if(server.isEnabled())
enabledServers.add(server);
}
return enabledServers;
}
/**
* Required by LdapDirectorySet interface.
* Returns a set of the marked disabled
* LdapDirectory(s) alphabetically sorted
*
* @return a set of the disabled LdapDirectory(s)
*/
public SortedSet<LdapDirectory> getDisabledServers()
{
SortedSet<LdapDirectory> enabledServers = new TreeSet<LdapDirectory>();
for(LdapDirectory server : this)
{
if(server.isEnabled())
enabledServers.add(server);
}
return enabledServers;
}
/**
* @return an iterator on all the
* LdapDirectory(s) alphabetically sorted
*/
public Iterator<LdapDirectory> iterator()
{
return this.serverMap.values().iterator();
}
/**
* Performs a search on every LdapDirectory provided
*
* @param servers a set of LdapDirectory to search for the person
* @param query the query to perform
* @param caller the LdapListener that will receive the results
* @param searchSettings the custom settings for this search,
* or null for the defaults
*/
public synchronized void searchPerson(
Set<LdapDirectory> servers,
LdapQuery query,
LdapListener caller,
LdapSearchSettings searchSettings
)
{
if(servers == null)
throw new NullPointerException("servers shouldn't be null!");
if(query == null)
throw new NullPointerException("query shouldn't be null!");
if(caller == null)
throw new NullPointerException("caller shouldn't be null!");
this.pendingSearches.put(query, new LdapPendingSearch(servers, caller));
for(LdapDirectory server : servers)
{
if(server == null)
logger.info("server is null");
server.searchPerson(query, this, searchSettings);
}
}
/**
* Performs a search on every enabled LdapDirectory of this set.
*
* @param query the query to perform
* @param caller the LdapListener that will receive the results
* @param searchSettings the custom settings for this search
*/
public void searchPerson(
LdapQuery query,
LdapListener caller,
LdapSearchSettings searchSettings
)
{
this.searchPerson(this.getEnabledServers(), query, caller,
searchSettings);
}
/**
* Required by LdapListener.
*
* Dispatches event received from LdapDirectory-s to
* real search initiators (the search dialog for example)
*
* @param event An LdapEvent probably sent by an LdapDirectory
*/
public synchronized void ldapEventReceived(LdapEvent event)
{
LdapQuery query;
switch(event.getCause())
{
case NEW_SEARCH_RESULT:
LdapPersonFound result = (LdapPersonFound) event.getContent();
query = result.getQuery();
if(this.pendingSearches.get(query) != null)
{
this.fireLdapEvent(event, pendingSearches.get(query).
getCaller());
logger.trace("result event for query \"" +
result.getQuery().toString() + "\" forwaded");
}
break;
case SEARCH_ERROR:
case SEARCH_CANCELLED:
case SEARCH_ACHIEVED:
query = (LdapQuery) event.getContent();
if(this.pendingSearches.get(query) != null)
{
this.pendingSearches.get(query).getPendingServers().remove(
event.getSource());
logger.trace("end event for query \"" + query.toString() +
"\" on directory \"" + event.getSource() + "\"");
if(pendingSearches.get(query).getPendingServers().
size() == 0)
{
fireLdapEvent(event, pendingSearches.get(query).
getCaller());
event = new LdapEvent(this,
LdapEvent.LdapEventCause.SEARCH_ACHIEVED,
query);
pendingSearches.remove(query);
}
}
break;
}
}
}
|