From feb5d90ec016c99712f19c5485cf7633cd38f111 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 23 Mar 2007 14:26:04 +0000
Subject: [PATCH] Merge admin framework from config-prototype-branch onto trunk.

---
 opends/src/server/org/opends/server/core/DirectoryServer.java |  340 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 330 insertions(+), 10 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 90d031f..17ef39b 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -47,7 +47,8 @@
 import javax.management.MBeanServer;
 import javax.management.MBeanServerFactory;
 
-
+import org.opends.server.admin.ClassLoaderProvider;
+import org.opends.server.admin.std.server.PasswordValidatorCfg;
 import org.opends.server.api.*;
 import org.opends.server.api.plugin.PluginType;
 import org.opends.server.api.plugin.StartupPluginResult;
@@ -264,7 +265,9 @@
   // The set of password validators registered with the Directory Server, as a
   // mapping between the DN of the associated configuration entry and the
   // validator implementation.
-  private ConcurrentHashMap<DN,PasswordValidator> passwordValidators;
+  private ConcurrentHashMap<DN,
+               PasswordValidator<? extends PasswordValidatorCfg>>
+               passwordValidators;
 
   // The set of trust manager providers registered with the server.
   private ConcurrentHashMap<DN,TrustManagerProvider> trustManagerProviders;
@@ -593,7 +596,8 @@
     directoryServer.authPasswordStorageSchemes =
          new ConcurrentHashMap<String,PasswordStorageScheme>();
     directoryServer.passwordValidators =
-         new ConcurrentHashMap<DN,PasswordValidator>();
+         new ConcurrentHashMap<DN,
+              PasswordValidator<? extends PasswordValidatorCfg>>();
     directoryServer.accountStatusNotificationHandlers =
          new ConcurrentHashMap<DN,AccountStatusNotificationHandler>();
     directoryServer.rootDNs = new CopyOnWriteArraySet<DN>();
@@ -734,6 +738,10 @@
     pluginConfigManager = new PluginConfigManager();
 
 
+    // Make sure that administration framework definition classes are loaded.
+    ClassLoaderProvider.getInstance().enable();
+
+
     // If we have gotten here, then the configuration should be properly
     // bootstrapped.
     synchronized (directoryServer)
@@ -2490,7 +2498,13 @@
   {
     if (directoryServer.configHandler == null)
     {
-      String serverRoot = System.getenv(ENV_VAR_INSTANCE_ROOT);
+      String serverRoot = System.getProperty(PROPERTY_SERVER_ROOT);
+
+      if (serverRoot == null)
+      {
+        serverRoot = System.getenv(ENV_VAR_INSTANCE_ROOT);
+      }
+
       if (serverRoot != null)
       {
         return serverRoot;
@@ -3970,6 +3984,257 @@
     {
       mBean.addConfigurableComponent(component);
     }
+
+
+
+    // This is all code used to dynamically generate an admin definition from
+    // the configurable component.  We'll only generate it if the
+    // org.opends.server.dumpComponents property is set to "true".
+    String propValue = System.getProperty("org.opends.server.dumpComponents");
+    if ((propValue == null) || (! propValue.equals("true")))
+    {
+      return;
+    }
+
+    try
+    {
+      DN entryDN = component.getConfigurableComponentEntryDN();
+      ConfigEntry configEntry =
+           directoryServer.configHandler.getConfigEntry(entryDN);
+      ObjectClass structuralClass =
+           configEntry.getEntry().getStructuralObjectClass();
+      ObjectClass superiorClass = structuralClass.getSuperiorClass();
+
+      String baseName;
+      String primaryName = structuralClass.getPrimaryName();
+      if (primaryName.startsWith("ds-cfg-"))
+      {
+        baseName = primaryName.substring(7);
+      }
+      else
+      {
+        baseName = "___NAME___";
+      }
+
+
+      LinkedList<String> lines = new LinkedList<String>();
+      lines.add("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+      lines.add("<adm:managed-object name=\"" + baseName + "\" plural-name=\"" +
+                baseName + "s\"");
+      lines.add("  package=\"org.opends.server.admin.std\"");
+      lines.add("  xmlns:adm=\"http://www.opends.org/admin\"");
+      lines.add("  xmlns:ldap=\"http://www.opends.org/admin-ldap\"");
+      lines.add("  <adm:synopsis>");
+      lines.add("    ___SYNOPSIS___");
+      lines.add("  </adm:synopsis>");
+
+
+      // Write information about the object class.
+      lines.add("  <adm:profile name=\"ldap\">");
+      lines.add("    <ldap:object-class>");
+      lines.add("      <ldap:oid>" + structuralClass.getOID() + "</ldap:oid>");
+      lines.add("      <ldap:name>" + primaryName + "</ldap:name>");
+
+      if (superiorClass != null)
+      {
+        lines.add("      <ldap:superior>" + superiorClass.getNameOrOID() +
+                  "</ldap:superior>");
+      }
+
+      lines.add("    </ldap:object-class>");
+      lines.add("  </adm:profile>");
+
+
+      // Write information about all of the configuration attributes.
+      for (org.opends.server.config.ConfigAttribute attr :
+           component.getConfigurationAttributes())
+      {
+        if (attr instanceof org.opends.server.config.ReadOnlyConfigAttribute)
+        {
+          continue;
+        }
+
+        primaryName = attr.getName();
+        AttributeType type = getAttributeType(toLowerCase(primaryName), true);
+        if (primaryName.startsWith("ds-cfg-"))
+        {
+          baseName = primaryName.substring(7);
+        }
+        else
+        {
+          baseName = "___NAME___";
+        }
+
+        lines.add("  <adm:property name=\"" + baseName + "\" mandatory=\"" +
+                  String.valueOf(attr.isRequired()) + "\">");
+        lines.add("    <adm:synopsis>");
+        lines.add("      ___SYNOPSIS___");
+        lines.add("    </adm:synopsis>");
+        lines.add("    <adm:description>");
+
+        String description = attr.getDescription();
+        int startPos = 0;
+        while (startPos < description.length())
+        {
+          StringBuilder buffer = new StringBuilder();
+          buffer.append("      ");
+          int remaining = description.length() - startPos;
+          if (remaining <= 73)
+          {
+            buffer.append(description.substring(startPos));
+            startPos += remaining;
+          }
+          else
+          {
+            int endPos = startPos + 72;
+            while ((endPos > startPos) && (description.charAt(endPos) != ' '))
+            {
+              endPos--;
+            }
+            if (description.charAt(endPos) == ' ')
+            {
+              buffer.append(description.substring(startPos, endPos));
+              startPos = endPos + 1;
+            }
+            else
+            {
+              buffer.append(description.substring(startPos));
+              startPos += remaining;
+            }
+          }
+
+          lines.add(buffer.toString());
+        }
+
+        lines.add("    </adm:description>");
+        lines.add("    <adm:syntax>");
+
+        if (attr instanceof org.opends.server.config.BooleanConfigAttribute)
+        {
+          lines.add("      <adm:boolean />");
+        }
+        else if (attr instanceof org.opends.server.config.DNConfigAttribute)
+        {
+          lines.add("      <adm:dn />");
+        }
+        else if (attr instanceof
+                 org.opends.server.config.IntegerConfigAttribute)
+        {
+          org.opends.server.config.IntegerConfigAttribute intAttr =
+               (org.opends.server.config.IntegerConfigAttribute) attr;
+          String lineStr = "      <adm:integer ";
+          if (intAttr.hasLowerBound())
+          {
+            lineStr += " lower-limit=\"" + intAttr.getLowerBound() + "\" ";
+          }
+
+          if (intAttr.hasUpperBound())
+          {
+            lineStr += " upper-limit=\"" + intAttr.getUpperBound() + "\" ";
+          }
+
+          lineStr += "/>";
+          lines.add(lineStr);
+        }
+        else if (attr instanceof
+                 org.opends.server.config.IntegerWithUnitConfigAttribute)
+        {
+          lines.add("     <!-- ___INTEGER_WITH_UNIT_TYPE___ -->");
+          lines.add("      <adm:string />");
+        }
+        else if (attr instanceof
+                 org.opends.server.config.MultiChoiceConfigAttribute)
+        {
+          lines.add("      <adm:enumeration>");
+
+          org.opends.server.config.MultiChoiceConfigAttribute mcAttr =
+               (org.opends.server.config.MultiChoiceConfigAttribute) attr;
+          for (String allowedValue : mcAttr.allowedValues())
+          {
+            lines.add("        <adm:value name=\"" + allowedValue + "\">");
+            lines.add("          <adm:synopsis>");
+            lines.add("            ___SYNOPSIS___");
+            lines.add("          </adm:synopsis>");
+            lines.add("        </adm:value>");
+          }
+
+          lines.add("      </adm:enumeration>");
+        }
+        else if (attr instanceof
+                 org.opends.server.config.StringConfigAttribute)
+        {
+          lines.add("      <adm:string />");
+        }
+        else
+        {
+          lines.add("     <!-- ___UNKNOWN_CONFIG_ATTR_TYPE___ -->");
+          lines.add("      <adm:string />");
+        }
+
+        lines.add("    </adm:syntax>");
+        lines.add("    <adm:profile name=\"ldap\">");
+        lines.add("      <ldap:attribute>");
+        lines.add("        <ldap:oid>" + type.getOID() + "</ldap:oid>");
+        lines.add("        <ldap:name>" + primaryName + "</ldap:name>");
+        lines.add("      </ldap:attribute>");
+        lines.add("    </adm:profile>");
+        lines.add("  </adm:property>");
+      }
+
+      lines.add("</adm:managed-object>");
+
+
+      File parentDir = new File("/tmp/admin-framework");
+      if (! parentDir.exists())
+      {
+        parentDir.mkdirs();
+      }
+
+      String dnString = entryDN.toNormalizedString();
+      StringBuilder filename = new StringBuilder();
+      filename.append(parentDir.getAbsolutePath());
+      filename.append("/");
+      for (int i=0; i < dnString.length(); i++)
+      {
+        char c = dnString.charAt(i);
+        if (Character.isLetter(c) || Character.isDigit(c))
+        {
+          filename.append(c);
+        }
+        else
+        {
+          filename.append('_');
+        }
+      }
+      filename.append(".xml");
+
+      java.io.BufferedWriter bw =
+           new java.io.BufferedWriter(new java.io.FileWriter(
+                                               filename.toString()));
+      for (String line : lines)
+      {
+        bw.write(line);
+        bw.newLine();
+      }
+      bw.flush();
+      bw.close();
+
+      System.err.println();
+      System.err.println();
+      System.err.println("---------- Registered Configurable Component " +
+                         "----------");
+      for (String line : lines)
+      {
+        System.err.println(line);
+      }
+
+      System.err.println();
+      System.err.println();
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
   }
 
 
@@ -4282,7 +4547,10 @@
    * @return  The set of password validators that have been registered for use
    *          with the Directory Server.
    */
-  public static ConcurrentHashMap<DN,PasswordValidator> getPasswordValidators()
+  public static
+       ConcurrentHashMap<DN,
+            PasswordValidator<? extends PasswordValidatorCfg>>
+            getPasswordValidators()
   {
     return directoryServer.passwordValidators;
   }
@@ -4299,7 +4567,8 @@
    * @return  The requested password validator, or <CODE>null</CODE> if no such
    *          validator is defined.
    */
-  public static PasswordValidator getPasswordValidator(DN configEntryDN)
+  public static PasswordValidator<? extends PasswordValidatorCfg>
+                     getPasswordValidator(DN configEntryDN)
   {
     return directoryServer.passwordValidators.get(configEntryDN);
   }
@@ -4315,8 +4584,10 @@
    * @param  validator      The password validator to register with the
    *                        Directory Server.
    */
-  public static void registerPasswordValidator(DN configEntryDN,
-                                               PasswordValidator validator)
+  public static void
+       registerPasswordValidator(DN configEntryDN,
+            PasswordValidator<? extends PasswordValidatorCfg>
+            validator)
   {
     directoryServer.passwordValidators.put(configEntryDN, validator);
   }
@@ -6508,7 +6779,7 @@
       Class workQueueClass ;
       try
       {
-        workQueueClass = Class.forName(classAttr.activeValue());
+        workQueueClass = DirectoryServer.loadClass(classAttr.activeValue());
       }
       catch (Exception e)
       {
@@ -8435,6 +8706,56 @@
     return monitorRootDN.concat(rdn);
   }
 
+
+
+  /**
+   * Gets the class loader to be used with this directory server
+   * application.
+   * <p>
+   * The class loader will automatically load classes from plugins
+   * where required.
+   *
+   * @return Returns the class loader to be used with this directory
+   *         server application.
+   */
+  public static ClassLoader getClassLoader()
+  {
+    return ClassLoaderProvider.getInstance().getClassLoader();
+  }
+
+
+
+  /**
+   * Loads the named class using this directory server application's
+   * class loader.
+   * <p>
+   * This method provided as a convenience and is equivalent to
+   * calling:
+   *
+   * <pre>
+   * Class.forName(name, true, DirectoryServer.getClassLoader());
+   * </pre>
+   *
+   * @param name
+   *          The fully qualified name of the desired class.
+   * @return Returns the class object representing the desired class.
+   * @throws LinkageError
+   *           If the linkage fails.
+   * @throws ExceptionInInitializerError
+   *           If the initialization provoked by this method fails.
+   * @throws ClassNotFoundException
+   *           If the class cannot be located by the specified class
+   *           loader.
+   * @see Class#forName(String, boolean, ClassLoader)
+   */
+  public static Class<?> loadClass(String name) throws LinkageError,
+      ExceptionInInitializerError, ClassNotFoundException
+  {
+    return Class.forName(name, true, DirectoryServer.getClassLoader());
+  }
+
+
+
   /**
    * Returns the error code that we return when we are checking the startability
    * of the server.
@@ -8562,6 +8883,5 @@
     }
     return isRunningAsWindowsService;
   }
-
 }
 

--
Gitblit v1.10.0