1 /*
2 * Copyright (c) 2003 Scott Howlett & Paul Libbrecht.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. The end-user documentation included with the redistribution,
18 * if any, must include the following acknowledgment:
19 * "This product includes software developed by the Xwing
20 * Project ( http://xwing.sourceforge.net/ )."
21 * Alternately, this acknowledgment may appear in the software itself,
22 * if and wherever such third-party acknowledgments normally appear.
23 *
24 * 4. The name "Xwing" must not be used to endorse or promote products
25 * derived from this software without prior written permission. For
26 * written permission, please contact the project authors via
27 * the Xwing project site, http://xwing.sourceforge.net/ .
28 *
29 * 5. Products derived from this software may not be called "Xwing",
30 * nor may "Xwing" appear in their name, without prior written
31 * permission of the Xwing project.
32 *
33 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36 * DISCLAIMED. IN NO EVENT SHALL THE XWING AUTHORS OR THE PROJECT
37 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
45 *
46 * For more information on Xwing, please see
47 * < http://xwing.sourceforge.net/ >.
48 */
49
50 package net.sourceforge.xwing.jelly.tags.dom;
51
52 import java.io.File;
53 import java.io.InputStream;
54 import java.net.URL;
55
56 import javax.xml.parsers.DocumentBuilderFactory;
57 import javax.xml.transform.dom.DOMResult;
58 import javax.xml.transform.sax.SAXTransformerFactory;
59 import javax.xml.transform.sax.TransformerHandler;
60
61 import net.sourceforge.xwing.dom.DomUtils;
62
63 import org.apache.commons.beanutils.BasicDynaBean;
64 import org.apache.commons.beanutils.BasicDynaClass;
65 import org.apache.commons.beanutils.DynaClass;
66 import org.apache.commons.beanutils.DynaProperty;
67 import org.apache.commons.jelly.DynaBeanTagSupport;
68 import org.apache.commons.jelly.JellyTagException;
69 import org.apache.commons.jelly.MissingAttributeException;
70 import org.apache.commons.jelly.XMLOutput;
71 import org.w3c.dom.Document;
72
73 //DynaBeanTagSupport is the only working way to get
74 //the "xml" attribute without going through unnecessary
75 //and destructive BeanUtils conversions.
76
77 public class ParseTag extends DynaBeanTagSupport {
78
79 private static DynaClass attribClass =
80 new BasicDynaClass(
81 "Attributes",
82 null,
83 new DynaProperty[] {
84 new DynaProperty("var", String.class),
85 new DynaProperty("xml", Object.class),
86 new DynaProperty("validate", Boolean.class),
87 new DynaProperty("text", String.class)});
88
89 private static DocumentBuilderFactory dbf;
90
91 public ParseTag() {
92 super(new BasicDynaBean(attribClass));
93 }
94
95 public void doTag(XMLOutput output)
96 throws MissingAttributeException, JellyTagException {
97
98 String var = (String) getDynaBean().get("var");
99
100 if (var == null) {
101 throw new MissingAttributeException("var");
102 }
103
104 try {
105 context.setVariable(var, getXmlDocument());
106 } catch (Exception exc) {
107 throw new JellyTagException(exc);
108 }
109 }
110
111 protected Document getXmlDocument() throws JellyTagException {
112 Document document = null;
113 Object xml = getDynaBean().get("xml");
114
115 if (xml == null) {
116
117 String text = (String) getDynaBean().get("text");
118 if (text != null) {
119 document = parseText(text);
120 } else {
121 document = parseBody();
122 }
123 } else {
124 document = parse(xml);
125 }
126
127 return document;
128 }
129
130 protected Document parseBody() throws JellyTagException {
131 try {
132 SAXTransformerFactory factory =
133 (SAXTransformerFactory) SAXTransformerFactory.newInstance();
134
135 TransformerHandler handler = factory.newTransformerHandler();
136 Document result = DomUtils.newDocument();
137 handler.setResult(new DOMResult(result));
138
139 XMLOutput output = new XMLOutput(handler);
140
141 output.startDocument();
142 invokeBody(output);
143 output.endDocument();
144
145 return result;
146
147 } catch (Exception exc) {
148 throw new JellyTagException(exc);
149 }
150 }
151
152 protected Document parseText(String text) throws JellyTagException {
153 try {
154 return DomUtils.parseText(text);
155 } catch (Exception e) {
156 throw new JellyTagException(e);
157 }
158 }
159
160 protected Document parse(Object source) throws JellyTagException {
161 try {
162
163 if (source instanceof String) {
164 source = context.getResource((String) source);
165 }
166
167 if (source instanceof URL) {
168 return DomUtils.parse(((URL) source).openStream());
169 } else if (source instanceof File) {
170 return DomUtils.parse((File) source);
171 } else if (source instanceof InputStream) {
172 return DomUtils.parse((InputStream) source);
173 } else {
174 throw new IllegalArgumentException(
175 "Invalid source argument. Must be a String,"
176 + " InputStream or URL."
177 + " Was type; "
178 + source.getClass().getName()
179 + " with value: "
180 + source);
181 }
182 } catch (Exception e) {
183 throw new JellyTagException(e);
184 }
185 }
186 }
This page was automatically generated by Maven