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>
- <titles>
- {
- for $x in /bookstore/book
- where $x/price > 30
- return $x/title
- }
- </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>