⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 standardpluginmanager.java

📁 java插件系统源码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                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 + -