You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fo...@apache.org on 2016/02/08 17:14:00 UTC

camel git commit: CAMEL-9580: XSLT component: Support URI resolver factory

Repository: camel
Updated Branches:
  refs/heads/master 03b5c2943 -> 8e479dfa7


CAMEL-9580: XSLT component: Support URI resolver factory

- factory for creating URI resolver
- usfull to create an URI resolver which is a sub-class of the
  default XsltUriResolver

Change-Id: Idfd3b1c2b0811aa5ef1c6e43178f67dc6fe2228d


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8e479dfa
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8e479dfa
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8e479dfa

Branch: refs/heads/master
Commit: 8e479dfa7a7e83713c2b3eb2e1145aaefd15ff6f
Parents: 03b5c29
Author: Franz Forsthofer <fr...@sap.com>
Authored: Mon Feb 8 16:56:24 2016 +0100
Committer: Franz Forsthofer <fr...@sap.com>
Committed: Mon Feb 8 17:13:20 2016 +0100

----------------------------------------------------------------------
 .../xslt/DefaultXsltUriResolverFactory.java     |  20 +++
 .../camel/component/xslt/XsltComponent.java     |  38 ++++-
 .../component/xslt/XsltUriResolverFactory.java  |  50 +++++++
 .../xslt/XsltUriResolverFactoryTest.java        | 146 +++++++++++++++++++
 4 files changed, 249 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8e479dfa/camel-core/src/main/java/org/apache/camel/component/xslt/DefaultXsltUriResolverFactory.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/xslt/DefaultXsltUriResolverFactory.java b/camel-core/src/main/java/org/apache/camel/component/xslt/DefaultXsltUriResolverFactory.java
new file mode 100644
index 0000000..a6a283e
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/xslt/DefaultXsltUriResolverFactory.java
@@ -0,0 +1,20 @@
+package org.apache.camel.component.xslt;
+
+import javax.xml.transform.URIResolver;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.xml.XsltUriResolver;
+
+/**
+ * Default URI resolver factory which instantiates the camel default XSLT URI
+ * resolver which can resolves absolute and relative URIs in the classpath and
+ * file system.
+ */
+public class DefaultXsltUriResolverFactory implements XsltUriResolverFactory {
+
+    @Override
+    public URIResolver createUriResolver(CamelContext camelContext, String resourceUri) {
+        return new XsltUriResolver(camelContext.getClassResolver(), resourceUri);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8e479dfa/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
index 3227242..0754e3b 100644
--- a/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltComponent.java
@@ -37,8 +37,10 @@ public class XsltComponent extends UriEndpointComponent {
 
     @Metadata(label = "advanced")
     private XmlConverter xmlConverter;
-    @Metadata(label = "advanced")
+    @Metadata(label = "advanced", description="To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'.")
     private URIResolver uriResolver;
+    @Metadata(label = "advanced", description="To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'.")
+    private XsltUriResolverFactory uriResolverFactory;
     @Metadata(defaultValue = "true")
     private boolean contentCache = true;
     private boolean saxon;
@@ -57,13 +59,29 @@ public class XsltComponent extends UriEndpointComponent {
     public void setXmlConverter(XmlConverter xmlConverter) {
         this.xmlConverter = xmlConverter;
     }
+    
+    
+
+    public XsltUriResolverFactory getUriResolverFactory() {
+        return uriResolverFactory;
+    }
+
+    /**
+     * To use a custom javax.xml.transform.URIResolver which depends on a dynamic endpoint resource URI or which is a subclass of {@link XsltUriResolver}.
+     *  Do not use in combination with uriResolver.
+     * See also {@link #setUriResolver(URIResolver)}.
+     */
+    public void setUriResolverFactory(XsltUriResolverFactory uriResolverFactory) {
+        this.uriResolverFactory = uriResolverFactory;
+    }
 
     public URIResolver getUriResolver() {
         return uriResolver;
     }
 
     /**
-     * To use a custom javax.xml.transform.URIResolver
+     * To use a custom javax.xml.transform.URIResolver. Do not use in combination with uriResolverFactory.
+     * See also {@link #setUriResolverFactory(XsltUriResolverFactory)}.
      */
     public void setUriResolver(URIResolver uriResolver) {
         this.uriResolver = uriResolver;
@@ -114,10 +132,20 @@ public class XsltComponent extends UriEndpointComponent {
         if (resolver == null) {
             // not in endpoint then use component specific resolver
             resolver = getUriResolver();
-        }
+        }       
         if (resolver == null) {
-            // fallback to use a Camel specific resolver
-            resolver = new XsltUriResolver(getCamelContext().getClassResolver(), remaining);
+            // lookup custom resolver factory to use
+            XsltUriResolverFactory resolverFactory = resolveAndRemoveReferenceParameter(parameters, "uriResolverFactory", XsltUriResolverFactory.class);
+            if (resolverFactory == null) {
+                // not in endpoint then use component specific resolver factory
+                resolverFactory = getUriResolverFactory();
+            }
+            if (resolverFactory == null){
+                // fallback to use the Default URI resolver factory
+                resolverFactory = new DefaultXsltUriResolverFactory();
+            }
+            
+            resolver = resolverFactory.createUriResolver(getCamelContext(), remaining);
         }
         endpoint.setUriResolver(resolver);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/8e479dfa/camel-core/src/main/java/org/apache/camel/component/xslt/XsltUriResolverFactory.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/xslt/XsltUriResolverFactory.java b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltUriResolverFactory.java
new file mode 100644
index 0000000..f9209a3
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/xslt/XsltUriResolverFactory.java
@@ -0,0 +1,50 @@
+/**
+ * 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.camel.component.xslt;
+
+import javax.xml.transform.URIResolver;
+
+import org.apache.camel.CamelContext;
+
+/**
+ * Can be used to create custom URI resolver for the XSLT endpoint. This
+ * interface is useful, if the custom URI resolver depends on the resource URI
+ * specified in the XSLT endpoint. The resource URI of the endpoint can be even
+ * dynamic, like in the following example:
+ * 
+ * <pre>
+ * {@code <camel:recipientList>} 
+ * {@code      <camel:simple>}xslt:${header.XSLT_FILE}?uriResolverFactory=#uriResolverFactory{@code</camel:simple>}
+ * {@code </camel:recipientList>}
+ * </pre>
+ * 
+ * The dynamic resource URI given in ${header.XSLT_FILE} will be past as
+ * resourceUri parameter in the method
+ * {@link #createUriResolver(CamelContext, String)}
+ */
+public interface XsltUriResolverFactory {
+
+    /**
+     * Method is called during the creation of a xslt endpoint.
+     * 
+     * @param camelContext camel context
+     * @param resourceUri resource URI specified in the endpoint URI
+     * @return URI resolver
+     */
+    URIResolver createUriResolver(CamelContext camelContext, String resourceUri);
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/8e479dfa/camel-core/src/test/java/org/apache/camel/component/xslt/XsltUriResolverFactoryTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/xslt/XsltUriResolverFactoryTest.java b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltUriResolverFactoryTest.java
new file mode 100644
index 0000000..e16fb4a
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/xslt/XsltUriResolverFactoryTest.java
@@ -0,0 +1,146 @@
+/**
+ * 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.camel.component.xslt;
+
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.builder.xml.XsltUriResolver;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.model.language.ConstantExpression;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.spi.ClassResolver;
+import org.junit.Assert;
+
+/**
+ *
+ */
+public class XsltUriResolverFactoryTest extends ContextTestSupport {
+
+    private JndiRegistry registry;
+
+    public void testConfigurationOnEndpoint() throws Exception {
+        String endpointUri = "xslt:xslt/staff/staff.xsl?uriResolverFactory=#uriResolverFactory";
+        String directStart = "direct:start";
+
+        // ensure that the URI resolver factory is not set on the component by
+        // the method "testConfigurationOnComponent"
+        registry.getContext().unbind("xslt");
+        execute(endpointUri, directStart);
+    }
+
+    public void testConfigurationOnComponent() throws Exception {
+
+        XsltComponent xsltComponent = new XsltComponent();
+        xsltComponent.setUriResolverFactory(new CustomXsltUriResolverFactory());
+        registry.bind("xslt", xsltComponent);
+
+        String endpointUri = "xslt:xslt/staff/staff.xsl";
+        String directStart = "direct:startComponent";
+
+        execute(endpointUri, directStart);
+    }
+
+    void execute(String endpointUri, String directStart) throws InterruptedException {
+        InputStream payloud = XsltUriResolverFactoryTest.class.getClassLoader().getResourceAsStream("xslt/staff/staff.xml");
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+
+        sendBody(directStart, payloud);
+        XsltEndpoint xsltEndpoint = null;
+        for (int i = 0; i < 5; i++) {
+            xsltEndpoint = resolveMandatoryEndpoint(endpointUri, XsltEndpoint.class);
+            if (xsltEndpoint != null) {
+                break;
+            }
+            // wait until endpoint is resolved
+            Thread.sleep(50);
+        }
+        assertMockEndpointsSatisfied();
+        assertNotNull(xsltEndpoint);
+        CustomXsltUriResolver resolver = (CustomXsltUriResolver)xsltEndpoint.getUriResolver();
+        checkResourceUri(resolver.resolvedRsourceUris, "xslt/staff/staff.xsl");
+        checkResourceUri(resolver.resolvedRsourceUris, "../common/staff_template.xsl");
+    }
+
+    @Override
+    protected RouteBuilder[] createRouteBuilders() throws Exception {
+        return new RouteBuilder[] {new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start") //
+                    .setHeader("xslt_file", new ConstantExpression("xslt/staff/staff.xsl")) //
+                    .recipientList(new SimpleExpression("xslt:${header.xslt_file}?uriResolverFactory=#uriResolverFactory")) //
+                    .to("mock:result");
+            }
+        }, new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:startComponent") //
+                    .setHeader("xslt_file", new ConstantExpression("xslt/staff/staff.xsl")) //
+                    .recipientList(new SimpleExpression("xslt:${header.xslt_file}")) //
+                    .to("mock:result");
+            }
+        }};
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        registry = super.createRegistry();
+        registry.bind("uriResolverFactory", new CustomXsltUriResolverFactory());
+        return registry;
+
+    }
+
+    void checkResourceUri(Set<String> uris, String resourceUri) {
+        Assert.assertTrue("Missing resource uri " + resourceUri + " in resolved resource URI set", uris.contains(resourceUri));
+    }
+
+    static class CustomXsltUriResolverFactory implements XsltUriResolverFactory {
+
+        @Override
+        public URIResolver createUriResolver(CamelContext camelContext, String resourceUri) {
+            return new CustomXsltUriResolver(camelContext.getClassResolver(), resourceUri);
+        }
+
+    }
+
+    static class CustomXsltUriResolver extends XsltUriResolver {
+
+        private final Set<String> resolvedRsourceUris = new HashSet<>();
+
+        public CustomXsltUriResolver(ClassResolver resolver, String location) {
+            super(resolver, location);
+        }
+
+        public Source resolve(String href, String base) throws TransformerException {
+            Source result = super.resolve(href, base);
+            resolvedRsourceUris.add(href);
+            return result;
+        }
+
+    }
+}