Author: davsclaus
Date: Sun Jul 31 11:55:54 2011
New Revision: 1152569

URL: http://svn.apache.org/viewvc?rev=1152569&view=rev
Log:
CAMEL-4285: camel-saxon can now load imported resources from the classpath 
using a custom ModuleURIResolver. Thanks to Jay Mann for the patch.

Added:
    
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryModuleURIResolver.java
Modified:
    
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
    
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryComponent.java

Modified: 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java?rev=1152569&r1=1152568&r2=1152569&view=diff
==============================================================================
--- 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
 (original)
+++ 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
 Sun Jul 31 11:55:54 2011
@@ -43,6 +43,7 @@ import net.sf.saxon.om.DocumentInfo;
 import net.sf.saxon.om.Item;
 import net.sf.saxon.om.SequenceIterator;
 import net.sf.saxon.query.DynamicQueryContext;
+import net.sf.saxon.query.ModuleURIResolver;
 import net.sf.saxon.query.StaticQueryContext;
 import net.sf.saxon.query.XQueryExpression;
 import net.sf.saxon.trans.XPathException;
@@ -87,6 +88,7 @@ public abstract class XQueryBuilder impl
     private Class resultType;
     private final AtomicBoolean initialized = new AtomicBoolean(false);
     private boolean stripsAllWhiteSpace = true;
+    private ModuleURIResolver moduleURIResolver;
 
     @Override
     public String toString() {
@@ -393,6 +395,14 @@ public abstract class XQueryBuilder impl
         this.resultType = resultType;
     }
 
+    public ModuleURIResolver getModuleURIResolver() {
+        return moduleURIResolver;
+    }
+
+    public void setModuleURIResolver(ModuleURIResolver moduleURIResolver) {
+        this.moduleURIResolver = moduleURIResolver;
+    }
+
     public boolean isStripsAllWhiteSpace() {
         return stripsAllWhiteSpace;
     }
@@ -515,6 +525,10 @@ public abstract class XQueryBuilder impl
             configuration.setStripsWhiteSpace(isStripsAllWhiteSpace() ? 
Whitespace.ALL : Whitespace.IGNORABLE);
 
             staticQueryContext = new StaticQueryContext(getConfiguration());
+            if (moduleURIResolver != null) {
+                staticQueryContext.setModuleURIResolver(moduleURIResolver);
+            }
+
             Set<Map.Entry<String, String>> entries = 
namespacePrefixes.entrySet();
             for (Map.Entry<String, String> entry : entries) {
                 String prefix = entry.getKey();
@@ -522,7 +536,6 @@ public abstract class XQueryBuilder impl
                 staticQueryContext.declareNamespace(prefix, uri);
                 staticQueryContext.setInheritNamespaces(true);
             }
-
             expression = createQueryExpression(staticQueryContext);
 
             initialized.set(true);

Modified: 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryComponent.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryComponent.java?rev=1152569&r1=1152568&r2=1152569&view=diff
==============================================================================
--- 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryComponent.java
 (original)
+++ 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryComponent.java
 Sun Jul 31 11:55:54 2011
@@ -16,26 +16,28 @@
  */
 package org.apache.camel.component.xquery;
 
+import java.net.URL;
 import java.util.Map;
 
+import net.sf.saxon.query.ModuleURIResolver;
 import org.apache.camel.Endpoint;
 import org.apache.camel.component.ResourceBasedComponent;
 import org.apache.camel.impl.ProcessorEndpoint;
 import org.springframework.core.io.Resource;
 
-
 /**
  * An <a href="http://camel.apache.org/xquery.html";>XQuery Component</a>
  * for performing transforming messages
- *
- * @version 
  */
 public class XQueryComponent extends ResourceBasedComponent {
 
+    private ModuleURIResolver moduleURIResolver = new 
XQueryModuleURIResolver(this);
+
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         Resource resource = resolveMandatoryResource(remaining);
         log.debug("{} using schema resource: {}", this, resource);
         XQueryBuilder xslt = XQueryBuilder.xquery(resource.getURL());
+        xslt.setModuleURIResolver(getModuleURIResolver());
         configureXslt(xslt, uri, remaining, parameters);
         return new ProcessorEndpoint(uri, this, xslt);
     }
@@ -43,4 +45,16 @@ public class XQueryComponent extends Res
     protected void configureXslt(XQueryBuilder xQueryBuilder, String uri, 
String remaining, Map<String, Object> parameters) throws Exception {
         setProperties(xQueryBuilder, parameters);
     }
+
+    public URL resolveModuleResource(String uri) throws Exception {
+        return resolveMandatoryResource(uri).getURL();
+    }
+
+    public ModuleURIResolver getModuleURIResolver() {
+        return moduleURIResolver;
+    }
+
+    public void setModuleURIResolver(ModuleURIResolver moduleURIResolver) {
+        this.moduleURIResolver = moduleURIResolver;
+    }
 }

Added: 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryModuleURIResolver.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryModuleURIResolver.java?rev=1152569&view=auto
==============================================================================
--- 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryModuleURIResolver.java
 (added)
+++ 
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryModuleURIResolver.java
 Sun Jul 31 11:55:54 2011
@@ -0,0 +1,46 @@
+/**
+ * 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.xquery;
+
+import javax.xml.transform.stream.StreamSource;
+
+import net.sf.saxon.query.ModuleURIResolver;
+import net.sf.saxon.trans.XPathException;
+
+/**
+ * Resolves XQuery file imports
+ */
+public class XQueryModuleURIResolver implements ModuleURIResolver {
+    private final XQueryComponent xqueryComponent;
+
+    public XQueryModuleURIResolver(XQueryComponent xqueryComponent) {
+        this.xqueryComponent = xqueryComponent;
+    }
+
+    public StreamSource[] resolve(String moduleURI, String baseURI, String[] 
locations) throws XPathException {
+        StreamSource[] ss = new StreamSource[locations.length];
+        try {
+            for (int i = 0; i < locations.length; i++) {
+                ss[i] = new 
StreamSource(xqueryComponent.resolveModuleResource(locations[i]).openStream());
+            }
+        } catch (Exception e) {
+            throw new XPathException("Error resolving resource: " + locations, 
e);
+        }
+        return ss;
+    }
+
+}


Reply via email to