aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorjeffpk <[email protected]>2003-06-07 00:17:26 +0000
committerjeffpk <[email protected]>2003-06-07 00:17:26 +0000
commitfe011589ffb1f4405fe5dd27ebf94692934250f9 (patch)
treecfa41512b8a17530e88c999faff2b4c9b6a010fc /src
parent4ab19a606a56e6bd4d5f2450d6720834d5fb5d63 (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
Diffstat (limited to 'src')
-rw-r--r--src/java/net/java/games/util/plugins/Plugin.java60
-rw-r--r--src/java/net/java/games/util/plugins/PluginLoader.java147
-rw-r--r--src/java/net/java/games/util/plugins/Plugins.java243
-rw-r--r--src/java/net/java/games/util/plugins/test/FooChildPlugin.java50
-rw-r--r--src/java/net/java/games/util/plugins/test/FooPlugin.java51
-rw-r--r--src/java/net/java/games/util/plugins/test/InheritedInterfacePlugin.java50
-rw-r--r--src/java/net/java/games/util/plugins/test/InterfaceNotAPlugin.java49
-rw-r--r--src/java/net/java/games/util/plugins/test/NotAPlugin.java50
-rw-r--r--src/java/net/java/games/util/plugins/test/PluginTest.java115
9 files changed, 815 insertions, 0 deletions
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();
+ }
+
+}