diff options
author | jeffpk <[email protected]> | 2003-06-07 00:17:26 +0000 |
---|---|---|
committer | jeffpk <[email protected]> | 2003-06-07 00:17:26 +0000 |
commit | fe011589ffb1f4405fe5dd27ebf94692934250f9 (patch) | |
tree | cfa41512b8a17530e88c999faff2b4c9b6a010fc | |
parent | 4ab19a606a56e6bd4d5f2450d6720834d5fb5d63 (diff) |
This commit was generated by cvs2svn to compensate for changes in r4, which
included commits to RCS files with non-trunk default branches.
git-svn-id: file:///home/sven/projects/JOGL/git-svn/svn-server-sync/jutils/trunk@5 052365b4-98e0-4bc5-a281-465471b020e0
-rw-r--r-- | README.txt | 45 | ||||
-rw-r--r-- | build.xml | 109 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/Plugin.java | 60 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/PluginLoader.java | 147 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/Plugins.java | 243 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/FooChildPlugin.java | 50 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/FooPlugin.java | 51 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/InheritedInterfacePlugin.java | 50 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/InterfaceNotAPlugin.java | 49 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/NotAPlugin.java | 50 | ||||
-rw-r--r-- | src/java/net/java/games/util/plugins/test/PluginTest.java | 115 |
11 files changed, 969 insertions, 0 deletions
diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..338c842 --- /dev/null +++ b/README.txt @@ -0,0 +1,45 @@ +Project: net.java.games.* +Purpose: Open source game libraries +Authors: + -- plugin utils design and release author: + Jeff Kesselman, Game Technology Architect, + Advanced Software Technologies Group, + Sun Microsystems. + -- this file updated on 006/06/2003 by Jeff Kesselman + + +Introduction: + +This is the utils project that contains ueful shared functionality +for the other Java Games Initiative APIs. + +Build Requirements: + +This project has been built in the follwing environment. + -- Win32 (Win 2000 in the case of our machine) + -- Sun J2SDK 1.4 (available at java.sun.com) + -- ANT 1.4.1 (available at apache.org) + + +Directory Organization: + +The root contains a master ANT build.xml. +After a build you will see the following sub directories: + -- apidocs Where the javadocs get built to + -- lib Where dependant libraries are kept. + -- bin Where the actual API is built to + -- src The source files. + -- src/test Execution directories and data for tests. + +Build instructions: + +To clean: ant clean +To build: ant all (or just ant) +To build docs: ant javadoc +To test: ant test + +Release Info: + Initial Release: This release contains an implementation of a flexible plugin + management system. See the apidocs for more information. + + diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..bed0dec --- /dev/null +++ b/build.xml @@ -0,0 +1,109 @@ +<?xml version="1.0"?> + +<!-- Written to assume that classpath is rooted in the current directory. --> +<!-- So this should be OK if you make this script in the root of a filesystem. --> +<!-- If not, you may prefer to adjust the basedir, or move some directories around. --> +<!-- The idea is that both Ant and NetBeans have to know what the package root is --> +<!-- for the classes in your application. --> +<project name="utils.jar" basedir="." default="all"> + + <!-- Don't worry if you don't know the Ant syntax completely or need help on some tasks! --> + <!-- The standard Ant documentation is bundled. See Help | Help Sets | Ant 1.4.1 Manual. --> + + <target name="init"> + <!-- You can set up any variables you want used throughout the script here. --> + <!-- <property name="hello" value="world"/> --> + <!-- To use e.g. Jikes, uncomment this line. --> + <!-- (Or make the same change in Tools | Options | Ant Settings | Properties.) --> + <!-- <property name="build.compiler" value="jikes"/> --> + <!-- You might like to set up some overridable paths, etc.: --> + <!-- <property name="mylib" value="../lib/mylib.jar"/> --> + <mkdir dir="bin" /> + <mkdir dir="classes" /> + <mkdir dir="apidocs" /> + <mkdir dir="src/tests/test_plugin" /> + </target> + + <target name="compile" depends="init"> + <!-- Both srcdir and destdir should be package roots. --> + <!-- They could be different of course; in that case NetBeans can also be set --> + <!-- up to compile to a different filesystem in the same way; see Compiler Types: --> + <javac srcdir="src/java" destdir="classes" debug="true" deprecation="true"> + <include name="net/java/**"/> + <!-- To add something to the classpath: --> + <!-- + <classpath> + <pathelement location="${mylib}"/> + </classpath> + --> + <!-- To exclude some files: --> + <!-- + <exclude name="com/foo/SomeFile.java"/> + <exclude name="com/foo/somepackage/"/> + --> + </javac> + </target> + + <target name="jar" depends="init,compile"> + <!-- To make a standalone app: --> + <!-- 1. Create a myapp.mf manifest somewhere. --> + <!-- 2. Put in it: --> + <!-- Manifest-Version: 1.0 --> + <!-- Main-Class: com.foo.Main --> + <!-- 3. Pass to <jar>: manifest="myapp.mf" --> + <jar jarfile="bin/jutils.jar" compress="true" basedir="classes"> + <include name="net/java/**"/> + <exclude name="**/*.java"/> + <exclude name="**/*.form"/> + <exclude name="myapp.mf"/> + <exclude name="myapp.jar"/> + <exclude name="apidoc"/> + <exclude name="**/plugins/test/*Plugin.class"/> + </jar> + <copy file="bin/jutils.jar" todir="../jinput/coreAPI/lib" /> + <copy file="bin/jutils.jar" todir="../jinput/plugins/DX8/lib" /> + <jar jarfile="src/tests/test_plugins/test_plugins.jar" compress="true" basedir="classes"> + <include name="**/plugins/test/*Plugin.class"/> + </jar> + </target> + + <target name="all" depends="init,jar" description="Build everything."> + <echo message="Application built. Hello ${hello}!"/> + </target> + + <target name="test" depends="init,all" description="Try running it."> + <java classname="net.java.games.util.plugins.test.PluginTest" + fork="true" dir="src/tests" failonerror="true"> + <classpath> + <!-- <pathelement location= "classes" /> --> + <pathelement location="bin/jutils.jar"/> + </classpath> + <!-- Pass some args, perhaps: --> + <!-- <arg value="-myfile"/> --> + <!-- Will be given as an absolute path: --> + <!-- <arg file="myfile.txt"/> --> + </java> + </target> + + <target name="javadoc" depends="init" description="Javadoc for input API."> + <javadoc packagenames="net.java.games.util.plugins.*" + destdir="apidocs" + additionalparam="-source 1.4"> + <sourcepath> + <pathelement location="src/java"/> + </sourcepath> + </javadoc> + </target> + + <target name="clean" depends="init" description="Clean all build products."> + <delete> + <fileset dir="classes"> + <include name="**/*.class"/> + </fileset> + </delete> + <delete file="bin/jutils.jar"/> + <delete file="tests/test_plugins/test_plugins.jar"/> + <delete dir="apidocs"/> + </target> + +</project> diff --git a/src/java/net/java/games/util/plugins/Plugin.java b/src/java/net/java/games/util/plugins/Plugin.java new file mode 100644 index 0000000..cfb533b --- /dev/null +++ b/src/java/net/java/games/util/plugins/Plugin.java @@ -0,0 +1,60 @@ +/* + * Plugin.java + * + * Created on April 18, 2003, 11:29 AM + */ + +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ + +package net.java.games.util.plugins; + +/** This is a marker interface used to mark plugins in a Jar file + * for retrieval by the Plugins class. In order for a class to be + * treated as a Plugin the following must be true: + * + * (1) The name of the class must end with "Plugin". + * (ie MedianCutFilterPlugin, DirectInput EnvrionmentPlugin) + * + * (2) The class must implement the Plugin interface. It can do + * so directly, through inheritence of either a superclass + * that implements this interface, or through the implementation + * of an interface that extends this interface. + * + * + * @author Jeffrey P. Kesselman + * + */ +public interface Plugin { + +} diff --git a/src/java/net/java/games/util/plugins/PluginLoader.java b/src/java/net/java/games/util/plugins/PluginLoader.java new file mode 100644 index 0000000..1882713 --- /dev/null +++ b/src/java/net/java/games/util/plugins/PluginLoader.java @@ -0,0 +1,147 @@ +/* + * PluginLodaer.java + * + * Created on April 18, 2003, 11:32 AM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins; + +/** + * + * @author jeff + */ +import java.io.*; +import java.net.*; + +/** This class is used internally by the Plugin system. + * End users of the system are unlikely to need to be aware + * of it. + * + * + * This is the class loader used to keep the namespaces of + * different plugins isolated from each other and from the + * main app code. One plugin loader is created per Jar + * file in the sub-directory tree of the plugin directory. + * + * In addition to isolating java classes this loader also isolates + * DLLs such that plugins with conflicting DLL names may be + * used by simply placing the plugin and its associated DLL + * in a sub-folder of its own. + * + * This class also currently implements methods for testing + * classes for inheritance of superclasses or interfaces. + * This code is genericly useful and should really be moved + * to a seperate ClassUtils class. + * @author Jeffrey Kesselman + */ +public class PluginLoader extends URLClassLoader { + static final boolean DEBUG = false; + File parentDir; + /** Creates a new instance of PluginLodaer + * @param jf The JarFile to load the Plugins from. + * @throws MalformedURLException Will throw this exception if jf does not refer to a + * legitimate Jar file. + */ + public PluginLoader(File jf) throws MalformedURLException { + super(new URL[] {jf.toURL()}); + parentDir = jf.getParentFile(); + } + + /** This method is queried by the System.loadLibrary() + * code to find the actual native name and path to the + * native library to load. + * + * This subclass implementation of this method ensures that + * the native library will be loaded from, and only from, + * the parent directory of the Jar file this loader was + * created to support. This allows different Plugins + * with supporting DLLs of the same name to co-exist, each + * in their own subdirectory. + * @param libname The JNI name of the native library to locate. + * @return Returns a string describing the actual loation of the + * native library in the native file system. + */ + protected String findLibrary(String libname){ + String libpath = parentDir.getPath()+File.separator+ + System.mapLibraryName(libname); + if (DEBUG) { + System.out.println("Returning libname of: "+libpath); + } + return libpath; + } + + /** This function is called as part of scanning the Jar for + * plugins. It checks to make sure the class passed in is + * a legitimate plugin, which is to say that it meets + * the following criteria: + * + * (1) Is not itself an interface + * (2) Implements the Plugin marker interface either directly + * or through inheritance. + * + * interface, either + * @param pc The potential plug-in class to vette. + * @return Returns true if the class meets the criteria for a + * plugin. Otherwise returns false. + */ + public boolean attemptPluginDefine(Class pc){ + return ((!pc.isInterface()) && classImplementsPlugin(pc)); + } + + private boolean classImplementsPlugin(Class testClass){ + if (testClass == null) return false; // end of tree + if (DEBUG) { + System.out.println("testing class "+testClass.getName()); + } + Class[] implementedInterfaces = testClass.getInterfaces(); + for(int i=0;i<implementedInterfaces.length;i++){ + if (DEBUG) { + System.out.println("examining interface: "+implementedInterfaces[i]); + } + if (implementedInterfaces[i]==Plugin.class) { + if (DEBUG) { + System.out.println("returning true from classImplementsPlugin"); + } + return true; + } + } + for(int i=0;i<implementedInterfaces.length;i++){ + if (classImplementsPlugin(implementedInterfaces[i])){ + return true; + } + } + return classImplementsPlugin(testClass.getSuperclass()); + } + +} diff --git a/src/java/net/java/games/util/plugins/Plugins.java b/src/java/net/java/games/util/plugins/Plugins.java new file mode 100644 index 0000000..7a7e5f4 --- /dev/null +++ b/src/java/net/java/games/util/plugins/Plugins.java @@ -0,0 +1,243 @@ +/* + * Plugins.java + * + * Created on April 18, 2003, 10:57 AM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins; + +/** + * + * @author jeff + */ + +import java.io.*; +import java.util.*; +import java.util.jar.*; + +/** This is the application interface to the Plugin system. + * One Plugins object should be created for each plug-in + * directory tree root. + * + * On creation the Plugins object will scan its assigned + * directory tree and examine all Jar files in that tree to + * see if they qualify as Plug-ins. + * + * The Plugin classes may then be retrived from the Plugins object by calling + * the appropriate get function (see below). + * + * If a plugin requires a native code library, that library must be present + * in the same directory as the plugin Jar file. + * + */ +public class Plugins { + static final boolean DEBUG = true; + List pluginList= new ArrayList(); + + /** Creates a new instance of Plugins + * @param pluginRoot The root od the directory tree to scan for Jars + * containing plugins. + */ + public Plugins(File pluginRoot) { + scanPlugins(pluginRoot); + } + + private void scanPlugins(File dir) { + File[] files = dir.listFiles(); + for(int i=0;i<files.length;i++){ + File f = files[i]; + if (f.getName().endsWith(".jar")) { // process JAR file + processJar(f); + } else if (f.isDirectory()) { + scanPlugins(f); // recurse + } + } + } + + + private void processJar(File f) { + try { + //JarFile jf = new JarFile(f); + if (DEBUG) { + System.out.println("Scanning jar: "+f.getName()); + } + PluginLoader loader = new PluginLoader(f); + JarFile jf = new JarFile(f); + for (Enumeration enum = jf.entries();enum.hasMoreElements();){ + JarEntry je = (JarEntry)enum.nextElement(); + if (DEBUG) { + System.out.println("Examining file : "+je.getName()); + } + if (je.getName().endsWith("Plugin.class")) { + if (DEBUG) { + System.out.println("Found candidate class: "+je.getName()); + } + String cname = je.getName(); + cname = cname.substring(0,cname.length()-6); + Class pc = loader.loadClass(cname); + if (loader.attemptPluginDefine(pc)) { + if (DEBUG) { + System.out.println("Adding class to plugins:"+pc.getName()); + } + pluginList.add(pc); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** This method returns all the Plugins found in the + * directory passed in at object creation time or any of its + * sub-directories. + * @return + */ + public Class[] get(){ + Class[] pluginArray = new Class[pluginList.size()]; + return (Class[])pluginList.toArray(pluginArray); + } + + /** This method returns a sub-list of all the found Plugin + * classes that implement <B>any</B> of the passed in set of + * Interfaces (either directly or through inheritance.) + * @param interfaces A set of interfaces to match against the interfaces + * implemented by the plugin classes. + * @return The list of plugin classes that implement at least + * one member of the passed in set of interfaces. + */ + public Class[] getImplementsAny(Class[] interfaces){ + List matchList = new ArrayList(pluginList.size()); + Set interfaceSet = new HashSet(); + for(int i=0;i<interfaces.length;i++){ + interfaceSet.add(interfaces[i]); + } + for(Iterator i = pluginList.iterator();i.hasNext();){ + Class pluginClass = (Class)i.next(); + if (classImplementsAny(pluginClass,interfaceSet)){ + matchList.add(pluginClass); + } + } + Class[] pluginArray = new Class[matchList.size()]; + return (Class[])matchList.toArray(pluginArray); + } + + private boolean classImplementsAny(Class testClass,Set interfaces){ + if (testClass == null) return false; // end of tree + Class[] implementedInterfaces = testClass.getInterfaces(); + for(int i=0;i<implementedInterfaces.length;i++){ + if (interfaces.contains(implementedInterfaces[i])) { + return true; + } + } + for(int i=0;i<implementedInterfaces.length;i++){ + if (classImplementsAny(implementedInterfaces[i],interfaces)){ + return true; + } + } + return classImplementsAny(testClass.getSuperclass(),interfaces); + } + + /** This method returns a sub-list of all the found Plugin + * classes that implement <B>all</B> of the passed in set of + * Interfaces (either directly or through inheritance.) + * @param interfaces A set of interfaces to match against the interfaces + * implemented by the plugin classes. + * @return The list of plugin classes that implement at least + * one member of the passed in set of interfaces. + */ + public Class[] getImplementsAll(Class[] interfaces){ + List matchList = new ArrayList(pluginList.size()); + Set interfaceSet = new HashSet(); + for(int i=0;i<interfaces.length;i++){ + interfaceSet.add(interfaces[i]); + } + for(Iterator i = pluginList.iterator();i.hasNext();){ + Class pluginClass = (Class)i.next(); + if (classImplementsAll(pluginClass,interfaceSet)){ + matchList.add(pluginClass); + } + } + Class[] pluginArray = new Class[matchList.size()]; + return (Class[])matchList.toArray(pluginArray); + } + + private boolean classImplementsAll(Class testClass,Set interfaces){ + if (testClass == null) return false; // end of tree + Class[] implementedInterfaces = testClass.getInterfaces(); + for(int i=0;i<implementedInterfaces.length;i++){ + if (interfaces.contains(implementedInterfaces[i])) { + interfaces.remove(implementedInterfaces[i]); + if (interfaces.size() == 0) { // found them all + return true; + } + } + } + for(int i=0;i<implementedInterfaces.length;i++){ + if (classImplementsAll(implementedInterfaces[i],interfaces)){ + return true; + } + } + return classImplementsAll(testClass.getSuperclass(),interfaces); + } + + /** This method returns a sub-list of all the found Plugin + * classes that extend the passed in Class + * (either directly or through inheritance.) + * @param superclass The class to match. + * @return The list of plugin classes that extend the passed + * in class. + */ + public Class[] getExtends(Class superclass){ + List matchList = new ArrayList(pluginList.size()); + for(Iterator i = pluginList.iterator();i.hasNext();){ + Class pluginClass = (Class)i.next(); + if (classExtends(pluginClass,superclass)){ + matchList.add(pluginClass); + } + } + Class[] pluginArray = new Class[matchList.size()]; + return (Class[])matchList.toArray(pluginArray); + } + + private boolean classExtends(Class testClass,Class superclass){ + if (testClass == null) { // end of hirearchy + return false; + } + if (testClass == superclass) { + return true; + } + return classExtends(testClass.getSuperclass(),superclass); + } +} diff --git a/src/java/net/java/games/util/plugins/test/FooChildPlugin.java b/src/java/net/java/games/util/plugins/test/FooChildPlugin.java new file mode 100644 index 0000000..ee8678a --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/FooChildPlugin.java @@ -0,0 +1,50 @@ +/* + * FooChildPlugin.java + * + * Created on April 22, 2003, 12:22 AM + */ + +package net.java.games.util.plugins.test; +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +/** + * + * @author jeff + */ +public class FooChildPlugin extends FooPlugin { + + /** Creates a new instance of FooChildPlugin */ + public FooChildPlugin() { + } + +} diff --git a/src/java/net/java/games/util/plugins/test/FooPlugin.java b/src/java/net/java/games/util/plugins/test/FooPlugin.java new file mode 100644 index 0000000..684406a --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/FooPlugin.java @@ -0,0 +1,51 @@ +/* + * FooPlugin.java + * + * Created on April 21, 2003, 5:48 PM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins.test; +import net.java.games.util.plugins.Plugin; + +/** + * + * @author jeff + */ +public class FooPlugin implements Plugin{ + + /** Creates a new instance of FooPlugin */ + public FooPlugin() { + } + +} diff --git a/src/java/net/java/games/util/plugins/test/InheritedInterfacePlugin.java b/src/java/net/java/games/util/plugins/test/InheritedInterfacePlugin.java new file mode 100644 index 0000000..4458a20 --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/InheritedInterfacePlugin.java @@ -0,0 +1,50 @@ +/* + * InheritedInterfacePlugin.java + * + * Created on April 22, 2003, 12:23 AM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins.test; + +/** + * + * @author jeff + */ +public class InheritedInterfacePlugin implements InterfaceNotAPlugin { + + /** Creates a new instance of InheritedInterfacePlugin */ + public InheritedInterfacePlugin() { + } + +} diff --git a/src/java/net/java/games/util/plugins/test/InterfaceNotAPlugin.java b/src/java/net/java/games/util/plugins/test/InterfaceNotAPlugin.java new file mode 100644 index 0000000..a6bfca6 --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/InterfaceNotAPlugin.java @@ -0,0 +1,49 @@ +/* + * InterfaceceNotaPlugin.java + * + * Created on April 21, 2003, 6:24 PM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins.test; +import net.java.games.util.plugins.Plugin; + +/** + * + * @author jeff + */ +public interface InterfaceNotAPlugin extends Plugin{ + + + +} diff --git a/src/java/net/java/games/util/plugins/test/NotAPlugin.java b/src/java/net/java/games/util/plugins/test/NotAPlugin.java new file mode 100644 index 0000000..cabcc08 --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/NotAPlugin.java @@ -0,0 +1,50 @@ +/* + * NotAPlugin.java + * + * Created on April 21, 2003, 6:24 PM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins.test; + +/** + * + * @author jeff + */ +public class NotAPlugin { + + /** Creates a new instance of NotAPlugin */ + public NotAPlugin() { + } + +} diff --git a/src/java/net/java/games/util/plugins/test/PluginTest.java b/src/java/net/java/games/util/plugins/test/PluginTest.java new file mode 100644 index 0000000..a5ea39d --- /dev/null +++ b/src/java/net/java/games/util/plugins/test/PluginTest.java @@ -0,0 +1,115 @@ +/* + * PluginTest.java + * + * Created on April 21, 2003, 4:59 PM + */ +/***************************************************************************** + * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materails provided with the distribution. + * + * Neither the name Sun Microsystems, Inc. or the names of the contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND + * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS + * A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for us in + * the design, construction, operation or maintenance of any nuclear facility + * + *****************************************************************************/ +package net.java.games.util.plugins.test; + +/** + * + * @author jeff + */ + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import net.java.games.util.plugins.Plugins; + + +class ClassRenderer implements ListCellRenderer { + JLabel label = new JLabel(); + public Component getListCellRendererComponent(JList jList, Object obj, int param, + boolean param3, boolean param4) + { + label.setText(((Class)obj).getName()); + label.setForeground(Color.BLACK); + label.setBackground(Color.WHITE); + if (PluginTest.DEBUG) { + System.out.println("Rendering: "+label.getText()); + } + return label; + } +} + +class ListUpdater implements Runnable{ + Object[] objList; + DefaultListModel mdl; + public ListUpdater(JList jlist, Object[] list){ + objList = list; + mdl = (DefaultListModel)jlist.getModel(); + } + + public void run() { + mdl.clear(); + for(int i=0;i<objList.length;i++){ + mdl.addElement(objList[i]); + } + } +} + +public class PluginTest { + static final boolean DEBUG = false; + Plugins plugins = new Plugins(new File("test_plugins")); + JList plist; + Class[] piList; // holder for current list of plugins + /** Creates a new instance of PluginTest */ + public PluginTest() { + JFrame f = new JFrame("PluginTest"); + plist = new JList(new DefaultListModel()); + plist.setCellRenderer(new ClassRenderer()); + Container c = f.getContentPane(); + c.setLayout(new BorderLayout()); + c.add(new JScrollPane(plist),BorderLayout.CENTER); + JPanel p = new JPanel(); + c.add(p,BorderLayout.SOUTH); + p.setLayout(new FlowLayout()); + f.pack(); + f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); + f.setVisible(true); + doListAll(); + } + + private void doListAll(){ + SwingUtilities.invokeLater(new ListUpdater(plist,plugins.get())); + } + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + new PluginTest(); + } + +} |