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();
+ }
+
+}