plugininitializer.java
来自「Azureus is a powerful, full-featured, cr」· Java 代码 · 共 1,154 行 · 第 1/2 页
JAVA
1,154 行
if ( plugin_name != null ){
new_props.put( "plugin.name", plugin_name );
}
// System.out.println( "loading plugin '" + plugin_class + "' using cl " + classLoader);
// if the plugin load fails we still need to generate a plugin entry
// as this drives the upgrade process
Plugin plugin = null;
Throwable load_failure = null;
try{
Class c = classLoader.loadClass(plugin_class);
plugin = (Plugin) c.newInstance();
}catch( Throwable e ){
load_failure = e;
plugin = new loadFailedPlugin();
}
MessageText.integratePluginMessages((String)props.get("plugin.langfile"),classLoader);
PluginInterfaceImpl plugin_interface =
new PluginInterfaceImpl(
plugin,
this,
directory,
classLoader,
directory.getName(), // key for config values
new_props,
directory.getAbsolutePath(),
plugin_id[0]==null?directory.getName():plugin_id[0],
plugin_version[0] );
try{
plugin.initialize(plugin_interface);
}catch( Throwable e ){
load_failure = e;
}
plugin_interface.setOperational( load_failure == null );
plugins.add( plugin );
plugin_interfaces.add( plugin_interface );
if ( load_failure != null ){
Debug.printStackTrace( load_failure );
String msg = "Error loading plugin '" + pluginName + "' / '" + plugin_class_string + "'";
LGLogger.logUnrepeatableAlert( msg, load_failure );
System.out.println( msg + " : " + load_failure);
last_load_failure = new PluginException( msg, load_failure );
}
}
if ( p1 == -1 ){
break;
}
}
if ( last_load_failure != null ){
throw( last_load_failure );
}
} catch(Throwable e) {
if ( e instanceof PluginException ){
throw((PluginException)e);
}
Debug.printStackTrace( e );
String msg = "Error loading plugin '" + pluginName + "' / '" + plugin_class_string + "'";
LGLogger.logUnrepeatableAlert( msg, e );
System.out.println( msg + " : " + e);
throw( new PluginException( msg, e ));
}
}
private ClassLoader
addFileToClassPath(
ClassLoader classLoader,
File f)
{
if ( f.exists() &&
(!f.isDirectory())&&
f.getName().endsWith(".jar")){
try {
// URL classloader doesn't seem to delegate to parent classloader properly
// so if you get a chain of them then it fails to find things. Here we
// make sure that all of our added URLs end up within a single URLClassloader
// with its parent being the one that loaded this class itself
if ( classLoader instanceof URLClassLoader ){
URL[] old = ((URLClassLoader)classLoader).getURLs();
URL[] new_urls = new URL[old.length+1];
System.arraycopy( old, 0, new_urls, 0, old.length );
new_urls[new_urls.length-1]= f.toURL();
classLoader = new URLClassLoader(
new_urls,
classLoader==getClass().getClassLoader()?
classLoader:
classLoader.getParent());
}else{
classLoader = new URLClassLoader(new URL[]{f.toURL()},classLoader);
}
}catch(Exception e){
Debug.printStackTrace( e );
}
}
return( classLoader );
}
protected void
initializePluginFromClass(
Class plugin_class,
String plugin_id,
String plugin_config_key )
throws PluginException
{
if ( getPluginFromClass( plugin_class ) != null ){
LGLogger.logUnrepeatableAlert( LGLogger.AT_WARNING, "plugin class '" + plugin_class.getName() + "' is already loaded" );
return;
}
if( listener != null ){
String plugin_name = plugin_class.getName();
int pos = plugin_name.lastIndexOf(".");
if ( pos != -1 ){
plugin_name = plugin_name.substring( pos+1 );
}
listener.reportCurrentTask(MessageText.getString("splash.plugin") + plugin_name );
}
try{
Plugin plugin = (Plugin) plugin_class.newInstance();
PluginInterfaceImpl plugin_interface =
new PluginInterfaceImpl(
plugin,
this,
plugin_class,
plugin_class.getClassLoader(),
plugin_config_key,
new Properties(),
"",
plugin_id,
null );
plugin.initialize(plugin_interface);
plugins.add( plugin );
plugin_interfaces.add( plugin_interface );
}catch(Throwable e){
Debug.printStackTrace( e );
String msg = "Error loading internal plugin '" + plugin_class.getName() + "'";
LGLogger.logUnrepeatableAlert( msg, e );
System.out.println(msg + " : " + e);
throw( new PluginException( msg, e ));
}
}
protected void
initializePluginFromInstance(
Plugin plugin,
String plugin_id,
String plugin_config_key )
throws PluginException
{
try{
PluginInterfaceImpl plugin_interface =
new PluginInterfaceImpl(
plugin,
this,
plugin.getClass(),
plugin.getClass().getClassLoader(),
plugin_config_key,
new Properties(),
"",
plugin_id,
null );
plugin.initialize(plugin_interface);
plugins.add( plugin );
plugin_interfaces.add( plugin_interface );
}catch(Throwable e){
Debug.printStackTrace( e );
String msg = "Error loading internal plugin '" + plugin.getClass().getName() + "'";
LGLogger.logUnrepeatableAlert( msg, e );
System.out.println(msg + " : " + e);
throw( new PluginException( msg, e ));
}
}
protected void
unloadPlugin(
PluginInterfaceImpl pi )
{
plugins.remove( pi.getPlugin());
plugin_interfaces.remove( pi );
}
protected void
reloadPlugin(
PluginInterfaceImpl pi )
throws PluginException
{
unloadPlugin( pi );
Object key = pi.getInitializerKey();
String config_key = pi.getPluginConfigKey();
if ( key instanceof File ){
initializePluginFromDir( (File)key );
}else{
initializePluginFromClass( (Class) key, pi.getPluginID(), config_key );
}
}
protected AzureusCore
getAzureusCore()
{
return( azureus_core );
}
protected GlobalManager
getGlobalManager()
{
return( azureus_core.getGlobalManager() );
}
public static PluginInterface
getDefaultInterface()
{
return( singleton.getDefaultInterfaceSupport());
}
protected PluginInterface
getDefaultInterfaceSupport()
{
if ( default_plugin == null ){
default_plugin =
new PluginInterfaceImpl(
null,
this,
getClass(),
getClass().getClassLoader(),
"default",
new Properties(),
null,
"<internal>",
null );
}
return( default_plugin );
}
public void
downloadManagerAdded(
DownloadManager dm )
{
}
public void
downloadManagerRemoved(
DownloadManager dm )
{
}
public void
destroyInitiated()
{
for (int i=0;i<plugin_interfaces.size();i++){
((PluginInterfaceImpl)plugin_interfaces.get(i)).closedownInitiated();
}
if ( default_plugin != null ){
default_plugin.closedownInitiated();
}
}
public void
destroyed()
{
for (int i=0;i<plugin_interfaces.size();i++){
((PluginInterfaceImpl)plugin_interfaces.get(i)).closedownComplete();
}
if ( default_plugin != null ){
default_plugin.closedownComplete();
}
}
protected void
fireEventSupport(
final int type )
{
PluginEvent ev = new PluginEvent(){ public int getType(){ return( type );}};
for (int i=0;i<plugin_interfaces.size();i++){
((PluginInterfaceImpl)plugin_interfaces.get(i)).fireEvent(ev);
}
}
public static void
fireEvent(
int type )
{
singleton.fireEventSupport(type);
}
protected void
initialisationCompleteSupport()
{
initialisation_complete = true;
for (int i=0;i<plugin_interfaces.size();i++){
((PluginInterfaceImpl)plugin_interfaces.get(i)).initialisationComplete();
}
if ( default_plugin != null ){
default_plugin.initialisationComplete();
}
}
protected boolean
isInitialisationComplete()
{
return( initialisation_complete );
}
public static void
initialisationComplete()
{
singleton.initialisationCompleteSupport();
}
public static List getPluginInterfaces() {
return singleton.getPluginInterfacesSupport();
}
protected List getPluginInterfacesSupport() {
return plugin_interfaces;
}
protected PluginInterface[]
getPlugins()
{
List pis = getPluginInterfacesSupport();
PluginInterface[] res = new PluginInterface[pis.size()];
pis.toArray(res);
return( res );
}
protected PluginManager
getPluginManager()
{
return( plugin_manager );
}
protected PluginInterfaceImpl
getPluginFromClass(
Class cla )
{
return( getPluginFromClass( cla.getName()));
}
protected PluginInterfaceImpl
getPluginFromClass(
String class_name )
{
for (int i=0;i<plugin_interfaces.size();i++){
PluginInterfaceImpl pi = (PluginInterfaceImpl)plugin_interfaces.get(i);
if ( pi.getPlugin().getClass().getName().equals( class_name )){
return( pi );
}
}
return( null );
}
protected File[]
getHighestJarVersions(
File[] files,
String[] version_out ,
String[] id_out ) // currently the version of last versioned jar found...
{
List res = new ArrayList();
Map version_map = new HashMap();
for (int i=0;i<files.length;i++){
File f = files[i];
String name = f.getName().toLowerCase();
if ( name.endsWith(".jar")){
int cvs_pos = name.lastIndexOf("_cvs");
int sep_pos;
if (cvs_pos <= 0)
sep_pos = name.lastIndexOf("_");
else
sep_pos = name.lastIndexOf("_", cvs_pos - 1);
if ( sep_pos == -1 ||
sep_pos == name.length()-1 ||
!Character.isDigit(name.charAt(sep_pos+1))){
// not a versioned jar
res.add( f );
}else{
String prefix = name.substring(0,sep_pos);
String version = name.substring(sep_pos+1, (cvs_pos <= 0) ? name.length()-4 : cvs_pos);
String prev_version = (String)version_map.get(prefix);
if ( prev_version == null ){
version_map.put( prefix, version );
}else{
if ( PluginUtils.comparePluginVersions( prev_version, version ) < 0 ){
version_map.put( prefix, version );
}
}
}
}
}
// If any of the jars are versioned then the assumption is that all of them are
// For migration purposes (i.e. on the first real introduction of the update versioning
// system) we drop all non-versioned jars from the set
if ( version_map.size() > 0 ){
res.clear();
}
Iterator it = version_map.keySet().iterator();
while(it.hasNext()){
String prefix = (String)it.next();
String version = (String)version_map.get(prefix);
String target = prefix + "_" + version;
version_out[0] = version;
id_out[0] = prefix;
for (int i=0;i<files.length;i++){
File f = files[i];
String lc_name = f.getName().toLowerCase();
if ( lc_name.equals( target + ".jar" ) ||
lc_name.equals( target + "_cvs.jar" )){
res.add( f );
break;
}
}
}
File[] res_array = new File[res.size()];
res.toArray( res_array );
return( res_array );
}
protected class
loadFailedPlugin
implements UnloadablePlugin
{
public void
initialize(
PluginInterface pluginInterface )
throws PluginException
{
}
public void
unload()
{
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?