From: Frederik D. <fd...@us...> - 2004-12-31 16:09:16
|
Update of /cvsroot/columba/columba/src/columba/core/org/columba/core/loader In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1217/src/columba/core/org/columba/core/loader Modified Files: DefaultClassLoader.java ExternalClassLoader.java Added Files: ClassLoaderHelper.java Log Message: [feature]added groovy interpreter plugin, added groovy helloworld action plugin, much improved error/exception handling for plugin system, massiv speedup of JMenu creation Index: ExternalClassLoader.java =================================================================== RCS file: /cvsroot/columba/columba/src/columba/core/org/columba/core/loader/ExternalClassLoader.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** ExternalClassLoader.java 31 Oct 2004 22:03:38 -0000 1.13 --- ExternalClassLoader.java 31 Dec 2004 16:08:25 -0000 1.14 *************** *** 22,145 **** import java.util.logging.Logger; - /** ! * Classloader responsible for instanciating plugins which ! * can also be outside. * <p> ! * Note, that this classloader tries to find the correct ! * constructor based on the arguments. ! * * @author fdietz */ public class ExternalClassLoader extends URLClassLoader { - - private static final Logger LOG = Logger.getLogger("org.columba.core.loader"); - - /** - * Constructor for ExternalClassLoader. - * @param urls - * @param parent - */ - public ExternalClassLoader(URL[] urls, ClassLoader parent) { - super(urls, parent); - } - - /** - * Constructor for ExternalClassLoader. - * @param urls - */ - public ExternalClassLoader(URL[] urls) { - super(urls); - } - - /** - * Constructor for ExternalClassLoader. - * @param urls - * @param parent - * @param factory - */ - public ExternalClassLoader(URL[] urls, ClassLoader parent, - URLStreamHandlerFactory factory) { - super(urls, parent, factory); - } - - public void addURL(URL url) { - super.addURL(url); - } ! public Class findClass(String className) throws ClassNotFoundException { ! Class temp = super.findClass(className); ! return temp; ! } ! public Object instanciate(String className) throws Exception { ! Class actClass = findClass(className); ! return actClass.newInstance(); ! } ! public Object instanciate(String className, Object[] args) ! throws Exception { ! ! Class actClass = findClass(className); ! Constructor constructor = null; ! // ! // we can't just load the first constructor ! // -> go find the correct constructor based ! // -> based on the arguments ! // ! // old solution and wrong: ! //Constructor constructor = actClass.getConstructors()[0];//argClazz); ! // ! if ((args == null) || (args.length == 0)) { ! constructor = actClass.getConstructors()[0]; ! return constructor.newInstance(args); ! } ! Constructor[] list = actClass.getConstructors(); ! Class[] classes = new Class[args.length]; ! for (int i = 0; i < list.length; i++) { ! Constructor c = list[i]; ! Class[] parameterTypes = c.getParameterTypes(); ! // this constructor has the correct number ! // of arguments ! if (parameterTypes.length == args.length) { ! boolean success = true; ! for (int j = 0; j < parameterTypes.length; j++) { ! Class parameter = parameterTypes[j]; ! if (args[j] == null) { ! success = true; ! } else if (!parameter.isAssignableFrom(args[j].getClass())) { ! success = false; ! } ! } ! // ok, we found a matching constructor ! // -> create correct list of arguments ! if (success) { ! constructor = actClass.getConstructor(parameterTypes); ! } ! } ! } ! // couldn't find correct constructor ! if (constructor == null) { ! LOG.severe("Couldn't find constructor for "+className+" with matching argument-list: "); ! for ( int i=0; i<args.length; i++) { ! LOG.severe("argument["+i+"]="+args[i]); ! } ! return null; ! } ! return constructor.newInstance(args); ! } ! } --- 22,118 ---- import java.util.logging.Logger; /** ! * Classloader responsible for instanciating plugins which can also be outside. * <p> ! * Note, that this classloader tries to find the correct constructor based on ! * the arguments. ! * * @author fdietz */ public class ExternalClassLoader extends URLClassLoader { ! private static final Logger LOG = Logger ! .getLogger("org.columba.core.loader"); ! /** ! * Constructor for ExternalClassLoader. ! * ! * @param urls ! * @param parent ! */ ! public ExternalClassLoader(URL[] urls, ClassLoader parent) { ! super(urls, parent); ! } ! /** ! * Constructor for ExternalClassLoader. ! * ! * @param urls ! */ ! public ExternalClassLoader(URL[] urls) { ! super(urls); ! } ! /** ! * Constructor for ExternalClassLoader. ! * ! * @param urls ! * @param parent ! * @param factory ! */ ! public ExternalClassLoader(URL[] urls, ClassLoader parent, ! URLStreamHandlerFactory factory) { ! super(urls, parent, factory); ! } ! public void addURL(URL url) { ! super.addURL(url); ! } ! public Class findClass(String className) throws ClassNotFoundException { ! Class temp = super.findClass(className); ! return temp; ! } ! public Object instanciate(String className) throws Exception { ! Class actClass = findClass(className); ! return actClass.newInstance(); ! } ! public Object instanciate(String className, Object[] args) throws Exception { ! Class actClass = findClass(className); ! Constructor constructor = null; ! // ! // we can't just load the first constructor ! // -> go find the correct constructor based ! // -> based on the arguments ! // ! // old solution and wrong: ! //Constructor constructor = actClass.getConstructors()[0];//argClazz); ! // ! if ((args == null) || (args.length == 0)) { ! constructor = actClass.getConstructors()[0]; ! return constructor.newInstance(args); ! } ! constructor = ClassLoaderHelper.findConstructor(args, actClass); ! // couldn't find correct constructor ! if (constructor == null) { ! LOG.severe("Couldn't find constructor for " + className ! + " with matching argument-list: "); ! for (int i = 0; i < args.length; i++) { ! LOG.severe("argument[" + i + "]=" + args[i]); ! } ! return null; ! } ! return constructor.newInstance(args); ! } ! } \ No newline at end of file Index: DefaultClassLoader.java =================================================================== RCS file: /cvsroot/columba/columba/src/columba/core/org/columba/core/loader/DefaultClassLoader.java,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** DefaultClassLoader.java 18 Sep 2004 09:18:29 -0000 1.16 --- DefaultClassLoader.java 31 Dec 2004 16:08:25 -0000 1.17 *************** *** 19,132 **** import java.util.logging.Logger; - /** ! * Classloader responsible for instanciating plugins which are ! * located inside the Columba sources. * <p> ! * Note, that this classloader tries to find the correct ! * constructor based on the arguments. ! * * @author fdietz */ public class DefaultClassLoader { - - private static final Logger LOG = Logger.getLogger("org.columba.core.loader"); - - // we can't use SystemClassLoader here, because that doesn't work - // with java webstart - // -> instead we use this.getClass().getClassLoader() - // -> which seems to work perfectly ! /* ! protected static ClassLoader loader = ClassLoader.getSystemClassLoader(); ! */ ! ClassLoader loader; ! ! /** ! * Constructor for CClassLoader. ! */ ! public DefaultClassLoader() { ! super(); ! ! loader = this.getClass().getClassLoader(); ! } ! public Object instanciate(String className) throws Exception { ! //ColumbaLogger.log.info("class="+className); ! Class actClass = loader.loadClass(className); ! return actClass.newInstance(); ! } ! public Object instanciate(String className, Object[] args) ! throws Exception { ! //ColumbaLogger.log.info("class="+className); ! Class actClass = loader.loadClass(className); ! Constructor constructor = null; ! // ! // we can't just load the first constructor ! // -> go find the correct constructor based ! // -> based on the arguments ! // ! // old solution and wrong: ! //Constructor constructor = actClass.getConstructors()[0];//argClazz); ! // ! if ((args == null) || (args.length == 0)) { ! // @author fdietz ! // #987119 import wizard plugin loading error ! // simply load default constructor with no arguments ! // ! /* ! constructor = actClass.getConstructors()[0]; ! return constructor.newInstance(args); ! */ ! return actClass.newInstance(); ! } ! Constructor[] list = actClass.getConstructors(); ! Class[] classes = new Class[args.length]; ! for (int i = 0; i < list.length; i++) { ! Constructor c = list[i]; ! Class[] parameterTypes = c.getParameterTypes(); ! // this constructor has the correct number ! // of arguments ! if (parameterTypes.length == args.length) { ! boolean success = true; ! for (int j = 0; j < parameterTypes.length; j++) { ! Class parameter = parameterTypes[j]; ! if (args[j] == null) { ! success = true; ! } else if (!parameter.isAssignableFrom(args[j].getClass())) { ! success = false; ! } ! } ! // ok, we found a matching constructor ! // -> create correct list of arguments ! if (success) { ! constructor = actClass.getConstructor(parameterTypes); ! } ! } ! } ! // couldn't find correct constructor ! if (constructor == null) { ! LOG.severe("Couldn't find constructor for "+className+" with matching argument-list: "); ! for ( int i=0; i<args.length; i++) { ! LOG.severe("argument["+i+"]="+args[i]); ! } ! ! return null; ! } ! return constructor.newInstance(args); ! } ! } --- 19,104 ---- import java.util.logging.Logger; /** ! * Classloader responsible for instanciating plugins which are located inside ! * the Columba sources. * <p> ! * Note, that this classloader tries to find the correct constructor based on ! * the arguments. ! * * @author fdietz */ public class DefaultClassLoader { ! private static final Logger LOG = Logger ! .getLogger("org.columba.core.loader"); ! // we can't use SystemClassLoader here, because that doesn't work ! // with java webstart ! // -> instead we use this.getClass().getClassLoader() ! // -> which seems to work perfectly ! /* ! * protected static ClassLoader loader = ClassLoader.getSystemClassLoader(); ! */ ! ClassLoader loader; ! /** ! * Constructor for CClassLoader. ! */ ! public DefaultClassLoader() { ! super(); ! loader = this.getClass().getClassLoader(); ! } ! public Object instanciate(String className) throws Exception { ! //ColumbaLogger.log.info("class="+className); ! Class actClass = loader.loadClass(className); ! return actClass.newInstance(); ! } ! public Object instanciate(String className, Object[] args) throws Exception { ! //ColumbaLogger.log.info("class="+className); ! Class actClass = loader.loadClass(className); ! Constructor constructor = null; ! // ! // we can't just load the first constructor ! // -> go find the correct constructor based ! // -> based on the arguments ! // ! // old solution and wrong: ! //Constructor constructor = actClass.getConstructors()[0];//argClazz); ! // ! if ((args == null) || (args.length == 0)) { ! // @author fdietz ! // #987119 import wizard plugin loading error ! // simply load default constructor with no arguments ! // ! /* ! * constructor = actClass.getConstructors()[0]; return ! * constructor.newInstance(args); ! */ ! return actClass.newInstance(); ! } ! constructor = ClassLoaderHelper.findConstructor(args, actClass); ! // couldn't find correct constructor ! if (constructor == null) { ! LOG.severe("Couldn't find constructor for " + className ! + " with matching argument-list: "); ! for (int i = 0; i < args.length; i++) { ! LOG.severe("argument[" + i + "]=" + args[i]); ! } ! return null; ! } ! return constructor.newInstance(args); ! } ! } \ No newline at end of file --- NEW FILE: ClassLoaderHelper.java --- // The contents of this file are subject to the Mozilla Public License Version // 1.1 //(the "License"); you may not use this file except in compliance with the //License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ // //Software distributed under the License is distributed on an "AS IS" basis, //WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License //for the specific language governing rights and //limitations under the License. // //The Original Code is "The Columba Project" // //The Initial Developers of the Original Code are Frederik Dietz and Timo // Stich. //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003. // //All Rights Reserved. package org.columba.core.loader; import java.lang.reflect.Constructor; /** * @author fdietz * */ public class ClassLoaderHelper { /** * @param args * @param actClass * @return @throws * NoSuchMethodException */ public static Constructor findConstructor(Object[] args, Class actClass) throws NoSuchMethodException { Constructor constructor = null; Constructor[] list = actClass.getConstructors(); Class[] classes = new Class[args.length]; for (int i = 0; i < list.length; i++) { Constructor c = list[i]; Class[] parameterTypes = c.getParameterTypes(); // this constructor has the correct number // of arguments if (parameterTypes.length == args.length) { boolean success = true; for (int j = 0; j < parameterTypes.length; j++) { Class parameter = parameterTypes[j]; if (args[j] == null) { success = true; } else if (!parameter.isAssignableFrom(args[j].getClass())) { success = false; } } // ok, we found a matching constructor // -> create correct list of arguments if (success) { constructor = actClass.getConstructor(parameterTypes); } } } return constructor; } } |