blob: 68fcd6f4b74afe79b5e422e7157972e3e622a36d [file] [log] [blame]
/**
* 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.springboot.commands.crsh;
import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.apache.camel.CamelContext;
import org.apache.camel.Route;
import org.apache.camel.commands.AbstractCamelCommand;
import org.apache.camel.commands.AbstractContextCommand;
import org.apache.camel.commands.AbstractRouteCommand;
import org.apache.camel.commands.LocalCamelController;
import org.apache.camel.commands.StringEscape;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CamelCommandsFacade {
protected final Logger log = LoggerFactory.getLogger(getClass().getName());
private LocalCamelController camelController;
private StringEscape stringEscape = new NoopStringEscape();
CamelCommandsFacade(LocalCamelController controller) {
this.camelController = controller;
}
LocalCamelController getCamelController() {
return this.camelController;
}
public <T extends AbstractCamelCommand> String runCommand(Class<T> clazz, Object... commandArgs) throws Exception {
OutputBuffer buffer = new OutputBuffer();
PrintStream ops = buffer.getPrintStream();
// Trying to infer the camel context if not given
// The order of the varargs for Route Command
// [0] - route id
// [1] - camel context
if (AbstractRouteCommand.class.isAssignableFrom(clazz) && null == commandArgs[1]) {
commandArgs[1] = getCamelContextForRoute((String) commandArgs[0]);
ops.println("Automatically inferred context name : " + commandArgs[1]);
}
// The order of the varargs for Context Command
// [0] - camel context
if (AbstractContextCommand.class.isAssignableFrom(clazz) && null == commandArgs[0]) {
commandArgs[0] = getFirstCamelContextName();
ops.println("Context name is not provided. Using the first : " + commandArgs[0]);
}
// Finding the right constructor
Class[] types = new Class[commandArgs.length];
for (int i = 0; i < commandArgs.length; i++) {
types[i] = commandArgs[i].getClass();
// Commands require primitives
if (types[i] == Boolean.class) {
types[i] = boolean.class;
}
if (types[i] == Integer.class) {
types[i] = int.class;
}
}
// Instantiating an object
Constructor<T> constructor = clazz.getConstructor(types);
T command = constructor.newInstance(commandArgs);
// Some commands require StringEscape property to be set
try {
Method m = clazz.getMethod("setStringEscape", org.apache.camel.commands.StringEscape.class);
m.invoke(command, stringEscape);
} catch (Exception e) {
}
// Executing
command.execute(camelController, ops, ops);
return buffer.toString();
}
private String getCamelContextForRoute(String routeId) throws Exception {
ArrayList<String> contextNames = new ArrayList<String>();
for (CamelContext camelContext : camelController.getLocalCamelContexts()) {
for (Route route : camelContext.getRoutes()) {
if (routeId.equals(route.getId())) {
contextNames.add(camelContext.getName());
break;
}
}
}
if (contextNames.size() != 1) {
StringBuffer error = new StringBuffer();
error.append("Cannot infer CamelContext. Please provide manually.");
if (contextNames.size() > 1) {
error.append(" Contexts : " + contextNames.toString());
}
throw new org.crsh.cli.impl.SyntaxException(error.toString());
}
return contextNames.get(0);
}
private String getFirstCamelContextName() throws Exception {
if (camelController.getLocalCamelContexts() == null || camelController.getLocalCamelContexts().size() == 0) {
throw new org.crsh.cli.impl.SyntaxException("No CamelContexts available");
}
return camelController.getLocalCamelContexts().get(0).getName();
}
}