From a091e85ec925fdb878303144f7b4f5e302e7c35f Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Fri, 21 Sep 2007 17:31:33 +0000
Subject: [PATCH] Fix for issues 2314 and 2238.

---
 opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromFile.java         |   24 +++
 opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java         |   16 ++
 opends/src/ads/org/opends/admin/ads/ADSContext.java                             |   10 +
 opends/src/guitools/org/opends/guitools/statuspanel/StatusCli.java              |   31 ++++
 opends/src/guitools/org/opends/guitools/statuspanel/BaseDNDescriptor.java       |  173 ++++++++++++++++++++++++++++
 opends/src/guitools/org/opends/guitools/statuspanel/ServerStatusDescriptor.java |   21 +++
 opends/src/guitools/org/opends/guitools/statuspanel/ui/DatabasesTableModel.java |    4 
 opends/src/guitools/org/opends/guitools/statuspanel/ListenerDescriptor.java     |    4 
 opends/src/guitools/org/opends/guitools/statuspanel/ui/StatusPanelDialog.java   |   39 ++++++
 opends/src/messages/messages/admin_tool.properties                              |    4 
 10 files changed, 314 insertions(+), 12 deletions(-)

diff --git a/opends/src/ads/org/opends/admin/ads/ADSContext.java b/opends/src/ads/org/opends/admin/ads/ADSContext.java
index 608433e..42fc739 100644
--- a/opends/src/ads/org/opends/admin/ads/ADSContext.java
+++ b/opends/src/ads/org/opends/admin/ads/ADSContext.java
@@ -1982,7 +1982,7 @@
     String ben = backendName ;
     if (backendName == null)
     {
-      ben = getBackendName() ;
+      ben = getDefaultBackendName() ;
     }
     helper.createAdministrationSuffix(getDirContext(), ben,
         getDbName(), getImportTemp());
@@ -1995,10 +1995,14 @@
   private void removeAdministrationSuffix() throws ADSContextException
   {
     ADSContextHelper helper = new ADSContextHelper();
-    helper.removeAdministrationSuffix(getDirContext(), getBackendName());
+    helper.removeAdministrationSuffix(getDirContext(), getDefaultBackendName());
   }
 
-  private static String getBackendName()
+  /**
+   * Returns the default backend name of the administration data.
+   * @return the default backend name of the administration data.
+   */
+  public static String getDefaultBackendName()
   {
     return "adminRoot";
   }
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/BaseDNDescriptor.java b/opends/src/guitools/org/opends/guitools/statuspanel/BaseDNDescriptor.java
index 08398dc..bf58266 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/BaseDNDescriptor.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/BaseDNDescriptor.java
@@ -27,7 +27,12 @@
 
 package org.opends.guitools.statuspanel;
 
+import java.io.UnsupportedEncodingException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 import org.opends.quicksetup.util.Utils;
+import org.opends.server.util.StaticUtils;
 
 /**
  * This class is used to represent a Base DN / Replica and is aimed to be
@@ -56,6 +61,10 @@
   private int ageOfOldestMissingChange;
   private Type type;
   private String baseDn;
+  private String unescapedDn;
+  private static final Logger LOG =
+    Logger.getLogger(BaseDNDescriptor.class.getName());
+
 
   /**
    * Constructor for this class.
@@ -73,6 +82,15 @@
     this.type = type;
     this.ageOfOldestMissingChange = ageOfOldestMissingChange;
     this.missingChanges = missingChanges;
+    try
+    {
+      this.unescapedDn = unescapeUtf8(baseDn);
+    }
+    catch (Throwable t)
+    {
+      this.unescapedDn = baseDn;
+      LOG.log(Level.WARNING, "Error unescaping dn: "+baseDn, t);
+    }
   }
 
   /**
@@ -85,6 +103,17 @@
   }
 
   /**
+   * Return the String DN associated with the base DN with unescaped UTF-8
+   * characters.
+   * @return the String DN associated with the base DN with unescaped UTF-8
+   * characters.
+   */
+  public String getUnescapedDn()
+  {
+    return unescapedDn;
+  }
+
+  /**
    * {@inheritDoc}
    */
   public boolean equals(Object v)
@@ -191,4 +220,148 @@
   {
     this.db = db;
   }
