001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.component.exec;
018    
019    import java.io.InputStream;
020    
021    import org.apache.camel.Exchange;
022    
023    /**
024     * Represents the binding of input and output types of a
025     * {@link ExecCommandExecutor} to an {@link Exchange}. The input of the executor
026     * is an {@link ExecCommand} and the output is an {@link ExecResult}.
027     */
028    public interface ExecBinding {
029    
030        /**
031         * The header value overrides the executable of the command, configured in
032         * the exec endpoint URI. As executable is considered the remaining of the
033         * {@link ExecEndpoint} URI; <br>
034         * <br>
035         * e.g. in the URI <i> <code>exec:C:/Program Files/jdk/java.exe</code> </i>,
036         * <code>C:/Program Files/jdk/java.exe<code> is the executable.
037         */
038        String EXEC_COMMAND_EXECUTABLE = "CamelExecCommandExecutable";
039    
040        /**
041         * The header value overrides the existing command arguments in the
042         * {@link ExecEndpoint} URI. The arguments may be a
043         * <code>List<String></code>. In this case no parsing of the arguments is
044         * necessary.
045         * 
046         * @see {@link #EXEC_COMMAND_EXECUTABLE}
047         */
048        String EXEC_COMMAND_ARGS = "CamelExecCommandArgs";
049    
050        /**
051         * Specifies the file name of a file, created by the executable, that should
052         * be considered as output of the executable, e.g. a log file.
053         * 
054         * @see ExecResultConverter#toInputStream(ExecResult)
055         */
056        String EXEC_COMMAND_OUT_FILE = "CamelExecCommandOutFile";
057    
058        /**
059         * Sets the working directory of the {@link #EXEC_COMMAND_EXECUTABLE}. The
060         * header value overrides any existing command in the endpoint URI. If this
061         * is not configured, the working directory of the current process will be
062         * used.
063         */
064        String EXEC_COMMAND_WORKING_DIR = "CamelExecCommandWorkingDir";
065    
066        /**
067         * Specifies the amount of time, in milliseconds, after which the process of
068         * the executable should be terminated. The default value is
069         * {@link Long#MAX_VALUE}.
070         */
071        String EXEC_COMMAND_TIMEOUT = "CamelExecCommandTimeout";
072    
073        /**
074         * The value of this header is a {@link InputStream} with the standard error
075         * stream of the executable.
076         */
077        String EXEC_STDERR = "CamelExecStderr";
078    
079        /**
080         * The value of this header is the exit value that is returned, after the
081         * execution. By convention a non-zero status exit value indicates abnormal
082         * termination. <br>
083         * <b>Note that the exit value is OS dependent.</b>
084         */
085        String EXEC_EXIT_VALUE = "CamelExecExitValue";
086    
087        /**
088         * The value of this header is a boolean which indicates whether or not
089         * to fallback and use stderr when stdout is empty.
090         */
091        String EXEC_USE_STDERR_ON_EMPTY_STDOUT = "CamelExecUseStderrOnEmptyStdout";
092    
093        /**
094         * Creates a {@link ExecCommand} from the headers in the
095         * <code>exchange</code> and the settings of the <code>endpoint</code>.
096         * 
097         * @param exchange a Camel {@link Exchange}
098         * @param endpoint an {@link ExecEndpoint} instance
099         * @return an {@link ExecCommand} object
100         * @see ExecCommandExecutor
101         */
102        ExecCommand readInput(Exchange exchange, ExecEndpoint endpoint);
103    
104        /**
105         * Populates the exchange form the {@link ExecResult}.
106         * 
107         * @param exchange a Camel {@link Exchange}, in which to write the
108         *            <code>result</code>
109         * @param result the result of a command execution
110         * @see ExecCommandExecutor
111         */
112        void writeOutput(Exchange exchange, ExecResult result);
113    }