You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by js...@apache.org on 2007/11/19 12:30:40 UTC

svn commit: r596273 - in /activemq/camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/management/ camel-core/src/main/java/org/apache/camel/model/ camel-core...

Author: jstrachan
Date: Mon Nov 19 03:30:37 2007
New Revision: 596273

URL: http://svn.apache.org/viewvc?rev=596273&view=rev
Log:
patch applied for https://issues.apache.org/activemq/browse/CAMEL-232 with thanks!

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java   (with props)
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/FromType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ResequencerType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationUsingDefaultsTest.java
    activemq/camel/trunk/examples/camel-example-spring/src/main/resources/META-INF/spring/camel-context.xml

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Route.java Mon Nov 19 03:30:37 2007
@@ -29,6 +29,9 @@
  * @version $Revision$
  */
 public class Route<E extends Exchange> {
+    public static final String PARENT_PROPERTY = "parent";
+    public static final String GROUP_PROPERTY = "group";
+
     private final Map<String, Object> properties = new HashMap<String, Object>(16);
     private Endpoint<E> endpoint;
     private List<Service> services = new ArrayList<Service>();

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Mon Nov 19 03:30:37 2007
@@ -450,10 +450,11 @@
 
     protected void startRouteDefinitions(Collection<RouteType> list) throws Exception {
         if (list != null) {
+            Collection<Route> routes = new ArrayList<Route>();
             for (RouteType route : list) {
-            	lifecycleStrategy.beforeStartRouteType(this, route);
-                route.addRoutes(this);
+                route.addRoutes(this, routes);
             }
+            addRoutes(routes);
         }
     }
 

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultLifecycleStrategy.java Mon Nov 19 03:30:37 2007
@@ -20,7 +20,7 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
-import org.apache.camel.model.RouteType;
+import org.apache.camel.Exchange;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
@@ -31,7 +31,7 @@
 		// do nothing
 	}
 	
-	public void onEndpointAdd(Endpoint endpoint) {
+	public void onEndpointAdd(Endpoint<? extends Exchange> endpoint) {
 		// do nothing
 	}
 
@@ -43,7 +43,7 @@
 		// do nothing
 	}
 
-	public void beforeStartRouteType(CamelContext context, RouteType routeType) {
+	public void onRouteContextCreate(RouteContext routeContext) {
 		// do nothing
 	}
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/RouteContext.java Mon Nov 19 03:30:37 2007
@@ -23,6 +23,7 @@
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
@@ -45,7 +46,7 @@
     private RouteType route;
     private FromType from;
     private Collection<Route> routes;
-    private Endpoint endpoint;
+    private Endpoint<? extends Exchange> endpoint;
     private List<Processor> eventDrivenProcessors = new ArrayList<Processor>();
     private Interceptor lastInterceptor;
     private CamelContext camelContext;
@@ -65,7 +66,7 @@
         route = new RouteType("temporary");
     }
 
