From 7d09dc3ceefdc6b30cfa9dfed6d094e1eb6328f8 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 02 Dec 2013 13:11:24 +0000
Subject: [PATCH] Front-port fix for OPENDJ-1079 for OpenDJ 3: OpenDJ UpgradeCli adds HTTP connection handler, which breaks Tomcat6 when OpenDJ is an embeddedDS

---
 opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java |  114 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 61 insertions(+), 53 deletions(-)

diff --git a/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java b/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
index 4938211..60ee882 100644
--- a/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
+++ b/opendj-admin/src/main/java/org/opends/server/admin/ClassPropertyDefinition.java
@@ -23,6 +23,7 @@
  *
  *
  *      Copyright 2008 Sun Microsystems, Inc.
+ *      Portions copyright 2013 ForgeRock AS.
  */
 
 package org.opends.server.admin;
@@ -73,22 +74,26 @@
         public final void addInstanceOf(String className) {
             ensureNotNull(className);
 
-            // Do some basic checks to make sure the string representation
-            // is valid.
+            /*
+             * Do some basic checks to make sure the string representation is
+             * valid.
+             */
             String value = className.trim();
             if (!value.matches(CLASS_RE)) {
                 throw new IllegalArgumentException("\"" + value + "\" is not a valid Java class name");
             }
 
-            // If possible try and load the class in order to perform
-            // additional
-            // validation.
+            /*
+             * If possible try and load the class in order to perform additional
+             * validation.
+             */
             if (isAllowClassValidation()) {
-                // Check that the class can be loaded so that validation can
-                // be
-                // performed.
+                /*
+                 * Check that the class can be loaded so that validation can be
+                 * performed.
+                 */
                 try {
-                    loadClass(value);
+                    loadClass(value, true);
                 } catch (ClassNotFoundException e) {
                     // TODO: can we do something better here?
                     throw new RuntimeException(e);
@@ -114,8 +119,9 @@
     // Regular expression for validating class names.
     private static final String CLASS_RE = "^([A-Za-z][A-Za-z0-9_]*\\.)*[A-Za-z][A-Za-z0-9_]*(\\$[A-Za-z0-9_]+)*$";
 
-    // Flag indicating whether class property values should be
-    // validated.
+    /*
+     * Flag indicating whether class property values should be validated.
+     */
     private static boolean allowClassValidation = true;
 
     /**
@@ -160,8 +166,10 @@
     }
 
     // Load a named class.
-    private static Class<?> loadClass(String className) throws ClassNotFoundException, LinkageError {
-        return Class.forName(className, true, ClassLoaderProvider.getInstance().getClassLoader());
+    private static Class<?> loadClass(String className, boolean initialize)
+            throws ClassNotFoundException, LinkageError {
+        return Class.forName(className, initialize, ClassLoaderProvider.getInstance()
+                .getClassLoader());
     }
 
     // List of interfaces which property values must implement.
@@ -202,7 +210,7 @@
         try {
             validateValue(value);
         } catch (IllegalPropertyValueException e) {
-            throw new IllegalPropertyValueStringException(this, value);
+            throw new IllegalPropertyValueStringException(this, value, e.getCause());
         }
 
         return value;
@@ -244,7 +252,7 @@
 
         // Make sure that the named class is valid.
         validateClassName(className);
-        Class<?> theClass = validateClassInterfaces(className);
+        Class<?> theClass = validateClassInterfaces(className, true);
 
         // Cast it to the required type.
         return theClass.asSubclass(instanceOf);
@@ -270,52 +278,52 @@
         // Always make sure the name is a valid class name.
         validateClassName(value);
 
-        // If additional validation is enabled then attempt to load the
-        // class and
-        // check the interfaces that it implements/extends.
+        /*
+         * If additional validation is enabled then attempt to load the class
+         * and check the interfaces that it implements/extends.
+         */
         if (allowClassValidation) {
-            validateClassInterfaces(value);
+            validateClassInterfaces(value, false);
         }
     }
 
-    // Make sure that named class implements the interfaces named by
-    // this
-    // definition.
-    private Class<?> validateClassInterfaces(String className) throws IllegalPropertyValueException {
-        String nvalue = className.trim();
-
-        Class<?> theClass;
-        try {
-            theClass = loadClass(nvalue);
-        } catch (Exception e) {
-            // If the class cannot be loaded then it is an invalid value.
-            throw new IllegalPropertyValueException(this, className);
-        }
-
-        for (String i : instanceOfInterfaces) {
-            try {
-                Class<?> instanceOfClass = loadClass(i);
-
-                if (!instanceOfClass.isAssignableFrom(theClass)) {
-                    throw new IllegalPropertyValueException(this, className);
-                }
-            } catch (Exception e) {
-                // Should not happen because the class was validated when the
-                // property
-                // definition was constructed.
-                throw new IllegalPropertyValueException(this, className);
-            }
-        }
-
-        return theClass;
-    }
-
-    // Do some basic checks to make sure the string representation is
-    // valid.
+    /*
+     * Do some basic checks to make sure the string representation is valid.
+     */
     private void validateClassName(String className) throws IllegalPropertyValueException {
         String nvalue = className.trim();
         if (!nvalue.matches(CLASS_RE)) {
             throw new IllegalPropertyValueException(this, className);
         }
     }
+
+
+    /*
+     * Make sure that named class implements the interfaces named by this
+     * definition.
+     */
+    private Class<?> validateClassInterfaces(String className, boolean initialize)
+            throws IllegalPropertyValueException {
+        Class<?> theClass = loadClassForValidation(className, className, initialize);
+        for (String i : instanceOfInterfaces) {
+            Class<?> instanceOfClass = loadClassForValidation(className, i, initialize);
+            if (!instanceOfClass.isAssignableFrom(theClass)) {
+                throw new IllegalPropertyValueException(this, className);
+            }
+        }
+        return theClass;
+    }
+
+    private Class<?> loadClassForValidation(String componentClassName, String classToBeLoaded,
+            boolean initialize) {
+        try {
+            return loadClass(classToBeLoaded.trim(), initialize);
+        } catch (ClassNotFoundException e) {
+            // If the class cannot be loaded then it is an invalid value.
+            throw new IllegalPropertyValueException(this, componentClassName, e);
+        } catch (LinkageError e) {
+            // If the class cannot be initialized then it is an invalid value.
+            throw new IllegalPropertyValueException(this, componentClassName, e);
+        }
+    }
 }

--
Gitblit v1.10.0