| /** |
| * 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.exec.impl; |
| |
| import java.io.File; |
| import java.io.InputStream; |
| |
| import org.apache.camel.Exchange; |
| import org.apache.camel.Processor; |
| import org.apache.camel.Produce; |
| import org.apache.camel.ProducerTemplate; |
| import org.apache.camel.builder.RouteBuilder; |
| import org.apache.camel.component.exec.ExecResult; |
| import org.apache.camel.test.junit4.CamelTestSupport; |
| import org.apache.commons.io.FileUtils; |
| import org.apache.commons.io.IOUtils; |
| |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| import static org.apache.camel.component.exec.ExecTestUtils.buildJavaExecutablePath; |
| |
| /** |
| * The tests are ignored by default, because they are OS-specific. On demand |
| * they can be run manually to validate the documentation examples for that OS. |
| */ |
| |
| public class ExecDocumentationExamplesTest extends CamelTestSupport { |
| |
| private static final String ANT_BUILD_FILE_NAME = "CamelExecTestAntBuildFile.xml"; |
| |
| private static final String ANT_OUT_FILE_NAME = "CamelExecOutFile.txt"; |
| |
| private static final String ANT_BUILD_FILE_CONTENT = buildAntFileContent(); |
| |
| private static final String TEST_MSG = "Hello Camel Exec!"; |
| |
| @Produce(uri = "direct:javaVersion") |
| protected ProducerTemplate templateJavaVersion; |
| |
| @Produce(uri = "direct:javaVersionWorkingDir") |
| protected ProducerTemplate templateJavaVersionWorkingDir; |
| |
| @Produce(uri = "direct:execAnt") |
| protected ProducerTemplate templateExecAnt; |
| |
| @Produce(uri = "direct:execAntWithOutFile") |
| protected ProducerTemplate templateExecAntWithOutFile; |
| |
| @Produce(uri = "direct:wordCount") |
| protected ProducerTemplate templateWordCount; |
| |
| @Test |
| @Ignore |
| public void testExecLinuxWordCount() throws Exception { |
| // use type conversion here |
| ExecResult body = templateWordCount.requestBody((Object)"test", ExecResult.class); |
| assertNotNull(body); |
| |
| } |
| |
| /** |
| * The test assumes, that java is in the system path |
| */ |
| @Test |
| @Ignore |
| public void testJavaVersion() throws Exception { |
| ExecResult body = templateJavaVersion.requestBody((Object)"test", ExecResult.class); |
| InputStream out = body.getStdout(); |
| InputStream err = body.getStderr(); |
| // Strange that Sun Java 1.5 writes the -version in the syserr |
| assertNull(out); |
| assertNotNull(err); |
| String outString = IOUtils.toString(err); |
| log.info("Received stdout: " + outString); |
| assertTrue(outString.contains("java version")); |
| } |
| |
| @Test |
| @Ignore |
| public void testWinJavaVersionWorkingDir() throws Exception { |
| ExecResult body = templateJavaVersionWorkingDir.requestBody((Object)"test", ExecResult.class); |
| InputStream out = body.getStdout(); |
| InputStream err = body.getStderr(); |
| // Strange that Sun Java 1.5 writes the -version in the syserr |
| assertNull(out); |
| assertNotNull(err); |
| String outerr = IOUtils.toString(err); |
| log.info("Received stderr: " + outerr); |
| assertTrue(outerr.contains("java version")); |
| } |
| |
| /** |
| * The test assumes that Apache ant is installed |
| */ |
| @Test |
| @Ignore |
| public void testExecWinAnt() throws Exception { |
| File f = new File(ANT_BUILD_FILE_NAME); |
| f.createNewFile(); |
| FileUtils.writeStringToFile(f, ANT_BUILD_FILE_CONTENT); |
| assertTrue("You must create a sample build file!", f.exists()); |
| ExecResult body = templateExecAnt.requestBody((Object)"test", ExecResult.class); |
| String stdout = IOUtils.toString(body.getStdout()); |
| assertNull(body.getStderr()); |
| assertTrue("The ant script should print" + TEST_MSG, stdout.contains(TEST_MSG)); |
| f.delete(); |
| } |
| |
| /** |
| * The test assumes that Apache ant is installed |
| */ |
| @Test |
| @Ignore |
| public void testExecWinAntWithOutFile() throws Exception { |
| File f = new File(ANT_BUILD_FILE_NAME); |
| f.createNewFile(); |
| FileUtils.writeStringToFile(f, ANT_BUILD_FILE_CONTENT); |
| assertTrue("You must create a sample build file!", f.exists()); |
| // use type conversion here |
| InputStream body = templateExecAntWithOutFile.requestBody((Object)"test", InputStream.class); |
| String bodyString = IOUtils.toString(body); |
| assertTrue("The ant script should print" + TEST_MSG, bodyString.contains(TEST_MSG)); |
| f.delete(); |
| } |
| |
| @Override |
| protected RouteBuilder createRouteBuilder() { |
| return new RouteBuilder() { |
| public void configure() { |
| // word count |
| from("direct:wordCount").to("exec:wc?args=--words /usr/share/dict/words").process(new Processor() { |
| public void process(Exchange exchange) throws Exception { |
| // By default, the body is ExecResult instance |
| assertIsInstanceOf(ExecResult.class, exchange.getIn().getBody()); |
| // Use the Camel Exec String type converter to |
| // convert the ExecResult to String |
| // In this case, the stdout is considered as output |
| String wordCountOutput = exchange.getIn().getBody(String.class); |
| // do something with the output |
| log.info(wordCountOutput); |
| } |
| |
| }); |
| |
| // example 1 in the component docs |
| from("direct:javaVersion").to("exec:java?args=-version -server"); |
| // example 2 in the component docs |
| from("direct:javaVersionWorkingDir").to("exec:" + buildJavaExecutablePath() + "?args=-version -Duser.name=Camel&workingDir=C:/temp"); |
| |
| // advanced, test ant |
| from("direct:execAnt").to("exec:ant.bat?args=-f " + ANT_BUILD_FILE_NAME); |
| |
| // advanced, test ant with out file |
| from("direct:execAntWithOutFile").to("exec:ant.bat?args=-f " + ANT_BUILD_FILE_NAME + " -l " + ANT_OUT_FILE_NAME + "&outFile=" + ANT_OUT_FILE_NAME) |
| .process(new Processor() { |
| |
| public void process(Exchange exchange) throws Exception { |
| InputStream outFile = exchange.getIn().getBody(InputStream.class); |
| // do something with the out file here |
| log.info(IOUtils.toString(outFile)); |
| } |
| |
| }); |
| } |
| }; |
| } |
| |
| private static String buildAntFileContent() { |
| StringBuilder builder = new StringBuilder(); |
| builder.append("<project name=\"TestExec\" default=\"test\" basedir=\".\">"); |
| builder.append("<target name=\"test\">"); |
| builder.append("<echo message=\"" + TEST_MSG + "\"/>"); |
| builder.append("</target>"); |
| builder.append("</project>"); |
| return builder.toString(); |
| } |
| |
| } |