jkf 2005/05/23 14:52:35 Modified: src/main/org/apache/tools/ant/taskdefs/email EmailTask.java src/main/org/apache/tools/ant Main.java src/main/org/apache/tools/ant/taskdefs/optional/javah JavahAdapterFactory.java src/main/org/apache/tools/ant/listener MailLogger.java src/main/org/apache/tools/ant/taskdefs/optional/script ScriptDef.java src/main/org/apache/tools/ant/util ClasspathUtils.java src/main/org/apache/tools/ant/taskdefs/rmic RmicAdapterFactory.java src/main/org/apache/tools/ant/taskdefs/optional/native2ascii Native2AsciiAdapterFactory.java src/main/org/apache/tools/ant/util/regexp RegexpMatcherFactory.java src/main/org/apache/tools/ant/taskdefs/compilers CompilerAdapterFactory.java Log: Improved the newInstance method in ClasspathUtils, and used this method from the places where newInstances are made and Throwable is caught. Revision Changes Path 1.31 +18 -11 ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java Index: EmailTask.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- EmailTask.java 2 Feb 2005 20:08:57 -0000 1.30 +++ EmailTask.java 23 May 2005 21:52:35 -0000 1.31 @@ -25,8 +25,10 @@ import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; +import org.apache.tools.ant.listener.MailLogger; import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.util.ClasspathUtils; /** * A task to send SMTP email. This is a refactoring of the SendMail and @@ -399,14 +401,16 @@ if (encoding.equals(MIME) || (encoding.equals(AUTO) && !autoFound)) { try { - mailer = (Mailer) Class.forName( - "org.apache.tools.ant.taskdefs.email.MimeMailer") - .newInstance(); + mailer = (Mailer) ClasspathUtils.newInstance( + "org.apache.tools.ant.taskdefs.email.MimeMailer", + EmailTask.class.getClassLoader(), Mailer.class); autoFound = true; log("Using MIME mail", Project.MSG_VERBOSE); - } catch (Throwable e) { - log("Failed to initialise MIME mail: " - + e.getMessage(), Project.MSG_WARN); + } catch (BuildException e) { + Throwable t = e.getCause() == null ? e : e.getCause(); + log("Failed to initialise MIME mail: " + t.getMessage(), + Project.MSG_WARN); + return; } } // SMTP auth only allowed with MIME mail @@ -423,13 +427,16 @@ if (encoding.equals(UU) || (encoding.equals(AUTO) && !autoFound)) { try { - mailer = - (Mailer) Class.forName("org.apache.tools.ant.taskdefs.email.UUMailer") - .newInstance(); + mailer = (Mailer) ClasspathUtils.newInstance( + "org.apache.tools.ant.taskdefs.email.UUMailer", + EmailTask.class.getClassLoader(), Mailer.class); autoFound = true; log("Using UU mail", Project.MSG_VERBOSE); - } catch (Throwable e) { - log("Failed to initialise UU mail", Project.MSG_WARN); + } catch (BuildException e) { + Throwable t = e.getCause() == null ? e : e.getCause(); + log("Failed to initialise UU mail: " + t.getMessage(), + Project.MSG_WARN); + return; } } // try plain format 1.119 +17 -35 ant/src/main/org/apache/tools/ant/Main.java Index: Main.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Main.java,v retrieving revision 1.118 retrieving revision 1.119 diff -u -r1.118 -r1.119 --- Main.java 13 May 2005 21:57:23 -0000 1.118 +++ Main.java 23 May 2005 21:52:35 -0000 1.119 @@ -29,6 +29,7 @@ import org.apache.tools.ant.input.DefaultInputHandler; import org.apache.tools.ant.input.InputHandler; import org.apache.tools.ant.launch.AntMain; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.FileUtils; @@ -698,17 +699,13 @@ for (int i = 0; i < listeners.size(); i++) { String className = (String) listeners.elementAt(i); - try { - BuildListener listener = - (BuildListener) Class.forName(className).newInstance(); - if (project != null) { - project.setProjectReference(listener); - } - project.addBuildListener(listener); - } catch (Throwable exc) { - throw new BuildException("Unable to instantiate listener " - + className, exc); + BuildListener listener = + (BuildListener) ClasspathUtils.newInstance(className, + Main.class.getClassLoader(), BuildListener.class); + if (project != null) { + project.setProjectReference(listener); } + project.addBuildListener(listener); } } @@ -725,22 +722,11 @@ if (inputHandlerClassname == null) { handler = new DefaultInputHandler(); } else { - try { - handler = (InputHandler) - (Class.forName(inputHandlerClassname).newInstance()); - if (project != null) { - project.setProjectReference(handler); - } - } catch (ClassCastException e) { - String msg = "The specified input handler class " - + inputHandlerClassname - + " does not implement the InputHandler interface"; - throw new BuildException(msg); - } catch (Exception e) { - String msg = "Unable to instantiate specified input handler " - + "class " + inputHandlerClassname + " : " - + e.getClass().getName(); - throw new BuildException(msg); + handler = (InputHandler) ClasspathUtils.newInstance( + inputHandlerClassname, Main.class.getClassLoader(), + InputHandler.class); + if (project != null) { + project.setProjectReference(handler); } } project.setInputHandler(handler); @@ -760,17 +746,13 @@ BuildLogger logger = null; if (loggerClassname != null) { try { - Class loggerClass = Class.forName(loggerClassname); - logger = (BuildLogger) (loggerClass.newInstance()); - } catch (ClassCastException e) { + logger = (BuildLogger) ClasspathUtils.newInstance( + loggerClassname, Main.class.getClassLoader(), + BuildLogger.class); + } catch (BuildException e) { System.err.println("The specified logger class " + loggerClassname - + " does not implement the BuildLogger interface"); - throw new RuntimeException(); - } catch (Exception e) { - System.err.println("Unable to instantiate specified logger " - + "class " + loggerClassname + " : " - + e.getClass().getName()); + + " could not be used because " + e.getMessage()); throw new RuntimeException(); } } else { 1.3 +4 -15 ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java Index: JavahAdapterFactory.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JavahAdapterFactory.java 7 Feb 2005 18:38:07 -0000 1.2 +++ JavahAdapterFactory.java 23 May 2005 21:52:35 -0000 1.3 @@ -18,6 +18,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.JavaEnvUtils; /** @@ -77,20 +78,8 @@ * isn't an instance of JavahAdapter. */ private static JavahAdapter resolveClassName(String className) - throws BuildException { - try { - Class c = Class.forName(className); - Object o = c.newInstance(); - return (JavahAdapter) o; - } catch (ClassNotFoundException cnfe) { - throw new BuildException("Can't load " + className, cnfe); - } catch (ClassCastException cce) { - throw new BuildException(className - + " is not a Javah adapter", cce); - } catch (Throwable t) { - // for all other possibilities - throw new BuildException(className + " caused an interesting " - + "exception.", t); - } + throws BuildException { + return (JavahAdapter) ClasspathUtils.newInstance(className, + JavahAdapterFactory.class.getClassLoader(), JavahAdapter.class); } } 1.27 +11 -8 ant/src/main/org/apache/tools/ant/listener/MailLogger.java Index: MailLogger.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/listener/MailLogger.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- MailLogger.java 9 Mar 2004 16:48:03 -0000 1.26 +++ MailLogger.java 23 May 2005 21:52:35 -0000 1.27 @@ -27,11 +27,13 @@ import java.util.StringTokenizer; import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.email.EmailAddress; import org.apache.tools.ant.taskdefs.email.Message; import org.apache.tools.ant.taskdefs.email.Mailer; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.DateUtils; import org.apache.tools.ant.util.StringUtils; import org.apache.tools.mail.MailMessage; @@ -239,14 +241,15 @@ String message) { // convert the replyTo string into a vector of emailaddresses Mailer mailer = null; - try { - mailer = - (Mailer) Class.forName("org.apache.tools.ant.taskdefs.email.MimeMailer") - .newInstance(); - } catch (Throwable e) { - log("Failed to initialise MIME mail: " + e.getMessage()); - return; - } + try { + mailer = (Mailer) ClasspathUtils.newInstance( + "org.apache.tools.ant.taskdefs.email.MimeMailer", + MailLogger.class.getClassLoader(), Mailer.class); + } catch (BuildException e) { + Throwable t = e.getCause() == null ? e : e.getCause(); + log("Failed to initialise MIME mail: " + t.getMessage()); + return; + } Vector replyToList = vectorizeEmailAddresses(replyToString); mailer.setHost(host); mailer.setPort(port); 1.19 +6 -19 ant/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java Index: ScriptDef.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- ScriptDef.java 17 May 2005 10:45:29 -0000 1.18 +++ ScriptDef.java 23 May 2005 21:52:35 -0000 1.19 @@ -34,6 +34,7 @@ import java.util.HashSet; import java.io.File; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.ScriptRunner; /** @@ -272,27 +273,13 @@ */ ClassLoader loader = createLoader(); - Class instanceClass = null; - try { - instanceClass = Class.forName(classname, true, loader); - } catch (Throwable e) { - // try normal method - try { - instanceClass = Class.forName(classname); - } catch (Throwable e2) { - throw new BuildException("scriptdef: Unable to load " - + "class " + classname + " for nested element <" - + elementName + ">", e2); - } + try + { + instance = ClasspathUtils.newInstance(classname, loader); + } catch (BuildException e) { + instance = ClasspathUtils.newInstance(classname, ScriptDef.class.getClassLoader()); } - try { - instance = instanceClass.newInstance(); - } catch (Throwable e) { - throw new BuildException("scriptdef: Unable to create " - + "element of class " + classname + " for nested " - + "element <" + elementName + ">", e); - } getProject().setProjectReference(instance); } 1.16 +60 -5 ant/src/main/org/apache/tools/ant/util/ClasspathUtils.java Index: ClasspathUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/ClasspathUtils.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- ClasspathUtils.java 20 May 2005 22:51:37 -0000 1.15 +++ ClasspathUtils.java 23 May 2005 21:52:35 -0000 1.16 @@ -236,17 +236,49 @@ * @throws BuildException when loading or instantiation failed. */ public static Object newInstance( + String className, + ClassLoader userDefinedLoader) { + return newInstance(className, userDefinedLoader, Object.class); + } + + + + /** + * Creates a fresh object instance of the specified classname. + * + * <p> This uses the userDefinedLoader to load the specified class, + * and then makes an instance using the default no-argument constructor. + * </p> + * + * @param className the full qualified class name to load. + * @param userDefinedLoader the classloader to use. + * @param expectedType the Class that the result should be assignment + * compatible with. (No ClassCastException will be thrown in case + * the result of this method is casted to the expectedType) + * @return The fresh object instance + * @throws BuildException when loading or instantiation failed. + * @since Ant 1.7 + */ + public static Object newInstance( String className, - ClassLoader userDefinedLoader) { + ClassLoader userDefinedLoader, + Class expectedType) { try { - Class clazz = userDefinedLoader.loadClass(className); + Class clazz = Class.forName(className, true, userDefinedLoader); Object o = clazz.newInstance(); + if (!expectedType.isInstance(o)) + { + throw new BuildException( + "Class of unexpected Type: " + + className + + " expected :" + + expectedType); + } return o; } catch (ClassNotFoundException e) { throw new BuildException( - "Class " - + className - + " not found by the specific classLoader.", + "Class not found: " + + className, e); } catch (InstantiationException e) { throw new BuildException( @@ -262,10 +294,33 @@ + ". Specified class should have a " + "public constructor.", e); + } catch (LinkageError e) { + throw new BuildException( + "Class " + + className + + " could not be loaded because of an invalid dependency.", + e); } } /** + * Creates a fresh object instance of the specified classname. + * + * <p> This uses the userDefinedLoader to load the specified class, + * and then makes an instance using the default no-argument constructor. + * </p> + * + * @param className the full qualified class name to load. + * @param userDefinedLoader the classloader to use. + * @param expectedType the Class that the result should be assignment + * compatible with. (No ClassCastException will be thrown in case + * the result of this method is casted to the expectedType) + * @return The fresh object instance + * @throws BuildException when loading or instantiation failed. + */ + + + /** * Obtains a delegate that helps out with classic classpath configuration. * * @param component your projectComponent that needs the assistence 1.18 +5 -17 ant/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java Index: RmicAdapterFactory.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- RmicAdapterFactory.java 14 Mar 2005 18:36:44 -0000 1.17 +++ RmicAdapterFactory.java 23 May 2005 21:52:35 -0000 1.18 @@ -19,6 +19,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; +import org.apache.tools.ant.util.ClasspathUtils; /** @@ -28,10 +29,10 @@ */ public final class RmicAdapterFactory { /** The error message to be used when the compiler cannot be found. */ - public static final String ERROR_UNKNOWN_COMPILER = "Cannot find the compiler or class: "; + public static final String ERROR_UNKNOWN_COMPILER = "Class not found: "; /** The error message to be used when the class is not an rmic adapter. */ - public static final String ERROR_NOT_RMIC_ADAPTER = "Not an rmic adapter: "; + public static final String ERROR_NOT_RMIC_ADAPTER = "Class of unexpected Type: "; /** If the compiler has this name use a default compiler. */ public static final String DEFAULT_COMPILER = "default"; @@ -93,20 +94,7 @@ */ private static RmicAdapter resolveClassName(String className) throws BuildException { - try { - Class c = Class.forName(className); - Object o = c.newInstance(); - return (RmicAdapter) o; - } catch (ClassNotFoundException cnfe) { - throw new BuildException(ERROR_UNKNOWN_COMPILER + className, - cnfe); - } catch (ClassCastException cce) { - throw new BuildException(ERROR_NOT_RMIC_ADAPTER + className, - cce); - } catch (Throwable t) { - // for all other possibilities - throw new BuildException(className + " caused an interesting " - + "exception.", t); - } + return (RmicAdapter) ClasspathUtils.newInstance(className, + RmicAdapterFactory.class.getClassLoader(), RmicAdapter.class); } } 1.2 +6 -15 ant/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/Native2AsciiAdapterFactory.java Index: Native2AsciiAdapterFactory.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/Native2AsciiAdapterFactory.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Native2AsciiAdapterFactory.java 31 Jan 2005 11:48:25 -0000 1.1 +++ Native2AsciiAdapterFactory.java 23 May 2005 21:52:35 -0000 1.2 @@ -18,6 +18,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.JavaEnvUtils; /** @@ -77,20 +78,10 @@ * isn't an instance of Native2AsciiAdapter. */ private static Native2AsciiAdapter resolveClassName(String className) - throws BuildException { - try { - Class c = Class.forName(className); - Object o = c.newInstance(); - return (Native2AsciiAdapter) o; - } catch (ClassNotFoundException cnfe) { - throw new BuildException("Can't load " + className, cnfe); - } catch (ClassCastException cce) { - throw new BuildException(className - + " is not a Native2Ascii adapter", cce); - } catch (Throwable t) { - // for all other possibilities - throw new BuildException(className + " caused an interesting " - + "exception.", t); - } + throws BuildException + { + return (Native2AsciiAdapter) ClasspathUtils.newInstance(className, + Native2AsciiAdapterFactory.class.getClassLoader(), + Native2AsciiAdapter.class); } } \ No newline at end of file 1.18 +5 -7 ant/src/main/org/apache/tools/ant/util/regexp/RegexpMatcherFactory.java Index: RegexpMatcherFactory.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/regexp/RegexpMatcherFactory.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- RegexpMatcherFactory.java 17 Dec 2004 19:46:04 -0000 1.17 +++ RegexpMatcherFactory.java 23 May 2005 21:52:35 -0000 1.18 @@ -19,6 +19,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.ClasspathUtils; /** * Simple Factory Class that produces an implementation of @@ -99,13 +100,10 @@ * @exception BuildException if an error occurs */ protected RegexpMatcher createInstance(String className) - throws BuildException { - try { - Class implClass = Class.forName(className); - return (RegexpMatcher) implClass.newInstance(); - } catch (Throwable t) { - throw new BuildException(t); - } + throws BuildException + { + return (RegexpMatcher) ClasspathUtils.newInstance(className, + RegexpMatcherFactory.class.getClassLoader(), RegexpMatcher .class); } /** 1.31 +4 -15 ant/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java Index: CompilerAdapterFactory.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- CompilerAdapterFactory.java 13 May 2005 16:58:55 -0000 1.30 +++ CompilerAdapterFactory.java 23 May 2005 21:52:35 -0000 1.31 @@ -20,6 +20,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; +import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.JavaEnvUtils; /** @@ -162,21 +163,9 @@ */ private static CompilerAdapter resolveClassName(String className) throws BuildException { - try { - Class c = Class.forName(className); - Object o = c.newInstance(); - return (CompilerAdapter) o; - } catch (ClassNotFoundException cnfe) { - throw new BuildException("Compiler Adapter '" + className - + "' can\'t be found.", cnfe); - } catch (ClassCastException cce) { - throw new BuildException(className + " isn\'t the classname of " - + "a compiler adapter.", cce); - } catch (Throwable t) { - // for all other possibilities - throw new BuildException("Compiler Adapter " + className - + " caused an interesting exception.", t); - } + return (CompilerAdapter) ClasspathUtils.newInstance(className, + CompilerAdapterFactory.class.getClassLoader(), + CompilerAdapter.class); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]