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 }