- /* $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.
- }
- }
-