/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.plugin;
import Sirius.navigator.connection.SessionManager;
import Sirius.navigator.plugin.context.*;
import Sirius.navigator.plugin.interfaces.*;
import Sirius.navigator.plugin.ui.*;
import Sirius.navigator.resource.*;
import Sirius.navigator.ui.embedded.*;
import Sirius.server.newuser.User;
import Sirius.server.newuser.UserGroup;
import Sirius.server.newuser.permission.PermissionHolder;
import org.apache.commons.digester.*;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.xml.sax.*;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
/**
* blah.
*
* @author Pascal
* @version 1.0 02/15/2003
*/
public final class PluginFactory {
//~ Static fields/initializers ---------------------------------------------
/** singleton shared instance. */
// private static PluginFactory factory = null;
private static final ResourceManager resource = ResourceManager.getManager();
//~ Instance fields --------------------------------------------------------
private final Logger logger;
private final PreloadPluginRuleSet preloadRuleSet;
private final LoadPluginRuleSet loadRuleSet;
private final String schemaLocation;
//~ Constructors -----------------------------------------------------------
/**
* Creates the singleton shared instance of PluginFactory.
*/
protected PluginFactory() {
logger = Logger.getLogger(this.getClass());
// log = new Log4jFactory().getInstance("navigator.plugin.factory.digester");
final Logger digesterLogger = Logger.getLogger(PluginFactory.LoadPluginRuleSet.class);
digesterLogger.setLevel(Level.WARN);
preloadRuleSet = new PreloadPluginRuleSet();
loadRuleSet = new LoadPluginRuleSet();
schemaLocation = resource.pathToIURIString(PropertyManager.getManager().getPluginPath() + "plugin.xsd"); // NOI18N
}
//~ Methods ----------------------------------------------------------------
/**
* Return the singleton PluginFactory instance.
*
* @param descriptor DOCUMENT ME!
* @param validating DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws SAXException DOCUMENT ME!
* @throws URISyntaxException DOCUMENT ME!
* @throws FileNotFoundException DOCUMENT ME!
*/
/*public final static PluginFactory getFactory()
* { if(factory == null) { factory = new PluginFactory(); } return factory;}*/
protected void preloadPlugin(final PluginDescriptor descriptor, final boolean validating) throws IOException,
SAXException,
URISyntaxException,
FileNotFoundException {
// InputStream inputStream = this.getXMLDescriptorInputStream(descriptor.getUrl());
final InputStream inputStream = this.getXMLDescriptorInputStream(descriptor.getPluginPath());
final Digester digester = new Digester();
if (validating) {
if (logger.isInfoEnabled()) {
logger.info("plugin xml schema validation turned off to improve performance"); // NOI18N
}
// if(logger.isDebugEnabled())logger.debug("enabling xml schema validation: '" + this.getSchemaLocation() +
// "'"); digester.setSchema(this.getSchemaLocation()); digester.setValidating(validating);
}
digester.push(descriptor);
digester.addRuleSet(preloadRuleSet);
digester.parse(inputStream);
inputStream.close();
}
/**
* DOCUMENT ME!
*
* @param descriptor DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws SAXException DOCUMENT ME!
* @throws URISyntaxException DOCUMENT ME!
* @throws FileNotFoundException DOCUMENT ME!
* @throws InvocationTargetException DOCUMENT ME!
*/
protected void loadPlugin(final PluginDescriptor descriptor) throws IOException,
SAXException,
URISyntaxException,
FileNotFoundException,
InvocationTargetException {
// InputStream inputStream = this.getXMLDescriptorInputStream(descriptor.getUrl());
final InputStream inputStream = this.getXMLDescriptorInputStream(descriptor.getPluginPath());
final Digester digester = new Digester();
// digester.setLogger(log);
digester.push(new PluginFactory.FactoryCore(descriptor));
digester.addRuleSet(loadRuleSet);
digester.parse(inputStream);
inputStream.close();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getSchemaLocation() {
return this.schemaLocation;
}
// helper methods ----------------------------------------------------------
/**
* Return the plugin descriptor XML configuration file (plugin.xml).
*
* @param pluginUrl DOCUMENT ME!
*
* @return the input stream, that reads the XML file
*
* @throws URISyntaxException DOCUMENT ME!
* @throws FileNotFoundException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
private InputStream getXMLDescriptorInputStream(final URL pluginUrl) throws URISyntaxException,
FileNotFoundException,
IOException {
if (logger.isDebugEnabled()) {
logger.debug("loading plugin XML descriptor '" + pluginUrl.toString() + "/"
+ PluginDescriptor.XML_DESCRIPTOR + "'"); // NOI18N
}
final File file = new File(new URI(pluginUrl.toString() + "/" + PluginDescriptor.XML_DESCRIPTOR)); // NOI18N
return new BufferedInputStream(new FileInputStream(file), 8192);
}
/**
* DOCUMENT ME!
*
* @param pluginPath DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws FileNotFoundException DOCUMENT ME!
* @throws MalformedURLException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
*/
private InputStream getXMLDescriptorInputStream(final String pluginPath) throws FileNotFoundException,
MalformedURLException,
IOException {
final String pluginDescriptorPath = pluginPath + PluginDescriptor.XML_DESCRIPTOR;
if (logger.isDebugEnabled()) {
logger.debug("loading plugin XML descriptor from remote URL '" + pluginDescriptorPath + "'"); // NOI18N
}
return new BufferedInputStream(resource.getResourceAsStream(pluginDescriptorPath), 16384);
/*if(pluginPath.indexOf("http://") == 0 || pluginPath.indexOf("https://") == 0)
* { if(logger.isDebugEnabled())logger.debug("loading plugin XML descriptor from remote URL '" +
* pluginDescriptorPath + "'"); URL pluginURL = new URL(pluginPath); return new
* BufferedInputStream(pluginURL.openStream()); } else { if(logger.isDebugEnabled())logger.debug("loading plugin
* XML descriptor from local filesystem '" + pluginDescriptorPath + "'"); File file = new
* File(pluginDescriptorPath); return new BufferedInputStream(new FileInputStream(file));}*/
}
//~ Inner Classes ----------------------------------------------------------
/**
* Digester RuleSets -------------------------------------------------------.
*
* @version $Revision$, $Date$
*/
private class PreloadPluginRuleSet extends RuleSetBase {
//~ Methods ------------------------------------------------------------
@Override
public void addRuleInstances(final Digester digester) {
// <plugin> ........................................................
// set PluginDescriptor Bean properties (<plugin> attributes -> properties)
digester.addSetProperties("plugin"); // NOI18N
// <metainfo> ......................................................
// create PluginMetaInfo object
digester.addObjectCreate("plugin/metainfo", "Sirius.navigator.plugin.PluginMetaInfo"); // NOI18N
// add PluginMetaInfo to PluginDescriptor
digester.addSetNext("plugin/metainfo", "setMetaInfo", "Sirius.navigator.plugin.PluginMetaInfo"); // NOI18N
// set PluginMetaInfo Bean properties (<plugin> attributes -> properties)
// digester.addSetProperties("plugin/metainfo/properties");
digester.addSetProperties("plugin/metainfo"); // NOI18N
// set PluginMetaInfo description (<description></description> -> description)
digester.addCallMethod("plugin/metainfo/description", "setDescription", 0); // NOI18N
// <rights> ........................................................
// set the usernames
digester.addCallMethod("plugin/deployment/rights/users/name", "addUser", 0); // NOI18N
// set the usergroupnames
digester.addCallMethod("plugin/deployment/rights/usergroups/name", "addUsergroup", 0); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class LoadPluginRuleSet extends RuleSetBase {
//~ Methods ------------------------------------------------------------
@Override
public void addRuleInstances(final Digester digester) {
// <properties> section ............................................
// capabilities
digester.addCallMethod(
"plugin/properties/capabilities",
"setCapabilities",
5,
new String[] {
"java.lang.Boolean",
"java.lang.Boolean",
"java.lang.Boolean",
"java.lang.Boolean",
"java.lang.Boolean"
}); // NOI18N
digester.addCallParam("plugin/properties/capabilities/progressobservable", 0); // NOI18N
digester.addCallParam("plugin/properties/capabilities/propertyobservable", 1); // NOI18N
digester.addCallParam("plugin/properties/capabilities/internationalized", 2); // NOI18N
digester.addCallParam("plugin/properties/capabilities/unloadable", 3); // NOI18N
digester.addCallParam("plugin/properties/capabilities/deactivateable", 4); // NOI18N
// internationalization
digester.addCallMethod("plugin/properties/internationalization/defaultlocale", "setDefaultLocale", 0); // NOI18N
// add PluginLocale object
digester.addCallMethod("plugin/properties/internationalization/locales/locale", "addLocale", 4); // NOI18N
digester.addCallParam("plugin/properties/internationalization/locales/locale/name", 0); // NOI18N
digester.addCallParam("plugin/properties/internationalization/locales/locale/language", 1); // NOI18N
digester.addCallParam("plugin/properties/internationalization/locales/locale/country", 2); // NOI18N
digester.addCallParam("plugin/properties/internationalization/locales/locale/resourcefile", 3); // NOI18N
// <deployment> section ............................................
// set plugin class name
digester.addCallMethod("plugin/deployment/pluginclass", "setClassName", 0); // NOI18N
// add libraries (jar files)
digester.addCallMethod("plugin/deployment/libraries/jar", "addLibrary", 0); // NOI18N
// add the plugin parameters
digester.addCallMethod("plugin/deployment/params/param", "addParameter", 2); // NOI18N
digester.addCallParam("plugin/deployment/params/param/name", 0); // NOI18N
digester.addCallParam("plugin/deployment/params/param/value", 1); // NOI18N
// add the attribute id <-> attribute name mappings
digester.addCallMethod("plugin/deployment/mappings/attribute", "addAttributeMapping", 2); // NOI18N
digester.addCallParam("plugin/deployment/mappings/attribute/name", 0); // NOI18N
digester.addCallParam("plugin/deployment/mappings/attribute/id", 1); // NOI18N
// it's time to create the plugin
digester.addCallMethod("plugin/deployment", "createPluginInstance"); // NOI18N
// .................................................................
// add the method
digester.addCallMethod(
"plugin/methods/method",
"addMethod",
5,
new String[] {
"java.lang.String",
"java.lang.String",
"java.lang.String",
"java.lang.Boolean",
"java.lang.Long"
}); // NOI18N
digester.addCallParam("plugin/methods/method/id", 0); // NOI18N
digester.addCallParam("plugin/methods/method/name", 1); // NOI18N
digester.addCallParam("plugin/methods/method/description", 2); // NOI18N
digester.addCallParam("plugin/methods/method/multithreaded", 3); // NOI18N
digester.addCallParam("plugin/methods/method/availability", 4); // NOI18N
// register methods digester.addCallMethod("plugin/methods", "registerMethods");
// ..................................................................
// register methods digester.addCallMethod("plugin/deployment/events", "registerMethods"); register event
// listeners @deprecated! use PluginContext.getMetadata.addXXXListener()
// digester.addCallMethod("plugin/deployment/events/selection/nodes", "registerNodeSelectionEvent", 0);
// digester.addCallMethod("plugin/deployment/events/selection/attributes",
// "registerAttributeSelectionEvent", 0);
// <ui><widget><component> section ---------------------------------
// create PluginComponentProxy
digester.addObjectCreate(
"plugin/ui/widgets/widget/component",
"Sirius.navigator.plugin.PluginUIDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/widgets/widget/component",
"addUIDescriptor",
"Sirius.navigator.plugin.PluginUIDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/widgets/widget/component/id", "setId", 0); // NOI18N
digester.addCallMethod("plugin/ui/widgets/widget/component/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/widgets/widget/component/tooltip", "setToolTip", 0); // NOI18N
digester.addCallMethod("plugin/ui/widgets/widget/component/icon", "setIconName", 0); // NOI18N
digester.addCallMethod("plugin/ui/widgets/widget/component/position", "setPosition", 0); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/component/preferredindex",
"setPreferredIndex",
0,
new String[] { "java.lang.Integer" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/component/componentevents",
"setPluginComponentEventsEnabled",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
// <ui><widget><container> section ---------------------------------
// no container
digester.addCallMethod("plugin/ui/widgets/widget/container/none", "addAsComponent"); // NOI18N
// panel
digester.addCallMethod("plugin/ui/widgets/widget/container/panel/layout", "addAsPanel", 0); // NOI18N
// scrollpane
digester.addCallMethod("plugin/ui/widgets/widget/container/scrollpane", "addAsScrollPane"); // NOI18N
// floatingframe
digester.addObjectCreate(
"plugin/ui/widgets/widget/container/floatingframe",
"Sirius.navigator.plugin.ui.PluginFloatingFrameConfigurator"); // NOI18N
digester.addSetNext(
"plugin/ui/widgets/widget/container/floatingframe",
"addAsFloatingFrame",
"Sirius.navigator.plugin.ui.PluginFloatingFrameConfigurator"); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/menubaravailable",
"setMenuBarAvailable",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/swapmenubar",
"setSwapMenuBar",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/disablemenubar",
"setDisableMenuBar",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/toolbaravailable",
"setToolBarAvailable",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/swaptoolbar",
"setSwapToolBar",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/disabletoolbar",
"setDisableToolBar",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addCallMethod(
"plugin/ui/widgets/widget/container/floatingframe/floatingevents",
"setFloatingEventsEnabled",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
// <ui><actions><toolbar> section ----------------------------------
digester.addObjectCreate(
"plugin/ui/actions/toolbar/properties",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/toolbar/properties",
"createPluginToolBar",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/properties/name", "setName", 0); // NOI18N
digester.addCallMethod(
"plugin/ui/actions/toolbar/properties/floatable",
"setFloatable",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
digester.addObjectCreate(
"plugin/ui/actions/toolbar/buttons/button",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/toolbar/buttons/button",
"addToolBarButton",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/buttons/button/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/buttons/button/mnemonic", "setMnemonic", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/buttons/button/tooltip", "setTooltip", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/buttons/button/icon", "setIconName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/toolbar/buttons/button/method", "setMethodId", 0); // NOI18N
// <ui><actions><menubar> section ----------------------------------
digester.addObjectCreate(
"plugin/ui/actions/menu/properties",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/menu/properties",
"createPluginMenu",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/properties/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/properties/mnemonic", "setMnemonic", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/properties/icon", "setIconName", 0); // NOI18N
digester.addObjectCreate(
"plugin/ui/actions/menu/items/item",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/menu/items/item",
"addMenuItem",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/mnemonic", "setMnemonic", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/tooltip", "setTooltip", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/icon", "setIconName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/method", "setMethodId", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/menu/items/item/accelerator", "setAccelerator", 0); // NOI18N
digester.addCallMethod(
"plugin/ui/actions/menu/items/item/separator",
"setSeparator",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
// <ui><actions><popup> section ----------------------------------
digester.addObjectCreate(
"plugin/ui/actions/popupmenu/properties",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/popupmenu/properties",
"createPluginPopupMenu",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/properties/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/properties/mnemonic", "setMnemonic", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/properties/icon", "setIconName", 0); // NOI18N
digester.addObjectCreate(
"plugin/ui/actions/popupmenu/items/item",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addSetNext(
"plugin/ui/actions/popupmenu/items/item",
"addPopupMenuItem",
"Sirius.navigator.plugin.PluginActionDescriptor"); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/name", "setName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/mnemonic", "setMnemonic", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/tooltip", "setTooltip", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/icon", "setIconName", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/method", "setMethodId", 0); // NOI18N
digester.addCallMethod("plugin/ui/actions/popupmenu/items/item/accelerator", "setAccelerator", 0); // NOI18N
digester.addCallMethod(
"plugin/ui/actions/popupmenu/items/item/separator",
"setSeparator",
0,
new String[] { "java.lang.Boolean" }); // NOI18N
// @deprecated
// digester.addCallMethod("plugin/deployment/methods/method/id", "setId", 0);
// digester.addCallMethod("plugin/deployment/methods/method/name", "setName", 0);
// digester.addCallMethod("plugin/deployment/methods/method/description", "setDescription", 0);
/*digester.addObjectCreate("plugin/deployment/methods/method",
* "Sirius.navigator.pluginsupport.PluginMethodDescriptor");
* digester.addSetNext("plugin/deployment/methods/method","addMethodDescriptor",
* "Sirius.navigator.pluginsupport.PluginMethodDescriptor");
* digester.addBeanPropertySetter("plugin/deployment/methods/method/id");
* digester.addBeanPropertySetter("plugin/deployment/methods/method/name");digester.addBeanPropertySetter("plugin/deployment/methods/method/description");*/
// digester.addCallMethod("plugin/ui/widgets/widget/component/id", "setId");
// digester.addCallMethod("plugin/ui/widgets/widget/component/name", "setName");
}
// @deprecated
/*
* private class PluginCreationFactory extends AbstractObjectCreationFactory { public Object
* createObject(Attributes attributes) throws java.lang.Exception { String classname =
* attributes.getValue("pluginclass"); PluginFactory.this.logger.info("creating plugin instance '" +
* classname + "'"); Class plugin = digester.getClassLoader().loadClass(classname); return
* plugin.newInstance(); } }
*/
}
/**
* helper factory ----------------------------------------------------------.
*
* @version $Revision$, $Date$
*/
private class FactoryCore {
//~ Instance fields ----------------------------------------------------
/** a list of libraries, this plugin needs. */
private ArrayList libraries = new ArrayList();
private HashMap mappingTable = new HashMap();
private HashMap paramTable = new HashMap();
private HashMap methodDescriptors = null;
private HashMap uiDescriptors = null;
private HashMap pluginLocales = null;
// private ArrayList actionDescriptors = new ArrayList();
private PluginDescriptor descriptor = null;
private String className = null;
private PluginUIDescriptor uiDescriptor = null;
private PluginMenu pluginMenu = null;
private PluginMenu pluginPopupMenu = null;
private EmbeddedToolBar pluginToolBar = null;
private String defaultLocale = null;
//~ Constructors -------------------------------------------------------
/**
* Creates a new FactoryCore object.
*
* @param descriptor DOCUMENT ME!
*/
private FactoryCore(final PluginDescriptor descriptor) {
if (logger.isInfoEnabled()) {
logger.info("new Plugin Factory Core instance created"); // NOI18N
}
this.descriptor = descriptor;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private PluginDescriptor getDescriptor() {
return this.descriptor;
}
/**
* <properties> set apabilities ========================================.
*
* @param progressObservable DOCUMENT ME!
* @param propertyObservable DOCUMENT ME!
* @param internationalized DOCUMENT ME!
* @param unloadable DOCUMENT ME!
* @param deactivateable DOCUMENT ME!
*/
public void setCapabilities(final Boolean progressObservable,
final Boolean propertyObservable,
final Boolean internationalized,
final Boolean unloadable,
final Boolean deactivateable) {
if (logger.isDebugEnabled()) {
logger.debug("setting plugin capabilities"); // NOI18N
}
this.descriptor.setProgressObservable(progressObservable.booleanValue());
this.descriptor.setPropertyObservable(propertyObservable.booleanValue());
this.descriptor.setInternationalized(internationalized.booleanValue());
this.descriptor.setUnloadable(unloadable.booleanValue());
this.descriptor.setDeactivateable(deactivateable.booleanValue());
}
/**
* <properties> add locale .............................................
*
* @param defaultLocale DOCUMENT ME!
*/
public void setDefaultLocale(final String defaultLocale) {
this.defaultLocale = defaultLocale;
}
/**
* DOCUMENT ME!
*
* @param name DOCUMENT ME!
* @param language DOCUMENT ME!
* @param country DOCUMENT ME!
* @param resourceFile DOCUMENT ME!
*/
public void addLocale(final String name,
final String language,
final String country,
final String resourceFile) {
if (logger.isDebugEnabled()) {
logger.debug("adding new plugin locale '" + name + "'"); // NOI18N
}
if (this.pluginLocales == null) {
this.pluginLocales = new HashMap();
}
final PluginLocale locale = new PluginLocale(name, language, country, resourceFile);
this.pluginLocales.put(locale.getName(), locale);
}
/**
* <deployment> section part 1 =========================================.
*
* @param className DOCUMENT ME!
*/
public void setClassName(final String className) {
if (logger.isDebugEnabled()) {
logger.debug("setting plugin class name " + className + "'"); // NOI18N
}
this.className = className;
}
/**
* DOCUMENT ME!
*
* @param jar DOCUMENT ME!
*/
public void addLibrary(final String jar) {
if (logger.isDebugEnabled()) {
logger.debug("adding library " + jar + "'"); // NOI18N
}
libraries.add(jar);
}
/**
* Maps meta attribute names to attribute ids.
*
* <p>The mapping is defined in the plugin descriptor (plugin.xml).</p>
*
* @param attributeName the name of the meta attribute, e.g. 'Koordinate'
* @param attributeId the id of the meta attribute, e.g. XYZ123
*/
public void addAttributeMapping(final String attributeName, final String attributeId) {
if (logger.isDebugEnabled()) {
logger.debug("adding attribute mapping '" + attributeName + "' = '" + attributeId + "'"); // NOI18N
}
if (mappingTable.containsKey(attributeName)) {
if (logger.isDebugEnabled()) {
logger.debug("attribute '" + attributeName + "' already in map, adding id to String array"); // NOI18N
}
// String[] currentIds = (String[])mappingTable.get(attributeName);
// String[] newIds = new String[currentIds.length + 1];
// System.arraycopy(currentIds, 0, newIds, 0, currentIds.length);
// newIds[currentIds.length] = attributeId;
final Set idSet = (Set)mappingTable.get(attributeName);
idSet.add(attributeId);
// logger.fatal("size: " + ((Set)mappingTable.get(attributeName)).size());
} else {
// mappingTable.put(attributeName, new String[]{attributeId});
final HashSet idSet = new HashSet();
idSet.add(attributeId);
mappingTable.put(attributeName, idSet);
}
}
/**
* DOCUMENT ME!
*
* @param paramName DOCUMENT ME!
* @param paramValue DOCUMENT ME!
*/
public void addParameter(final String paramName, final String paramValue) {
if (logger.isDebugEnabled()) {
logger.debug("adding parameter " + paramName + "' = '" + paramValue + "'"); // NOI18N
}
paramTable.put(paramName, paramValue);
}
/**
* create the plugin instance ==========================================.
*
* @throws MalformedURLException DOCUMENT ME!
* @throws ClassNotFoundException DOCUMENT ME!
* @throws NoSuchMethodException DOCUMENT ME!
* @throws InstantiationException DOCUMENT ME!
* @throws IllegalAccessException DOCUMENT ME!
* @throws InvocationTargetException DOCUMENT ME!
* @throws InterruptedException DOCUMENT ME!
*/
public void createPluginInstance() throws MalformedURLException,
ClassNotFoundException,
NoSuchMethodException,
InstantiationException,
IllegalAccessException,
InvocationTargetException,
InterruptedException {
if (logger.isInfoEnabled()) {
logger.info("creating new plugin '" + className + "' instance"); // NOI18N
}
PluginProgressObserver progressObserver = null;
if (descriptor.isProgressObservable()) {
if (logger.isDebugEnabled()) {
logger.debug("setting plugin progress observer"); // NOI18N
}
progressObserver = new PluginProgressObserver(this.descriptor.getName());
PropertyManager.getManager().getSharedProgressObserver().setSubProgressObserver(progressObserver);
} else if (logger.isDebugEnabled()) {
if (logger.isDebugEnabled()) {
logger.debug("plugin " + descriptor.getName() + "' is not progressobservable ("
+ descriptor.isProgressObservable() + ")"); // NOI18N
}
}
final PluginContext context = new PluginContext(
this.descriptor,
progressObserver,
this.paramTable,
this.mappingTable,
this.pluginLocales,
this.defaultLocale);
descriptor.setContext(context);
if (descriptor.isInternationalized() && !context.getI18n().isInternationalized()) {
logger.warn("internationalization broken, check plugin descriptor & resource files"); // NOI18N
descriptor.setInternationalized(false);
}
// load jar files
final URL[] urls = new URL[libraries.size() + 1];
final String jarBase = resource.pathToIURIString(descriptor.getPluginPath() + "lib/"); // NOI18N
// /res implements classpath ...
urls[0] = new URL(resource.pathToIURIString(descriptor.getPluginPath() + "res/")); // NOI18N
for (int i = 0; i < libraries.size(); i++) {
if (logger.isDebugEnabled()) {
logger.debug("loading plugin library: '" + jarBase + libraries.get(i).toString() + "'"); // NOI18N
}
urls[i + 1] = new URL(jarBase + libraries.get(i).toString());
}
if (logger.isDebugEnabled()) {
logger.debug("the current classloader is '" + this.getClass().getClassLoader().getClass().getName()
+ "'"); // NOI18N
}
// URLClassLoader classLoader = new URLClassLoader(urls, this.getClass().getClassLoader());
Class pluginClass = null;
if (urls.length > 0) { // vorher 1 geht aber trotzdem
// weil der URLClassLOader den
// normalen als Fallback hat
// ///HELL
final PluginClassLoader classLoader = new PluginClassLoader(urls, this.getClass().getClassLoader());
if (logger.isDebugEnabled()) {
logger.debug("the current url parent classloader is '"
+ classLoader.getParent().getClass().getName() + "'"); // NOI18N
}
final URL[] jarURLs = classLoader.getURLs();
for (int i = 0; i < jarURLs.length; i++) {
if (logger.isDebugEnabled()) {
logger.debug("loadign jar file at '" + jarURLs[i] + "'"); // NOI18N
}
}
// create plugin instance
if (logger.isInfoEnabled()) {
logger.info("creating plugin instance of class '" + className + "'"); // NOI18N
}
pluginClass = classLoader.loadClass(className);
} else {
pluginClass = this.getClass().getClassLoader().loadClass(className); // HELL \u00C4nderung quick &
// Dirty
}
// ...........................................
final Constructor pluginConstructor = pluginClass.getConstructor(
new Class[] { Sirius.navigator.plugin.context.PluginContext.class });
final Object pluginObject = pluginConstructor.newInstance(new Object[] { descriptor.getContext() });
// just to be shure:
if (descriptor.isProgressObservable()) {
progressObserver.setFinished(true);
}
// ..................................................................
if (logger.isInfoEnabled()) {
logger.info("plugin instance created!"); // NOI18N
}
descriptor.setPlugin((PluginSupport)pluginObject);
}
/**
* <deployment> section part 2 =========================================.
*
* @param id DOCUMENT ME!
* @param name DOCUMENT ME!
* @param description DOCUMENT ME!
* @param multithreaded DOCUMENT ME!
* @param availability DOCUMENT ME!
*/
public void addMethod(final String id,
final String name,
final String description,
final Boolean multithreaded,
final Long availability) {
if (logger.isDebugEnabled()) {
logger.debug("addingr new plugin method: id='" + id + "', name='" + name + "'"); // NOI18N
}
final Object object = descriptor.getPlugin().getMethod(id);
if ((object != null) && (object instanceof PluginMethod)) {
if (methodDescriptors == null) {
methodDescriptors = new HashMap();
descriptor.setMethodDescriptors(methodDescriptors);
}
final PluginMethodDescriptor methodDescriptor = new PluginMethodDescriptor(
id,
name,
description,
multithreaded.booleanValue(),
availability.longValue(),
(PluginMethod)object);
methodDescriptors.put(methodDescriptor.getId(), methodDescriptor);
} else {
logger.error("plugin method '" + id + "' could not be found: '" + object + "'"); // NOI18N
}
}
/**
* public void registerMethods() { if(logger.isDebugEnabled())logger.debug("registering plugin methods");
* descriptor.setMethodDescriptors(methodDescriptors); } <ui> section part 1
* =========================================.
*
* @param uiDescriptor DOCUMENT ME!
*/
public void addUIDescriptor(final PluginUIDescriptor uiDescriptor) {
if (logger.isDebugEnabled()) {
logger.debug("adding plugin ui descriptor " + uiDescriptor.getName() + "'"); // NOI18N
}
if (uiDescriptors == null) {
uiDescriptors = new HashMap();
descriptor.setUIDescriptors(uiDescriptors);
}
this.uiDescriptor = uiDescriptor;
uiDescriptors.put(this.uiDescriptor.getId(), this.uiDescriptor);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private PluginUI getPluginUI() {
if (this.uiDescriptor != null) {
final PluginUI pluginUI = descriptor.getPlugin().getUI(uiDescriptor.getId());
if (pluginUI != null) {
if (uiDescriptor.getIconName() != null) {
uiDescriptor.setIcon(this.getImageIcon(uiDescriptor.getIconName()));
}
return pluginUI;
} else {
logger.error("plugin ui '" + uiDescriptor.getId() + "' could not be found"); // NOI18N
uiDescriptors.remove(uiDescriptor.getId());
return null;
}
} else {
logger.fatal("synchronization error: plugin ui descriptor generation failed"); // NOI18N
return null;
}
}
/**
* DOCUMENT ME!
*/
public void addAsComponent() {
final PluginUI pluginUI = this.getPluginUI();
if (pluginUI != null) {
uiDescriptor.addAsComponent(pluginUI);
uiDescriptor = null;
}
}
/**
* DOCUMENT ME!
*
* @param layout DOCUMENT ME!
*/
public void addAsPanel(final String layout) {
final PluginUI pluginUI = this.getPluginUI();
if (pluginUI != null) {
uiDescriptor.addAsPanel(pluginUI, layout);
uiDescriptor = null;
}
}
/**
* DOCUMENT ME!
*/
public void addAsScrollPane() {
final PluginUI pluginUI = this.getPluginUI();
if (pluginUI != null) {
uiDescriptor.addAsScrollPane(pluginUI);
uiDescriptor = null;
}
}
/**
* DOCUMENT ME!
*
* @param configurator DOCUMENT ME!
*/
public void addAsFloatingFrame(final PluginFloatingFrameConfigurator configurator) {
final PluginUI pluginUI = this.getPluginUI();
configurator.setAdvancedLayout(PropertyManager.getManager().isAdvancedLayout());
if (pluginUI != null) {
if (pluginUI instanceof FloatingPluginUI) {
uiDescriptor.addAsFloatingFrame((FloatingPluginUI)pluginUI, configurator);
} else {
logger.error("wrong plugin ui type'" + pluginUI.getClass().getName()
+ "', 'Sirius.navigator.plugin.interfaces.FloatingPluginUI' expected"); // NOI18N
uiDescriptors.remove(uiDescriptor.getId());
}
}
}
/**
* <ui> section part 2 <actions> =======================================.
*
* @param actionDescriptor DOCUMENT ME!
*/
public void createPluginToolBar(final PluginActionDescriptor actionDescriptor) {
if (logger.isDebugEnabled()) {
logger.debug("createPluginToolBar, floatable: '" + actionDescriptor.isFloatable() + "'"); // NOI18N
}
pluginToolBar = new EmbeddedToolBar(descriptor.getId());
pluginToolBar.setName(actionDescriptor.getName());
pluginToolBar.setRollover(PropertyManager.getManager().isAdvancedLayout());
pluginToolBar.setFloatable(actionDescriptor.isFloatable());
descriptor.setPluginToolBar(pluginToolBar);
}
/**
* DOCUMENT ME!
*
* @param actionDescriptor DOCUMENT ME!
*/
public void addToolBarButton(final PluginActionDescriptor actionDescriptor) {
if (descriptor.isPluginMethodAvailable(actionDescriptor.getMethodId())) {
if (logger.isDebugEnabled()) {
logger.debug("creating new plugin toolbar button: '" + actionDescriptor.getName() + "'"); // NOI18N
}
final PluginToolBarButton button = new PluginToolBarButton(descriptor.getMethodDescriptor(
actionDescriptor.getMethodId()).getMethod());
this.setItemProperties(button, actionDescriptor);
pluginToolBar.addButton(button);
} else {
logger.error("plugin toolbar button '" + actionDescriptor.getName()
+ "' refers to an unknown plugin method: '" + actionDescriptor.getMethodId() + "'"); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param actionDescriptor DOCUMENT ME!
*/
public void createPluginMenu(final PluginActionDescriptor actionDescriptor) {
if (logger.isDebugEnabled()) {
logger.debug("createPluginMenu"); // NOI18N
}
pluginMenu = new PluginMenu(descriptor.getId(), actionDescriptor.getName());
// pluginMenu.setText(actionDescriptor.getName());
pluginMenu.setMnemonic(actionDescriptor.getMnemonic());
pluginMenu.setIcon(this.getImageIcon(actionDescriptor.getIconName()));
descriptor.setPluginMenu(pluginMenu);
}
/**
* DOCUMENT ME!
*
* @param actionDescriptor DOCUMENT ME!
*/
public void addMenuItem(final PluginActionDescriptor actionDescriptor) {
if (descriptor.isPluginMethodAvailable(actionDescriptor.getMethodId())) {
if (logger.isDebugEnabled()) {
logger.debug("creating new plugin menu item: '" + actionDescriptor.getName() + "'"); // NOI18N
}
final PluginMethodDescriptor methodDescriptor = descriptor.getMethodDescriptor(
actionDescriptor.getMethodId());
Sirius.server.localserver.method.Method method = null;
final String methodKey = actionDescriptor.getMethodId() + '@' + this.descriptor.getId(); // NOI18N
try {
method = SessionManager.getProxy().getMethod(methodKey);
if (method != null) {
final User user = SessionManager.getSession().getUser();
final UserGroup userGroup = user.getUserGroup();
final boolean hasPermission;
if (userGroup != null) {
hasPermission = method.getPermissions()
.hasPermission(userGroup.getKey(), PermissionHolder.READPERMISSION);
} else {
boolean tmpPerm = false;
for (final UserGroup potentialUserGroup : user.getPotentialUserGroups()) {
if (method.getPermissions().hasPermission(
potentialUserGroup.getKey(),
PermissionHolder.READPERMISSION)) {
tmpPerm = true;
break;
}
}
hasPermission = tmpPerm;
}
if (hasPermission) {
final PluginMenuItem menuItem = new PluginMenuItem(methodDescriptor.getMethod(), method);
this.setItemProperties(menuItem, actionDescriptor);
final KeyStroke accelerator = actionDescriptor.getAccelerator();
if (accelerator != null) {
menuItem.setAccelerator(accelerator);
}
pluginMenu.addItem(menuItem);
if (actionDescriptor.isSeparator()) {
pluginMenu.addSeparator();
}
} else {
if (logger.isDebugEnabled()) {
logger.warn("no permission to show method '" + method.getKey() + "'"); // NOI18N
}
}
} else {
logger.error("method '" + methodKey + "' is not registered, ignoring method"); // NOI18N
}
} catch (Throwable t) {
logger.warn("could not retrieve method '" + methodKey + "'"); // NOI18N
}
} else {
logger.error("plugin menu item '" + actionDescriptor.getName()
+ "' refers to an unknown plugin method: '" + actionDescriptor.getMethodId() + "'"); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param actionDescriptor DOCUMENT ME!
*/
public void createPluginPopupMenu(final PluginActionDescriptor actionDescriptor) {
if (logger.isDebugEnabled()) {
logger.debug("createPluginPopupMenu"); // NOI18N
}
pluginPopupMenu = new PluginMenu(descriptor.getId(), actionDescriptor.getName());
// pluginPopupMenu.setText(actionDescriptor.getName());
pluginPopupMenu.setMnemonic(actionDescriptor.getMnemonic());
pluginPopupMenu.setIcon(this.getImageIcon(actionDescriptor.getIconName()));
descriptor.setPluginPopupMenu(pluginPopupMenu);
}
/**
* DOCUMENT ME!
*
* @param actionDescriptor DOCUMENT ME!
*/
public void addPopupMenuItem(final PluginActionDescriptor actionDescriptor) {
if (descriptor.isPluginMethodAvailable(actionDescriptor.getMethodId())) {
if (pluginPopupMenu == null) {
pluginPopupMenu = new PluginMenu(descriptor.getId(), descriptor.getMetaInfo().getName());
descriptor.setPluginPopupMenu(pluginPopupMenu);
}
if (logger.isDebugEnabled()) {
logger.debug("creating new plugin menu item: '" + actionDescriptor.getName() + "'"); // NOI18N
}
// PluginMenuItem menuItem = new
// PluginMenuItem(descriptor.getMethodDescriptor(actionDescriptor.getMethodId()).getMethod());
final PluginMethodDescriptor methodDescriptor = descriptor.getMethodDescriptor(
actionDescriptor.getMethodId());
Sirius.server.localserver.method.Method method = null;
final String methodKey = actionDescriptor.getMethodId() + '@' + this.descriptor.getId(); // NOI18N
try {
method = SessionManager.getProxy().getMethod(methodKey);
if (method != null) {
final User user = SessionManager.getSession().getUser();
final UserGroup userGroup = user.getUserGroup();
final boolean hasPermission;
if (userGroup != null) {
hasPermission = method.getPermissions()
.hasPermission(userGroup.getKey(), PermissionHolder.READPERMISSION);
} else {
boolean tmpPerm = false;
for (final UserGroup potentialUserGroup : user.getPotentialUserGroups()) {
if (method.getPermissions().hasPermission(
potentialUserGroup.getKey(),
PermissionHolder.READPERMISSION)) {
tmpPerm = true;
break;
}
}
hasPermission = tmpPerm;
}
if (hasPermission) {
final PluginMenuItem menuItem = new PluginMenuItem(methodDescriptor.getMethod(), method);
this.setItemProperties(menuItem, actionDescriptor);
final KeyStroke accelerator = actionDescriptor.getAccelerator();
if (accelerator != null) {
menuItem.setAccelerator(accelerator);
}
// pluginPopupMenu.setAvailability(actionDescriptor.getAvailability());
pluginPopupMenu.addItem(menuItem);
if (actionDescriptor.isSeparator()) {
pluginPopupMenu.addSeparator();
}
} else {
logger.warn("no permission to show method '" + method.getKey() + "'"); // NOI18N
}
} else {
logger.error("method '" + methodKey + "' is not available, ignoring method"); // NOI18N
}
} catch (Throwable t) {
logger.warn("could not retrieve method '" + methodKey + "'"); // NOI18N
}
} else {
logger.error("plugin menu item '" + actionDescriptor.getName()
+ "' refers to an unknown plugin method: '" + actionDescriptor.getMethodId() + "'"); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param item DOCUMENT ME!
* @param actionDescriptor DOCUMENT ME!
*/
private void setItemProperties(final AbstractButton item, final PluginActionDescriptor actionDescriptor) {
item.setText(actionDescriptor.getName());
item.setMnemonic(actionDescriptor.getMnemonic());
item.setToolTipText(actionDescriptor.getTooltip());
item.setIcon(this.getImageIcon(actionDescriptor.getIconName()));
/*Icon icon = descriptor.getPlugin().getImageIcon(actionDescriptor.getIconId());
* if(icon != null) { item.setIcon(icon);}*/
}
/**
* DOCUMENT ME!
*
* @param icon DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private ImageIcon getImageIcon(final String icon) {
String iconURL = null;
if ((icon.indexOf("/") == 0) || (icon.indexOf("\\") == 0)) // NOI18N
{
iconURL = descriptor.getContext().getEnvironment().getDocumentBase() + icon;
} else {
iconURL = descriptor.getContext().getEnvironment().getDocumentBase() + "/" + icon; // NOI18N
}
return descriptor.getContext().getResource().getImageIcon(iconURL);
}
}
// test --------------------------------------------------------------------
/*public static void main(String args[])
* { try { //BufferedInputStream inputStream = new BufferedInputStream(new
* FileInputStream("D:\\work\\web\\Sirius\\Navigator\\plugins\\plugin.xml")); String name = "example";
* PluginFactory factory = PluginFactory.getFactory(); //factory.logger.setLevel(Level.DEBUG); PluginDescriptor
* descriptor = new PluginDescriptor(new URL("file:///D:/work/web/Sirius/Navigator/plugins"), name);
* factory.logger.info("preloading plugin '" + name + "'"); factory.preloadPlugin(descriptor);
* factory.logger.info("loading plugin '" + name + "'"); factory.loadPlugin(descriptor);
* System.out.println(descriptor.getName()); System.out.println(descriptor.getMetaInfo().getDisplayname()); }
* catch(Exception exp) { exp.printStackTrace(); }}*/
}