mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

ludovicp
31.48.2010 3749749fcfc4a3f9821fa8df2c0b93688971628e
Fix for issue #4536. Close JNDI enumerations to avoid unbinding and closing underlying LDAP connection. Fixes in all CLI and control panel.
18 files modified
1235 ■■■■■ changed files
opends/src/ads/org/opends/admin/ads/ADSContext.java 175 ●●●● patch | view | raw | blame | history
opends/src/ads/org/opends/admin/ads/ADSContextHelper.java 35 ●●●● patch | view | raw | blame | history
opends/src/ads/org/opends/admin/ads/ServerDescriptor.java 413 ●●●●● patch | view | raw | blame | history
opends/src/ads/org/opends/admin/ads/TopologyCache.java 8 ●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/browser/NodeRefresher.java 271 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/datamodel/CustomSearchResult.java 29 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java 69 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java 21 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java 41 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java 23 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java 10 ●●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java 26 ●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/util/LDAPEntryReader.java 10 ●●●● patch | view | raw | blame | history
opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java 10 ●●●●● patch | view | raw | blame | history
opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java 21 ●●●● patch | view | raw | blame | history
opends/src/quicksetup/org/opends/quicksetup/util/Utils.java 23 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java 30 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java 20 ●●●●● patch | view | raw | blame | history
opends/src/ads/org/opends/admin/ads/ADSContext.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2007-2009 Sun Microsystems, Inc.
 *      Copyright 2007-2010 Sun Microsystems, Inc.
 */
package org.opends.admin.ads;
@@ -604,9 +604,9 @@
    }
    // Unregister the server in server groups
    NamingEnumeration<SearchResult> ne = null;
    try
    {
      NamingEnumeration<SearchResult> ne;
      SearchControls sc = new SearchControls();
      String serverID = getServerID(serverProperties);
@@ -623,24 +623,38 @@
          BasicAttribute newAttr = new BasicAttribute(memberAttrName);
          NamingEnumeration<? extends Attribute> attrs =
            sr.getAttributes().getAll();
          while (attrs.hasMore())
          try
          {
            Attribute attr = attrs.next();
            String attrID = attr.getID();
            if (attrID.equalsIgnoreCase(memberAttrName))
            while (attrs.hasMore())
            {
              NamingEnumeration<?> ae = attr.getAll();
              while (ae.hasMore())
              Attribute attr = attrs.next();
              String attrID = attr.getID();
              if (attrID.equalsIgnoreCase(memberAttrName))
              {
                String value = (String)ae.next();
                if (!value.equalsIgnoreCase("cn="+serverID))
                NamingEnumeration<?> ae = attr.getAll();
                try
                {
                  newAttr.add(value);
                  while (ae.hasMore())
                  {
                    String value = (String)ae.next();
                    if (!value.equalsIgnoreCase("cn="+serverID))
                    {
                      newAttr.add(value);
                    }
                  }
                }
                finally
                {
                  handleCloseNamingEnumeration(ae);
                }
              }
            }
          }
          finally
          {
            handleCloseNamingEnumeration(attrs);
          }
          BasicAttributes newAttrs = new BasicAttributes();
          newAttrs.put(newAttr);
          if (newAttr.size() > 0)
@@ -671,6 +685,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(ne);
    }
  }
  /**
@@ -750,19 +768,20 @@
        + getServerGroupContainerDN());
    Set<String> result = new HashSet<String>() ;
    NamingEnumeration<SearchResult> srs = null;
    NamingEnumeration<? extends Attribute> ne = null;
    try
    {
      SearchControls sc = new SearchControls();
      sc.setSearchScope(SearchControls.OBJECT_SCOPE);
      NamingEnumeration<SearchResult> srs = getDirContext().search(dn,
          "(objectclass=*)", sc);
      srs = getDirContext().search(dn, "(objectclass=*)", sc);
      if (!srs.hasMore())
      {
        return result;
      }
      Attributes attrs = srs.next().getAttributes();
      NamingEnumeration<? extends Attribute> ne = attrs.getAll();
      ne = attrs.getAll();
      while (ne.hasMore())
      {
        Attribute attr = (Attribute)ne.next();
@@ -776,9 +795,16 @@
        // We have the members list
        NamingEnumeration<?> ae = attr.getAll();
        while (ae.hasMore())
        try
        {
          result.add((String)ae.next());
          while (ae.hasMore())
          {
            result.add((String)ae.next());
          }
        }
        finally
        {
          handleCloseNamingEnumeration(ae);
        }
        break;
      }
@@ -797,8 +823,13 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(srs);
      handleCloseNamingEnumeration(ne);
    }
    return result;
      }
  }
  /**
   * Returns a set containing the servers that are registered in the
@@ -814,9 +845,9 @@
  {
    Set<Map<ServerProperty,Object>> result =
      new HashSet<Map<ServerProperty,Object>>();
    NamingEnumeration<SearchResult> ne = null;
    try
    {
      NamingEnumeration<SearchResult> ne;
      SearchControls sc = new SearchControls();
      sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
@@ -829,6 +860,7 @@
        Object keyId = properties.get(ServerProperty.INSTANCE_KEY_ID);
        if (keyId != null)
        {
          NamingEnumeration<SearchResult> ne2 = null;
          try
          {
            SearchControls sc1 = new SearchControls();
@@ -836,8 +868,7 @@
            final String attrIDs[] = { "ds-cfg-public-key-certificate;binary" };
            sc1.setReturningAttributes(attrIDs);
            NamingEnumeration<SearchResult> ne2 = dirContext.search(
                getInstanceKeysContainerDN(),
            ne2 = dirContext.search(getInstanceKeysContainerDN(),
                "(ds-cfg-key-id="+keyId+")", sc);
            if (ne2.hasMore())
            {
@@ -856,6 +887,10 @@
          {
            LOG.log(Level.WARNING, "Could not find public key for "+properties);
          }
          finally
          {
            handleCloseNamingEnumeration(ne2);
          }
        }
        result.add(properties);
      }
@@ -875,6 +910,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(ne);
    }
    return result;
  }
@@ -1038,9 +1077,9 @@
  {
    Set<Map<ServerGroupProperty, Object>> result =
      new HashSet<Map<ServerGroupProperty, Object>>();
    NamingEnumeration<SearchResult> ne = null;
    try
    {
      NamingEnumeration<SearchResult> ne;
      SearchControls sc = new SearchControls();
      sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
@@ -1069,6 +1108,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(ne);
    }
    return result;
  }
@@ -1083,8 +1126,8 @@
  {
    Set<Map<AdministratorProperty, Object>> result =
      new HashSet<Map<AdministratorProperty, Object>>();
    NamingEnumeration<SearchResult> ne = null;
    try {
      NamingEnumeration<SearchResult> ne;
      SearchControls sc = new SearchControls();
      sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
@@ -1119,6 +1162,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(ne);
    }
    return result;
  }
@@ -1339,6 +1386,8 @@
    boolean updatePassword = adminProperties
    .containsKey(AdministratorProperty.PASSWORD);
    NamingEnumeration<?> currentPrivileges = null;
    try
    {
      // Entry renaming
@@ -1355,7 +1404,6 @@
      // if modification includes 'privilege', we have to get first the
      // current privileges list.
      NamingEnumeration<?> currentPrivileges = null;
      if (adminProperties.containsKey(AdministratorProperty.PRIVILEGE))
      {
        SearchControls sc = new SearchControls();
@@ -1370,6 +1418,7 @@
        .getAll();
      }
      // Replace properties, if needed.
      if (adminProperties.size() > 1)
      {
@@ -1395,6 +1444,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(currentPrivileges);
    }
  }
  /**
@@ -1795,9 +1848,16 @@
          Set<String> set = new HashSet<String>();
          NamingEnumeration<?> ae = attr.getAll();
          while (ae.hasMore())
          try
          {
            set.add((String)ae.next());
            while (ae.hasMore())
            {
              set.add((String)ae.next());
            }
          }
          finally
          {
            ae.close();
          }
          value = set;
        }
@@ -1863,9 +1923,16 @@
          {
            Set<String> set = new HashSet<String>();
            NamingEnumeration<?> ae = attr.getAll();
            while (ae.hasMore())
            try
            {
              set.add((String)ae.next());
              while (ae.hasMore())
              {
                set.add((String)ae.next());
              }
            }
            finally
            {
              ae.close();
            }
            value = set;
          }
@@ -1884,7 +1951,7 @@
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    return result;
      }
  }
  /**
@@ -1906,10 +1973,10 @@
    nameObj = nameFromDN(rdn);
    String dn = nameObj + "," + getAdministratorContainerDN();
    result.put(AdministratorProperty.ADMINISTRATOR_DN, dn);
    NamingEnumeration<? extends Attribute> ne = null;
    try
    {
      NamingEnumeration<? extends Attribute> ne = attrs.getAll();
      ne = attrs.getAll();
      while (ne.hasMore()) {
        Attribute attr = ne.next();
        String attrID = attr.getID();
@@ -1947,6 +2014,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, x);
    }
    finally
    {
      handleCloseNamingEnumeration(ne);
    }
    return result;
  }
@@ -2430,13 +2501,24 @@
      searchControls.setReturningAttributes(attrIDs);
      NamingEnumeration<SearchResult> keyEntries
      = dirContext.search(baseDN, searchFilter, searchControls);
      while (keyEntries.hasMore()) {
        final SearchResult entry = keyEntries.next();
        final Attributes attrs = entry.getAttributes();
        final Attribute keyIDAttr = attrs.get(attrIDs[0]);
        final Attribute keyCertAttr = attrs.get(attrIDs[1]);
        if (null == keyIDAttr || null == keyCertAttr) continue; // schema viol.
        certificateMap.put((String)keyIDAttr.get(), (byte[])keyCertAttr.get());
      try
      {
        while (keyEntries.hasMore()) {
          final SearchResult entry = keyEntries.next();
          final Attributes attrs = entry.getAttributes();
          final Attribute keyIDAttr = attrs.get(attrIDs[0]);
          final Attribute keyCertAttr = attrs.get(attrIDs[1]);
          if (null == keyIDAttr || null == keyCertAttr)
          {
            continue;// schema viol.
          }
          certificateMap.put((String)keyIDAttr.get(),
              (byte[])keyCertAttr.get());
        }
      }
      finally
      {
        keyEntries.close();
      }
    }
    catch (NamingException x) {
@@ -2581,4 +2663,21 @@
      }
    }
  }
  private void handleCloseNamingEnumeration(NamingEnumeration<?> ne)
  throws ADSContextException
  {
    if (ne != null)
    {
      try
      {
        ne.close();
      }
      catch (NamingException ex)
      {
        throw new ADSContextException(
            ADSContextException.ErrorType.ERROR_UNEXPECTED, ex);
      }
    }
  }
}
opends/src/ads/org/opends/admin/ads/ADSContextHelper.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2007-2009 Sun Microsystems, Inc.
 *      Copyright 2007-2010 Sun Microsystems, Inc.
 */
package org.opends.admin.ads;
@@ -232,10 +232,11 @@
    /* search for public-key certificate entry in ADS DIT */
    final String attrIDs[] = { "ds-cfg-key-id" };
    NamingEnumeration<SearchResult> results = null;
    try
    {
      final NamingEnumeration<SearchResult> results = ctx.search(
          ADSContext.getInstanceKeysContainerDN(), keyAttrs, attrIDs);
     results = ctx.search(ADSContext.getInstanceKeysContainerDN(), keyAttrs,
         attrIDs);
      if (results.hasMore()) {
        final Attribute keyIdAttr =
          results.next().getAttributes().get(attrIDs[0]);
@@ -287,6 +288,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, cme);
    }
    finally
    {
      handleCloseNamingEnumeration(results);
    }
  }
@@ -324,9 +329,10 @@
    /* search for public-key certificate entry in ADS DIT */
    final String attrIDs[] = { "ds-cfg-key-id" };
    NamingEnumeration<SearchResult> results = null;
    try
    {
      final NamingEnumeration<SearchResult> results = ctx.search(
      results = ctx.search(
          ADSContext.getInstanceKeysContainerDN(), keyAttrs, attrIDs);
      if (results.hasMore()) {
        SearchResult res = results.next();
@@ -341,6 +347,10 @@
      throw new ADSContextException(
          ADSContextException.ErrorType.ERROR_UNEXPECTED, ne);
    }
    finally
    {
      handleCloseNamingEnumeration(results);
    }
  }
  /**
@@ -364,4 +374,21 @@
  {
    return ConfigConstants.ATTR_CRYPTO_KEY_COMPROMISED_TIME;
  }
  private void handleCloseNamingEnumeration(NamingEnumeration<?> ne)
  throws ADSContextException
  {
    if (ne != null)
    {
      try
      {
        ne.close();
      }
      catch (NamingException ex)
      {
        throw new ADSContextException(
            ADSContextException.ErrorType.ERROR_UNEXPECTED, ex);
      }
    }
  }
}
opends/src/ads/org/opends/admin/ads/ServerDescriptor.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2007-2009 Sun Microsystems, Inc.
 *      Copyright 2007-2010 Sun Microsystems, Inc.
 */
package org.opends.admin.ads;
@@ -335,9 +335,9 @@
    if (!serverProperties.isEmpty())
    {
      ArrayList s = (ArrayList)serverProperties.get(
      ArrayList<?> s = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAP_ENABLED);
      ArrayList p = (ArrayList)serverProperties.get(
      ArrayList<?> p = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAP_PORT);
      if (s != null)
      {
@@ -372,9 +372,9 @@
    if (!serverProperties.isEmpty())
    {
      ArrayList s = (ArrayList)serverProperties.get(
      ArrayList<?> s = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAPS_ENABLED);
      ArrayList p = (ArrayList)serverProperties.get(
      ArrayList<?> p = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAPS_PORT);
      if (s != null)
      {
@@ -409,9 +409,9 @@
    if (!serverProperties.isEmpty())
    {
      ArrayList s = (ArrayList)serverProperties.get(
      ArrayList<?> s = (ArrayList<?>)serverProperties.get(
          ServerProperty.ADMIN_ENABLED);
      ArrayList p = (ArrayList)serverProperties.get(
      ArrayList<?> p = (ArrayList<?>)serverProperties.get(
          ServerProperty.ADMIN_PORT);
      if (s != null)
      {
@@ -439,9 +439,9 @@
  public List<Integer> getEnabledAdministrationPorts()
  {
    List<Integer> ports = new ArrayList<Integer>(1);
    ArrayList s = (ArrayList)serverProperties.get(
    ArrayList<?> s = (ArrayList<?>)serverProperties.get(
        ServerProperty.ADMIN_ENABLED);
    ArrayList p = (ArrayList)serverProperties.get(
    ArrayList<?> p = (ArrayList<?>)serverProperties.get(
        ServerProperty.ADMIN_PORT);
    if (s != null)
    {
@@ -471,9 +471,9 @@
    if (!serverProperties.isEmpty())
    {
      ArrayList s = (ArrayList)serverProperties.get(
      ArrayList<?> s = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAP_ENABLED);
      ArrayList p = (ArrayList)serverProperties.get(
      ArrayList<?> p = (ArrayList<?>)serverProperties.get(
          ServerProperty.LDAP_PORT);
      if (s != null)
      {
@@ -488,9 +488,9 @@
      }
      if (securePreferred)
      {
        s = (ArrayList)serverProperties.get(
        s = (ArrayList<?>)serverProperties.get(
            ServerProperty.ADMIN_ENABLED);
        p = (ArrayList)serverProperties.get(ServerProperty.ADMIN_PORT);
        p = (ArrayList<?>)serverProperties.get(ServerProperty.ADMIN_PORT);
        if (s != null)
        {
          for (int i=0; i<s.size(); i++)
@@ -587,7 +587,7 @@
          ServerProperty.ADMIN_ENABLED
      };
      for (ServerProperty prop : props) {
        ArrayList s = (ArrayList) serverProperties.get(prop);
        ArrayList<?> s = (ArrayList<?>) serverProperties.get(prop);
        for (Object o : s) {
          buf.append(":").append(o);
        }
@@ -694,8 +694,8 @@
    for (int i=0; i<sProps.length; i++)
    {
      ArrayList s = (ArrayList)serverProperties.get(sProps[i][0]);
      ArrayList p = (ArrayList)serverProperties.get(sProps[i][1]);
      ArrayList<?> s = (ArrayList<?>)serverProperties.get(sProps[i][0]);
      ArrayList<?> p = (ArrayList<?>)serverProperties.get(sProps[i][1]);
      if (s != null)
      {
        int port = -1;
@@ -723,7 +723,7 @@
      }
    }
    ArrayList array = (ArrayList)serverProperties.get(
    ArrayList<?> array = (ArrayList<?>)serverProperties.get(
        ServerProperty.STARTTLS_ENABLED);
    boolean startTLSEnabled = false;
    if ((array != null) && !array.isEmpty())
@@ -802,44 +802,53 @@
    String filter = "(objectclass=ds-cfg-ldap-connection-handler)";
    LdapName jndiName = new LdapName("cn=config");
    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> listeners =
      ctx.search(jndiName, filter, ctls);
    ArrayList<Integer> ldapPorts = new ArrayList<Integer>();
    ArrayList<Integer> ldapsPorts = new ArrayList<Integer>();
    ArrayList<Boolean> ldapEnabled = new ArrayList<Boolean>();
    ArrayList<Boolean> ldapsEnabled = new ArrayList<Boolean>();
    ArrayList<Boolean> startTLSEnabled = new ArrayList<Boolean>();
    desc.serverProperties.put(ServerProperty.LDAP_PORT, ldapPorts);
    desc.serverProperties.put(ServerProperty.LDAPS_PORT, ldapsPorts);
    desc.serverProperties.put(ServerProperty.LDAP_ENABLED, ldapEnabled);
    desc.serverProperties.put(ServerProperty.LDAPS_ENABLED, ldapsEnabled);
    desc.serverProperties.put(ServerProperty.STARTTLS_ENABLED, startTLSEnabled);
    while(listeners.hasMore())
    try
    {
      SearchResult sr = (SearchResult)listeners.next();
      ArrayList<Integer> ldapPorts = new ArrayList<Integer>();
      ArrayList<Integer> ldapsPorts = new ArrayList<Integer>();
      ArrayList<Boolean> ldapEnabled = new ArrayList<Boolean>();
      ArrayList<Boolean> ldapsEnabled = new ArrayList<Boolean>();
      ArrayList<Boolean> startTLSEnabled = new ArrayList<Boolean>();
      String port = getFirstValue(sr, "ds-cfg-listen-port");
      desc.serverProperties.put(ServerProperty.LDAP_PORT, ldapPorts);
      desc.serverProperties.put(ServerProperty.LDAPS_PORT, ldapsPorts);
      desc.serverProperties.put(ServerProperty.LDAP_ENABLED, ldapEnabled);
      desc.serverProperties.put(ServerProperty.LDAPS_ENABLED, ldapsEnabled);
      desc.serverProperties.put(ServerProperty.STARTTLS_ENABLED,
          startTLSEnabled);
      boolean isSecure = "true".equalsIgnoreCase(
          getFirstValue(sr, "ds-cfg-use-ssl"));
      while(listeners.hasMore())
      {
        SearchResult sr = listeners.next();
      boolean enabled = "true".equalsIgnoreCase(
        String port = getFirstValue(sr, "ds-cfg-listen-port");
        boolean isSecure = "true".equalsIgnoreCase(
            getFirstValue(sr, "ds-cfg-use-ssl"));
        boolean enabled = "true".equalsIgnoreCase(
            getFirstValue(sr, "ds-cfg-enabled"));
      if (isSecure)
      {
        ldapsPorts.add(new Integer(port));
        ldapsEnabled.add(enabled);
        if (isSecure)
        {
          ldapsPorts.add(new Integer(port));
          ldapsEnabled.add(enabled);
        }
        else
        {
          ldapPorts.add(new Integer(port));
          ldapEnabled.add(enabled);
          enabled = "true".equalsIgnoreCase(
              getFirstValue(sr, "ds-cfg-allow-start-tls"));
          startTLSEnabled.add(enabled);
        }
      }
      else
      {
        ldapPorts.add(new Integer(port));
        ldapEnabled.add(enabled);
        enabled = "true".equalsIgnoreCase(
            getFirstValue(sr, "ds-cfg-allow-start-tls"));
        startTLSEnabled.add(enabled);
      }
    }
    finally
    {
      listeners.close();
    }
  }
@@ -857,28 +866,36 @@
    String filter = "(objectclass=ds-cfg-administration-connector)";
    LdapName jndiName = new LdapName("cn=config");
    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> listeners =
      ctx.search(jndiName, filter, ctls);
    Integer adminConnectorPort = null;
    // we should have a single administration connector
    if (listeners.hasMore()) {
      SearchResult sr = (SearchResult) listeners.next();
      String port = getFirstValue(sr, "ds-cfg-listen-port");
      adminConnectorPort = new Integer(port);
    }
    // Even if we have a single port, use an array to be consistent with
    // other protocols.
    ArrayList<Integer> adminPorts = new ArrayList<Integer>();
    ArrayList<Boolean> adminEnabled = new ArrayList<Boolean>();
    if (adminConnectorPort != null)
    try
    {
      adminPorts.add(adminConnectorPort);
      adminEnabled.add(Boolean.TRUE);
      Integer adminConnectorPort = null;
      // we should have a single administration connector
      if (listeners.hasMore()) {
        SearchResult sr = listeners.next();
        String port = getFirstValue(sr, "ds-cfg-listen-port");
        adminConnectorPort = new Integer(port);
      }
      // Even if we have a single port, use an array to be consistent with
      // other protocols.
      ArrayList<Integer> adminPorts = new ArrayList<Integer>();
      ArrayList<Boolean> adminEnabled = new ArrayList<Boolean>();
      if (adminConnectorPort != null)
      {
        adminPorts.add(adminConnectorPort);
        adminEnabled.add(Boolean.TRUE);
      }
      desc.serverProperties.put(ServerProperty.ADMIN_PORT, adminPorts);
      desc.serverProperties.put(ServerProperty.ADMIN_ENABLED, adminEnabled);
    }
    desc.serverProperties.put(ServerProperty.ADMIN_PORT, adminPorts);
    desc.serverProperties.put(ServerProperty.ADMIN_ENABLED, adminEnabled);
    finally
    {
      listeners.close();
    }
  }
  private static void updateJmxConfiguration(ServerDescriptor desc,
@@ -898,7 +915,8 @@
    String filter = "(objectclass=ds-cfg-jmx-connection-handler)";
    LdapName jndiName = new LdapName("cn=config");
    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> listeners =
      ctx.search(jndiName, filter, ctls);
    ArrayList<Integer> jmxPorts = new ArrayList<Integer>();
    ArrayList<Integer> jmxsPorts = new ArrayList<Integer>();
@@ -910,27 +928,34 @@
    desc.serverProperties.put(ServerProperty.JMX_ENABLED, jmxEnabled);
    desc.serverProperties.put(ServerProperty.JMXS_ENABLED, jmxsEnabled);
    while(listeners.hasMore())
    try
    {
      SearchResult sr = (SearchResult)listeners.next();
      while(listeners.hasMore())
      {
        SearchResult sr = listeners.next();
      String port = getFirstValue(sr, "ds-cfg-listen-port");
        String port = getFirstValue(sr, "ds-cfg-listen-port");
      boolean isSecure = "true".equalsIgnoreCase(
          getFirstValue(sr, "ds-cfg-use-ssl"));
        boolean isSecure = "true".equalsIgnoreCase(
            getFirstValue(sr, "ds-cfg-use-ssl"));
      boolean enabled = "true".equalsIgnoreCase(
        boolean enabled = "true".equalsIgnoreCase(
            getFirstValue(sr, "ds-cfg-enabled"));
      if (isSecure)
      {
        jmxsPorts.add(new Integer(port));
        jmxsEnabled.add(enabled);
        if (isSecure)
        {
          jmxsPorts.add(new Integer(port));
          jmxsEnabled.add(enabled);
        }
        else
        {
          jmxPorts.add(new Integer(port));
          jmxEnabled.add(enabled);
        }
      }
      else
      {
        jmxPorts.add(new Integer(port));
        jmxEnabled.add(enabled);
      }
    }
    finally
    {
      listeners.close();
    }
  }
@@ -952,82 +977,90 @@
    String filter = "(objectclass=ds-cfg-backend)";
    LdapName jndiName = new LdapName("cn=config");
    NamingEnumeration databases = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> databases =
      ctx.search(jndiName, filter, ctls);
    while(databases.hasMore())
    try
    {
      SearchResult sr = (SearchResult)databases.next();
      String id = getFirstValue(sr, "ds-cfg-backend-id");
      if (!isConfigBackend(id) || isSchemaBackend(id))
      while(databases.hasMore())
      {
        Set<String> baseDns = getValues(sr, "ds-cfg-base-dn");
        SearchResult sr = databases.next();
        Set<String> entries;
        if (cacheFilter.searchMonitoringInformation())
        {
          entries = getBaseDNEntryCount(ctx, id);
        }
        else
        {
          entries = new HashSet<String>();
        }
        String id = getFirstValue(sr, "ds-cfg-backend-id");
        Set<ReplicaDescriptor> replicas = desc.getReplicas();
        for (String baseDn : baseDns)
        if (!isConfigBackend(id) || isSchemaBackend(id))
        {
          boolean addReplica = cacheFilter.searchAllBaseDNs();
          if (!addReplica)
          Set<String> baseDns = getValues(sr, "ds-cfg-base-dn");
          Set<String> entries;
          if (cacheFilter.searchMonitoringInformation())
          {
            for (String dn : cacheFilter.getBaseDNsToSearch())
            {
              addReplica = Utils.areDnsEqual(dn, baseDn);
              if (addReplica)
              {
                break;
              }
            }
            entries = getBaseDNEntryCount(ctx, id);
          }
          if(addReplica)
          else
          {
            SuffixDescriptor suffix = new SuffixDescriptor();
            suffix.setDN(baseDn);
            ReplicaDescriptor replica = new ReplicaDescriptor();
            replica.setServer(desc);
            replica.setBackendName(id);
            replicas.add(replica);
            HashSet<ReplicaDescriptor> r = new HashSet<ReplicaDescriptor>();
            r.add(replica);
            suffix.setReplicas(r);
            replica.setSuffix(suffix);
            int nEntries = -1;
            for (String s : entries)
            entries = new HashSet<String>();
          }
          Set<ReplicaDescriptor> replicas = desc.getReplicas();
          for (String baseDn : baseDns)
          {
            boolean addReplica = cacheFilter.searchAllBaseDNs();
            if (!addReplica)
            {
              int index = s.indexOf(" ");
              if (index != -1)
              for (String dn : cacheFilter.getBaseDNsToSearch())
              {
                String dn = s.substring(index + 1);
                if (Utils.areDnsEqual(baseDn, dn))
                addReplica = Utils.areDnsEqual(dn, baseDn);
                if (addReplica)
                {
                  try
                  {
                    nEntries = Integer.parseInt(s.substring(0, index));
                  }
                  catch (Throwable t)
                  {
                    /* Ignore */
                  }
                  break;
                }
              }
            }
            replica.setEntries(nEntries);
            if(addReplica)
            {
              SuffixDescriptor suffix = new SuffixDescriptor();
              suffix.setDN(baseDn);
              ReplicaDescriptor replica = new ReplicaDescriptor();
              replica.setServer(desc);
              replica.setBackendName(id);
              replicas.add(replica);
              HashSet<ReplicaDescriptor> r = new HashSet<ReplicaDescriptor>();
              r.add(replica);
              suffix.setReplicas(r);
              replica.setSuffix(suffix);
              int nEntries = -1;
              for (String s : entries)
              {
                int index = s.indexOf(" ");
                if (index != -1)
                {
                  String dn = s.substring(index + 1);
                  if (Utils.areDnsEqual(baseDn, dn))
                  {
                    try
                    {
                      nEntries = Integer.parseInt(s.substring(0, index));
                    }
                    catch (Throwable t)
                    {
                      /* Ignore */
                    }
                    break;
                  }
                }
              }
              replica.setEntries(nEntries);
            }
          }
          desc.setReplicas(replicas);
        }
        desc.setReplicas(replicas);
      }
    }
    finally
    {
      databases.close();
    }
  }
  private static void updateReplication(ServerDescriptor desc,
@@ -1045,14 +1078,15 @@
    LdapName jndiName = new LdapName(
      "cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config");
    NamingEnumeration<SearchResult> syncProviders = null;
    try
    {
      NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
      syncProviders = ctx.search(jndiName, filter, ctls);
      while(syncProviders.hasMore())
      {
        SearchResult sr = (SearchResult)syncProviders.next();
        SearchResult sr = syncProviders.next();
        if ("true".equalsIgnoreCase(getFirstValue(sr,
          "ds-cfg-enabled")))
@@ -1065,6 +1099,13 @@
    {
      /* ignore */
    }
    finally
    {
      if (syncProviders != null)
      {
        syncProviders.close();
      }
    }
    desc.serverProperties.put(ServerProperty.IS_REPLICATION_ENABLED,
        replicationEnabled ? Boolean.TRUE : Boolean.FALSE);
@@ -1085,13 +1126,14 @@
      jndiName = new LdapName(
      "cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config");
      syncProviders = null;
      try
      {
        NamingEnumeration syncProviders = ctx.search(jndiName, filter, ctls);
        syncProviders = ctx.search(jndiName, filter, ctls);
        while(syncProviders.hasMore())
        {
          SearchResult sr = (SearchResult)syncProviders.next();
          SearchResult sr = syncProviders.next();
          int id = Integer.parseInt(
              getFirstValue(sr, "ds-cfg-server-id"));
@@ -1123,6 +1165,13 @@
      {
        /* ignore */
      }
      finally
      {
        if (syncProviders != null)
        {
          syncProviders.close();
        }
      }
    }
    ctls = new SearchControls();
@@ -1139,13 +1188,14 @@
    desc.serverProperties.put(ServerProperty.IS_REPLICATION_SERVER,
        Boolean.FALSE);
    NamingEnumeration<SearchResult> entries = null;
    try
    {
      NamingEnumeration entries = ctx.search(jndiName, filter, ctls);
      entries = ctx.search(jndiName, filter, ctls);
      while(entries.hasMore())
      while (entries.hasMore())
      {
        SearchResult sr = (SearchResult)entries.next();
        SearchResult sr = entries.next();
        desc.serverProperties.put(ServerProperty.IS_REPLICATION_SERVER,
            Boolean.TRUE);
@@ -1172,6 +1222,13 @@
    {
      /* ignore */
    }
    finally
    {
      if (entries != null)
      {
        entries.close();
      }
    }
    boolean replicationSecure = false;
    if (replicationEnabled)
@@ -1184,14 +1241,21 @@
      jndiName = new LdapName("cn=Crypto Manager,cn=config");
      NamingEnumeration entries = ctx.search(jndiName, filter, ctls);
      entries = ctx.search(jndiName, filter, ctls);
      while(entries.hasMore())
      try
      {
        SearchResult sr = (SearchResult)entries.next();
        while (entries.hasMore())
        {
          SearchResult sr = entries.next();
        String v = getFirstValue(sr, "ds-cfg-ssl-encryption");
        replicationSecure = "true".equalsIgnoreCase(v);
          String v = getFirstValue(sr, "ds-cfg-ssl-encryption");
          replicationSecure = "true".equalsIgnoreCase(v);
        }
      }
      finally
      {
        entries.close();
      }
    }
    desc.serverProperties.put(ServerProperty.IS_REPLICATION_SECURE,
@@ -1269,14 +1333,22 @@
    String filter = "|(objectclass=*)(objectclass=ldapsubentry)";
    LdapName jndiName = new LdapName("cn=schema");
    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> listeners =
      ctx.search(jndiName, filter, ctls);
    while(listeners.hasMore())
    try
    {
      SearchResult sr = (SearchResult)listeners.next();
      while(listeners.hasMore())
      {
        SearchResult sr = listeners.next();
      desc.serverProperties.put(ServerProperty.SCHEMA_GENERATION_ID,
          getFirstValue(sr, "ds-sync-generation-id"));
        desc.serverProperties.put(ServerProperty.SCHEMA_GENERATION_ID,
            getFirstValue(sr, "ds-sync-generation-id"));
      }
    }
    finally
    {
      listeners.close();
    }
  }
@@ -1346,10 +1418,17 @@
      NamingEnumeration<SearchResult> ne = ctx.search(TRUSTSTORE_DN,
          "(objectclass=ds-cfg-instance-key)", sc);
      ArrayList<String> dnsToDelete = new ArrayList<String>();
      while (ne.hasMore())
      try
      {
        SearchResult sr = ne.next();
        dnsToDelete.add(sr.getName()+","+TRUSTSTORE_DN);
        while (ne.hasMore())
        {
          SearchResult sr = ne.next();
          dnsToDelete.add(sr.getName()+","+TRUSTSTORE_DN);
        }
      }
      finally
      {
        ne.close();
      }
      for (String dn : dnsToDelete)
      {
@@ -1384,13 +1463,21 @@
    String filter = "(ds-backend-id="+backendID+")";
    LdapName jndiName = new LdapName("cn=monitor");
    NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
    NamingEnumeration<SearchResult> listeners =
      ctx.search(jndiName, filter, ctls);
    while(listeners.hasMore())
    try
    {
      SearchResult sr = (SearchResult)listeners.next();
      while(listeners.hasMore())
      {
        SearchResult sr = listeners.next();
      v.addAll(getValues(sr, "ds-base-dn-entry-count"));
        v.addAll(getValues(sr, "ds-base-dn-entry-count"));
      }
    }
    finally
    {
      listeners.close();
    }
    return v;
  }
opends/src/ads/org/opends/admin/ads/TopologyCache.java
@@ -475,13 +475,13 @@
    LdapName jndiName = new LdapName("cn=monitor");
    InitialLdapContext ctx = null;
    NamingEnumeration<SearchResult> monitorEntries = null;
    try
    {
      ServerLoader loader =
        getServerLoader(replicationServer.getAdsProperties());
      ctx = loader.createContext();
      NamingEnumeration<SearchResult> monitorEntries =
        ctx.search(jndiName, filter, ctls);
      monitorEntries = ctx.search(jndiName, filter, ctls);
      while(monitorEntries.hasMore())
      {
@@ -537,6 +537,10 @@
    }
    finally
    {
      if (monitorEntries != null)
      {
        monitorEntries.close();
      }
      if (ctx != null)
      {
        ctx.close();
opends/src/guitools/org/opends/guitools/controlpanel/browser/NodeRefresher.java
@@ -349,10 +349,17 @@
    NamingEnumeration<SearchResult> s = ctx.search(new LdapName(node.getDN()),
              controller.getFilter(),
              ctls);
    if (!s.hasMoreElements())
    try
    {
      throw new NameNotFoundException("Entry "+node.getDN()+
          " does not verify filter "+controller.getFilter());
      if (!s.hasMoreElements())
      {
        throw new NameNotFoundException("Entry "+node.getDN()+
            " does not verify filter "+controller.getFilter());
      }
    }
    finally
    {
      s.close();
    }
  }
@@ -372,10 +379,17 @@
    NamingEnumeration<SearchResult> s = ctx.search(new LdapName(dn),
              controller.getFilter(),
              ctls);
    if (!s.hasMoreElements())
    try
    {
      throw new NameNotFoundException("Entry "+dn+
          " does not verify filter "+controller.getFilter());
      if (!s.hasMoreElements())
      {
        throw new NameNotFoundException("Entry "+dn+
            " does not verify filter "+controller.getFilter());
      }
    }
    finally
    {
      s.close();
    }
  }
@@ -402,11 +416,18 @@
      NamingEnumeration<SearchResult> s = ctx.search(new LdapName(node.getDN()),
                controller.getObjectSearchFilter(),
                ctls);
      if (s.hasMore())
      try
      {
        localEntry = s.next();
        localEntry.setName(node.getDN());
        if (s.hasMore())
        {
          localEntry = s.next();
          localEntry.setName(node.getDN());
        }
      }
      finally
      {
        s.close();
      }
      if (localEntry == null) {
        /* Not enough rights to read the entry or the entry simply does not
@@ -511,23 +532,30 @@
        NamingEnumeration<SearchResult> sr = ctx.search(remoteDn,
            filter,
            ctls);
        if (sr.hasMore())
        try
        {
          entry = sr.next();
          String name;
          if (entry.getName().length() == 0)
          if (sr.hasMore())
          {
            name = remoteDn;
            entry = sr.next();
            String name;
            if (entry.getName().length() == 0)
            {
              name = remoteDn;
            }
            else
            {
              name = unquoteRelativeName(entry.getName())+","+remoteDn;
            }
            entry.setName(name);
          }
          else
          {
            name = unquoteRelativeName(entry.getName())+","+remoteDn;
            throw new NameNotFoundException();
          }
          entry.setName(name);
        }
        else
        finally
        {
          throw new NameNotFoundException();
          sr.close();
        }
        throwAbandonIfNeeded(null);
      }
@@ -660,6 +688,17 @@
      if (ctx != null) {
        controller.releaseLDAPConnection(ctx);
      }
      if (searchResults != null)
      {
        try
        {
          searchResults.close();
        }
        catch (NamingException x)
        {
          throwAbandonIfNeeded(x);
        }
      }
    }
  }
@@ -731,124 +770,131 @@
                controller.getChildSearchFilter(),
                ctls);
      while (entries.hasMore())
      try
      {
        SearchResult r = entries.next();
        String name;
        if (r.getName().length() == 0)
        while (entries.hasMore())
        {
          continue;
        }
        else
        {
          name = unquoteRelativeName(r.getName())+","+parentDn;
        }
        boolean add = false;
        if (useCustomFilter())
        {
          // Check that is an inmediate child: use a faster method by just
          // comparing the number of components.
          DN dn = null;
          try
          SearchResult r = entries.next();
          String name;
          if (r.getName().length() == 0)
          {
            dn = DN.decode(name);
            add = dn.getNumComponents() == parentComponents + 1;
            continue;
          }
          catch (Throwable t)
          else
          {
            throw new RuntimeException("Error decoding dns: "+t, t);
            name = unquoteRelativeName(r.getName())+","+parentDn;
          }
          if (!add)
          boolean add = false;
          if (useCustomFilter())
          {
            // Is not a direct child.  Check if the parent has been added,
            // if it is the case, do not add the parent.  If is not the case,
            // search for the parent and add it.
            RDN[] rdns = new RDN[parentComponents + 1];
            int diff = dn.getNumComponents() - rdns.length;
            for (int i=0; i < rdns.length; i++)
            // Check that is an inmediate child: use a faster method by just
            // comparing the number of components.
            DN dn = null;
            try
            {
              rdns[i] = dn.getRDN(i + diff);
              dn = DN.decode(name);
              add = dn.getNumComponents() == parentComponents + 1;
            }
            final DN parentToAddDN = new DN(rdns);
            boolean mustAddParent = true;
            for (SearchResult addedEntry : childEntries)
            catch (Throwable t)
            {
              try
              throw new RuntimeException("Error decoding dns: "+t, t);
            }
            if (!add)
            {
              // Is not a direct child.  Check if the parent has been added,
              // if it is the case, do not add the parent.  If is not the case,
              // search for the parent and add it.
              RDN[] rdns = new RDN[parentComponents + 1];
              int diff = dn.getNumComponents() - rdns.length;
              for (int i=0; i < rdns.length; i++)
              {
                DN addedDN = DN.decode(addedEntry.getName());
                if (addedDN.equals(parentToAddDN))
                rdns[i] = dn.getRDN(i + diff);
              }
              final DN parentToAddDN = new DN(rdns);
              boolean mustAddParent = true;
              for (SearchResult addedEntry : childEntries)
              {
                try
                {
                  mustAddParent = false;
                  break;
                  DN addedDN = DN.decode(addedEntry.getName());
                  if (addedDN.equals(parentToAddDN))
                  {
                    mustAddParent = false;
                    break;
                  }
                }
                catch (Throwable t)
                {
                  throw new RuntimeException("Error decoding dn: "+
                      addedEntry.getName()+" . "+t, t);
                }
              }
              catch (Throwable t)
              if (mustAddParent)
              {
                throw new RuntimeException("Error decoding dn: "+
                    addedEntry.getName()+" . "+t, t);
              }
            }
            if (mustAddParent)
            {
              final boolean resultValue[] = {true};
              // Check the children added to the tree
              try
              {
                SwingUtilities.invokeAndWait(new Runnable()
                final boolean resultValue[] = {true};
                // Check the children added to the tree
                try
                {
                  public void run()
                  SwingUtilities.invokeAndWait(new Runnable()
                  {
                    for (int i=0; i<getNode().getChildCount(); i++)
                    public void run()
                    {
                      BasicNode node = (BasicNode)getNode().getChildAt(i);
                      try
                      for (int i=0; i<getNode().getChildCount(); i++)
                      {
                        DN dn = DN.decode(node.getDN());
                        if (dn.equals(parentToAddDN))
                        BasicNode node = (BasicNode)getNode().getChildAt(i);
                        try
                        {
                          resultValue[0] = false;
                          break;
                          DN dn = DN.decode(node.getDN());
                          if (dn.equals(parentToAddDN))
                          {
                            resultValue[0] = false;
                            break;
                          }
                        }
                        catch (Throwable t)
                        {
                          throw new RuntimeException("Error decoding dn: "+
                              node.getDN()+" . "+t, t);
                        }
                      }
                      catch (Throwable t)
                      {
                        throw new RuntimeException("Error decoding dn: "+
                            node.getDN()+" . "+t, t);
                      }
                    }
                  }
                });
                  });
                }
                catch (Throwable t)
                {
                  // Ignore
                }
                mustAddParent = resultValue[0];
              }
              catch (Throwable t)
              if (mustAddParent)
              {
                // Ignore
                SearchResult parentResult = searchManuallyEntry(ctx,
                    parentToAddDN.toString());
                childEntries.add(parentResult);
              }
              mustAddParent = resultValue[0];
            }
            if (mustAddParent)
            {
              SearchResult parentResult = searchManuallyEntry(ctx,
                  parentToAddDN.toString());
              childEntries.add(parentResult);
            }
          }
        }
        else
        {
          add = true;
        }
        if (add)
        {
          r.setName(name);
          childEntries.add(r);
          // Time to time we update the display
          if (childEntries.size() >= 20) {
            changeStateTo(State.SEARCHING_CHILDREN);
            childEntries.clear();
          else
          {
            add = true;
          }
          if (add)
          {
            r.setName(name);
            childEntries.add(r);
            // Time to time we update the display
            if (childEntries.size() >= 20) {
              changeStateTo(State.SEARCHING_CHILDREN);
              childEntries.clear();
            }
          }
          throwAbandonIfNeeded(null);
        }
        throwAbandonIfNeeded(null);
      }
      finally
      {
        entries.close();
      }
    }
    catch (SizeLimitExceededException slee)
@@ -886,10 +932,17 @@
              controller.getObjectSearchFilter(),
              ctls);
    while (entries.hasMore())
    try
    {
      sr = entries.next();
      sr.setName(dn);
      while (entries.hasMore())
      {
        sr = entries.next();
        sr.setName(dn);
      }
    }
    finally
    {
      entries.close();
    }
    return sr;
  }
opends/src/guitools/org/opends/guitools/controlpanel/datamodel/CustomSearchResult.java
@@ -135,20 +135,27 @@
    if (attrs != null)
    {
      NamingEnumeration<?> en = attrs.getAll();
      while (en.hasMore()) {
        Attribute attr = (Attribute)en.next();
        String attrName = attr.getID();
        attrNames.add(attrName);
        List<Object> values = new ArrayList<Object>();
        for (int i=0; i<attr.size(); i++)
        {
          Object v = attr.get(i);
          if (!"".equals(v.toString()))
      try
      {
        while (en.hasMore()) {
          Attribute attr = (Attribute)en.next();
          String attrName = attr.getID();
          attrNames.add(attrName);
          List<Object> values = new ArrayList<Object>();
          for (int i=0; i<attr.size(); i++)
          {
            values.add(v);
            Object v = attr.get(i);
            if (!"".equals(v.toString()))
            {
              values.add(v);
            }
          }
          attributes.put(attrName.toLowerCase(), values);
        }
        attributes.put(attrName.toLowerCase(), values);
      }
      finally
      {
        en.close();
      }
    }
    toString = calculateToString();
opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.guitools.controlpanel.task;
@@ -259,50 +259,57 @@
          Utilities.getJNDIName(groupDn.toString()),
          filter, ctls);
    while (result.hasMore())
    try
    {
      SearchResult sr = result.next();
      Set<String> values =
        ConnectionUtils.getValues(sr, ServerConstants.ATTR_UNIQUE_MEMBER);
      Set<String> dnsToAdd = new LinkedHashSet<String>();
      if (values != null)
      while (result.hasMore())
      {
        for (DN newDn : dns)
        SearchResult sr = result.next();
        Set<String> values =
          ConnectionUtils.getValues(sr, ServerConstants.ATTR_UNIQUE_MEMBER);
        Set<String> dnsToAdd = new LinkedHashSet<String>();
        if (values != null)
        {
          boolean found = false;
          for (String dn : values)
          for (DN newDn : dns)
          {
            if (Utilities.areDnsEqual(dn, newDn.toString()))
            boolean found = false;
            for (String dn : values)
            {
              found = true;
              break;
              if (Utilities.areDnsEqual(dn, newDn.toString()))
              {
                found = true;
                break;
              }
            }
            if (!found)
            {
              dnsToAdd.add(newDn.toString());
            }
          }
          if (!found)
        }
        else
        {
          for (DN newDn : dns)
          {
            dnsToAdd.add(newDn.toString());
          }
        }
      }
      else
      {
        for (DN newDn : dns)
        if (dnsToAdd.size() > 0)
        {
          dnsToAdd.add(newDn.toString());
          Attribute attribute =
            new BasicAttribute(ServerConstants.ATTR_UNIQUE_MEMBER);
          for (String dn : dnsToAdd)
          {
            attribute.add(dn);
          }
          modifications.add(new ModificationItem(
              DirContext.ADD_ATTRIBUTE,
              attribute));
        }
      }
      if (dnsToAdd.size() > 0)
      {
        Attribute attribute =
          new BasicAttribute(ServerConstants.ATTR_UNIQUE_MEMBER);
        for (String dn : dnsToAdd)
        {
          attribute.add(dn);
        }
        modifications.add(new ModificationItem(
            DirContext.ADD_ATTRIBUTE,
            attribute));
      }
    }
    finally
    {
      result.close();
    }
    return modifications;
  }
opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteEntryTask.java
@@ -367,17 +367,24 @@
        ctx.search(Utilities.getJNDIName(dnToRemove.toString()), filter, ctls);
      DN entryDNFound = dnToRemove;
      while (entryDNs.hasMore())
      try
      {
        SearchResult sr = entryDNs.next();
        if (!sr.getName().equals(""))
        while (entryDNs.hasMore())
        {
          CustomSearchResult res =
            new CustomSearchResult(sr, dnToRemove.toString());
          entryDNFound = DN.decode(res.getDN());
          deleteSubtreeRecursively(ctx, entryDNFound, null, toNotify);
          SearchResult sr = entryDNs.next();
          if (!sr.getName().equals(""))
          {
            CustomSearchResult res =
              new CustomSearchResult(sr, dnToRemove.toString());
            entryDNFound = DN.decode(res.getDN());
            deleteSubtreeRecursively(ctx, entryDNFound, null, toNotify);
          }
        }
      }
      finally
      {
        entryDNs.close();
      }
    } catch (NameNotFoundException nnfe) {
      // The entry is not there: it has been removed
opends/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
@@ -649,20 +649,20 @@
    }
    boolean hasSuperior = false;
    Set<ObjectClass> newSuperiors = new LinkedHashSet<ObjectClass>();
    for(ObjectClass sup : ocToDelete.getSuperiorClasses())
    for (ObjectClass sup : ocToDelete.getSuperiorClasses())
    {
      boolean isFound = false;
      for(ObjectClass oc: providedOcsToDelete)
      for (ObjectClass oc: providedOcsToDelete)
      {
        if(sup.equals(oc))
        {
          hasSuperior = true;
          isFound = true;
          newSuperiors.add(getNewSuperior(oc));
          newSuperiors.addAll(getNewSuperiors(oc));
          break;
        }
      }
      if(!isFound)
      if (!isFound)
      {
        //Use the same super if not found in the list.
        newSuperiors.add(sup);
@@ -715,22 +715,29 @@
  }
  private ObjectClass getNewSuperior(ObjectClass currentSup)
  private Set<ObjectClass> getNewSuperiors(ObjectClass currentSup)
  {
    if(currentSup.getSuperiorClasses() == null ||
            currentSup.getSuperiorClasses().isEmpty())
     {
       return currentSup;
     }
     if(providedOcsToDelete.contains(currentSup))
     {
      for(ObjectClass o : currentSup.getSuperiorClasses())
    Set<ObjectClass> newSuperiors = new LinkedHashSet<ObjectClass>();
    if (currentSup.getSuperiorClasses() == null ||
        currentSup.getSuperiorClasses().isEmpty())
    {
      // Nothing to do
    }
    else
    {
      for (ObjectClass o : currentSup.getSuperiorClasses())
      {
       return getNewSuperior(o);
        if (providedOcsToDelete.contains(o))
        {
          newSuperiors.addAll(getNewSuperiors(o));
        }
        else
        {
          newSuperiors.add(o);
        }
      }
     }
     return null;
    }
    return newSuperiors;
  }
opends/src/guitools/org/opends/guitools/controlpanel/task/ResetUserPasswordTask.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.guitools.controlpanel.task;
@@ -294,19 +294,26 @@
        NamingEnumeration<SearchResult> entries =
          ctx.search(Utilities.getJNDIName(dn.toString()), filter, ctls);
        while (entries.hasMore())
        try
        {
          SearchResult sr = entries.next();
          Set<String> dns = ConnectionUtils.getValues(sr, attrName);
          for (String sDn : dns)
          while (entries.hasMore())
          {
            if (bindDN.equals(DN.decode(sDn)))
            SearchResult sr = entries.next();
            Set<String> dns = ConnectionUtils.getValues(sr, attrName);
            for (String sDn : dns)
            {
              isBoundAs = true;
              break;
              if (bindDN.equals(DN.decode(sDn)))
              {
                isBoundAs = true;
                break;
              }
            }
          }
        }
        finally
        {
          entries.close();
        }
      }
      catch (Throwable t)
      {
opends/src/guitools/org/opends/guitools/controlpanel/ui/LocalOrRemotePanel.java
@@ -958,7 +958,15 @@
      NamingEnumeration<SearchResult> en =
        ctx.search("cn=Version,cn=monitor", "objectclass=*",
          searchControls);
      SearchResult sr = en.next();
      SearchResult sr = null;
      try
      {
        sr = en.next();
      }
      finally
      {
        en.close();
      }
      CustomSearchResult csr =
        new CustomSearchResult(sr, "cn=Version,cn=monitor");
opends/src/guitools/org/opends/guitools/controlpanel/util/ConfigFromDirContext.java
@@ -826,10 +826,17 @@
      javaVersion = null;
      numberConnections = -1;
      while (monitorEntries.hasMore())
      try
      {
        SearchResult sr = monitorEntries.next();
        handleMonitoringSearchResult(sr, "cn=monitor");
        while (monitorEntries.hasMore())
        {
          SearchResult sr = monitorEntries.next();
          handleMonitoringSearchResult(sr, "cn=monitor");
        }
      }
      finally
      {
        monitorEntries.close();
      }
    }
    catch (NamingException ne)
@@ -858,10 +865,17 @@
      NamingEnumeration<SearchResult> taskEntries =
        ctx.search(jndiName, filter, ctls);
      while (taskEntries.hasMore())
      try
      {
        SearchResult sr = taskEntries.next();
        handleTaskSearchResult(sr, ConfigConstants.DN_TASK_ROOT, ts);
        while (taskEntries.hasMore())
        {
          SearchResult sr = taskEntries.next();
          handleTaskSearchResult(sr, ConfigConstants.DN_TASK_ROOT, ts);
        }
      }
      finally
      {
        taskEntries.close();
      }
    }
    catch (NamingException ne)
opends/src/guitools/org/opends/guitools/controlpanel/util/LDAPEntryReader.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.guitools.controlpanel.util;
@@ -72,6 +72,7 @@
  public CustomSearchResult processBackgroundTask() throws Throwable
  {
    isOver = false;
    NamingEnumeration<SearchResult> en = null;
    try
    {
      SearchControls controls = new SearchControls();
@@ -82,8 +83,7 @@
      controls.setSearchScope(SearchControls.OBJECT_SCOPE);
      final String filter = "(|(objectclass=*)(objectclass=ldapsubentry))";
      NamingEnumeration<SearchResult> en =
        ctx.search(Utilities.getJNDIName(dn), filter, controls);
      en = ctx.search(Utilities.getJNDIName(dn), filter, controls);
      SearchResult sr = en.next();
@@ -95,6 +95,10 @@
      {
        isOver = true;
      }
      if (en != null)
      {
        en.close();
      }
    }
  }
opends/src/guitools/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
@@ -93,7 +93,15 @@
      ctx.search(ConfigConstants.DN_DEFAULT_SCHEMA_ROOT,
          filter,
          searchControls);
    SearchResult sr = srs.next();
    SearchResult sr = null;
    try
    {
      sr = srs.next();
    }
    finally
    {
      srs.close();
    }
    CustomSearchResult csr = new CustomSearchResult(sr,
        ConfigConstants.DN_DEFAULT_SCHEMA_ROOT);
opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -4595,8 +4595,15 @@
      {
        NamingEnumeration<SearchResult> res =
          ctx.search(dn, filter, searchControls);
        SearchResult sr = res.next();
        SearchResult sr = null;
        try
        {
          sr = res.next();
        }
        finally
        {
          res.close();
        }
        // Get the number of entries that have been handled and
        // a percentage...
        Message msg;
@@ -4890,7 +4897,15 @@
      {
        NamingEnumeration<SearchResult> res =
          ctx.search(dn, filter, searchControls);
        SearchResult sr = res.next();
        SearchResult sr = null;
        try
        {
          sr = res.next();
        }
        finally
        {
          res.close();
        }
        String logMsg = getFirstValue(sr, "ds-task-log-message");
        if (logMsg != null)
        {
opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -1754,19 +1754,26 @@
      LdapName jndiName = new LdapName("cn=monitor");
      NamingEnumeration<?> listeners = ctx.search(jndiName, filter, ctls);
      while (listeners.hasMore())
      try
      {
        SearchResult sr = (SearchResult)listeners.next();
        while (listeners.hasMore())
        {
          SearchResult sr = (SearchResult)listeners.next();
        v = getFirstValue(sr, "currentTime");
          v = getFirstValue(sr, "currentTime");
        TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
          TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
        SimpleDateFormat formatter =
             new SimpleDateFormat("yyyyMMddHHmmss'Z'");
        formatter.setTimeZone(utcTimeZone);
          SimpleDateFormat formatter =
            new SimpleDateFormat("yyyyMMddHHmmss'Z'");
          formatter.setTimeZone(utcTimeZone);
        time = formatter.parse(v).getTime();
          time = formatter.parse(v).getTime();
        }
      }
      finally
      {
        listeners.close();
      }
    }
    catch (Throwable t)
opends/src/server/org/opends/server/admin/client/ldap/JNDIDirContextAdaptor.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 */
package org.opends.server.admin.client.ldap;
@@ -235,8 +235,15 @@
    try {
      NamingEnumeration<SearchResult> results = dirContext.search(dn, filter,
          controls);
      if (results.hasMore()) {
        return true;
      try
      {
        if (results.hasMore()) {
          return true;
        }
      }
      finally
      {
        results.close();
      }
    } catch (NameNotFoundException e) {
      // Fall through - entry not found.
@@ -262,11 +269,18 @@
    List<LdapName> children = new LinkedList<LdapName>();
    NamingEnumeration<SearchResult> results = dirContext.search(dn, filter,
        controls);
    while (results.hasMore()) {
      SearchResult sr = results.next();
      LdapName child = new LdapName(dn.getRdns());
      child.add(new Rdn(sr.getName()));
      children.add(child);
    try
    {
      while (results.hasMore()) {
        SearchResult sr = results.next();
        LdapName child = new LdapName(dn.getRdns());
        child.add(new Rdn(sr.getName()));
        children.add(child);
      }
    }
    finally
    {
      results.close();
    }
    return children;
opends/src/server/org/opends/server/tools/dsreplication/ReplicationCliMain.java
@@ -7745,7 +7745,15 @@
      {
        NamingEnumeration<SearchResult> res =
          ctx.search(dn, filter, searchControls);
        SearchResult sr = res.next();
        SearchResult sr = null;
        try
        {
          sr = res.next();
        }
        finally
        {
          res.close();
        }
        String logMsg = getFirstValue(sr, "ds-task-log-message");
        if (logMsg != null)
        {
@@ -7898,7 +7906,15 @@
      {
        NamingEnumeration<SearchResult> res =
          ctx.search(dn, filter, searchControls);
        SearchResult sr = res.next();
        SearchResult sr = null;
        try
        {
          sr = res.next();
        }
        finally
        {
          res.close();
        }
        // Get the number of entries that have been handled and
        // a percentage...