Author: gnodet
Date: Thu Sep 28 07:53:23 2006
New Revision: 450880

URL: http://svn.apache.org/viewvc?view=rev&rev=450880
Log:
Allow dynamic selection of xslt / stylsheet 

Modified:
    
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/SaxonEndpoint.java
    
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XQueryEndpoint.java
    
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XsltEndpoint.java
    
incubator/servicemix/trunk/servicemix-saxon/src/test/java/org/apache/servicemix/saxon/SaxonComponentTest.java
    incubator/servicemix/trunk/servicemix-saxon/src/test/resources/spring.xml

Modified: 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/SaxonEndpoint.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/SaxonEndpoint.java?view=diff&rev=450880&r1=450879&r2=450880
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/SaxonEndpoint.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/SaxonEndpoint.java
 Thu Sep 28 07:53:23 2006
@@ -1,15 +1,27 @@
 package org.apache.servicemix.saxon;

 

+import java.io.File;

+import java.io.IOException;

+import java.net.URI;

+import java.net.URL;

 import java.util.Iterator;

 

 import javax.jbi.messaging.ExchangeStatus;

 import javax.jbi.messaging.InOut;

 import javax.jbi.messaging.MessageExchange;

 import javax.jbi.messaging.NormalizedMessage;

+import javax.xml.parsers.DocumentBuilder;

+import javax.xml.parsers.DocumentBuilderFactory;

 

 import net.sf.saxon.Configuration;

 

 import org.apache.servicemix.common.ProviderEndpoint;

+import org.apache.servicemix.expression.Expression;

+import org.springframework.core.io.DefaultResourceLoader;

+import org.springframework.core.io.FileSystemResource;

+import org.springframework.core.io.Resource;

+import org.springframework.core.io.UrlResource;

+import org.w3c.dom.Document;

 

 public abstract class SaxonEndpoint extends ProviderEndpoint {

 

@@ -22,6 +34,51 @@
     private boolean copyAttachments = true;

     private boolean copySubject = true;

     private String result = RESULT_DOM;

+    private Resource resource;

+    private Expression expression;

+    private Resource wsdlResource;

+

+    /**

+     * @return the wsdlResource

+     */

+    public Resource getWsdlResource() {

+        return wsdlResource;

+    }

+

+    /**

+     * @param wsdlResource the wsdlResource to set

+     */

+    public void setWsdlResource(Resource wsdlResource) {

+        this.wsdlResource = wsdlResource;

+    }

+

+    /**

+     * @return the expression

+     */

+    public Expression getExpression() {

+        return expression;

+    }

+

+    /**

+     * @param expression the expression to set

+     */

+    public void setExpression(Expression expression) {

+        this.expression = expression;

+    }

+

+    /**

+     * @return the resource

+     */

+    public Resource getResource() {

+        return resource;

+    }

+

+    /**

+     * @param resource the resource to set

+     */

+    public void setResource(Resource resource) {

+        this.resource = resource;

+    }

 

     /**

      * @return the result

@@ -96,6 +153,13 @@
     // Interface methods

     // 
-------------------------------------------------------------------------

     

+    public void activate() throws Exception {

+        if (wsdlResource != null) {

+            setDescription(parse(wsdlResource));

+        }

+        super.activate();

+    }

+    

     public void process(MessageExchange exchange) throws Exception {

         // The component acts as a provider, this means that another component 
has requested our service

         // As this exchange is active, this is either an in or a fault (out 
are send by this component)

@@ -159,5 +223,37 @@
     }

     

     protected abstract void transform(MessageExchange exchange, 
NormalizedMessage in, NormalizedMessage out) throws Exception;

+

+    protected Resource getDynamicResource(MessageExchange exchange, 
NormalizedMessage in) throws Exception {

+        Object res = getExpression().evaluate(exchange, in);

+        if (res == null) {

+            return null;

+        }

+        if (res instanceof Resource) {

+            return (Resource) res;

+        }

+        if (res instanceof File) {

+            return new FileSystemResource((File) res);

+        }

+        if (res instanceof URL) {

+            return new UrlResource((URL) res);

+        }

+        if (res instanceof URI) {

+            return new UrlResource(((URI) res).toURL());

+        }

+        return new DefaultResourceLoader().getResource(res.toString());

+    }

     

+    protected Document parse(Resource res) throws Exception {

+        URL url = null;

+        try {

+            res.getURL();

+        } catch (IOException e) {

+            // Ignore

+        }

+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

+        factory.setNamespaceAware(true);

+        DocumentBuilder builder = factory.newDocumentBuilder();

+        return builder.parse(res.getInputStream(), url != null ? 
url.toExternalForm() : null);

+    }

 }


Modified: 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XQueryEndpoint.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XQueryEndpoint.java?view=diff&rev=450880&r1=450879&r2=450880
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XQueryEndpoint.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XQueryEndpoint.java
 Thu Sep 28 07:53:23 2006
@@ -28,7 +28,8 @@
  */

 public class XQueryEndpoint extends SaxonEndpoint {

 

-    private Resource resource;

+    private static final Properties EMPTY_PROPS = new Properties();

+    

     private String query;

     private XQueryExpression exp;

     private StaticQueryContext staticEnv;

@@ -66,20 +67,6 @@
         this.query = query;

     }

 

-    /**

-     * @return the resource

-     */

-    public Resource getResource() {

-        return resource;

-    }

-

-    /**

-     * @param resource the resource to set

-     */

-    public void setResource(Resource resource) {

-        this.resource = resource;

-    }

-

     // Interface methods

     // 
-------------------------------------------------------------------------

     

@@ -91,17 +78,18 @@
         config.setHostLanguage(Configuration.XQUERY);

         setConfiguration(config);

         staticEnv = new StaticQueryContext(config);

-        if (query == null || query.trim().length() == 0) {

-            exp = staticEnv.compileQuery(resource.getInputStream(), null);

-        } else {

-            exp = staticEnv.compileQuery(query);

+        if (getQuery() != null) {

+            exp = staticEnv.compileQuery(getQuery());

+            staticEnv = exp.getStaticContext();

+        } else if (getResource() != null) {

+            exp = staticEnv.compileQuery(getResource().getInputStream(), null);

+            staticEnv = exp.getStaticContext();

         }

-        staticEnv = exp.getStaticContext();

     }

     

     public void validate() throws DeploymentException {

-        if ((query == null || query.trim().length() == 0) && resource == null) 
{

-            throw new DeploymentException("query or resource should be 
specified");

+        if (getQuery() == null && getResource() == null && getExpression() == 
null) {

+            throw new DeploymentException("query, resource or expression 
should be specified");

         }

     }

 

@@ -119,20 +107,21 @@
         DocumentInfo doc = staticEnv.buildDocument(in.getContent());

         dynamicEnv.setContextItem(doc);

         configureQuery(dynamicEnv, exchange, in);

+        Properties props = outputProperties != null ? outputProperties : 
EMPTY_PROPS; 

         if (RESULT_BYTES.equalsIgnoreCase(getResult())) {

             ByteArrayOutputStream buffer = new ByteArrayOutputStream();

             Result result = new StreamResult(buffer);

-            expression.run(dynamicEnv, result, outputProperties);

+            expression.pull(dynamicEnv, result, props);

             out.setContent(new BytesSource(buffer.toByteArray()));

         }

         else if (RESULT_STRING.equalsIgnoreCase(getResult())) {

             StringWriter buffer = new StringWriter();

             Result result = new StreamResult(buffer);

-            expression.run(dynamicEnv, result, outputProperties);

+            expression.pull(dynamicEnv, result, props);

             out.setContent(new StringSource(buffer.toString()));

         } else {

             DOMResult result = new DOMResult();

-            expression.run(dynamicEnv, result, outputProperties);

+            expression.pull(dynamicEnv, result, props);

             out.setContent(new DOMSource(result.getNode()));

         }

     }

@@ -154,7 +143,12 @@
     }

     

     protected XQueryExpression createQuery(MessageExchange exchange, 
NormalizedMessage in) throws Exception {

-        return exp;

+        if (getExpression() != null) {

+            Resource r = getDynamicResource(exchange, in);

+            return staticEnv.compileQuery(r.getInputStream(), null);

+        } else {

+            return exp;

+        }

     }

     

 }


Modified: 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XsltEndpoint.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XsltEndpoint.java?view=diff&rev=450880&r1=450879&r2=450880
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XsltEndpoint.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-saxon/src/main/java/org/apache/servicemix/saxon/XsltEndpoint.java
 Thu Sep 28 07:53:23 2006
@@ -18,13 +18,11 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.StringWriter;
-import java.net.URL;
 import java.util.Iterator;
 
 import javax.jbi.management.DeploymentException;
 import javax.jbi.messaging.MessageExchange;
 import javax.jbi.messaging.NormalizedMessage;
-import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
@@ -50,8 +48,8 @@
     
     private TransformerFactory transformerFactory;
     private Source xsltSource;
-    private Resource resource;
     private Templates templates;
+    
     public TransformerFactory getTransformerFactory() {
         if (transformerFactory == null) {
             transformerFactory = createTransformerFactory();
@@ -63,17 +61,9 @@
         this.transformerFactory = transformerFactory;
     }
 
-    public Resource getResource() {
-        return resource;
-    }
-
-    public void setResource(Resource xsltResource) {
-        this.resource = xsltResource;
-    }
-
     public void validate() throws DeploymentException {
-        if (xsltSource == null && resource == null) {
-            throw new DeploymentException("xsltSrouce or resource must be 
specified");
+        if (xsltSource == null && getResource() == null && getExpression() == 
null) {
+            throw new DeploymentException("xsltSource, resource or expression 
must be specified");
         }
     }
     
@@ -116,21 +106,13 @@
 
     protected Source getXsltSource() throws Exception {
         if (xsltSource == null) {
-            xsltSource = createXsltSource();
+            xsltSource = createXsltSource(getResource());
         }
         return xsltSource;
     }
 
-    protected Source createXsltSource() throws Exception {
-        if (resource != null) {
-            URL url = resource.getURL();
-            DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
-            factory.setNamespaceAware(true);
-            DocumentBuilder builder = factory.newDocumentBuilder();
-            Document doc = builder.parse(resource.getInputStream(), url != 
null ? url.toExternalForm() : null);
-            return new DOMSource(doc);
-        }
-        return null;
+    protected Source createXsltSource(Resource res) throws Exception {
+        return new DOMSource(parse(res));
     }
 
     public Templates getTemplates() throws Exception {
@@ -152,11 +134,17 @@
      * Factory method to create a new transformer instance
      */
     protected Transformer createTransformer(MessageExchange exchange, 
NormalizedMessage in) throws Exception {
-        Source source = getXsltSource();
-        if (source == null) {
-            return getTransformerFactory().newTransformer();
-        }
-        else {
+        // Use dynamic stylesheet selection
+        if (getExpression() != null) {
+            Resource r = getDynamicResource(exchange, in);
+            if (r == null) {
+                return getTransformerFactory().newTransformer();
+            } else {
+                Source source = createXsltSource(r);
+                return getTransformerFactory().newTransformer(source);
+            }
+        // Use static stylesheet
+        } else {
             return getTemplates().newTransformer();
         }
     }

Modified: 
incubator/servicemix/trunk/servicemix-saxon/src/test/java/org/apache/servicemix/saxon/SaxonComponentTest.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-saxon/src/test/java/org/apache/servicemix/saxon/SaxonComponentTest.java?view=diff&rev=450880&r1=450879&r2=450880
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-saxon/src/test/java/org/apache/servicemix/saxon/SaxonComponentTest.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-saxon/src/test/java/org/apache/servicemix/saxon/SaxonComponentTest.java
 Thu Sep 28 07:53:23 2006
@@ -78,6 +78,30 @@
         client.done(me);
     }
     
+    public void testXsltDynamic() throws Exception {
+        DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("urn:test", "xslt-dynamic"));
+        Element e = transformer.toDOMElement(new 
StreamSource(getClass().getResourceAsStream("/books.xml")));
+        e = DOMUtil.getFirstChildElement(e);
+        me.getInMessage().setContent(new DOMSource(e));
+        me.getInMessage().setProperty("xslt.source", 
"classpath:transform.xsl");
+        client.sendSync(me);
+        if (me.getStatus() == ExchangeStatus.ERROR) {
+            if (me.getError() != null) {
+                throw me.getError();
+            } else {
+                fail("Received ERROR status");
+            }
+        } else if (me.getFault() != null) {
+            fail("Received fault: " + new 
SourceTransformer().toString(me.getFault().getContent()));
+        }
+        
System.err.println(transformer.toString(me.getOutMessage().getContent()));
+        Element el = transformer.toDOMElement(me.getOutMessage());
+        assertEquals("2005", textValueOfXPath(el, "/transformed/book/year"));
+        client.done(me);
+    }
+    
     public void testXQuery() throws Exception {
         DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
         InOut me = client.createInOutExchange();
@@ -104,6 +128,33 @@
         InOut me = client.createInOutExchange();
         me.setService(new QName("urn:test", "xquery-inline"));
         me.getInMessage().setContent(new 
StreamSource(getClass().getResourceAsStream("/books.xml")));
+        client.sendSync(me);
+        if (me.getStatus() == ExchangeStatus.ERROR) {
+            if (me.getError() != null) {
+                throw me.getError();
+            } else {
+                fail("Received ERROR status");
+            }
+        } else if (me.getFault() != null) {
+            fail("Received fault: " + new 
SourceTransformer().toString(me.getFault().getContent()));
+        }
+        
System.err.println(transformer.toString(me.getOutMessage().getContent()));
+        Element el = transformer.toDOMElement(me.getOutMessage());
+        assertEquals(new QName("http://saxon.sf.net/xquery-results";, 
"sequence"), DOMUtil.getQName(el));
+        el = DOMUtil.getFirstChildElement(el);
+        assertEquals(new QName("http://saxon.sf.net/xquery-results";, 
"element"), DOMUtil.getQName(el));
+        el = DOMUtil.getFirstChildElement(el);
+        assertEquals(new QName("title"), DOMUtil.getQName(el));
+        assertEquals("XQuery Kick Start", DOMUtil.getElementText(el));
+        client.done(me);
+    }
+    
+    public void testXQueryDynamic() throws Exception {
+        DefaultServiceMixClient client = new DefaultServiceMixClient(jbi);
+        InOut me = client.createInOutExchange();
+        me.setService(new QName("urn:test", "xquery-dynamic"));
+        me.getInMessage().setContent(new 
StreamSource(getClass().getResourceAsStream("/books.xml")));
+        me.getInMessage().setProperty("xquery.source", 
getClass().getResource("/query.xq"));
         client.sendSync(me);
         if (me.getStatus() == ExchangeStatus.ERROR) {
             if (me.getError() != null) {

Modified: 
incubator/servicemix/trunk/servicemix-saxon/src/test/resources/spring.xml
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-saxon/src/test/resources/spring.xml?view=diff&rev=450880&r1=450879&r2=450880
==============================================================================
--- incubator/servicemix/trunk/servicemix-saxon/src/test/resources/spring.xml 
(original)
+++ incubator/servicemix/trunk/servicemix-saxon/src/test/resources/spring.xml 
Thu Sep 28 07:53:23 2006
@@ -30,25 +30,50 @@
          <saxon:component>

            <saxon:endpoints>

 

+              <!-- START SNIPPET: xslt --> 

              <saxon:xslt service="test:xslt" endpoint="endpoint"

                          resource="classpath:transform.xsl" />

-                         

+             <!-- END SNIPPET: xslt --> 

+             

+             <!-- START SNIPPET: xslt-dynamic -->

+             <saxon:xslt service="test:xslt-dynamic" endpoint="endpoint">

+               <saxon:expression>
+                 <bean 
class="org.apache.servicemix.expression.PropertyExpression">
+                   <property name="property" value="xslt.source" />
+                 </bean>
+               </saxon:expression>

+             </saxon:xslt>

+             <!-- END SNIPPET: xslt-dynamic -->

+             

+             <!-- START SNIPPET: xquery --> 

              <saxon:xquery service="test:xquery" endpoint="endpoint"

                            resource="classpath:query.xq" />

-

+             <!-- END SNIPPET: xquery --> 

+             

+             <!-- START SNIPPET: xquery-inline --> 

              <saxon:xquery service="test:xquery-inline" endpoint="endpoint">

                <!-- CDATA are not supported currently -->

                <saxon:query>

-                  &lt;titles>

-                  {

-                    for $x in /bookstore/book

-                    where $x/price > 30

-                    return $x/title

-                  }

-                 &lt;/titles>

+                  for $x in /bookstore/book
+                  where $x/price > 30
+                  return $x/title

                </saxon:query>

+               <saxon:outputProperties>
+                 <saxon:property 
key="{http://saxon.sf.net/}wrap-result-sequence";>yes</saxon:property>
+               </saxon:outputProperties>

              </saxon:xquery>

-

+             <!-- END SNIPPET: xquery-inline --> 

+             

+             <!-- START SNIPPET: xquery-dynamic -->

+             <saxon:xquery service="test:xquery-dynamic" endpoint="endpoint">

+               <saxon:expression>

+                 <bean 
class="org.apache.servicemix.expression.PropertyExpression">

+                   <property name="property" value="xquery.source" />

+                 </bean>

+               </saxon:expression>

+             </saxon:xquery>

+             <!-- END SNIPPET: xquery-dynamic -->

+             

            </saxon:endpoints>

          </saxon:component>

         </sm:component>



Reply via email to