You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/10/10 17:15:02 UTC

svn commit: r454775 - /incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java

Author: gnodet
Date: Tue Oct 10 08:15:01 2006
New Revision: 454775

URL: http://svn.apache.org/viewvc?view=rev&rev=454775
Log:
SM-697: Using XSLT servicemix component causes a "java.io.IOException: Too many open files"

Modified:
    incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java

Modified: incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java
URL: http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java?view=diff&rev=454775&r1=454774&r2=454775
==============================================================================
--- incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java (original)
+++ incubator/servicemix/trunk/servicemix-components/src/main/java/org/apache/servicemix/components/xslt/XsltComponent.java Tue Oct 10 08:15:01 2006
@@ -16,35 +16,35 @@
  */
 package org.apache.servicemix.components.xslt;
 
-import org.apache.servicemix.MessageExchangeListener;
-import org.apache.servicemix.components.util.TransformComponentSupport;
-import org.apache.servicemix.jbi.jaxp.BytesSource;
-import org.apache.servicemix.jbi.jaxp.StringSource;
-import org.springframework.core.io.Resource;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Iterator;
 
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.MessagingException;
 import javax.jbi.messaging.NormalizedMessage;
+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.Templates;
 import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Iterator;
+import org.apache.servicemix.MessageExchangeListener;
+import org.apache.servicemix.components.util.TransformComponentSupport;
+import org.apache.servicemix.jbi.jaxp.BytesSource;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.springframework.core.io.Resource;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 /**
  * An <a href="http://www.w3.org/TR/xslt">XSLT</a> based JBI component using <a
@@ -90,11 +90,11 @@
         this.transformerFactory = transformerFactory;
     }
 
-    public Source getXsltSource() throws IOException {
+    public Source getXsltSource() throws Exception {
         if (xsltSource == null) {
             // lets create a new one each time
             // as we can only read a stream once
-            return createXsltSource();
+            xsltSource = createXsltSource();
         }
         return xsltSource;
     }
@@ -138,17 +138,9 @@
             transformContent(transformer, exchange, in, out);
             return shouldOutputResult(transformer);
         }
-        catch (ParserConfigurationException e) {
-            e.printStackTrace();
-            throw new MessagingException("Failed to transform: " + e, e);
-        }
-        catch (TransformerException e) {
-            e.printStackTrace();
+        catch (Exception e) {
             throw new MessagingException("Failed to transform: " + e, e);
         }
-        catch (IOException e) {
-            throw new MessagingException("Failed to load transform: " + e, e);
-        }
     }
 
     protected void transformContent(Transformer transformer, MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws TransformerException, MessagingException, ParserConfigurationException {
@@ -189,20 +181,26 @@
          */
     }
 
-    protected Source createXsltSource() throws IOException {
+    protected Source createXsltSource() throws Exception {
         if (xsltResource != null) {
-            URL url = xsltResource.getURL();
-            if (url == null) {
-                return new StreamSource(xsltResource.getInputStream());
-            }
-            else {
-                return new StreamSource(xsltResource.getInputStream(), url.toExternalForm());
-            }
+            return new DOMSource(parse(xsltResource));
         }
         return null;
     }
 
-    public Templates getTemplates() throws IOException, TransformerConfigurationException {
+    protected Document parse(Resource res) throws Exception {
+        URL url = null;
+        try {
+            res.getURL();
+        } catch (IOException e) {
+            // Ignore
+        }
+        DocumentBuilder builder = new SourceTransformer().createDocumentBuilder();
+        return builder.parse(res.getInputStream(), url != null ? url.toExternalForm() : null);
+    }
+
+    
+    public Templates getTemplates() throws Exception {
         if (templates == null) {
             templates = createTemplates();
         }
@@ -212,7 +210,7 @@
     /**
      * Factory method to create a new transformer instance
      */
-    protected Templates createTemplates() throws TransformerConfigurationException, IOException {
+    protected Templates createTemplates() throws Exception {
         Source source = getXsltSource();
         return getTransformerFactory().newTemplates(source);
     }
@@ -221,7 +219,7 @@
      * Factory method to create a new transformer instance
      */
     protected Transformer createTransformer(MessageExchange exchange, NormalizedMessage in)
-            throws TransformerConfigurationException, IOException {
+            throws Exception {
         Source source = getXsltSource();
         if (source == null) {
             return getTransformerFactory().newTransformer();