+
+  private String unescapeUtf8(String v) throws UnsupportedEncodingException
+  {
+    byte[] stringBytes = v.getBytes("UTF-8");
+    byte[] decodedBytes = new byte[stringBytes.length];
+    int pos = 0;
+    for (int i = 0; i < stringBytes.length; i++)
+    {
+      if ((stringBytes[i] == '\\') && (i + 2 < stringBytes.length) &&
+          StaticUtils.isHexDigit(stringBytes[i+1]) &&
+          StaticUtils.isHexDigit(stringBytes[i+2]))
+      {
+        // Convert hex-encoded UTF-8 to 16-bit chars.
+        byte b;
+
+        byte escapedByte1 = stringBytes[++i];
+        switch (escapedByte1)
+        {
+          case '0':
+            b = (byte) 0x00;
+            break;
+          case '1':
+            b = (byte) 0x10;
+            break;
+          case '2':
+            b = (byte) 0x20;
+            break;
+          case '3':
+            b = (byte) 0x30;
+            break;
+          case '4':
+            b = (byte) 0x40;
+            break;
+          case '5':
+            b = (byte) 0x50;
+            break;
+          case '6':
+            b = (byte) 0x60;
+            break;
+          case '7':
+            b = (byte) 0x70;
+            break;
+          case '8':
+            b = (byte) 0x80;
+            break;
+          case '9':
+            b = (byte) 0x90;
+            break;
+          case 'a':
+          case 'A':
+            b = (byte) 0xA0;
+            break;
+          case 'b':
+          case 'B':
+            b = (byte) 0xB0;
+            break;
+          case 'c':
+          case 'C':
+            b = (byte) 0xC0;
+            break;
+          case 'd':
+          case 'D':
+            b = (byte) 0xD0;
+            break;
+          case 'e':
+          case 'E':
+            b = (byte) 0xE0;
+            break;
+          case 'f':
+          case 'F':
+            b = (byte) 0xF0;
+            break;
+          default:
+            throw new IllegalStateException("Unexpected byte: "+escapedByte1);
+        }
+
+        byte escapedByte2 = stringBytes[++i];
+        switch (escapedByte2)
+        {
+          case '0':
+            break;
+          case '1':
+            b |= 0x01;
+            break;
+          case '2':
+            b |= 0x02;
+            break;
+          case '3':
+            b |= 0x03;
+            break;
+          case '4':
+            b |= 0x04;
+            break;
+          case '5':
+            b |= 0x05;
+            break;
+          case '6':
+            b |= 0x06;
+            break;
+          case '7':
+            b |= 0x07;
+            break;
+          case '8':
+            b |= 0x08;
+            break;
+          case '9':
+            b |= 0x09;
+            break;
+          case 'a':
+          case 'A':
+            b |= 0x0A;
+            break;
+          case 'b':
+          case 'B':
+            b |= 0x0B;
+            break;
+          case 'c':
+          case 'C':
+            b |= 0x0C;
+            break;
+          case 'd':
+          case 'D':
+            b |= 0x0D;
+            break;
+          case 'e':
+          case 'E':
+            b |= 0x0E;
+            break;
+          case 'f':
+          case 'F':
+            b |= 0x0F;
+            break;
+          default:
+            throw new IllegalStateException("Unexpected byte: "+escapedByte2);
+        }
+
+        decodedBytes[pos++] = b;
+      }
+      else {
+        decodedBytes[pos++] = stringBytes[i];
+      }
+    }
+    return new String(decodedBytes, 0, pos, "UTF-8");
+  }
 }
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromFile.java b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromFile.java
index 93458b7..947c6a7 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromFile.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromFile.java
@@ -37,6 +37,7 @@
 import java.util.logging.Logger;
 
 import org.opends.server.core.DirectoryServer;
+import org.opends.admin.ads.ADSContext;
 import org.opends.messages.Message;
 import org.opends.server.util.LDIFException;
 import org.opends.server.util.LDIFReader;
@@ -64,6 +65,8 @@
     DirectoryServer.getObjectClass("ds-cfg-ldap-connection-handler", true);
   private final ObjectClass jmxConnectionHandlerOc =
     DirectoryServer.getObjectClass("ds-cfg-jmx-connection-handler", true);
+  private final ObjectClass ldifConnectionHandlerOc =
+    DirectoryServer.getObjectClass("ds-cfg-ldif-connection-handler", true);
   private final ObjectClass backendOc =
     DirectoryServer.getObjectClass("ds-cfg-backend", true);
   private final ObjectClass administrativeUserOc =
@@ -411,7 +414,10 @@
     "schema".equalsIgnoreCase(id) ||
     "config".equalsIgnoreCase(id) ||
     "monitor".equalsIgnoreCase(id) ||
-    "backup".equalsIgnoreCase(id);
+    "backup".equalsIgnoreCase(id) ||
+    ADSContext.getDefaultBackendName().equalsIgnoreCase(id) ||
+    "ads-truststore".equalsIgnoreCase(id) ||
+    "replicationchanges".equalsIgnoreCase(id);
   }
 
 
@@ -510,6 +516,22 @@
         state = ListenerDescriptor.State.DISABLED;
       }
     }
+    else if (entry.hasObjectClass(ldifConnectionHandlerOc))
+    {
+      addressPort = INFO_UNKNOWN_LABEL.get().toString();
+      protocol = ListenerDescriptor.Protocol.LDIF;
+      protocolDescription = INFO_LDIF_PROTOCOL_LABEL.get();
+      boolean enabled = "true".equalsIgnoreCase(
+          getFirstValue(entry, "ds-cfg-connection-handler-enabled"));
+      if (enabled)
+      {
+        state = ListenerDescriptor.State.ENABLED;
+      }
+      else
+      {
+        state = ListenerDescriptor.State.DISABLED;
+      }
+    }
     else
     {
       addressPort = INFO_UNKNOWN_LABEL.get().toString();
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
index b4bd6a3..7dfd675 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ConfigFromLDAP.java
@@ -870,6 +870,22 @@
         state = ListenerDescriptor.State.DISABLED;
       }
     }
+    else if (hasObjectClass(entry, "ds-cfg-ldif-connection-handler"))
+    {
+      addressPort = INFO_UNKNOWN_LABEL.get().toString();
+      protocol = ListenerDescriptor.Protocol.LDIF;
+      protocolDescription = INFO_LDIF_PROTOCOL_LABEL.get();
+      boolean enabled = "true".equalsIgnoreCase(
+          getFirstValue(entry, "ds-cfg-connection-handler-enabled"));
+      if (enabled)
+      {
+        state = ListenerDescriptor.State.ENABLED;
+      }
+      else
+      {
+        state = ListenerDescriptor.State.DISABLED;
+      }
+    }
     else
     {
       addressPort = INFO_UNKNOWN_LABEL.get().toString();
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ListenerDescriptor.java b/opends/src/guitools/org/opends/guitools/statuspanel/ListenerDescriptor.java
index a0793ed..a25351f 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ListenerDescriptor.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ListenerDescriptor.java
@@ -77,6 +77,10 @@
      */
     JMXS,
     /**
+     * LDIF protocol.
+     */
+    LDIF,
+    /**
      * Other protocol.
      */
     OTHER
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ServerStatusDescriptor.java b/opends/src/guitools/org/opends/guitools/statuspanel/ServerStatusDescriptor.java
index f86a4b7..8712493 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ServerStatusDescriptor.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ServerStatusDescriptor.java
@@ -49,6 +49,18 @@
   private Message errorMsg;
   private boolean isAuthenticated;
 
+  private static String hostName = "locahost";
+  static
+  {
+    try
+    {
+      hostName = java.net.InetAddress.getLocalHost().getHostName();
+    }
+    catch (Throwable t)
+    {
+    }
+  };
+
   /**
    * Enumeration indicating the status of the server.
    *
@@ -359,4 +371,13 @@
   {
     this.listeners = listeners;
   }
+
+  /**
+   * Returns the host name of the server.
+   * @return the host name of the server.
+   */
+  public String getHostname()
+  {
+    return hostName;
+  }
 }
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/StatusCli.java b/opends/src/guitools/org/opends/guitools/statuspanel/StatusCli.java
index 3450f60..77f1d55 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/StatusCli.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/StatusCli.java
@@ -34,6 +34,7 @@
 import java.net.URI;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.logging.Level;
@@ -570,6 +571,7 @@
       {
         INFO_SERVER_STATUS_LABEL.get(),
         INFO_CONNECTIONS_LABEL.get(),
+        INFO_HOSTNAME_LABEL.get(),
         INFO_ADMINISTRATIVE_USERS_LABEL.get(),
         INFO_INSTALLATION_PATH_LABEL.get(),
         INFO_OPENDS_VERSION_LABEL.get(),
@@ -589,6 +591,7 @@
 
     title = INFO_SERVER_DETAILS_TITLE.get();
     out.println(centerTitle(title));
+    writeHostnameContents(desc, labelWidth);
     writeAdministrativeUserContents(desc, labelWidth);
     writeInstallPathContents(desc, labelWidth);
     writeVersionContents(desc, labelWidth);
@@ -691,9 +694,22 @@
   }
 
   /**
+   * Writes the host name contents.
+   * @param desc the ServerStatusDescriptor object.
+   * @param maxLabelWidth the maximum label width of the left label.
+   */
+  private void writeHostnameContents(ServerStatusDescriptor desc,
+      int maxLabelWidth)
+  {
+    writeLabelValue(INFO_HOSTNAME_LABEL.get(),
+        Message.raw(desc.getHostname()),
+        maxLabelWidth);
+  }
+  /**
    * Writes the administrative user contents displaying with what is specified
    * in the provided ServerStatusDescriptor object.
    * @param desc the ServerStatusDescriptor object.
+   * @param maxLabelWidth the maximum label width of the left label.
    */
   private void writeAdministrativeUserContents(ServerStatusDescriptor desc,
       int maxLabelWidth)
@@ -748,6 +764,7 @@
    * Writes the install path contents displaying with what is specified in the
    * provided ServerStatusDescriptor object.
    * @param desc the ServerStatusDescriptor object.
+   * @param maxLabelWidth the maximum label width of the left label.
    */
   private void writeInstallPathContents(ServerStatusDescriptor desc,
       int maxLabelWidth)
@@ -778,6 +795,7 @@
    * the provided ServerStatusDescriptor object.
    * This method must be called from the event thread.
    * @param desc the ServerStatusDescriptor object.
+   * @param maxLabelWidth the maximum label width of the left label.
    */
   private void writeJavaVersionContents(ServerStatusDescriptor desc,
       int maxLabelWidth)
@@ -815,7 +833,16 @@
     Message title = INFO_LISTENERS_TITLE.get();
     out.println(centerTitle(title));
 
-    Set<ListenerDescriptor> listeners = desc.getListeners();
+    Set<ListenerDescriptor> allListeners = desc.getListeners();
+
+    Set<ListenerDescriptor> listeners = new LinkedHashSet<ListenerDescriptor>();
+    for (ListenerDescriptor listener: allListeners)
+    {
+      if (listener.getProtocol() != ListenerDescriptor.Protocol.LDIF)
+      {
+        listeners.add(listener);
+      }
+    }
 
     if (listeners.size() == 0)
     {
@@ -839,7 +866,7 @@
     else
     {
       ListenersTableModel listenersTableModel = new ListenersTableModel();
-      listenersTableModel.setData(desc.getListeners());
+      listenersTableModel.setData(listeners);
       writeTableModel(listenersTableModel, desc);
     }
   }
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ui/DatabasesTableModel.java b/opends/src/guitools/org/opends/guitools/statuspanel/ui/DatabasesTableModel.java
index f44d3d8..8d6039a 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ui/DatabasesTableModel.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ui/DatabasesTableModel.java
@@ -329,7 +329,7 @@
     BaseDNDescriptor desc = dataArray.get(row);
     if (col == 0)
     {
-      v = desc.getDn();
+      v = desc.getUnescapedDn();
     }
     else if (col == 1)
     {
@@ -433,7 +433,7 @@
 
   private int compareDns(BaseDNDescriptor desc1, BaseDNDescriptor desc2)
   {
-    return desc1.getDn().compareTo(desc2.getDn());
+    return desc1.getUnescapedDn().compareTo(desc2.getUnescapedDn());
   }
 
   private int compareRepl(BaseDNDescriptor desc1, BaseDNDescriptor desc2)
diff --git a/opends/src/guitools/org/opends/guitools/statuspanel/ui/StatusPanelDialog.java b/opends/src/guitools/org/opends/guitools/statuspanel/ui/StatusPanelDialog.java
index fb7554d..e1ea0e2 100644
--- a/opends/src/guitools/org/opends/guitools/statuspanel/ui/StatusPanelDialog.java
+++ b/opends/src/guitools/org/opends/guitools/statuspanel/ui/StatusPanelDialog.java
@@ -68,6 +68,7 @@
 
 import org.opends.guitools.statuspanel.BaseDNDescriptor;
 import org.opends.guitools.statuspanel.DatabaseDescriptor;
+import org.opends.guitools.statuspanel.ListenerDescriptor;
 import org.opends.guitools.statuspanel.ServerStatusDescriptor;
 import org.opends.guitools.statuspanel.event.StatusPanelButtonListener;
 import org.opends.quicksetup.event.MinimumSizeComponentListener;
@@ -99,6 +100,7 @@
 
   private JLabel lServerStatus;
   private JLabel lCurrentConnections;
+  private JLabel lHostname;
   private JLabel lAdministrativeUsers;
   private JLabel lInstallPath;
   private JLabel lOpenDSVersion;
@@ -189,6 +191,8 @@
 
     updateCurrentConnectionContents(desc);
 
+    updateHostnameContents(desc);
+
     updateAdministrativeUserContents(desc);
 
     updateInstallPathContents(desc);
@@ -645,6 +649,9 @@
     JLabel[] leftLabels =
       {
         UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
+            INFO_HOSTNAME_LABEL.get(),
+            UIFactory.TextStyle.PRIMARY_FIELD_VALID),
+        UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
             INFO_ADMINISTRATIVE_USERS_LABEL.get(),
             UIFactory.TextStyle.PRIMARY_FIELD_VALID),
         UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
@@ -658,6 +665,9 @@
             UIFactory.TextStyle.PRIMARY_FIELD_VALID)
       };
 
+    lHostname = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
+        NOT_AVAILABLE,
+        UIFactory.TextStyle.READ_ONLY);
     lAdministrativeUsers = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
         NOT_AVAILABLE, UIFactory.TextStyle.READ_ONLY);
     lInstallPath = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
@@ -669,7 +679,8 @@
 
     JLabel[] rightLabels =
       {
-        lAdministrativeUsers, lInstallPath, lOpenDSVersion, lJavaVersion
+        lHostname, lAdministrativeUsers, lInstallPath, lOpenDSVersion,
+        lJavaVersion
       };
 
 
@@ -942,7 +953,18 @@
   }
 
   /**
-   * Updates the admiinistrative user contents displaying with what is specified
+   * Updates the host name contents displaying with what is specified
+   * in the provided ServerStatusDescriptor object.
+   * This method must be called from the event thread.
+   * @param desc the ServerStatusDescriptor object.
+   */
+  private void updateHostnameContents(ServerStatusDescriptor desc)
+  {
+    lHostname.setText(desc.getHostname());
+  }
+
+  /**
+   * Updates the administrative user contents displaying with what is specified
    * in the provided ServerStatusDescriptor object.
    * This method must be called from the event thread.
    * @param desc the ServerStatusDescriptor object.
@@ -1049,7 +1071,17 @@
    */
   private void updateListenerContents(ServerStatusDescriptor desc)
   {
-    listenersTableModel.setData(desc.getListeners());
+    Set<ListenerDescriptor> allListeners = desc.getListeners();
+
+    Set<ListenerDescriptor> listeners = new LinkedHashSet<ListenerDescriptor>();
+    for (ListenerDescriptor listener: allListeners)
+    {
+      if (listener.getProtocol() != ListenerDescriptor.Protocol.LDIF)
+      {
+        listeners.add(listener);
+      }
+    }
+    listenersTableModel.setData(listeners);
 
     if (listenersTableModel.getRowCount() == 0)
     {
@@ -1092,6 +1124,7 @@
   {
     Set<BaseDNDescriptor> replicas = new HashSet<BaseDNDescriptor>();
     Set<DatabaseDescriptor> dbs = desc.getDatabases();
+
     for (DatabaseDescriptor db: dbs)
     {
       replicas.addAll(db.getBaseDns());
diff --git a/opends/src/messages/messages/admin_tool.properties b/opends/src/messages/messages/admin_tool.properties
index 0a9a88a..823a86d 100644
--- a/opends/src/messages/messages/admin_tool.properties
+++ b/opends/src/messages/messages/admin_tool.properties
@@ -47,6 +47,7 @@
 # word separator
 #
 INFO_ADDRESS_PORT_COLUMN=Address:Port
+INFO_HOSTNAME_LABEL=Host Name:
 INFO_ADMINISTRATIVE_USERS_LABEL=Administrative Users:
 INFO_AGE_OF_OLDEST_MISSING_CHANGE_COLUMN=<html>Age of Oldest<br>Missing \
  Change<br>(hh:mm:ss)
@@ -220,7 +221,8 @@
 INFO_JMX_SECURE_PROTOCOL_LABEL=JMX (Secure)
 INFO_LDAP_PROTOCOL_LABEL=LDAP
 INFO_LDAPS_PROTOCOL_LABEL=LDAPS
-INFO_LISTENERS_TITLE=Listener Ports
+INFO_LDIF_PROTOCOL_LABEL=LDIF
+INFO_LISTENERS_TITLE=Connection Handlers
 INFO_LOGIN_CANCEL_BUTTON_TOOLTIP=Close Login Dialog
 INFO_LOGIN_DIALOG_MSG=You must provide an Administrative User DN and password \
  to retrieve monitoring information.

--
Gitblit v1.10.0