| /** |
| * 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; |
| |
| import org.apache.camel.Consumer; |
| import org.apache.camel.Processor; |
| import org.apache.camel.Producer; |
| import org.apache.camel.component.exec.impl.DefaultExecBinding; |
| import org.apache.camel.component.exec.impl.DefaultExecCommandExecutor; |
| import org.apache.camel.component.exec.impl.ExecParseUtils; |
| import org.apache.camel.impl.DefaultEndpoint; |
| import org.apache.camel.util.ObjectHelper; |
| |
| /** |
| * The endpoint utilizes an {@link ExecCommandExecutor} to execute a system |
| * command when it receives message exchanges. |
| * |
| * @see ExecBinding |
| * @see ExecCommandExecutor |
| * @see ExecCommand |
| * @see ExecResult |
| */ |
| public class ExecEndpoint extends DefaultEndpoint { |
| |
| /** |
| * Indicates that no {@link #timeout} is used. |
| */ |
| public static final long NO_TIMEOUT = Long.MAX_VALUE; |
| |
| private String executable; |
| |
| private String args; |
| |
| private String workingDir; |
| |
| private long timeout; |
| |
| private String outFile; |
| |
| private ExecCommandExecutor commandExecutor; |
| |
| private ExecBinding binding; |
| |
| private boolean useStderrOnEmptyStdout; |
| |
| public ExecEndpoint(String uri, ExecComponent component) { |
| super(uri, component); |
| this.timeout = NO_TIMEOUT; |
| this.binding = new DefaultExecBinding(); |
| this.commandExecutor = new DefaultExecCommandExecutor(); |
| } |
| |
| public Producer createProducer() throws Exception { |
| return new ExecProducer(this); |
| } |
| |
| public Consumer createConsumer(Processor processor) throws Exception { |
| throw new UnsupportedOperationException("Consumer not supported for ExecEndpoint!"); |
| } |
| |
| public boolean isSingleton() { |
| return true; |
| } |
| |
| /** |
| * @return the executable to be executed; that is the remaining part of the |
| * endpoint URI |
| * @see ExecBinding#EXEC_COMMAND_EXECUTABLE |
| */ |
| public String getExecutable() { |
| return executable; |
| } |
| |
| /** |
| * Sets the executable to be executed. The executable must not be empty or |
| * <code>null</code>. |
| * |
| * @param executable Sets the executable to be executed. |
| */ |
| public void setExecutable(String executable) { |
| ObjectHelper.notEmpty(executable, "executable"); |
| this.executable = executable; |
| } |
| |
| /** |
| * The arguments may be one or many whitespace-separated tokens, that can be |
| * quoted with ", e.g. <code>args="arg 1" arg2"</code> will use two arguments |
| * <code>arg 1</code> and <code>arg2</code>. To include the quotes use |
| * <code>""</code><br> |
| * , e.g. <code>args=""arg 1"" arg2</code> will use the arguments |
| * <code>"arg 1"</code> and <code>arg2</code>. |
| * |
| * @return the arguments of the executable application, as configured from |
| * the endpoint URI. |
| * @see ExecBinding#EXEC_COMMAND_ARGS |
| * @see ExecParseUtils#splitToWhiteSpaceSeparatedTokens(String) |
| */ |
| public String getArgs() { |
| return args; |
| } |
| |
| /** |
| * Sets the arguments of the executable application |
| * |
| * @param args Returns <code>null</code> value if no arguments are |
| * configured in the endpoint URI |
| * @see #getArgs() |
| * @see ExecBinding#EXEC_COMMAND_ARGS |
| */ |
| public void setArgs(String args) { |
| this.args = args; |
| } |
| |
| /** |
| * @return the working directory of the executable, or <code>null</code> is |
| * such is not set. |
| * @see ExecBinding#EXEC_COMMAND_WORKING_DIR |
| */ |
| public String getWorkingDir() { |
| return workingDir; |
| } |
| |
| /** |
| * Sets the working directory of the executable. |
| * |
| * @param dir the working directory of the executable. <code>null</code> |
| * values indicates that the current working directory will be |
| * used. |
| */ |
| public void setWorkingDir(String dir) { |
| this.workingDir = dir; |
| } |
| |
| /** |
| * @return The returned value is always a positive <code>long</code>. The |
| * default value is {@link ExecEndpoint#NO_TIMEOUT} |
| * @see ExecBinding#EXEC_COMMAND_TIMEOUT |
| */ |
| public long getTimeout() { |
| return timeout; |
| } |
| |
| /** |
| * Sets the timeout. |
| * |
| * @param timeout The <code>timeout</code> must be a positive long |
| * @see ExecBinding#EXEC_COMMAND_TIMEOUT |
| */ |
| public void setTimeout(long timeout) { |
| if (timeout <= 0) { |
| throw new IllegalArgumentException("The timeout must be a positive long!"); |
| } |
| this.timeout = timeout; |
| } |
| |
| /** |
| * @return <code>null</code> if no out file is set, otherwise returns the |
| * value of the outFile |
| * @see ExecBinding#EXEC_COMMAND_OUT_FILE |
| */ |
| public String getOutFile() { |
| return outFile; |
| } |
| |
| /** |
| * @param outFile a not-empty file path |
| * @see ExecBinding#EXEC_COMMAND_OUT_FILE |
| */ |
| public void setOutFile(String outFile) { |
| ObjectHelper.notEmpty(outFile, "outFile"); |
| this.outFile = outFile; |
| } |
| |
| /** |
| * @return The command executor used to execute commands. Defaults to |
| * {@link org.apache.camel.component.exec.impl.DefaultExecCommandExecutor} |
| */ |
| public ExecCommandExecutor getCommandExecutor() { |
| return commandExecutor; |
| } |
| |
| /** |
| * Sets a custom executor to execute commands. |
| * |
| * @param commandExecutor a not-null instance of {@link ExecCommandExecutor} |
| */ |
| public void setCommandExecutor(ExecCommandExecutor commandExecutor) { |
| ObjectHelper.notNull(commandExecutor, "commandExecutor"); |
| this.commandExecutor = commandExecutor; |
| } |
| |
| public ExecBinding getBinding() { |
| return binding; |
| } |
| |
| public void setBinding(ExecBinding binding) { |
| ObjectHelper.notNull(binding, "binding"); |
| this.binding = binding; |
| } |
| |
| public boolean isUseStderrOnEmptyStdout() { |
| return useStderrOnEmptyStdout; |
| } |
| |
| public void setUseStderrOnEmptyStdout(boolean useStderrOnEmptyStdout) { |
| this.useStderrOnEmptyStdout = useStderrOnEmptyStdout; |
| } |
| } |