-    public Endpoint getEndpoint() {
+    public Endpoint<? extends Exchange> getEndpoint() {
         if (endpoint == null) {
             endpoint = from.resolveEndpoint(this);
         }
@@ -91,15 +92,15 @@
         return node.createOutputsProcessor(this);
     }
 
-    public Endpoint resolveEndpoint(String uri) {
+    public Endpoint<? extends Exchange> resolveEndpoint(String uri) {
         return route.resolveEndpoint(uri);
     }
 
     /**
      * Resolves an endpoint from either a URI or a named reference
      */
-    public Endpoint resolveEndpoint(String uri, String ref) {
-        Endpoint endpoint = null;
+    public Endpoint<? extends Exchange> resolveEndpoint(String uri, String ref) {
+        Endpoint<? extends Exchange> endpoint = null;
         if (uri != null) {
             endpoint = resolveEndpoint(uri);
             if (endpoint == null) {
@@ -141,8 +142,13 @@
             final AsyncProcessor asyncProcessor = AsyncProcessorTypeConverter.convert(processor);
             Processor unitOfWorkProcessor = new UnitOfWorkProcessor(asyncProcessor);
 
-            routes.add(new EventDrivenConsumerRoute(getEndpoint(), unitOfWorkProcessor));
-            //routes.add(new EventDrivenConsumerRoute(getEndpoint(), processor));
+            // TODO: hz: move all this into the lifecycle strategy! (used by jmx naming strategy)
+            Route edcr = new EventDrivenConsumerRoute(getEndpoint(), unitOfWorkProcessor);
+            edcr.getProperties().put(Route.PARENT_PROPERTY, Integer.toHexString(route.hashCode()));
+            if (route.getGroup() != null) {
+                edcr.getProperties().put(Route.GROUP_PROPERTY, route.getGroup());
+            }
+            routes.add(edcr);
         }
     }
 

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/CamelNamingStrategy.java Mon Nov 19 03:30:37 2007
@@ -25,21 +25,29 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Route;
+import org.apache.camel.impl.RouteContext;
+import org.apache.camel.model.RouteType;
 
 public class CamelNamingStrategy {
     public static final String VALUE_UNKNOWN = "unknown";
     public static final String VALUE_ROUTE = "route";
+    public static final String VALUE_STATS = "Stats";
+    public static final String VALUE_DEFAULT_BUILDER = "default";
     public static final String KEY_NAME = "name";
     public static final String KEY_TYPE = "type";
     public static final String KEY_CONTEXT = "context";
     public static final String KEY_GROUP = "group";
     public static final String KEY_COMPONENT = "component";
+    public static final String KEY_BUILDER = "builder";
     public static final String KEY_ROUTE_TYPE = "routeType";
     public static final String KEY_ROUTE = "route";
     public static final String GROUP_ENDPOINTS = "endpoints";
     public static final String GROUP_SERVICES = "services";
-    public static final String GROUP_ROUTE_BUILDER = "routeBuilder";
+    public static final String GROUP_ROUTES = "routes";
     public static final String GROUP_ROUTE_TYPE = "routeType";
+
     protected String domainName;
     protected String hostName = "locahost";
 
@@ -86,7 +94,7 @@
      * @throws MalformedObjectNameException
      */
     public ObjectName getObjectName(ManagedEndpoint mbean) throws MalformedObjectNameException {
-        Endpoint ep = mbean.getEndpoint();
+        Endpoint<? extends Exchange> ep = mbean.getEndpoint();
 
         StringBuffer buffer = new StringBuffer();
         buffer.append(domainName + ":");
@@ -126,19 +134,23 @@
      * @throws MalformedObjectNameException
      */
     public ObjectName getObjectName(ManagedRoute mbean) throws MalformedObjectNameException {
-        Endpoint ep = mbean.getRoute().getEndpoint();
+        Route<? extends Exchange> route = mbean.getRoute();
+        Endpoint<? extends Exchange> ep = route.getEndpoint();
+        
         String ctxid = ep != null ? getContextId(ep.getContext()) : VALUE_UNKNOWN;
         String cid = getComponentId(ep);
         String id = VALUE_UNKNOWN.equals(cid) ? getEndpointId(ep) : 
-        	"[" + cid + "]" + getEndpointId(ep);
-        
+            "[" + cid + "]" + getEndpointId(ep);
+        String group = (String)route.getProperties().get(Route.GROUP_PROPERTY);
+
         StringBuffer buffer = new StringBuffer();
         buffer.append(domainName + ":");
         buffer.append(KEY_CONTEXT + "=" + ctxid + ",");
-        buffer.append(KEY_GROUP + "=" + GROUP_ROUTE_BUILDER + ",");
-        buffer.append(KEY_ROUTE_TYPE + "=" + GROUP_ROUTE_TYPE + ",");
+        buffer.append(KEY_GROUP + "=" + GROUP_ROUTES + ",");
+        buffer.append(KEY_BUILDER + "=" + (group != null ? group : VALUE_DEFAULT_BUILDER) + ",");
+        buffer.append(KEY_ROUTE_TYPE + "=" + route.getProperties().get(Route.PARENT_PROPERTY) + ",");
         buffer.append(KEY_ROUTE + "=" + id + ",");
-        buffer.append(KEY_NAME + "=" + VALUE_ROUTE);
+        buffer.append(KEY_TYPE + "=" + VALUE_ROUTE);
         return createObjectName(buffer);
     }
 
@@ -146,18 +158,31 @@
      * Implements the naming strategy for a {@see PerformanceCounter}.
      * The convention used for a {@see ManagedEndpoint} ObjectName is
      * "<domain>:context=<context>,type=Routes,endpoint=[urlPrefix]localPart".
-     *
      * @param mbean
+     * @param routeContext
+     *
      * @return generated ObjectName
      * @throws MalformedObjectNameException
      */
-    public ObjectName getObjectName(CamelContext context, PerformanceCounter mbean) throws MalformedObjectNameException {
+    public ObjectName getObjectName(CamelContext context, PerformanceCounter mbean, RouteContext routeContext)
+    	throws MalformedObjectNameException {
+    		
+		RouteType route = routeContext.getRoute();
+		Endpoint<? extends Exchange> ep = routeContext.getEndpoint();
+		String ctxid = ep != null ? getContextId(ep.getContext()) : VALUE_UNKNOWN;
+		String cid = getComponentId(ep);
+		String id = VALUE_UNKNOWN.equals(cid) ? getEndpointId(ep) :
+			"[" + cid + "]" + getEndpointId(ep);
+		String group = route.getGroup();
+		
         StringBuffer buffer = new StringBuffer();
         buffer.append(domainName + ":");
-        buffer.append(KEY_CONTEXT + "=" + getContextId(context) + ",");
-        buffer.append(KEY_GROUP + "=" + GROUP_ENDPOINTS + ",");
-        buffer.append(KEY_ROUTE + "=" + "Route.Counter" + ",");
-        buffer.append(KEY_NAME + "=" + "Stats");
+        buffer.append(KEY_CONTEXT + "=" + ctxid + ",");
+        buffer.append(KEY_GROUP + "=" + GROUP_ROUTES + ",");
+        buffer.append(KEY_BUILDER + "=" + (group != null ? group : VALUE_DEFAULT_BUILDER) + ",");
+        buffer.append(KEY_ROUTE_TYPE + "=" + route.hashCode() + ",");
+        buffer.append(KEY_ROUTE + "=" + id + ",");
+        buffer.append(KEY_TYPE + "=" + VALUE_STATS);
         return createObjectName(buffer);
     }
 
@@ -182,22 +207,20 @@
         return hostName + "/" + id;
     }
 
-    protected String getComponentId(Endpoint ep) {
+    protected String getComponentId(Endpoint<? extends Exchange> ep) {
         String uri = ep.getEndpointUri();
         int pos = uri.indexOf(':');
         return (pos == -1) ? VALUE_UNKNOWN : uri.substring(0, pos);
     }
     
-    protected String getEndpointId(Endpoint ep) {
+    protected String getEndpointId(Endpoint<? extends Exchange> ep) {
         String uri = ep.getEndpointUri();
         int pos = uri.indexOf(':');
         String id = (pos == -1) ? uri : uri.substring(pos + 1);
 		if (!ep.isSingleton()) { 
 			id += "." + Integer.toString(ep.hashCode());
 		}
-        id = id.replace("=", "_eq_");
-        id = id.replace(",", "_cm_");
-        return id;
+        return ObjectNameEncoder.encode(id);
 	}
 
     /**
@@ -206,7 +229,6 @@
     protected ObjectName createObjectName(StringBuffer buffer) throws MalformedObjectNameException {
         String text = buffer.toString();
         try {
-            text = text.replace("?", "_qe_");
             return new ObjectName(text);
         }
         catch (MalformedObjectNameException e) {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java Mon Nov 19 03:30:37 2007
@@ -23,13 +23,14 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.apache.camel.spi.InstrumentationAgent;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.RouteContext;
 import org.apache.camel.impl.ServiceSupport;
-import org.apache.camel.model.RouteType;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -47,17 +48,16 @@
 	public void onContextCreate(CamelContext context) {
 		if (context instanceof DefaultCamelContext) {
 			try {	
-				DefaultCamelContext dc = (DefaultCamelContext)context;
-				ManagedService ms = new ManagedService(dc);
+                DefaultCamelContext dc = (DefaultCamelContext)context;
+                ManagedService ms = new ManagedService(dc);
                 agent.register(ms, getNamingStrategy().getObjectName(dc));
-			}
-			catch(JMException e) {
-				LOG.warn("Could not register CamelContext MBean", e);
-			}
-		}
-	}
-	
-	public void onEndpointAdd(Endpoint endpoint) {
+            } catch (JMException e) {
+                LOG.warn("Could not register CamelContext MBean", e);
+            }
+        }
+    }
+
+	public void onEndpointAdd(Endpoint<? extends Exchange> endpoint) {
 		try {
 			ManagedEndpoint me = new ManagedEndpoint(endpoint);
 			agent.register(me, getNamingStrategy().getObjectName(me));
@@ -91,27 +91,28 @@
 		}
 	}
 
-	public void beforeStartRouteType(CamelContext context, RouteType routeType) {
-		PerformanceCounter mc = new PerformanceCounter();
-		routeType.intercept(new InstrumentationProcessor(mc));
-
-		/*
-		 *  Merge performance counter with the MBean it represents instead 
-		 *  of registering a new MBean
-		try {
-			agent.register(mc, getNamingStrategy().getObjectName(context, mc));
-		}
-		catch(JMException e) {
-			LOG.warn("Could not register Counter MBean", e);
-		}
-		*/
-	}
+	public void onRouteContextCreate(RouteContext routeContext) {
+        PerformanceCounter mc = new PerformanceCounter();
+        routeContext.getRoute().intercept(new InstrumentationProcessor(mc));
+
+        /*
+         *  Merge performance counter with the MBean it represents instead
+         *  of registering a new MBean
+         */
+        try {
+        	agent.register(mc, getNamingStrategy().getObjectName(
+                routeContext.getCamelContext(), mc, routeContext));
+        }
+        catch(JMException e) {
+            LOG.warn("Could not register Counter MBean", e);
+        }
+    }
 
     public CamelNamingStrategy getNamingStrategy() {
         return namingStrategy;
     }
 
-    public void setNamingStrategy(CamelNamingStrategy namingStrategy) {
-        this.namingStrategy = namingStrategy;
+    public void setNamingStrategy(CamelNamingStrategy strategy) {
+        this.namingStrategy = strategy;
     }
 }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedEndpoint.java Mon Nov 19 03:30:37 2007
@@ -18,6 +18,7 @@
 package org.apache.camel.management;
 
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.springframework.jmx.export.annotation.ManagedAttribute;
 import org.springframework.jmx.export.annotation.ManagedResource;
 
@@ -26,13 +27,13 @@
         currencyTimeLimit=15)
 public class ManagedEndpoint {
 	
-	private Endpoint endpoint;
+	private Endpoint<? extends Exchange> endpoint;
 
-	public ManagedEndpoint(Endpoint endpoint) {
+	public ManagedEndpoint(Endpoint<? extends Exchange> endpoint) {
 		this.endpoint = endpoint;
 	}
 	
-	public Endpoint getEndpoint() {
+	public Endpoint<? extends Exchange> getEndpoint() {
 		return endpoint;
 	}
 	

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ManagedRoute.java Mon Nov 19 03:30:37 2007
@@ -20,6 +20,7 @@
 import java.io.IOException;
 
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.apache.camel.Route;
 import org.springframework.jmx.export.annotation.ManagedAttribute;
 import org.springframework.jmx.export.annotation.ManagedOperation;
@@ -28,24 +29,24 @@
 @ManagedResource(
         description="Managed Route", 
         currencyTimeLimit=15)
-public class ManagedRoute{
+public class ManagedRoute extends PerformanceCounter {
 	
 	public static final String VALUE_UNKNOWN = "Unknown";
-	private Route route;
+	private Route<? extends Exchange> route;
 	private String description;
 	
-	ManagedRoute(Route route) {
+	ManagedRoute(Route<? extends Exchange> route) {
 		this.route = route;
 		this.description = route.toString();
 	}
 
-	public Route getRoute() {
+	public Route<? extends Exchange> getRoute() {
 		return route;
 	}
 
 	@ManagedAttribute(description = "Route Endpoint Uri")
 	public String getEndpointUri() {
-		Endpoint ep = route.getEndpoint();
+		Endpoint<? extends Exchange> ep = route.getEndpoint();
 		return ep != null ? ep.getEndpointUri() : VALUE_UNKNOWN;
 	}
 	

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java?rev=596273&view=auto
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java Mon Nov 19 03:30:37 2007
@@ -0,0 +1,63 @@
+/**
+ *
+ * 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.management;
+
+/**
+ * Utility class providing RFC 1738 style encoding for ObjectName values.
+ * (see section 2.2).
+ *
+ * Key Property Values in ObjectName(s) may not contain one of :",=*?
+ * (see jmx_1.2_spec, Chapter 6)
+ *
+ * @author hzbarcea
+ *
+ */
+public class ObjectNameEncoder {
+
+    private ObjectNameEncoder() {
+        // Complete (utility class should not have instances)
+    }
+
+    public static String encode(String on) {
+        return encode(on, false);
+    }
+
+    public static String encode(String on, boolean ignoreWildcards) {
+        on = on.replace("%", "%25");    // must be first
+        on = on.replace(":", "%3a");
+        on = on.replace("\"", "%22");
+        on = on.replace(",", "%2c");
+        on = on.replace("=", "%3d");
+        if (!ignoreWildcards) {
+            on = on.replace("*", "%2a");
+            on = on.replace("?", "%3f");
+        }
+        return on;
+    }
+
+    public static String decode(String on) {
+        on = on.replace("%25", "%");
+        on = on.replace("%3a", ":");
+        on = on.replace("%22", "\"");
+        on = on.replace("%2c", ",");
+        on = on.replace("%3d", "=");
+        on = on.replace("%2a", "*");
+        on = on.replace("%3f", "?");
+        return on;
+    }
+}

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/management/ObjectNameEncoder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/FromType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/FromType.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/FromType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/FromType.java Mon Nov 19 03:30:37 2007
@@ -17,6 +17,7 @@
 package org.apache.camel.model;
 
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.apache.camel.impl.RouteContext;
 import org.apache.camel.util.ObjectHelper;
 
@@ -39,7 +40,7 @@
     @XmlAttribute
     private String ref;
     @XmlTransient
-    private Endpoint endpoint;
+    private Endpoint<? extends Exchange> endpoint;
 
     public FromType() {
     }
@@ -48,7 +49,7 @@
         setUri(uri);
     }
 
-    public FromType(Endpoint endpoint) {
+    public FromType(Endpoint<? extends Exchange> endpoint) {
         this.endpoint = endpoint;
     }
 
@@ -61,7 +62,7 @@
         return description(getUri(), getRef(), getEndpoint());
     }
 
-    public Endpoint resolveEndpoint(RouteContext context) {
+    public Endpoint<? extends Exchange> resolveEndpoint(RouteContext context) {
         if (endpoint == null) {
             endpoint = context.resolveEndpoint(getUri(), getRef());
         }

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ResequencerType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ResequencerType.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ResequencerType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ResequencerType.java Mon Nov 19 03:30:37 2007
@@ -27,6 +27,7 @@
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAccessType;
 
+import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.Processor;
@@ -180,9 +181,9 @@
         }
     }
 
-    private Route<Exchange> createBatchResequencerRoute(RouteContext routeContext) throws Exception {
+    private Route<? extends Exchange> createBatchResequencerRoute(RouteContext routeContext) throws Exception {
         final Resequencer resequencer = createBatchResequencer(routeContext, batchConfig);
-        return new Route<Exchange>(routeContext.getEndpoint(), resequencer) {
+        return new Route(routeContext.getEndpoint(), resequencer) {
             @Override
             public String toString() {
                 return "BatchResequencerRoute[" + getEndpoint() + " -> " + resequencer.getProcessor() + "]";

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteType.java Mon Nov 19 03:30:37 2007
@@ -64,15 +64,6 @@
         return "Route[ " + inputs + " -> " + outputs + "]";
     }
 
-    // TODO should we zap this and replace with next method?
-    public void addRoutes(CamelContext context) throws Exception {
-        Collection<Route> routes = new ArrayList<Route>();
-
-        addRoutes(context, routes);
-
-        context.addRoutes(routes);
-    }
-
     public void addRoutes(CamelContext context, Collection<Route> routes) throws Exception {
         setCamelContext(context);
 
@@ -176,7 +167,10 @@
 
     protected void addRoutes(Collection<Route> routes, FromType fromType) throws Exception {
         RouteContext routeContext = new RouteContext(this, fromType, routes);
-        Endpoint endpoint = routeContext.getEndpoint();
+        routeContext.getEndpoint(); // force endpoint resolution
+        if (camelContext != null) {
+        	camelContext.getLifecycleStrategy().onRouteContextCreate(routeContext);
+        }
 
         List<ProcessorType<?>> list = new ArrayList<ProcessorType<?>>(outputs);
         for (ProcessorType output : list) {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java Mon Nov 19 03:30:37 2007
@@ -64,12 +64,6 @@
         return "Routes: " + routes;
     }
 
-    public void populateRoutes(List<Route> answer) throws Exception {
-        for (RouteType route : routes) {
-            route.addRoutes(camelContext, answer);
-        }
-    }
-
     // Properties
     //-----------------------------------------------------------------------
     public List<RouteType> getRoutes() {
@@ -208,4 +202,4 @@
         }
         return route;
     }
-}
\ No newline at end of file
+}

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LifecycleStrategy.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LifecycleStrategy.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/LifecycleStrategy.java Mon Nov 19 03:30:37 2007
@@ -20,9 +20,10 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
 import org.apache.camel.Route;
 import org.apache.camel.Service;
-import org.apache.camel.model.RouteType;
+import org.apache.camel.impl.RouteContext;
 
 public interface LifecycleStrategy {
 
@@ -34,7 +35,7 @@
 	/**
      * Notification on adding an {@see Endpoint}.
      */
-	void onEndpointAdd(Endpoint endpoint);
+	void onEndpointAdd(Endpoint<? extends Exchange> endpoint);
 
 	/**
      * Notification on adding a {@see Service}.
@@ -47,8 +48,8 @@
 	void onRoutesAdd(Collection<Route> routes);
 	
 	/**
-     * Notification on adding {@see Route}(s).
-	 * @param context TODO
+     * Notification on adding {@see RouteContext}(s).
+	 * @param routeContext
      */
-	void beforeStartRouteType(CamelContext context, RouteType routeType);
+	void onRouteContextCreate(RouteContext routeContext);
 }

Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationUsingDefaultsTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationUsingDefaultsTest.java?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationUsingDefaultsTest.java (original)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/management/JmxInstrumentationUsingDefaultsTest.java Mon Nov 19 03:30:37 2007
@@ -59,11 +59,8 @@
 
         resultEndpoint.assertIsSatisfied();
 
-        /* 
-         * Fixme: after stats are merged with the mbean they represent
-         * 
         MBeanServer mbs = iAgent.getMBeanServer();
-        ObjectName name = new ObjectName(domainName + ":name=Stats,*");
+        ObjectName name = new ObjectName(domainName + ":type=Stats,*");
         Set s = mbs.queryNames(name, null);
         assertEquals("Found mbeans: " + s, 1, s.size());
 
@@ -95,7 +92,6 @@
         		"'<domain>:name=Stats,*' key must be of type PerformanceCounter.class", valueofMeanProcessingTime);
         assertTrue(valueofMeanProcessingTime >= valueofMinProcessingTime &&
         		valueofMeanProcessingTime <= valueofMaxProcessingTime);
-         */
     }
 
     protected void enableJmx() {

Modified: activemq/camel/trunk/examples/camel-example-spring/src/main/resources/META-INF/spring/camel-context.xml
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/examples/camel-example-spring/src/main/resources/META-INF/spring/camel-context.xml?rev=596273&r1=596272&r2=596273&view=diff
==============================================================================
--- activemq/camel/trunk/examples/camel-example-spring/src/main/resources/META-INF/spring/camel-context.xml (original)
+++ activemq/camel/trunk/examples/camel-example-spring/src/main/resources/META-INF/spring/camel-context.xml Mon Nov 19 03:30:37 2007
@@ -29,7 +29,7 @@
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">
 
-  <camelContext useJmx="true" xmlns="http://activemq.apache.org/camel/schema/spring">
+  <camelContext id="camel" useJmx="true" mbeanServer="mbeanServer" xmlns="http://activemq.apache.org/camel/schema/spring">
     <package>org.apache.camel.example.spring</package>
   </camelContext>
 
@@ -40,6 +40,30 @@
          <property name="brokerURL" value="vm://localhost?broker.persistent=false&amp;broker.useJmx=false"/>
        </bean>
     </property>
+  </bean>
+
+  <!-- Use JMX -->
+  <bean id="agent" class="org.apache.camel.spring.SpringInstrumentationAgent">
+    <property name="camelContext" ref="camel"/>
+    <property name="MBeanServer" ref="mbeanServer"/>
+  </bean>
+  <!--
+    this bean needs to be eagerly pre-instantiated in order for the exporting to occur;
+    this means that it must not be marked as lazily initialized
+  -->
+  <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
+    <property name="defaultDomain" value="org.apache.camel.test"/>
+  </bean>
+  <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
+    <property name="port" value="1099"/>
+  </bean>
+  <bean id="serverConnector"
+      class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">
+    <property name="objectName" value="connector:name=rmi"/>
+    <property name="serviceUrl" 
+      value="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"/>
+    <property name="threaded" value="true"/>
+    <property name="daemon" value="true"/>
   </bean>
 
 </beans>