View Javadoc

    1   /*
    2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    3    *
    4    * This software is open source.
    5    * See the bottom of this file for the licence.
    6    */
    7
    8   package org.dom4j.rule;
    9
    10  import java.util.Iterator;
    11  import java.util.List;
    12
    13  import org.dom4j.Document;
    14  import org.dom4j.Element;
    15  import org.dom4j.Node;
    16  import org.dom4j.XPath;
    17
    18  /***
    19   * <p>
    20   * <code>Stylesheet</code> implements an XSLT stylesheet such that rules can
    21   * be added to the stylesheet and the stylesheet can be applied to a source
    22   * document or node.
    23   * </p>
    24   *
    25   * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
    26   * @version $Revision: 1.14 $
    27   */
    28  public class Stylesheet {
    29      private RuleManager ruleManager = new RuleManager();
    30
    31      /*** Holds value of property mode. */
    32      private String modeName;
    33
    34      /***
    35       * Creates a new empty stylesheet.
    36       */
    37      public Stylesheet() {
    38      }
    39
    40      /***
    41       * Add a rule to this stylesheet.
    42       *
    43       * @param rule
    44       *            the rule to add
    45       */
    46      public void addRule(Rule rule) {
    47          ruleManager.addRule(rule);
    48      }
    49
    50      /***
    51       * Removes the specified rule from this stylesheet.
    52       *
    53       * @param rule
    54       *            the rule to remove
    55       */
    56      public void removeRule(Rule rule) {
    57          ruleManager.removeRule(rule);
    58      }
    59
    60      /***
    61       * Runs this stylesheet on the given input which should be either a Node or
    62       * a List of Node objects.
    63       *
    64       * @param input
    65       *            the input to run this stylesheet on
    66       *
    67       * @throws Exception
    68       *             if something goes wrong
    69       */
    70      public void run(Object input) throws Exception {
    71          run(input, this.modeName);
    72      }
    73
    74      public void run(Object input, String mode) throws Exception {
    75          if (input instanceof Node) {
    76              run((Node) input, mode);
    77          } else if (input instanceof List) {
    78              run((List) input, mode);
    79          }
    80      }
    81
    82      public void run(List list) throws Exception {
    83          run(list, this.modeName);
    84      }
    85
    86      public void run(List list, String mode) throws Exception {
    87          for (int i = 0, size = list.size(); i < size; i++) {
    88              Object object = list.get(i);
    89
    90              if (object instanceof Node) {
    91                  run((Node) object, mode);
    92              }
    93          }
    94      }
    95
    96      public void run(Node node) throws Exception {
    97          run(node, this.modeName);
    98      }
    99
    100     public void run(Node node, String mode) throws Exception {
    101         Mode mod = ruleManager.getMode(mode);
    102         mod.fireRule(node);
    103     }
    104
    105     /***
    106      * Processes the result of the xpath expression. The xpath expression is
    107      * evaluated against the provided input object.
    108      *
    109      * @param input
    110      *            the input object
    111      * @param xpath
    112      *            the xpath expression
    113      * @throws Exception
    114      *             if something goes wrong
    115      */
    116     public void applyTemplates(Object input, XPath xpath) throws Exception {
    117         applyTemplates(input, xpath, this.modeName);
    118     }
    119
    120     /***
    121      * Processes the result of the xpath expression in the given mode. The xpath
    122      * expression is evaluated against the provided input object.
    123      *
    124      * @param input
    125      *            the input object
    126      * @param xpath
    127      *            the xpath expression
    128      * @param mode
    129      *            the mode
    130      * @throws Exception
    131      *             if something goes wrong
    132      */
    133     public void applyTemplates(Object input, XPath xpath, String mode)
    134             throws Exception {
    135         Mode mod = ruleManager.getMode(mode);
    136
    137         List list = xpath.selectNodes(input);
    138         Iterator it = list.iterator();
    139         while (it.hasNext()) {
    140             Node current = (Node) it.next();
    141             mod.fireRule(current);
    142         }
    143     }
    144
    145     /***
    146      * Processes the result of the xpath expression. The xpath expression is
    147      * evaluated against the provided input object.
    148      *
    149      * @param input
    150      *            the input object
    151      * @param xpath
    152      *            the xpath expression
    153      * @throws Exception
    154      *             if something goes wrong
    155      * @deprecated Use {@link Stylesheet#applyTemplates(Object, XPath)}instead.
    156      */
    157     public void applyTemplates(Object input, org.jaxen.XPath xpath)
    158             throws Exception {
    159         applyTemplates(input, xpath, this.modeName);
    160     }
    161
    162     /***
    163      * Processes the result of the xpath expression in the given mode. The xpath
    164      * expression is evaluated against the provided input object.
    165      *
    166      * @param input
    167      *            the input object
    168      * @param xpath
    169      *            the xpath expression
    170      * @param mode
    171      *            the mode
    172      * @throws Exception
    173      *             if something goes wrong
    174      * @deprecated Use {@link Stylesheet#applyTemplates(Object, XPath, String)}
    175      *             instead.
    176      */
    177     public void applyTemplates(Object input, org.jaxen.XPath xpath, String mode)
    178             throws Exception {
    179         Mode mod = ruleManager.getMode(mode);
    180
    181         List list = xpath.selectNodes(input);
    182         Iterator it = list.iterator();
    183         while (it.hasNext()) {
    184             Node current = (Node) it.next();
    185             mod.fireRule(current);
    186         }
    187     }
    188
    189     /***
    190      * If input is a <code>Node</code>, this will processes all of the
    191      * children of that node. If input is a <code>List</code> of
    192      * <code>Nodes</code>s, these nodes will be iterated and all children of
    193      * each node will be processed.
    194      *
    195      * @param input
    196      *            the input object, this can either be a <code>Node</code> or
    197      *            a <code>List</code>
    198      * @throws Exception
    199      *             if something goes wrong
    200      */
    201     public void applyTemplates(Object input) throws Exception {
    202         applyTemplates(input, this.modeName);
    203     }
    204
    205     /***
    206      * Processes the input object in the given mode. If input is a
    207      * <code>Node</code>, this will processes all of the children of that
    208      * node. If input is a <code>List</code> of <code>Nodes</code>s, these
    209      * nodes will be iterated and all children of each node will be processed.
    210      *
    211      * @param input
    212      *            the input object, this can either be a <code>Node</code> or
    213      *            a <code>List</code>
    214      * @param mode
    215      *            the mode
    216      * @throws Exception
    217      *             if something goes wrong
    218      */
    219     public void applyTemplates(Object input, String mode) throws Exception {
    220         Mode mod = ruleManager.getMode(mode);
    221
    222         if (input instanceof Element) {
    223             // iterate through all children
    224             Element element = (Element) input;
    225             for (int i = 0, size = element.nodeCount(); i < size; i++) {
    226                 Node node = element.node(i);
    227                 mod.fireRule(node);
    228             }
    229         } else if (input instanceof Document) {
    230             // iterate through all children
    231             Document document = (Document) input;
    232             for (int i = 0, size = document.nodeCount(); i < size; i++) {
    233                 Node node = document.node(i);
    234                 mod.fireRule(node);
    235             }
    236         } else if (input instanceof List) {
    237             List list = (List) input;
    238
    239             for (int i = 0, size = list.size(); i < size; i++) {
    240                 Object object = list.get(i);
    241
    242                 if (object instanceof Element) {
    243                     applyTemplates((Element) object, mode);
    244                 } else if (object instanceof Document) {
    245                     applyTemplates((Document) object, mode);
    246                 }
    247             }
    248         }
    249     }
    250
    251     public void clear() {
    252         ruleManager.clear();
    253     }
    254
    255     // Properties
    256     // -------------------------------------------------------------------------
    257
    258     /***
    259      * DOCUMENT ME!
    260      *
    261      * @return the name of the mode the stylesheet uses by default
    262      */
    263     public String getModeName() {
    264         return modeName;
    265     }
    266
    267     /***
    268      * Sets the name of the mode that the stylesheet uses by default.
    269      *
    270      * @param modeName
    271      *            DOCUMENT ME!
    272      */
    273     public void setModeName(String modeName) {
    274         this.modeName = modeName;
    275     }
    276
    277     /***
    278      * DOCUMENT ME!
    279      *
    280      * @return the default value-of action which is used in the default rules
    281      *         for the pattern "text()|&#64;"
    282      */
    283     public Action getValueOfAction() {
    284         return ruleManager.getValueOfAction();
    285     }
    286
    287     /***
    288      * Sets the default value-of action which is used in the default rules for
    289      * the pattern "text()|&#64;"
    290      *
    291      * @param valueOfAction
    292      *            DOCUMENT ME!
    293      */
    294     public void setValueOfAction(Action valueOfAction) {
    295         ruleManager.setValueOfAction(valueOfAction);
    296     }
    297 }
    298
    299 /*
    300  * Redistribution and use of this software and associated documentation
    301  * ("Software"), with or without modification, are permitted provided that the
    302  * following conditions are met:
    303  *
    304  * 1. Redistributions of source code must retain copyright statements and
    305  * notices. Redistributions must also contain a copy of this document.
    306  *
    307  * 2. Redistributions in binary form must reproduce the above copyright notice,
    308  * this list of conditions and the following disclaimer in the documentation
    309  * and/or other materials provided with the distribution.
    310  *
    311  * 3. The name "DOM4J" must not be used to endorse or promote products derived
    312  * from this Software without prior written permission of MetaStuff, Ltd. For
    313  * written permission, please contact dom4j-info@metastuff.com.
    314  *
    315  * 4. Products derived from this Software may not be called "DOM4J" nor may
    316  * "DOM4J" appear in their names without prior written permission of MetaStuff,
    317  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
    318  *
    319  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
    320  *
    321  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
    322  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    323  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    324  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
    325  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    326  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    327  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    328  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    329  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    330  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    331  * POSSIBILITY OF SUCH DAMAGE.
    332  *
    333  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    334  */