You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2011/09/27 12:44:04 UTC
svn commit: r1176318 -
/openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java
Author: dblevins
Date: Tue Sep 27 10:44:04 2011
New Revision: 1176318
URL: http://svn.apache.org/viewvc?rev=1176318&view=rev
Log:
apache derived fix
Added:
openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java
Added: openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java?rev=1176318&view=auto
==============================================================================
--- openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java (added)
+++ openejb/trunk/openejb3/deps/jstl-patched/src/main/java/org/apache/taglibs/standard/tag/common/xml/TransformSupport.java Tue Sep 27 10:44:04 2011
@@ -0,0 +1,366 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tag.common.xml;
+
+import org.apache.taglibs.standard.resources.Resources;
+import org.apache.taglibs.standard.tag.common.core.ImportSupport;
+import org.apache.taglibs.standard.tag.common.core.Util;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspTagException;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.BodyTagSupport;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.Writer;
+import java.util.List;
+import java.util.MissingResourceException;
+
+public abstract class TransformSupport extends BodyTagSupport {
+
+ protected Object xml;
+
+ protected String xmlSystemId;
+
+ protected Object xslt;
+
+ protected String xsltSystemId;
+
+ protected Result result;
+
+ private String var;
+
+ private int scope;
+
+ private Transformer t;
+
+ private final TransformerFactory tf;
+
+ private final DocumentBuilder db;
+
+ public TransformSupport() {
+ super();
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ db = dbf.newDocumentBuilder();
+ tf = TransformerFactory.newInstance();
+ } catch (ParserConfigurationException e) {
+ throw (AssertionError) new AssertionError("Unable to create DocumentBuilder").initCause(e);
+ }
+
+ init();
+ }
+
+ private void init() {
+ xml = xslt = null;
+ xmlSystemId = xsltSystemId = null;
+ var = null;
+ result = null;
+ tf.setURIResolver(null);
+ scope = PageContext.PAGE_SCOPE;
+ }
+
+ @Override
+ public int doStartTag()
+ throws JspException {
+
+ t = getTransformer(xslt, xsltSystemId);
+ return EVAL_BODY_BUFFERED;
+ }
+
+ @Override
+ public int doEndTag()
+ throws JspException {
+ try {
+
+ Object xml = this.xml;
+ if (xml == null) {
+ if (bodyContent != null && bodyContent.getString() != null) {
+ xml = bodyContent.getString().trim();
+ } else {
+ xml = "";
+ }
+ }
+
+ if (isNullOrEmpty(xml)) {
+ throw new JspTagException("xml is null");
+ }
+
+ Source source = getSource(xml, xmlSystemId);
+
+ if (result != null) {
+ t.transform(source, result);
+ } else if (var != null) {
+
+ Document d = db.newDocument();
+ Result doc = new DOMResult(d);
+ t.transform(source, doc);
+ pageContext.setAttribute(var, d, scope);
+ } else {
+ Result page = new StreamResult(new SafeWriter(pageContext.getOut()));
+ t.transform(source, page);
+ }
+
+ return EVAL_PAGE;
+ } catch (SAXException ex) {
+ throw new JspException(ex);
+ } catch (ParserConfigurationException ex) {
+ throw new JspException(ex);
+ } catch (IOException ex) {
+ throw new JspException(ex);
+ } catch (TransformerException ex) {
+ throw new JspException(ex);
+ }
+ }
+
+
+ @Override
+ public void release() {
+ super.release();
+ init();
+ }
+
+ @Override
+ public void setPageContext(PageContext pageContext) {
+ super.setPageContext(pageContext);
+ tf.setURIResolver(pageContext == null ? null : new JstlUriResolver(pageContext));
+ }
+
+
+ public void addParameter(String name, Object value) {
+ t.setParameter(name, value);
+ }
+
+ private static String wrapSystemId(String systemId) {
+ if (systemId == null) {
+ return "jstl:";
+ } else if (ImportSupport.isAbsoluteUrl(systemId)) {
+ return systemId;
+ } else {
+ return ("jstl:" + systemId);
+ }
+ }
+
+ Transformer getTransformer(final Object xslt, final String systemId)
+ throws JspException {
+ if (isNullOrEmpty(xslt)) {
+ String name = "TRANSFORM_XSLT_IS_NULL";
+ throw new JspTagException(getMessage(name));
+ }
+
+ try {
+
+ final Source s = getSource(xslt, systemId);
+
+ tf.setURIResolver(new JstlUriResolver(pageContext));
+ return tf.newTransformer(s);
+
+ } catch (SAXException ex) {
+ throw new JspException(ex);
+ } catch (ParserConfigurationException ex) {
+ throw new JspException(ex);
+ } catch (IOException ex) {
+ throw new JspException(ex);
+ } catch (TransformerConfigurationException ex) {
+ throw new JspException(ex);
+ }
+ }
+
+ private String getMessage(String name) {
+ try {
+ return Resources.getMessage(name);
+ } catch (MissingResourceException e) {
+ return name;
+ }
+ }
+
+ protected boolean isNullOrEmpty(Object value) {
+ if (value == null) {
+ return true;
+ }
+
+ if (!(value instanceof String)) {
+ return false;
+ }
+
+ String str = (String) value;
+ str = str.trim();
+ return str.isEmpty();
+ }
+
+ private Source getSource(Object o, String systemId)
+ throws SAXException, ParserConfigurationException, IOException, JspTagException {
+ if (o == null) {
+ throw new JspTagException(getMessage("TRANSFORM_XML_IS_NULL"));
+ }
+
+ if (o instanceof List) {
+
+ List<?> list = (List<?>) o;
+ if (list.size() != 1) {
+ throw new JspTagException(getMessage("TRANSFORM_XML_LIST_SIZE"));
+ }
+ return getSource(list.get(0), systemId);
+ }
+
+ if (o instanceof Source) {
+ return (Source) o;
+ }
+
+ if (o instanceof String) {
+ String s = (String) o;
+ s = s.trim();
+ if (s.length() == 0) {
+ throw new JspTagException(getMessage("TRANSFORM_XML_IS_EMPTY"));
+ }
+ return getSource(new StringReader(s), systemId);
+ }
+
+ if (o instanceof Reader) {
+ return getSource((Reader) o, systemId);
+ }
+
+ if (o instanceof Node) {
+ return new DOMSource((Node) o, systemId);
+ }
+ throw new JspTagException(Resources.getMessage("TRANSFORM_XML_UNSUPPORTED_TYPE", o.getClass()));
+ }
+
+ Source getSource(Reader reader, String systemId)
+ throws JspTagException {
+ try {
+ XMLReader xr = XMLReaderFactory.createXMLReader();
+ xr.setEntityResolver(new ParseSupport.JstlEntityResolver(pageContext));
+ InputSource s = new InputSource(reader);
+ s.setSystemId(wrapSystemId(systemId));
+ Source result = new SAXSource(xr, s);
+ result.setSystemId(wrapSystemId(systemId));
+ return result;
+ } catch (SAXException e) {
+ throw new JspTagException(e);
+ }
+ }
+
+
+ public void setVar(String var) {
+ this.var = var;
+ }
+
+ public void setScope(String scope) {
+ this.scope = Util.getScope(scope);
+ }
+
+ private static class SafeWriter
+ extends Writer {
+ private final Writer w;
+
+ public SafeWriter(Writer w) {
+ this.w = w;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len)
+ throws IOException {
+ w.write(cbuf, off, len);
+ }
+ }
+
+ private static class JstlUriResolver
+ implements URIResolver {
+ private final PageContext ctx;
+
+ public JstlUriResolver(PageContext ctx) {
+ this.ctx = ctx;
+ }
+
+ public Source resolve(String href, String base)
+ throws TransformerException {
+
+ if (href == null) {
+ return null;
+ }
+
+ int index;
+ if (base != null && (index = base.indexOf("jstl:")) != -1) {
+ base = base.substring(index + 5);
+ }
+
+ if (ImportSupport.isAbsoluteUrl(href) || (base != null && ImportSupport.isAbsoluteUrl(base))) {
+ return null;
+ }
+
+ if (base == null || base.lastIndexOf("/") == -1) {
+ base = "";
+ } else {
+ base = base.substring(0, base.lastIndexOf("/") + 1);
+ }
+
+ String target = base + href;
+
+ InputStream s;
+ if (target.startsWith("/")) {
+ s = ctx.getServletContext().getResourceAsStream(target);
+ if (s == null) {
+ throw new TransformerException(Resources.getMessage("UNABLE_TO_RESOLVE_ENTITY", href));
+ }
+ } else {
+ String pagePath = ((HttpServletRequest) ctx.getRequest()).getServletPath();
+ String basePath = pagePath.substring(0, pagePath.lastIndexOf("/"));
+ s = ctx.getServletContext().getResourceAsStream(basePath + "/" + target);
+ if (s == null) {
+ throw new TransformerException(Resources.getMessage("UNABLE_TO_RESOLVE_ENTITY", href));
+ }
+ }
+ return new StreamSource(s);
+ }
+ }
+
+}