%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.commons.jelly.tags.core.ParseTag |
|
|
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.tags.core; |
|
17 | ||
18 | import java.io.StringReader; |
|
19 | ||
20 | import javax.xml.parsers.ParserConfigurationException; |
|
21 | import javax.xml.parsers.SAXParser; |
|
22 | import javax.xml.parsers.SAXParserFactory; |
|
23 | ||
24 | import org.apache.commons.jelly.JellyTagException; |
|
25 | import org.apache.commons.jelly.MissingAttributeException; |
|
26 | import org.apache.commons.jelly.Script; |
|
27 | import org.apache.commons.jelly.TagSupport; |
|
28 | import org.apache.commons.jelly.XMLOutput; |
|
29 | import org.apache.commons.jelly.parser.XMLParser; |
|
30 | import org.apache.commons.logging.Log; |
|
31 | import org.apache.commons.logging.LogFactory; |
|
32 | import org.xml.sax.ContentHandler; |
|
33 | import org.xml.sax.InputSource; |
|
34 | import org.xml.sax.SAXException; |
|
35 | import org.xml.sax.XMLReader; |
|
36 | ||
37 | /** |
|
38 | * Parses the output of this tags body or of a given String as a Jelly script |
|
39 | * then either outputting the Script as a variable or executing the script. |
|
40 | * |
|
41 | * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> |
|
42 | * @version $Revision: 155420 $ |
|
43 | */ |
|
44 | public class ParseTag extends TagSupport { |
|
45 | ||
46 | /** The Log to which logging calls will be made. */ |
|
47 | 546 | private static final Log log = LogFactory.getLog(ParseTag.class); |
48 | ||
49 | /** The variable that will be generated for the document */ |
|
50 | private String var; |
|
51 | ||
52 | /** The markup text to be parsed */ |
|
53 | private String text; |
|
54 | ||
55 | /** The XMLReader used to parser the document */ |
|
56 | private XMLReader xmlReader; |
|
57 | ||
58 | /** The Jelly parser */ |
|
59 | private XMLParser jellyParser; |
|
60 | ||
61 | 0 | public ParseTag() { |
62 | 0 | } |
63 | ||
64 | // Tag interface |
|
65 | //------------------------------------------------------------------------- |
|
66 | ||
67 | /* (non-Javadoc) |
|
68 | * @see org.apache.commons.jelly.Tag#doTag(org.apache.commons.jelly.XMLOutput) |
|
69 | */ |
|
70 | public void doTag(XMLOutput output) |
|
71 | throws MissingAttributeException, JellyTagException { |
|
72 | ||
73 | 0 | String text = getText(); |
74 | 0 | if (text != null) { |
75 | 0 | parseText(text); |
76 | 0 | } |
77 | else { |
|
78 | 0 | parseBody(output); |
79 | } |
|
80 | ||
81 | 0 | Script script = getJellyParser().getScript(); |
82 | 0 | if (var != null) { |
83 | 0 | context.setVariable(var, script); |
84 | 0 | } |
85 | else { |
|
86 | // invoke the script |
|
87 | 0 | script.run(context, output); |
88 | } |
|
89 | 0 | } |
90 | ||
91 | // Properties |
|
92 | //------------------------------------------------------------------------- |
|
93 | /** The variable name that will be used for the Document variable created |
|
94 | */ |
|
95 | public String getVar() { |
|
96 | 0 | return var; |
97 | } |
|
98 | ||
99 | /** Sets the variable name that will be used for the Document variable created |
|
100 | */ |
|
101 | public void setVar(String var) { |
|
102 | 0 | this.var = class="keyword">var; |
103 | 0 | } |
104 | ||
105 | /** |
|
106 | * Returns the text to be parsed |
|
107 | * @return String |
|
108 | */ |
|
109 | public String getText() { |
|
110 | 0 | return text; |
111 | } |
|
112 | ||
113 | /** |
|
114 | * Sets the text to be parsed by this parser |
|
115 | * @param text The text to be parsed by this parser |
|
116 | */ |
|
117 | public void setText(String text) { |
|
118 | 0 | this.text = text; |
119 | 0 | } |
120 | ||
121 | ||
122 | /** @return the XMLReader used for parsing, creating one lazily if need be */ |
|
123 | public XMLReader getXMLReader() throws ParserConfigurationException, SAXException { |
|
124 | 0 | if (xmlReader == null) { |
125 | 0 | xmlReader = createXMLReader(); |
126 | } |
|
127 | 0 | return xmlReader; |
128 | } |
|
129 | ||
130 | /** Sets the XMLReader used for parsing */ |
|
131 | public void setXMLReader(XMLReader xmlReader) { |
|
132 | 0 | this.xmlReader = xmlReader; |
133 | 0 | } |
134 | ||
135 | ||
136 | /** |
|
137 | * @return XMLParser |
|
138 | */ |
|
139 | public XMLParser getJellyParser() { |
|
140 | 0 | if (jellyParser == null) { |
141 | 0 | jellyParser = createJellyParser(); |
142 | } |
|
143 | 0 | return jellyParser; |
144 | } |
|
145 | ||
146 | /** |
|
147 | * Sets the jellyParser. |
|
148 | * @param jellyParser The jellyParser to set |
|
149 | */ |
|
150 | public void setJellyParser(XMLParser jellyParser) { |
|
151 | 0 | this.jellyParser = jellyParser; |
152 | 0 | } |
153 | ||
154 | ||
155 | // Implementation methods |
|
156 | //------------------------------------------------------------------------- |
|
157 | ||
158 | /** |
|
159 | * Factory method to create a new XMLReader |
|
160 | */ |
|
161 | protected XMLReader createXMLReader() throws ParserConfigurationException, SAXException { |
|
162 | 0 | SAXParserFactory factory = SAXParserFactory.newInstance(); |
163 | 0 | factory.setNamespaceAware(true); |
164 | 0 | SAXParser parser = factory.newSAXParser(); |
165 | 0 | return parser.getXMLReader(); |
166 | } |
|
167 | ||
168 | ||
169 | /** |
|
170 | * Parses the body of this tag and returns the parsed document |
|
171 | */ |
|
172 | protected void parseBody(XMLOutput output) throws JellyTagException { |
|
173 | 0 | ContentHandler handler = getJellyParser(); |
174 | 0 | XMLOutput newOutput = new XMLOutput(handler); |
175 | ||
176 | try { |
|
177 | 0 | handler.startDocument(); |
178 | 0 | invokeBody(newOutput); |
179 | 0 | handler.endDocument(); |
180 | } |
|
181 | 0 | catch (SAXException e) { |
182 | 0 | throw new JellyTagException(e); |
183 | 0 | } |
184 | 0 | } |
185 | ||
186 | /** |
|
187 | * Parses the give piece of text as being markup |
|
188 | */ |
|
189 | protected void parseText(String text) throws JellyTagException { |
|
190 | 0 | if ( log.isDebugEnabled() ) { |
191 | 0 | log.debug( "About to parse: " + text ); |
192 | } |
|
193 | ||
194 | try { |
|
195 | 0 | getXMLReader().parse( new InputSource( class="keyword">new StringReader( text ) ) ); |
196 | } |
|
197 | 0 | catch (Exception e) { |
198 | 0 | throw new JellyTagException(e); |
199 | 0 | } |
200 | 0 | } |
201 | ||
202 | /** |
|
203 | * Factory method to create a new Jelly parser |
|
204 | * @return XMLParser |
|
205 | */ |
|
206 | protected XMLParser createJellyParser() { |
|
207 | 0 | XMLParser answer = new XMLParser(); |
208 | 0 | answer.setContext(context); |
209 | 0 | return answer; |
210 | } |
|
211 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |