blob: f7799cc3b5593c539fb6ba10aeb22f49cea396aa [file] [log] [blame]
/* $Id: PluginDeclarationRule.java,v 1.16 2004/05/10 06:44:13 skitching Exp $
*
* Copyright 2003-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.digester.plugins;
import java.util.Properties;
import org.apache.commons.digester.Rule;
import org.apache.commons.digester.Digester;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.logging.Log;
/**
* A Digester rule which allows the user to pre-declare a class which is to
* be referenced later at a plugin point by a PluginCreateRule.
* <p>
* Normally, a PluginDeclarationRule is added to a Digester instance with
* the pattern "{root}/plugin" or "* /plugin" where {root} is the name of
* the root tag in the input document.
*
* @since 1.6
*/
public class PluginDeclarationRule extends Rule {
//------------------- constructors ---------------------------------------
/** constructor */
public PluginDeclarationRule() {
super();
}
//------------------- methods --------------------------------------------
/**
* Invoked upon reading a tag defining a plugin declaration. The tag
* must have the following mandatory attributes:
* <ul>
* <li> id </li>
* <li> class </li>
* </ul>
*
*@param namespace The xml namespace in which the xml element which
* triggered this rule resides.
*@param name The name of the xml element which triggered this rule.
*@param attributes The set of attributes on the xml element which
* triggered this rule.
*@exception java.lang.Exception
*/
public void begin(String namespace, String name,
org.xml.sax.Attributes attributes)
throws java.lang.Exception {
int nAttrs = attributes.getLength();
Properties props = new Properties();
for(int i=0; i<nAttrs; ++i) {
String key = attributes.getLocalName(i);
if ((key == null) || (key.length() == 0)) {
key = attributes.getQName(i);
}
String value = attributes.getValue(i);
props.setProperty(key, value);
}
try {
declarePlugin(digester, props);
} catch(PluginInvalidInputException ex) {
throw new PluginInvalidInputException(
"Error on element [" + digester.getMatch() +
"]: " + ex.getMessage());
}
}
public static void declarePlugin(Digester digester, Properties props)
throws PluginException {
Log log = digester.getLogger();
boolean debug = log.isDebugEnabled();
String id = props.getProperty("id");
String pluginClassName = props.getProperty("class");
if (id == null) {
throw new PluginInvalidInputException(
"mandatory attribute id not present on plugin declaration");
}
if (pluginClassName == null) {
throw new PluginInvalidInputException(
"mandatory attribute class not present on plugin declaration");
}
Declaration newDecl = new Declaration(pluginClassName);
newDecl.setId(id);
newDecl.setProperties(props);
PluginRules rc = (PluginRules) digester.getRules();
PluginManager pm = rc.getPluginManager();
newDecl.init(digester, pm);
pm.addDeclaration(newDecl);
// Note that it is perfectly safe to redeclare a plugin, because
// the declaration doesn't add any rules to digester; all it does
// is create a RuleLoader instance whch is *capable* of adding the
// rules to the digester.
}
}