📄 standardpluginmanager.java
字号:
clsLoader = obj.getClass().getClassLoader();
}
if (!(clsLoader instanceof PluginClassLoader)) {
return null;
}
PluginDescriptor descr =
((PluginClassLoader) clsLoader).getPluginDescriptor();
Plugin result = (Plugin) activePlugins.get(descr.getId());
if (result != null) {
return result;
}
throw new IllegalStateException("can't get plug-in " + descr); //$NON-NLS-1$
}
/**
* @param descr plug-in descriptor
* @return <code>true</code> if plug-in with given descriptor is activated
*/
public boolean isPluginActivated(final PluginDescriptor descr) {
return activePlugins.containsKey(descr.getId());
}
/**
* @param descr plug-in descriptor
* @return <code>true</code> if plug-in disabled as it's activation fails
*/
public boolean isBadPlugin(final PluginDescriptor descr) {
return badPlugins.contains(descr.getId());
}
/**
* @param descr plug-in descriptor
* @return <code>true</code> if plug-in is currently activating
*/
public boolean isPluginActivating(final PluginDescriptor descr) {
return activatingPlugins.contains(descr.getId());
}
/**
* Returns instance of plug-in's class loader and not tries to activate
* plug-in. Use this method if you need to get access to plug-in resources
* and don't want to cause plug-in activation.
* @param descr plug-in descriptor
* @return class loader instance for plug-in with given descriptor
*/
public PluginClassLoader getPluginClassLoader(
final PluginDescriptor descr) {
if (badPlugins.contains(descr.getId())) {
throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$
+ " disabled internally as it wasn't properly initialized"); //$NON-NLS-1$
}
if (disabledPlugins.contains(descr.getId())) {
throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$
+ " disabled externally"); //$NON-NLS-1$
}
PluginClassLoader result =
(PluginClassLoader) classLoaders.get(descr.getId());
if (result != null) {
return result;
}
synchronized (this) {
result = (PluginClassLoader) classLoaders.get(descr.getId());
if (result != null) {
return result;
}
result = lifecycleHandler.createPluginClassLoader(descr);
classLoaders.put(descr.getId(), result);
}
return result;
}
/**
* Shuts down the framework.
* <br>
* Calling this method will deactivate all active plug-ins in order,
* reverse to the order they was activated. It also releases all resources
* allocated by this manager (class loaders, plug-in descriptors etc.).
* All disabled plug-ins will be marked as "enabled", all registered event
* listeners will be unregistered.
*/
public synchronized void shutdown() {
log.debug("shutting down..."); //$NON-NLS-1$
dump();
registry.unregisterListener(registryChangeListener);
List reversedLog = new ArrayList(activationLog);
Collections.reverse(reversedLog);
for (Iterator it = reversedLog.iterator(); it.hasNext();) {
String id = (String) it.next();
PluginDescriptor descr = registry.getPluginDescriptor(id);
if (descr == null) {
log.warn("can't find descriptor for plug-in " + id //$NON-NLS-1$
+ " to deactivate plug-in", new Exception( //$NON-NLS-1$
"fake exception to view stack trace")); //$NON-NLS-1$
continue;
}
deactivatePlugin(descr);
}
dump();
classLoaders.clear();
disabledPlugins.clear();
listeners.clear();
lifecycleHandler.dispose();
log.info("shutdown done"); //$NON-NLS-1$
}
private synchronized Plugin activatePlugin(final PluginDescriptor descr)
throws PluginLifecycleException {
Plugin result = (Plugin) activePlugins.get(descr.getId());
if (result != null) {
return result;
}
if (badPlugins.contains(descr.getId())) {
throw new IllegalArgumentException("plug-in " + descr.getId() //$NON-NLS-1$
+ " disabled as it wasn't properly initialized"); //$NON-NLS-1$
}
if (activatingPlugins.contains(descr.getId())) {
throw new PluginLifecycleException(
StandardObjectFactory.PACKAGE_NAME,
"pluginActivating", descr.getId()); //$NON-NLS-1$
}
activatingPlugins.add(descr.getId());
try {
try {
checkPrerequisites(descr);
String pluginClassName = descr.getPluginClassName();
if ((pluginClassName == null)
|| (pluginClassName.trim().length() == 0)) {
result = new EmptyPlugin();
} else {
result = lifecycleHandler.createPluginInstance(descr);
}
initPlugin(result, descr);
lifecycleHandler.beforePluginStart(result);
startPlugin(result);
} catch (PluginLifecycleException ple) {
badPlugins.add(descr.getId());
classLoaders.remove(descr.getId());
throw ple;
} catch (Exception e) {
badPlugins.add(descr.getId());
classLoaders.remove(descr.getId());
throw new PluginLifecycleException(
StandardObjectFactory.PACKAGE_NAME,
"pluginStartFailed", descr.getUniqueId(), e); //$NON-NLS-1$
}
activePlugins.put(descr.getId(), result);
activationLog.add(descr.getId());
log.info("plug-in started - " + descr.getUniqueId()); //$NON-NLS-1$
fireEvent(result, true);
return result;
} finally {
activatingPlugins.remove(descr.getId());
}
}
private void checkPrerequisites(final PluginDescriptor descr)
throws PluginLifecycleException {
for (Iterator it = descr.getPrerequisites().iterator(); it.hasNext();) {
PluginPrerequisite pre = (PluginPrerequisite) it.next();
if (activatingPlugins.contains(pre.getPluginId())) {
log.warn("dependencies loop detected during " //$NON-NLS-1$
+ "activation of plug-in " + descr, new Exception( //$NON-NLS-1$
"fake exception to view stack trace")); //$NON-NLS-1$
continue;
}
if (badPlugins.contains(pre.getPluginId())) {
if (pre.isOptional()) {
continue;
}
throw new PluginLifecycleException(
StandardObjectFactory.PACKAGE_NAME,
"pluginPrerequisiteBad", //$NON-NLS-1$
new Object[] {descr.getId(), pre.getPluginId()});
}
if (disabledPlugins.contains(pre.getPluginId())) {
if (pre.isOptional()) {
continue;
}
throw new PluginLifecycleException(
StandardObjectFactory.PACKAGE_NAME,
"pluginPrerequisiteDisabled", //$NON-NLS-1$
new Object[] {descr.getId(), pre.getPluginId()});
}
if (!pre.matches()) {
if (pre.isOptional()) {
continue;
}
throw new PluginLifecycleException(
StandardObjectFactory.PACKAGE_NAME,
"pluginPrerequisiteNotMatches", //$NON-NLS-1$
new Object[] {descr.getId(), pre.getPluginId()});
}
try {
activatePlugin(registry.getPluginDescriptor(
pre.getPluginId()));
} catch (PluginLifecycleException ple) {
if (pre.isOptional()) {
log.warn("failed activating optional plug-in from" //$NON-NLS-1$
+ " prerequisite " + pre, ple); //$NON-NLS-1$
continue;
}
throw ple;
}
}
}
/**
* Deactivates plug-in with given ID if it has been successfully activated
* before. Note that this method will effectively deactivate all plug-ins
* that depend on the given plug-in.
* @param id plug-in ID
*/
public void deactivatePlugin(final String id) {
if (!activePlugins.containsKey(id)) {
return;
}
PluginDescriptor descr = registry.getPluginDescriptor(id);
if (descr == null) {
throw new IllegalArgumentException("unknown plug-in ID - " + id); //$NON-NLS-1$
}
// Collect depending plug-ins
Map dependingPluginsMap = new HashMap();
for (Iterator it = registry.getDependingPlugins(descr).iterator();
it.hasNext();) {
PluginDescriptor dependingPlugin = (PluginDescriptor) it.next();
dependingPluginsMap.put(dependingPlugin.getId(), dependingPlugin);
}
// Prepare list of plug-ins to be deactivated in correct order
List tobeDeactivated = new LinkedList();
List reversedLog = new ArrayList(activationLog);
Collections.reverse(reversedLog);
for (Iterator it = reversedLog.iterator(); it.hasNext();) {
String pluginId = (String) it.next();
if (pluginId.equals(descr.getId())) {
tobeDeactivated.add(descr);
} else if (dependingPluginsMap.containsKey(pluginId)) {
tobeDeactivated.add(dependingPluginsMap.get(pluginId));
}
}
// Deactivate plug-ins
for (Iterator it = tobeDeactivated.iterator(); it.hasNext();) {
deactivatePlugin((PluginDescriptor) it.next());
}
dump();
}
private synchronized void deactivatePlugin(final PluginDescriptor descr) {
Plugin plugin = (Plugin) activePlugins.remove(descr.getId());
if (plugin != null) {
try {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -