View Javadoc

    1   /*
    2    * Copyright 2002,2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jelly.impl;
    17
    18  import java.net.URL;
    19  import java.util.Iterator;
    20  import java.util.Map;
    21
    22  import org.apache.commons.jelly.DynaTag;
    23  import org.apache.commons.jelly.JellyContext;
    24  import org.apache.commons.jelly.JellyException;
    25  import org.apache.commons.jelly.JellyTagException;
    26  import org.apache.commons.jelly.Tag;
    27  import org.apache.commons.jelly.TagLibrary;
    28  import org.apache.commons.jelly.XMLOutput;
    29  import org.apache.commons.jelly.expression.Expression;
    30  import org.xml.sax.SAXException;
    31
    32  /***
    33   * <p><code>StaticTagScript</code> is a script that evaluates a StaticTag, a piece of static XML
    34   * though its attributes or element content may contain dynamic expressions.
    35   * The first time this tag evaluates, it may have become a dynamic tag, so it will check that
    36   * a new dynamic tag has not been generated.</p>
    37   *
    38   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    39   * @version $Revision: 155420 $
    40   */
    41  public class StaticTagScript extends TagScript {
    42
    43      public StaticTagScript() {
    44      }
    45
    46      public StaticTagScript(TagFactory tagFactory) {
    47          super(tagFactory);
    48      }
    49
    50
    51      // Script interface
    52      //-------------------------------------------------------------------------
    53      public void run(JellyContext context, XMLOutput output) throws JellyTagException {
    54          try {
    55              startNamespacePrefixes(output);
    56          } catch (SAXException e) {
    57              throw new JellyTagException("could not start namespace prefixes",e);
    58          }
    59
    60          Tag tag = null;
    61          try {
    62              tag = getTag(context);
    63
    64              // lets see if we have a dynamic tag
    65              if (tag instanceof StaticTag) {
    66                  tag = findDynamicTag(context, (StaticTag) tag);
    67              }
    68
    69              setTag(tag,context);
    70          } catch (JellyException e) {
    71              throw new JellyTagException(e);
    72          }
    73
    74          URL rootURL = context.getRootURL();
    75          URL currentURL = context.getCurrentURL();
    76          try {
    77              if ( tag == null ) {
    78                  return;
    79              }
    80              tag.setContext(context);
    81              setContextURLs(context);
    82
    83              DynaTag dynaTag = (DynaTag) tag;
    84
    85              // ### probably compiling this to 2 arrays might be quicker and smaller
    86              for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) {
    87                  Map.Entry entry = (Map.Entry) iter.next();
    88                  String name = (String) entry.getKey();
    89                  Expression expression = (Expression) entry.getValue();
    90
    91                  Object value = null;
    92
    93                  if ( Expression.class.isAssignableFrom( dynaTag.getAttributeType(name) ) ) {
    94                      value = expression;
    95                  } else {
    96                      value = expression.evaluate(context);
    97                  }
    98
    99                  dynaTag.setAttribute(name, value);
    100             }
    101
    102             tag.doTag(output);
    103         }
    104         catch (JellyTagException e) {
    105             handleException(e);
    106         }
    107         catch (RuntimeException e) {
    108             handleException(e);
    109         } finally {
    110             context.setCurrentURL(currentURL);
    111             context.setRootURL(rootURL);
    112         }
    113
    114         try {
    115             endNamespacePrefixes(output);
    116         } catch (SAXException e) {
    117             throw new JellyTagException("could not end namespace prefixes",e);
    118         }
    119     }
    120
    121     /***
    122      * Attempts to find a dynamically created tag that has been created since this
    123      * script was compiled
    124      */
    125     protected Tag findDynamicTag(JellyContext context, StaticTag tag) throws JellyException {
    126         // lets see if there's a tag library for this URI...
    127         TagLibrary taglib = context.getTagLibrary( tag.getUri() );
    128         if ( taglib != null ) {
    129             Tag newTag = taglib.createTag( tag.getLocalName(), getSaxAttributes() );
    130             if ( newTag != null ) {
    131                 newTag.setParent( tag.getParent() );
    132                 newTag.setBody( tag.getBody() );
    133                 return newTag;
    134             }
    135         }
    136         return tag;
    137     }
    138 }