package net.jxta.impl.loader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import net.jxta.document.Element;
import net.jxta.impl.peergroup.CompatibilityEquater;
import net.jxta.impl.peergroup.CompatibilityUtils;
import net.jxse.module.IJxtaModuleService;
import net.jxta.platform.IJxtaLoader;
import net.jxta.platform.Module;
import net.jxta.platform.ModuleSpecID;
import net.jxta.protocol.ModuleImplAdvertisement;
public class DynamicJxtaLoader implements IJxtaLoader {
/**
* Default compatibility equater instance.
*/
private static final CompatibilityEquater COMP_EQ = new CompatibilityEquater() {
public boolean compatible(Element<?> test) {
return CompatibilityUtils.isCompatible(test);
}
};
private static final DynamicJxtaLoader loader = new DynamicJxtaLoader();
private final IJxtaLoader ref;
private final Collection<IJxtaLoader> loaders;
private final JxtaModuleServiceLoader moduleLoader;
private DynamicJxtaLoader() {
loaders = new ArrayList<IJxtaLoader>();
moduleLoader = new JxtaModuleServiceLoader();
loaders.add( moduleLoader );
ref = new RefJxtaLoader( new URL[0], COMP_EQ );
loaders.add( ref);
}
public static DynamicJxtaLoader getInstance(){
return loader;
}
public void addModuleService( IJxtaModuleService<Module> service ){
moduleLoader.addModuleService( service );
}
public void removeModuleService( IJxtaModuleService<Module> service ){
moduleLoader.removeModuleService( service );
}
public void addURL(URL url) {
ref.addURL(url);
}
public ClassLoader getClassLoader() {
return (ClassLoader) ref;
}
public Class<? extends Module> findClass(ModuleSpecID spec) throws ClassNotFoundException {
for( IJxtaLoader loader: loaders ){
Class<? extends Module> clss = loader.findClass(spec);
if( clss != null )
return clss;
}
return null;
}
public Class<? extends Module> loadClass(ModuleSpecID spec) throws ClassNotFoundException {
for( IJxtaLoader loader: loaders ){
Class<? extends Module> clss = loader.loadClass(spec);
if( clss != null )
return clss;
}
return null;
}
public Class<? extends Module> defineClass(ModuleImplAdvertisement impl) {
for( IJxtaLoader loader: loaders ){
Class<? extends Module> clss = loader.defineClass(impl);
if( clss != null )
return clss;
}
return null;
}
public ModuleImplAdvertisement findModuleImplAdvertisement(Class<? extends Module> clazz) {
for( IJxtaLoader loader: loaders ){
ModuleImplAdvertisement implAdv = loader.findModuleImplAdvertisement(clazz);
if( implAdv != null )
return implAdv;
}
return null;
}
public ModuleImplAdvertisement findModuleImplAdvertisement(ModuleSpecID msid) {
for( IJxtaLoader loader: loaders ){
ModuleImplAdvertisement implAdv = loader.findModuleImplAdvertisement( msid );
if( implAdv != null )
return implAdv;
}
return null;
}
private class JxtaModuleServiceLoader implements IJxtaLoader{
private final Collection<IJxtaModuleService<Module>> services;
JxtaModuleServiceLoader() {
services = new ArrayList<IJxtaModuleService<Module>>();
}
public Class<? extends Module> findClass(ModuleSpecID spec) throws ClassNotFoundException {
for( IJxtaModuleService<Module> service: services ){
if( service.getModuleSpecID().equals( spec ))
return service.getModule().getClass();
}
return null;
}
public Class<? extends Module> loadClass(ModuleSpecID spec) throws ClassNotFoundException {
return this.findClass(spec);
}
void addModuleService( IJxtaModuleService<Module> service ){
this.services.add( service );
}
void removeModuleService( IJxtaModuleService<Module> service ){
this.services.remove( service );
}
public Class<? extends Module> defineClass(ModuleImplAdvertisement impl) {
for( IJxtaModuleService<Module> service: services ){
if( service.getModuleImplAdvertisement().equals( impl ))
return service.getModule().getClass();
}
return null;
}
public ModuleImplAdvertisement findModuleImplAdvertisement(Class<? extends Module> clazz) {
for( IJxtaModuleService<Module> service: services ){
if( service.getRepresentedClassName().equals( clazz.getCanonicalName() ))
return service.getModuleImplAdvertisement();
}
return null;
}
public ModuleImplAdvertisement findModuleImplAdvertisement(ModuleSpecID msid) {
for( IJxtaModuleService<Module> service: services ){
if( service.getModuleSpecID().equals( msid ))
return service.getModuleImplAdvertisement();
}
return null;
}
public void addURL(URL url) {
}
public ClassLoader getClassLoader() {
return null;
}
}
}