You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/12/10 18:56:59 UTC

[3/5] camel git commit: CAMEL-8044: Camel commands should be more reusable for remote JVMs

CAMEL-8044: Camel commands should be more reusable for remote JVMs


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8048c6ce
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8048c6ce
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8048c6ce

Branch: refs/heads/master
Commit: 8048c6cec1a44bfed21ada3a8d21d93dbcdec75e
Parents: b33acc3
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Dec 10 18:38:45 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Dec 10 18:38:45 2014 +0100

----------------------------------------------------------------------
 .../camel/commands/AbstractCamelController.java | 41 ++++++++++++++-----
 .../camel/commands/AbstractRouteCommand.java    | 43 ++++++--------------
 .../apache/camel/commands/CamelController.java  |  9 ++--
 .../apache/camel/commands/RouteListCommand.java | 25 +++++-------
 .../commands/completers/RouteCompleter.java     |  8 ++--
 5 files changed, 62 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/8048c6ce/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractCamelController.java
----------------------------------------------------------------------
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractCamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractCamelController.java
index eaf42c5..9480662 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractCamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractCamelController.java
@@ -62,19 +62,23 @@ public abstract class AbstractCamelController implements CamelController {
         return null;
     }
 
-    public List<Route> getRoutes(String camelContextName) throws Exception {
+    public List<Map<String, String>> getRoutes(String camelContextName) throws Exception {
         return getRoutes(camelContextName, null);
     }
 
-    public List<Route> getRoutes(String camelContextName, String filter) throws Exception {
-        List<Route> routes = new ArrayList<Route>();
+    public List<Map<String, String>> getRoutes(String camelContextName, String filter) throws Exception {
+        List<Map<String, String>> answer = new ArrayList<Map<String, String>>();
 
         if (camelContextName != null) {
             CamelContext context = this.getCamelContext(camelContextName);
             if (context != null) {
                 for (Route route : context.getRoutes()) {
                     if (filter == null || route.getId().matches(filter)) {
-                        routes.add(route);
+                        Map<String, String> row = new LinkedHashMap<String, String>();
+                        row.put("camelContextName", context.getName());
+                        row.put("routeId", route.getId());
+                        row.put("state", getRouteState(route));
+                        answer.add(row);
                     }
                 }
             }
@@ -83,29 +87,33 @@ public abstract class AbstractCamelController implements CamelController {
             for (CamelContext camelContext : camelContexts) {
                 for (Route route : camelContext.getRoutes()) {
                     if (filter == null || route.getId().matches(filter)) {
-                        routes.add(route);
+                        Map<String, String> row = new LinkedHashMap<String, String>();
+                        row.put("camelContextName", camelContext.getName());
+                        row.put("routeId", route.getId());
+                        row.put("state", getRouteState(route));
+                        answer.add(row);
                     }
                 }
             }
         }
 
         // sort the list
-        Collections.sort(routes, new Comparator<Route>() {
+        Collections.sort(answer, new Comparator<Map<String, String>>() {
             @Override
-            public int compare(Route o1, Route o2) {
+            public int compare(Map<String, String> o1, Map<String, String> o2) {
                 // group by camel context first, then by route name
-                String c1 = o1.getRouteContext().getCamelContext().getName();
-                String c2 = o2.getRouteContext().getCamelContext().getName();
+                String c1 = o1.get("camelContextName");
+                String c2 = o2.get("camelContextName");
 
                 int answer = c1.compareTo(c2);
                 if (answer == 0) {
                     // okay from same camel context, then sort by route id
-                    answer = o1.getId().compareTo(o2.getId());
+                    answer = o1.get("routeId").compareTo(o2.get("routeId"));
                 }
                 return answer;
             }
         });
-        return routes;
+        return answer;
     }
 
     public void resetRouteStats(String camelContextName) throws Exception{
@@ -458,4 +466,15 @@ public abstract class AbstractCamelController implements CamelController {
         return ServiceStatus.Started.name();
     }
 
+    private static String getRouteState(Route route) {
+        // must use String type to be sure remote JMX can read the attribute without requiring Camel classes.
+        if (route instanceof StatefulService) {
+            ServiceStatus status = ((StatefulService) route).getStatus();
+            return status.name();
+        }
+
+        // assume started if not a ServiceSupport instance
+        return ServiceStatus.Started.name();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/8048c6ce/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractRouteCommand.java
----------------------------------------------------------------------
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractRouteCommand.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractRouteCommand.java
index 81fd2a6..74611e8 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractRouteCommand.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractRouteCommand.java
@@ -20,13 +20,10 @@ import java.io.PrintStream;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.Route;
 import org.apache.camel.commands.internal.RegexUtil;
 
-import static org.apache.camel.util.CamelContextHelper.getRouteStartupOrder;
-
 /**
  * Abstract command for working with a one ore more routes.
  */
@@ -45,7 +42,7 @@ public abstract class AbstractRouteCommand extends AbstractCamelCommand {
     }
 
     public Object execute(CamelController camelController, PrintStream out, PrintStream err) throws Exception {
-        List<Route> camelRoutes = camelController.getRoutes(context, RegexUtil.wildcardAsRegex(route));
+        List<Map<String, String>> camelRoutes = camelController.getRoutes(context, RegexUtil.wildcardAsRegex(route));
         if (camelRoutes == null || camelRoutes.isEmpty()) {
             err.println("Camel routes using " + route + " not found.");
             return null;
@@ -53,16 +50,10 @@ public abstract class AbstractRouteCommand extends AbstractCamelCommand {
         // we want the routes sorted
         Collections.sort(camelRoutes, new RouteComparator());
 
-        for (Route camelRoute : camelRoutes) {
-            CamelContext camelContext = camelRoute.getRouteContext().getCamelContext();
-            // Setting thread context classloader to the bundle classloader to enable legacy code that relies on it
-            ClassLoader oldClassloader = Thread.currentThread().getContextClassLoader();
-            Thread.currentThread().setContextClassLoader(camelContext.getApplicationContextClassLoader());
-            try {
-                executeOnRoute(camelController, camelContext.getName(), camelRoute.getId(), out, err);
-            } finally {
-                Thread.currentThread().setContextClassLoader(oldClassloader);
-            }
+        for (Map<String, String> row : camelRoutes) {
+            String camelContextName = row.get("camelContextName");
+            String routeId = row.get("routeId");
+            executeOnRoute(camelController, camelContextName, routeId, out, err);
         }
 
         return null;
@@ -73,26 +64,18 @@ public abstract class AbstractRouteCommand extends AbstractCamelCommand {
     /**
      * To sort the routes.
      */
-    private static final class RouteComparator implements Comparator<Route> {
+    private static final class RouteComparator implements Comparator<Map<String, String>> {
 
         @Override
-        public int compare(Route route1, Route route2) {
+        public int compare(Map<String, String> route1, Map<String, String> route2) {
             // sort by camel context first
-            CamelContext camel1 = route1.getRouteContext().getCamelContext();
-            CamelContext camel2 = route2.getRouteContext().getCamelContext();
+            String camel1 = route1.get("camelContextName");
+            String camel2 = route2.get("camelContextName");
 
-            if (camel1.getName().equals(camel2.getName())) {
-                // and then accordingly to startup order
-                Integer order1 = getRouteStartupOrder(camel1, route1.getId());
-                Integer order2 = getRouteStartupOrder(camel2, route2.getId());
-                if (order1 == 0 && order2 == 0) {
-                    // fallback and use name if not startup order was found
-                    return route1.getId().compareTo(route2.getId());
-                } else {
-                    return order1.compareTo(order2);
-                }
+            if (camel1.equals(camel2)) {
+                return route1.get("routeId").compareTo(route2.get("routeId"));
             } else {
-                return camel1.getName().compareTo(camel2.getName());
+                return camel1.compareTo(camel2);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/8048c6ce/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java
----------------------------------------------------------------------
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java
index 5f61140..378cdb1 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/CamelController.java
@@ -21,7 +21,6 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.Endpoint;
 import org.apache.camel.Route;
 
 /**
@@ -50,20 +49,20 @@ public interface CamelController {
      * Get all routes. If Camel context name is null, all routes from all contexts are listed.
      *
      * @param camelContextName the Camel context name. If null, all contexts are considered.
-     * @return the list of the Camel routes.
+     * @return a list of key/value pairs with routes information
      * @throws java.lang.Exception can be thrown
      */
-    List<Route> getRoutes(String camelContextName) throws Exception;
+    List<Map<String, String>> getRoutes(String camelContextName) throws Exception;
 
     /**
      * Get all routes filtered by the regex.
      *
      * @param camelContextName the Camel context name. If null, all contexts are considered.
      * @param filter           the filter which supports * and ? as wildcards
-     * @return the list of the Camel routes.
+     * @return a list of key/value pairs with routes information
      * @throws java.lang.Exception can be thrown
      */
-    List<Route> getRoutes(String camelContextName, String filter) throws Exception;
+    List<Map<String, String>> getRoutes(String camelContextName, String filter) throws Exception;
 
     /**
      * Reset all the route stats for the given Camel context

http://git-wip-us.apache.org/repos/asf/camel/blob/8048c6ce/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RouteListCommand.java
----------------------------------------------------------------------
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RouteListCommand.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RouteListCommand.java
index b2e63ca..8c00d7a 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RouteListCommand.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/RouteListCommand.java
@@ -21,9 +21,6 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.camel.Route;
-import org.apache.camel.ServiceStatus;
-
 /**
  * Command to list all Camel routes.
  */
@@ -50,7 +47,7 @@ public class RouteListCommand extends AbstractCamelCommand {
 
     @Override
     public Object execute(CamelController camelController, PrintStream out, PrintStream err) throws Exception {
-        List<Route> routes = camelController.getRoutes(name);
+        List<Map<String, String>> routes = camelController.getRoutes(name);
 
         final Map<String, Integer> columnWidths = computeColumnWidths(routes);
         final String headerFormat = buildFormatString(columnWidths, true);
@@ -59,18 +56,18 @@ public class RouteListCommand extends AbstractCamelCommand {
         if (routes.size() > 0) {
             out.println(String.format(headerFormat, CONTEXT_COLUMN_LABEL, ROUTE_COLUMN_LABEL, STATUS_COLUMN_LABEL));
             out.println(String.format(headerFormat, "-------", "-----", "------"));
-            for (Route route : routes) {
-                String contextId = route.getRouteContext().getCamelContext().getName();
-                String routeId = route.getId();
-                ServiceStatus status = route.getRouteContext().getCamelContext().getRouteStatus(routeId);
-                out.println(String.format(rowFormat, contextId, routeId, status));
+            for (Map<String, String> row : routes) {
+                String contextId = row.get("camelContextName");
+                String routeId = row.get("routeId");
+                String state = row.get("state");
+                out.println(String.format(rowFormat, contextId, routeId, state));
             }
         }
 
         return null;
     }
 
-    private static Map<String, Integer> computeColumnWidths(final Iterable<Route> routes) throws Exception {
+    private static Map<String, Integer> computeColumnWidths(final Iterable<Map<String, String>> routes) throws Exception {
         if (routes == null) {
             throw new IllegalArgumentException("Unable to determine column widths from null Iterable<Route>");
         } else {
@@ -78,14 +75,14 @@ public class RouteListCommand extends AbstractCamelCommand {
             int maxRouteLen = 0;
             int maxStatusLen = 0;
 
-            for (final Route route : routes) {
-                final String contextId = route.getRouteContext().getCamelContext().getName();
+            for (Map<String, String> row : routes) {
+                final String contextId = row.get("camelContextName");
                 maxContextLen = java.lang.Math.max(maxContextLen, contextId == null ? 0 : contextId.length());
 
-                final String routeId = route.getId();
+                final String routeId = row.get("routeId");
                 maxRouteLen = java.lang.Math.max(maxRouteLen, routeId == null ? 0 : routeId.length());
 
-                final String status = route.getRouteContext().getCamelContext().getRouteStatus(routeId).name();
+                final String status = row.get("state");
                 maxStatusLen = java.lang.Math.max(maxStatusLen, status == null ? 0 : status.length());
             }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/8048c6ce/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/completers/RouteCompleter.java
----------------------------------------------------------------------
diff --git a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/completers/RouteCompleter.java b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/completers/RouteCompleter.java
index 53a3d4d..fbcd1d3 100644
--- a/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/completers/RouteCompleter.java
+++ b/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/completers/RouteCompleter.java
@@ -17,9 +17,9 @@
 package org.apache.camel.karaf.commands.completers;
 
 import java.util.List;
+import java.util.Map;
 
 import jline.console.completer.StringsCompleter;
-import org.apache.camel.Route;
 
 /**
  * A Jline completer for the Camel routes.
@@ -30,9 +30,9 @@ public class RouteCompleter extends CamelCompleterSupport {
     public int complete(String buffer, int cursor, List candidates) {
         try {
             StringsCompleter delegate = new StringsCompleter();
-            List<Route> routes = camelController.getRoutes(null);
-            for (Route route : routes) {
-                delegate.getStrings().add(route.getId());
+            List<Map<String, String>> routes = camelController.getRoutes(null);
+            for (Map<String, String> row : routes) {
+                delegate.getStrings().add(row.get("routeId"));
             }
             return delegate.complete(buffer, cursor, candidates);
         } catch (Exception e) {