package jframe.core.plugin.loader.ext;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import jframe.core.plugin.loader.PluginCase;
import jframe.core.plugin.loader.PluginClassLoader;
import jframe.core.plugin.loader.PluginClassLoaderContext;
import jframe.core.plugin.service.ServiceContext;
/**
* <p>
* <li>service finding</li>
* <li></li>
* </p>
*
* @author dzh
* @date Sep 15, 2014 5:11:00 PM
* @since 1.1
*/
public class DefPluginLoaderContext implements PluginClassLoaderContext {
private ServiceContext _sc;
/**
* TODO local storage
* <p>
* <pluginName,pluginClassLoader>
* </p>
*/
private Map<String, PluginClassLoader> clazzLoaders = Collections
.synchronizedMap(new HashMap<String, PluginClassLoader>());
/**
* <clazz,pluginName>
*/
private Map<String, String> exportClazz = Collections.synchronizedMap(new HashMap<String, String>());
public DefPluginLoaderContext() {
_sc = new ServiceContext();
}
public ServiceContext getServiceContext() {
return _sc;
}
public void close() {
_sc.close();
clazzLoaders.clear();
exportClazz.clear();
}
public PluginClassLoader findPluginClassLoader(String name) {
return clazzLoaders.get(name);
}
/**
*
* @param name
* @param clazzLoader
*/
protected void putPluginClassLoader(String name, PluginClassLoader clazzLoader) {
if (!clazzLoaders.containsKey(name)) {
clazzLoaders.put(name, clazzLoader);
}
}
protected void removePluginClassLoader(String name) {
if (clazzLoaders.containsKey(name)) {
clazzLoaders.remove(name);
}
}
/**
*
* @param clazz
* export/import class
* @param name
* plugin's name
*/
protected void putExportClass(String clazz, String name) {
exportClazz.put(clazz, name);
}
protected void removeExportClass(String clazz) {
exportClazz.remove(clazz);
}
/**
* @param clazz
* export/import class
* @return
*/
public PluginClassLoader findImportClassLoader(String clazz) {
return clazzLoaders.get(exportClazz.get(clazz));
}
/**
* register plugin
*/
public void regPluginClassLoader(PluginClassLoader clazzLoader) {
PluginCase pc = clazzLoader.getPluginCase();
// plugin name
putPluginClassLoader(pc.getPluginName(), clazzLoader);
// export class
for (String clazz : pc.getExportClass()) {
putExportClass(clazz, pc.getPluginName());
}
// plugin-service is exported default
for (String clazz : pc.getPluginService()) {
putExportClass(clazz, pc.getPluginName());
}
}
/**
* unregister plugin
*/
public void unregPluginClassLoader(PluginClassLoader clazzLoader) {
PluginCase pc = clazzLoader.getPluginCase();
for (String clazz : pc.getExportClass()) {
removeExportClass(clazz);
}
for (String clazz : pc.getPluginService()) {
removeExportClass(clazz);
}
removePluginClassLoader(clazzLoader.getPluginCase().getPluginName());
}
}