aboutsummaryrefslogtreecommitdiffstats
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
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
-rw-r--r--README.txt45
-rw-r--r--build.xml109
-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
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();
+ }
+
+}