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

📄 xpluginobject.java

📁 XBrowser是一个完全免费并且开源的Web浏览器
💻 JAVA
字号:
/****************************************************************
*              XBrowser  -  eXtended web Browser                *
*                                                               *
*           Copyright (c) 2000-2001  Armond Avanes              *
*     Refer to ReadMe & License files for more information      *
*                                                               *
*                                                               *
*                      By: Armond Avanes                        *
*       Armond555@yahoo.com     &    Armond333@yahoo.com        *
*                http://xbrowser.sourceforge.net/               *
*****************************************************************/
package xbrowser.util;

import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import java.beans.*;

import javax.swing.*;

import org.w3c.dom.*;
import org.apache.crimson.tree.*;
//import com.sun.xml.tree.*;

import xbrowser.*;
import xbrowser.plugin.*;
import xbrowser.widgets.*;
import xbrowser.options.*;

public class XPluginObject extends XProxyObject
{
	public XPluginObject(String resource)
	{
		super("", "", resource);
		propChangeSupport = new PropertyChangeSupport(this);
	}

	public void addPropertyChangeListener(PropertyChangeListener listener)
	{
		propChangeSupport.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener)
	{
		propChangeSupport.removePropertyChangeListener(listener);
	}

	public XPlugin getPlugin()
	{
		return plugin;
	}

	public void init()
	{
		if( plugin!=null )
			return;

		try
		{
			plugin = loadPluginImpl();
			setStatus(XProjectConstants.PLUGIN_LOADED);
		}
		catch( Throwable t )
		{
			XRepository.getLogger().error(this, "Plugin can not be loaded!");
			XRepository.getLogger().error(this, t);

			plugin = null;
			setStatus(XProjectConstants.PLUGIN_INVALID);
			return;
		}

		plugin.setContext( new XPluginContext(plugin.getClass().getClassLoader()) );
		plugin.init();
		setStatus(XProjectConstants.PLUGIN_INITIATED);
	}

	public void start()
	{
		if( plugin==null )
			return;

		plugin.start();
		setStatus(XProjectConstants.PLUGIN_STARTED);
	}

	public void stop()
	{
		if( plugin==null )
			return;

		plugin.stop();
		setStatus(XProjectConstants.PLUGIN_STOPPED);
	}

	public void destroy()
	{
		if( plugin==null )
			return;

		plugin.destroy();
	}

	public XOptionPage getOptionPage()
	{
		if( plugin==null )
			return null;

		if( options==null )
			options = plugin.getOptionPage();

		return options;
	}

	private XPlugin loadPluginImpl() throws Exception
	{
		if( pluginClassLoader==null )
		{
		StringTokenizer tokenizer = new StringTokenizer(resource, ",;");
		String temp_rsrc = "";

			while( tokenizer.hasMoreTokens() )
				temp_rsrc += XProjectConstants.PLUGINS_DIR+tokenizer.nextToken();

			pluginClassLoader = XRepository.getResourceManager().createClassLoaderForResource(temp_rsrc);
		}

	URL xml = pluginClassLoader.getResource(XProjectConstants.PLUGIN_DESCRIPTOR_FILE);

		if( xml==null )
			throw new Exception("Plugin descriptor not found!!");

	URL dtd_url = XRepository.getResourceManager().getResourceURL(DTD_URL);
	Document doc = XMLManager.readResourceDocument(xml.toString(), DTD_SYMBOL, dtd_url);
	Node node = XMLManager.findNode(doc, "xplugin").getNextSibling();

		loadDescriptor(node);
		checkForExtraLibraries();

		return( (XPlugin)XRepository.getResourceManager().loadObject(packageName, pluginClassLoader) );
	}

	private void checkForExtraLibraries() throws Exception
	{
	StringTokenizer tokenizer = new StringTokenizer(extraResource, ",;");
	String plugin_lib_dir = XProjectConstants.PLUGINS_DIR+name+"_lib/";
	String extra_resource_urls = "";
	String temp_rsrc;
	InputStream is;
	OutputStream os;
	File file;
	URL url;
	int b;

		while( tokenizer.hasMoreTokens() )
		{
			temp_rsrc = tokenizer.nextToken();
			file = new File(plugin_lib_dir+temp_rsrc);

			if( !file.exists() )
			{
				url = pluginClassLoader.getResource(temp_rsrc);
				is = url.openStream();

				file.getParentFile().mkdirs();
				os = new FileOutputStream(file);

				while( (b=is.read())!=-1 )
					os.write(b);

				is.close();
				os.close();
			}

			if( !extra_resource_urls.equals("") )
				extra_resource_urls += ";";

			extra_resource_urls += plugin_lib_dir+temp_rsrc;
		}

		pluginClassLoader = XRepository.getResourceManager().createBuiltInClassLoader(extra_resource_urls, pluginClassLoader);
	}

