1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
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
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
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 }