Author: davsclaus
Date: Fri Apr  8 10:11:55 2011
New Revision: 1090184

URL: http://svn.apache.org/viewvc?rev=1090184&view=rev
Log:
CAMEL-3818: Added more type convertion in camel-saxon to work with ftp and 
other types, like the XPath builder does.

Added:
    
camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/ftp/FtpXQueryTest.java
Modified:
    
camel/trunk/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java
    camel/trunk/tests/camel-itest/pom.xml

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=1090184&r1=1090183&r2=1090184&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
 Fri Apr  8 10:11:55 2011
@@ -51,9 +51,12 @@ import net.sf.saxon.value.Whitespace;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Message;
+import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeExpressionException;
+import org.apache.camel.component.bean.BeanInvocation;
+import org.apache.camel.component.file.GenericFile;
 import org.apache.camel.converter.IOConverter;
 import org.apache.camel.converter.jaxp.BytesSource;
 import org.apache.camel.converter.jaxp.StringSource;
@@ -422,7 +425,44 @@ public abstract class XQueryBuilder impl
         if (item != null) {
             dynamicQueryContext.setContextItem(item);
         } else {
-            Source source = in.getMandatoryBody(Source.class);
+            Source source = in.getBody(Source.class);
+            if (source == null) {
+                Object body = in.getBody();
+
+                // lets try coerce some common types into something JAXP can 
deal with
+                if (body instanceof GenericFile) {
+                    // special for files so we can work with them out of the 
box
+                    InputStream is = 
exchange.getContext().getTypeConverter().convertTo(InputStream.class, body);
+                    source = converter.toDOMSource(is);
+                } else if (body instanceof BeanInvocation) {
+                    // if its a null bean invocation then handle that
+                    BeanInvocation bi = 
exchange.getContext().getTypeConverter().convertTo(BeanInvocation.class, body);
+                    if (bi.getArgs() != null && bi.getArgs().length == 1 && 
bi.getArgs()[0] == null) {
+                        // its a null argument from the bean invocation so use 
null as answer
+                        source = null;
+                    }
+                } else if (body instanceof String) {
+                    source = converter.toDOMSource(body.toString());
+                } else {
+                    // try some of Camels type converters
+                    InputStream is = in.getBody(InputStream.class);
+                    if (is != null) {
+                        source = converter.toDOMSource(is);
+                    }
+                    // fallback and use String
+                    if (source == null) {
+                        String s = in.getBody(String.class);
+                        if (s != null) {
+                            source = converter.toDOMSource(s);
+                        }
+                    }
+                }
+
+                if (source == null) {
+                    // indicate it was not possible to convert to a Source type
+                    throw new NoTypeConversionAvailableException(body, 
Source.class);
+                }
+            }
             DocumentInfo doc = getStaticQueryContext().buildDocument(source);
             dynamicQueryContext.setContextItem(doc);
         }

Modified: camel/trunk/tests/camel-itest/pom.xml
URL: 
http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest/pom.xml?rev=1090184&r1=1090183&r2=1090184&view=diff
==============================================================================
--- camel/trunk/tests/camel-itest/pom.xml (original)
+++ camel/trunk/tests/camel-itest/pom.xml Fri Apr  8 10:11:55 2011
@@ -129,6 +129,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-saxon</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-mail</artifactId>
             <scope>test</scope>
         </dependency>

Added: 
camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/ftp/FtpXQueryTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/ftp/FtpXQueryTest.java?rev=1090184&view=auto
==============================================================================
--- 
camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/ftp/FtpXQueryTest.java
 (added)
+++ 
camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/ftp/FtpXQueryTest.java
 Fri Apr  8 10:11:55 2011
@@ -0,0 +1,106 @@
+/**
+ * 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.itest.ftp;
+
+import java.io.File;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.ftpserver.FtpServer;
+import org.apache.ftpserver.FtpServerFactory;
+import org.apache.ftpserver.filesystem.nativefs.NativeFileSystemFactory;
+import org.apache.ftpserver.ftplet.UserManager;
+import org.apache.ftpserver.listener.ListenerFactory;
+import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
+import org.apache.ftpserver.usermanager.impl.PropertiesUserManager;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class FtpXQueryTest extends CamelTestSupport {
+    protected FtpServer ftpServer;
+    private String ftp = 
"ftp:localhost:20127/myapp?password=admin&username=admin";
+
+    @Test
+    public void testXQueryFromFtp() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:davsclaus");
+        mock.expectedMessageCount(1);
+        mock.message(0).body(String.class).contains("Hello World");
+
+        MockEndpoint other = getMockEndpoint("mock:other");
+        other.expectedMessageCount(1);
+        other.message(0).body(String.class).contains("Bye World");
+
+        template.sendBodyAndHeader(ftp, "<mail 
from=\"[email protected]\"><subject>Hey</subject><body>Hello 
World!</body></mail>",
+                Exchange.FILE_NAME, "claus.xml");
+
+        template.sendBodyAndHeader(ftp, "<mail 
from=\"[email protected]\"><subject>Hey</subject><body>Bye 
World!</body></mail>",
+                Exchange.FILE_NAME, "janstey.xml");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from(ftp)
+                    .choice()
+                        .when().xquery("/mail/@from = '[email protected]'")
+                            .to("mock:davsclaus")
+                        .otherwise()
+                            .to("mock:other");
+            }
+        };
+    }
+
+    public void setUp() throws Exception {
+        super.setUp();
+        initFtpServer();
+        ftpServer.start();
+    }
+
+    public void tearDown() throws Exception {
+        super.tearDown();
+        ftpServer.stop();
+        ftpServer = null;
+    }
+
+    protected void initFtpServer() throws Exception {
+        FtpServerFactory serverFactory = new FtpServerFactory();
+
+        // setup user management to read our users.properties and use clear 
text passwords
+        File file = new 
File("./src/test/resources/users.properties").getAbsoluteFile();
+        UserManager uman = new PropertiesUserManager(new 
ClearTextPasswordEncryptor(), file, "admin");
+        serverFactory.setUserManager(uman);
+
+        NativeFileSystemFactory fsf = new NativeFileSystemFactory();
+        fsf.setCreateHome(true);
+        serverFactory.setFileSystem(fsf);
+
+        ListenerFactory factory = new ListenerFactory();
+        factory.setPort(20127);
+        serverFactory.addListener("default", factory.createListener());
+
+        ftpServer = serverFactory.createServer();
+    }
+
+}


Reply via email to