	private void loadDescriptor(Node root) throws DOMException
	{
	Node node = root.getFirstChild();

		while( node!=null )
		{
			if( node instanceof Element )
			{
				if( node.getNodeName().equals("name") )
					name = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("icon") )
					iconPath = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("classname") )
					packageName = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("resource") )
					extraResource = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("version") )
					version = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("releasedate") )
					releaseDate = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("description") )
					description = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("documentation") )
					documentationFile = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("author") )
					loadAuthorInfo(node);
			}

			node = node.getNextSibling();
		}
	}

	private void loadAuthorInfo(Node node) throws DOMException
	{
		node = node.getFirstChild();
		while( node!=null )
		{
			if( node instanceof Element )
			{
				if( node.getNodeName().equals("authorname") )
					authorName = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("authoremail") )
					authorEMail = XMLManager.getNodeValue(node);
				else if( node.getNodeName().equals("authorhomepage") )
					authorHomePage = XMLManager.getNodeValue(node);
			}

			node = node.getNextSibling();
		}
	}

	private void buildIcon()
	{
	    if( icon!=null )
	    	return;

	    if( (iconPath==null) || (iconPath.trim().equals("")) || (pluginClassLoader==null) )
	        return;

		try
		{
			icon = new ImageIcon( pluginClassLoader.getResource(iconPath) );
		}
		catch( MissingResourceException e )
		{
			//XRepository.getLogger().warning(this, e);
		}
	}

	public Component getComponent()
	{
		if( (myComponent==null) && (plugin instanceof XGUIPlugin) )
			myComponent = ((XGUIPlugin)plugin).getComponent();

		SwingUtilities.updateComponentTreeUI(myComponent);
		return myComponent;
	}

	public String getTitle()
	{
		if( plugin!=null )
			return plugin.getTitle();
		else
			return "";
	}

	public ImageIcon getIcon()
	{
		buildIcon();
		return icon;
	}

	public String getVersion()
	{
		return version;
	}

	public String getReleaseDate()
	{
		return releaseDate;
	}

	public String getDescription()
	{
		return description;
	}

	public String getDocumentationFile()
	{
		return documentationFile;
	}

	public URL getDocumentationURL()
	{
		return pluginClassLoader.getResource(documentationFile);
	}

	public String getAuthorName()
	{
		return authorName;
	}

	public String getAuthorEMail()
	{
		return authorEMail;
	}

	public String getAuthorHomePage()
	{
		return authorHomePage;
	}

	public int getStatus()
	{
		return status;
	}

	public String getStatusString()
	{
		if( status==XProjectConstants.PLUGIN_NOT_LOADED )
			return notLoadedPlugin;
		else if( status==XProjectConstants.PLUGIN_LOADED )
			return loadedPlugin;
		else if( status==XProjectConstants.PLUGIN_INVALID )
			return invalidPlugin;
		else if( status==XProjectConstants.PLUGIN_INITIATED )
			return initiatedPlugin;
		else if( status==XProjectConstants.PLUGIN_STARTED )
			return startedPlugin;
		else if( status==XProjectConstants.PLUGIN_STOPPED )
			return stoppedPlugin;
		else
			return "";
	}

	public int getDock()
	{
		return dock;
	}

	public void setDock(int new_dock)
	{
	int old_dock = dock;

		dock = new_dock;
		propChangeSupport.firePropertyChange("Dock", dock, old_dock);
	}

	public void setDockString(String new_dock)
	{
		if( new_dock.equalsIgnoreCase(floatablePlugin) )
			setDock(XProjectConstants.PLUGIN_DOCK_FLOATABLE);
		else if( new_dock.equalsIgnoreCase(dockablePlugin) )
			setDock(XProjectConstants.PLUGIN_DOCK_DOCKABLE);
	}

	public String getDockString()
	{
		if( dock==XProjectConstants.PLUGIN_DOCK_FLOATABLE )
			return floatablePlugin;
		else if( dock==XProjectConstants.PLUGIN_DOCK_DOCKABLE )
			return dockablePlugin;
		else
			return "";
	}

	public static Iterator getPluginDocks()
	{
		return pluginDocks.iterator();
	}

	public boolean isAutoStart()
	{
		return autoStart;
	}

	public void setAutoStart(boolean auto_start)
	{
	boolean old_auto_start = autoStart;

		autoStart = auto_start;
		propChangeSupport.firePropertyChange("AutoStart", autoStart, old_auto_start);
	}

	public String getAutoStartString()
	{
		if( autoStart )
			return autoPlugin;
		else
			return nonAutoPlugin;
	}

	private void setStatus(int new_status)
	{
	int old_status = status;

		status = new_status;
		propChangeSupport.firePropertyChange("Status", status, old_status);
	}

// Attributes:
	private Component myComponent = null;

	private XOptionPage options = null;

	private ImageIcon icon = null;
	private String iconPath = "";
	private String version = "";
	private String releaseDate = "";
	private String description = "";
	private String documentationFile = "";
	private String extraResource = "";

	private String authorName = "";
	private String authorEMail = "";
	private String authorHomePage = "";

    private final String DTD_SYMBOL = "xbrowser:plugin-jar";
    private final String DTD_URL = XProjectConstants.DTD_DIR+"XPlugin-jar.dtd";

	private int status = XProjectConstants.PLUGIN_NOT_LOADED;
	private int dock = XProjectConstants.PLUGIN_DOCK_FLOATABLE;
	private boolean autoStart = false;

	private ClassLoader pluginClassLoader = null;
	private PropertyChangeSupport propChangeSupport = null;
	private XPlugin plugin = null;

	private final static String notLoadedPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.NotLoadedPlugin");
	private final static String loadedPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.LoadedPlugin");
	private final static String invalidPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.InvalidPlugin");
	private final static String initiatedPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.InitiatedPlugin");
	private final static String startedPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.StartedPlugin");
	private final static String stoppedPlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Status.StoppedPlugin");

	private final static String dockablePlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Dock.DockablePlugin");
	private final static String floatablePlugin = XRepository.getResourceManager().getProperty(XPluginObject.class, "Dock.FloatablePlugin");

	private final static LinkedList pluginDocks = new LinkedList();
	static
	{
		pluginDocks.add(dockablePlugin);
		pluginDocks.add(floatablePlugin);
	}

	private final String autoPlugin = XRepository.getResourceManager().getProperty(this, "AutoStart.Yes");
	private final String nonAutoPlugin = XRepository.getResourceManager().getProperty(this, "AutoStart.No");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -