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