aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java')
-rw-r--r--src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java285
1 files changed, 285 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java b/src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java
new file mode 100644
index 0000000..3f775e8
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/ldap/LdapDirectorySetImpl.java
@@ -0,0 +1,285 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.impl.ldap;
+
+import java.util.*;
+
+import net.java.sip.communicator.util.*;
+import net.java.sip.communicator.service.configuration.*;
+import net.java.sip.communicator.service.ldap.*;
+import net.java.sip.communicator.service.ldap.event.*;
+
+/**
+ * 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) alphabeticaly sorted
+ */
+ public Iterator<LdapDirectory> iterator()
+ {
+ return this.serverMap.values().iterator();
+ }
+
+ /**
+ * Performs a search on every LdapDirectory provided
+ *
+ * @param servers a set of LdapDirectory to searchfor 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)
+ System.out.println("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;
+ }
+ }
+}