📄 standardpluginmanager.java
字号:
if (plugin.isActive()) {
fireEvent(plugin, false);
stopPlugin(plugin);
lifecycleHandler.afterPluginStop(plugin);
log.info("plug-in stopped - " + descr.getUniqueId()); //$NON-NLS-1$
} else {
log.warn("plug-in " + descr.getUniqueId() //$NON-NLS-1$
+ " is not active although present in active " //$NON-NLS-1$
+ "plug-ins list", new Exception( //$NON-NLS-1$
"fake exception to view stack trace")); //$NON-NLS-1$
}
} catch (Exception e) {
log.error("error while stopping plug-in " //$NON-NLS-1$
+ descr.getUniqueId(), e);
}
}
PluginClassLoader clsLoader =
(PluginClassLoader) classLoaders.remove(descr.getId());
if (clsLoader != null) {
disposeClassLoader(clsLoader);
}
badPlugins.remove(descr.getId());
activationLog.remove(descr.getId());
}
private void dump() {
if (!log.isDebugEnabled()) {
return;
}
StringBuffer buf = new StringBuffer("PLUGIN MANAGER DUMP:\r\n"); //$NON-NLS-1$
buf.append("-------------- DUMP BEGIN -----------------\r\n"); //$NON-NLS-1$
buf.append("\tActive plug-ins: " + activePlugins.size()) //$NON-NLS-1$
.append("\r\n"); //$NON-NLS-1$
for (Iterator it = activePlugins.values().iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("\tActivating plug-ins: " //$NON-NLS-1$
+ activatingPlugins.size()).append("\r\n"); //$NON-NLS-1$
for (Iterator it = activatingPlugins.iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("\tPlug-ins with instantiated class loaders: " //$NON-NLS-1$
+ classLoaders.size()).append("\r\n"); //$NON-NLS-1$
for (Iterator it = classLoaders.keySet().iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("\tDisabled plug-ins: " + disabledPlugins.size()) //$NON-NLS-1$
.append("\r\n"); //$NON-NLS-1$
for (Iterator it = disabledPlugins.iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("\tBad plug-ins: " + badPlugins.size()) //$NON-NLS-1$
.append("\r\n"); //$NON-NLS-1$
for (Iterator it = badPlugins.iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("\tActivation log: " + activationLog.size()) //$NON-NLS-1$
.append("\r\n"); //$NON-NLS-1$
for (Iterator it = activationLog.iterator(); it.hasNext();) {
buf.append("\t\t") //$NON-NLS-1$
.append(it.next())
.append("\r\n"); //$NON-NLS-1$
}
buf.append("Memory TOTAL/FREE/MAX: ") //$NON-NLS-1$
.append(Runtime.getRuntime().totalMemory())
.append("/") //$NON-NLS-1$
.append(Runtime.getRuntime().freeMemory())
.append("/") //$NON-NLS-1$
.append(Runtime.getRuntime().maxMemory())
.append("\r\n"); //$NON-NLS-1$
buf.append("-------------- DUMP END -----------------"); //$NON-NLS-1$
log.debug(buf.toString());
}
/**
* Disables plug-in (with dependencies) in this manager instance.
* Disabled plug-in can't be activated although it may be valid and
* successfully registered with plug-in registry. Before disabling,
* plug-in will be deactivated if it was successfully activated.
* <br>
* Be careful with this method as it can effectively disable large set
* of inter-depending plug-ins and your application may become unstable
* or even disabled as whole.
* @param descr descriptor of plug-in to be disabled
* @return descriptors of plug-ins that was actually disabled
*/
public PluginDescriptor[] disablePlugin(final PluginDescriptor descr) {
List result = new LinkedList();
if (!disabledPlugins.contains(descr.getId())) {
deactivatePlugin(descr);
fireEvent(descr, false);
disabledPlugins.add(descr.getId());
result.add(descr);
}
for (Iterator it = registry.getDependingPlugins(descr).iterator();
it.hasNext();) {
PluginDescriptor dependedPlugin = (PluginDescriptor) it.next();
if (!disabledPlugins.contains(dependedPlugin.getId())) {
deactivatePlugin(dependedPlugin);
fireEvent(dependedPlugin, false);
disabledPlugins.add(dependedPlugin.getId());
result.add(dependedPlugin);
}
}
return (PluginDescriptor[]) result.toArray(
new PluginDescriptor[result.size()]);
}
/**
* Enables plug-in (or plug-ins) in this manager instance.
* @param descr descriptor of plug-in to be enabled
* @param includeDependings if <code>true</code>, depending plug-ins will
* be also enabled
* @return descriptors of plug-ins that was actually enabled
* @see #disablePlugin(PluginDescriptor)
*/
public PluginDescriptor[] enablePlugin(final PluginDescriptor descr,
final boolean includeDependings) {
List result = new LinkedList();
if (disabledPlugins.contains(descr.getId())) {
disabledPlugins.remove(descr.getId());
fireEvent(descr, true);
result.add(descr);
}
if (includeDependings) {
for (Iterator it = registry.getDependingPlugins(descr).iterator();
it.hasNext();) {
PluginDescriptor dependedPlugin = (PluginDescriptor) it.next();
if (disabledPlugins.contains(dependedPlugin.getId())) {
disabledPlugins.remove(dependedPlugin.getId());
fireEvent(dependedPlugin, true);
result.add(dependedPlugin);
}
}
}
return (PluginDescriptor[]) result.toArray(
new PluginDescriptor[result.size()]);
}
/**
* @param descr plug-in descriptor
* @return <code>true</code> if given plug-in is disabled in this manager
*/
public boolean isPluginEnabled(final PluginDescriptor descr) {
return !disabledPlugins.contains(descr.getId());
}
/**
* Registers plug-in manager event listener. If given listener has been
* registered before, this method will throw an
* {@link IllegalArgumentException}.
* @param listener new manager event listener
*/
public void registerListener(final EventListener listener) {
if (listeners.contains(listener)) {
throw new IllegalArgumentException("listener " + listener //$NON-NLS-1$
+ " already registered"); //$NON-NLS-1$
}
listeners.add(listener);
}
/**
* Unregisters manager event listener. If given listener hasn't been
* registered before, this method will throw an
* {@link IllegalArgumentException}.
* @param listener registered listener
*/
public void unregisterListener(final EventListener listener) {
if (!listeners.remove(listener)) {
log.warn("unknown listener " + listener); //$NON-NLS-1$
}
}
private void fireEvent(final Object data, final boolean on) {
if (listeners.isEmpty()) {
return;
}
// make local copy
EventListener[] arr = (EventListener[]) listeners.toArray(
new EventListener[listeners.size()]);
// propagate event basing on given data type and on/off flag
//NB: revise this logic if EventListener members are changed
if (data instanceof PluginDescriptor) {
PluginDescriptor descr = (PluginDescriptor) data;
if (on) {
if (log.isDebugEnabled()) {
log.debug("propagating \"pluginEnabled\" event for " //$NON-NLS-1$
+ descr);
}
for (int i = 0; i < arr.length; i++) {
arr[i].pluginEnabled(descr);
}
} else {
if (log.isDebugEnabled()) {
log.debug("propagating \"pluginDisabled\" event for " //$NON-NLS-1$
+ descr);
}
for (int i = 0; i < arr.length; i++) {
arr[i].pluginDisabled(descr);
}
}
} else {
Plugin plugin = (Plugin) data;
if (on) {
if (log.isDebugEnabled()) {
log.debug("propagating \"pluginActivated\" event for " //$NON-NLS-1$
+ plugin);
}
for (int i = 0; i < arr.length; i++) {
arr[i].pluginActivated(plugin);
}
} else {
if (log.isDebugEnabled()) {
log.debug("propagating \"pluginDeactivated\" event for " //$NON-NLS-1$
+ plugin);
}
for (int i = 0; i < arr.length; i++) {
arr[i].pluginDeactivated(plugin);
}
}
}
}
static final class EmptyPlugin extends Plugin {
/**
* @see org.java.plugin.Plugin#doStart()
*/
protected void doStart() throws Exception {
// no-op
}
/**
* @see org.java.plugin.Plugin#doStop()
*/
protected void doStop() throws Exception {
// no-op
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -