Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* 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;
boolean localDLLs = true;
/** Creates a new instance of PluginLodaer
* If the system property "net.java.games.util.plugins.nolocalnative" is
* not set then the laoder will look for requried native libs in the
* same directory as the plugin jar. (Useful for handling name
* collision between plugins). If it IS set however, then it will
* fall back to the default way of loading natives. (Necessary for
* Java Web Start.)
* @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()},
Thread.currentThread().getContextClassLoader());
parentDir = jf.getParentFile();
if (System.getProperty("net.java.games.util.plugins.nolocalnative")
!=null){
localDLLs = false;
}
}
/** 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.
*
* Setting the global "localDLLs" by setting the property
* net.java.games.util.plugins.nolocalnative defeats this behavior.
* This is necessary for Java Web Start apps which have strong
* restrictions on where and how native libs can be loaded.
*
* @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){
if (localDLLs) {
String libpath = parentDir.getPath() + File.separator +
System.mapLibraryName(libname);
if (DEBUG) {
System.out.println("Returning libname of: " + libpath);
}
return libpath;
} else {
return super.findLibrary(libname);
}
}
/** 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