activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jstrac...@apache.org
Subject svn commit: r525519 - 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/util/ camel-core/src/test/java/org/apache/camel/util/ camel-cxf/src/mai...
Date Wed, 04 Apr 2007 14:19:50 GMT
Author: jstrachan
Date: Wed Apr  4 07:19:48 2007
New Revision: 525519

URL: http://svn.apache.org/viewvc?view=rev&rev=525519
Log:
simplified the auto-discovery and endpoint resolving mechanism to simplify the API, reduce the amount of code that a developer has to write and allow for more flexible IoC injection

Added:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java   (with props)
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/
    activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java   (with props)
    activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/
      - copied from r525477, activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/
    activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/
    activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/jms
      - copied, changed from r525477, activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/jms
    activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/
    activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/jpa
    activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/
    activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/mina
Removed:
    activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpointResolver.java
    activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpointResolver.java
    activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/
    activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpointResolver.java
    activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/
    activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaEndpointResolver.java
    activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/
Modified:
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.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/DefaultComponent.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java
    activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfBinding.java
    activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java
    activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/cxf
    activemq/camel/trunk/camel-jbi/src/main/java/org/apache/camel/component/jbi/CamelJbiComponent.java
    activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java
    activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java
    activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaComponent.java
    activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
    activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaTest.java
    activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsingCustomPersistenceUnitTest.java
    activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/Component.java Wed Apr  4 07:19:48 2007
@@ -23,7 +23,7 @@
  *
  * @version $Revision: 519901 $
  */
-public interface Component<E>  {
+public interface Component<E extends Exchange>  {
     
     /**
      * Returns the context
@@ -44,5 +44,13 @@
      * @return the executor for this endpoint
      */
     ScheduledExecutorService getExecutorService();
-	
+
+    /**
+     * Attempt to create an endpoint for the given URI if the component is capable of handling the URI
+     *
+     * @param uri the URI to create
+     * @return a newly created endpoint or null if this component cannot create instances of the given
+     * uri
+     */
+    Endpoint<E> createEndpoint(String uri) throws Exception;
 }

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?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- 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 Wed Apr  4 07:19:48 2007
@@ -23,10 +23,8 @@
 import org.apache.camel.impl.converter.Injector;
 import org.apache.camel.impl.converter.ReflectionInjector;
 import org.apache.camel.util.FactoryFinder;
-import org.apache.camel.util.ServiceHelper;
 import org.apache.camel.util.NoFactoryAvailableException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.camel.util.ServiceHelper;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -36,7 +34,6 @@
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Represents the context used to configure routes and the policies to use.
@@ -45,7 +42,6 @@
  * @org.apache.xbean.XBean element="container" rootElement="true"
  */
 public class DefaultCamelContext extends ServiceSupport implements CamelContext, Service {
-    private static final transient Log log = LogFactory.getLog(DefaultCamelContext.class);
     private Map<String, Endpoint> endpoints = new HashMap<String, Endpoint>();
     private Map<String, Component> components = new HashMap<String, Component>();
     private List<EndpointResolver> resolvers = new CopyOnWriteArrayList<EndpointResolver>();
@@ -55,7 +51,7 @@
     private EndpointResolver endpointResolver;
     private ExchangeConverter exchangeConverter;
     private Injector injector;
-    private AtomicBoolean started = new AtomicBoolean(false);
+    private DefaultComponentResolver componentResolver = new DefaultComponentResolver();
 
     /**
      * Adds a component to the container.
@@ -137,10 +133,27 @@
             answer = endpoints.get(uri);
             if (answer == null) {
                 try {
-                    for (EndpointResolver resolver : resolvers) {
-                        answer = resolver.resolveEndpoint(this, uri);
-                        if (answer != null) {
-                            break;
+                    synchronized (components) {
+                        Collection<Component> componentSet = components.values();
+                        for (Component component : componentSet) {
+                            answer = component.createEndpoint(uri);
+                            if (answer != null) {
+                                break;
+                            }
+                        }
+                    }
+                    if (answer == null) {
+                        Component component = componentResolver.resolveComponent(uri, this);
+                        if (component != null) {
+                            answer = component.createEndpoint(uri);
+                        }
+                    }
+                    if (answer == null) {
+                        for (EndpointResolver resolver : resolvers) {
+                            answer = resolver.resolveEndpoint(this, uri);
+                            if (answer != null) {
+                                break;
+                            }
                         }
                     }
                     if (answer == null) {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponent.java Wed Apr  4 07:19:48 2007
@@ -19,8 +19,14 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
+import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.URISupport;
+import org.apache.camel.util.ObjectHelper;
 
+import java.net.URI;
+import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadFactory;
@@ -29,6 +35,7 @@
  * @version $Revision$
  */
 public class DefaultComponent<E extends Exchange> extends ServiceSupport implements Component<E> {
+    protected static String[] EMPTY_ARRAY = {};
     private int defaultThreadPoolSize = 5;
     private CamelContext camelContext;
     private ScheduledExecutorService executorService;
@@ -40,6 +47,36 @@
         this.camelContext = context;
     }
 
+    public String[] getUriPrefixes() {
+        return EMPTY_ARRAY;
+    }
+
+    public Endpoint<E> createEndpoint(String uri) throws Exception {
+        ObjectHelper.notNull(getCamelContext(), "camelContext");
+        String remaining = matchesPrefixes(uri);
+        if (remaining == null) {
+            return null;
+        }
+        if (remaining.startsWith(":")) {
+            remaining = remaining.substring(1);
+        }
+        URI u = new URI(uri);
+        String path = u.getHost();
+        if (path == null) {
+            path = u.getSchemeSpecificPart();
+        }
+        Map parameters = URISupport.parseParamters(u);
+
+        Endpoint<E> endpoint = createEndpoint(uri, path, parameters);
+        if (endpoint == null) {
+            return null;
+        }
+        if (parameters != null) {
+            IntrospectionSupport.setProperties(endpoint, parameters);
+        }
+        return endpoint;
+    }
+
     public CamelContext getCamelContext() {
         return camelContext;
     }
@@ -81,5 +118,34 @@
         if (executorService != null) {
             executorService.shutdown();
         }
+    }
+
+    /**
+     * Returns true if the uri matches one of the available prefixes from {@link #getUriPrefixes()}
+     *
+     * @param uri the URI
+     * @return true if the URI matches one of the available prefixes
+     */
+    protected String matchesPrefixes(String uri) {
+        String[] prefixes = getUriPrefixes();
+        for (String prefix : prefixes) {
+            if (uri.startsWith(prefix)) {
+                return uri.substring(prefix.length());
+            }
+        }
+        return null;
+    }
+
+    /**
+     * A factory method allowing derived components to create a new endpoint from the given URI,
+     * remaining path and optional parameters
+     *
+     * @param uri        the full URI of the endpoint
+     * @param remaining  the remaining part of the URI without the query parameters or component prefix
+     * @param parameters the optional parameters passed in
+     * @return a newly created endpoint or null if the endpoint cannot be created based on the inputs
+     */
+    protected Endpoint<E> createEndpoint(String uri, String remaining, Map parameters) throws Exception {
+        return null;
     }
 }

Added: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java?view=auto&rev=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java (added)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java Wed Apr  4 07:19:48 2007
@@ -0,0 +1,73 @@
+/**
+ *
+ * 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.impl;
+
+import org.apache.camel.Component;
+import org.apache.camel.EndpointResolver;
+import org.apache.camel.Exchange;
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.converter.Injector;
+import org.apache.camel.util.FactoryFinder;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.NoFactoryAvailableException;
+
+/**
+ * An implementation of {@link org.apache.camel.EndpointResolver} that delegates to
+ * other {@link EndpointResolver} which are selected based on the uri prefix.
+ * <p/>
+ * The delegate {@link EndpointResolver} are associated with uri prefixes by
+ * adding a property file with the same uri prefix in the
+ * META-INF/services/org/apache/camel/EndpointResolver/
+ * directory on the classpath.
+ *
+ * @version $Revision$
+ */
+public class DefaultComponentResolver<E extends Exchange> {
+    static final private FactoryFinder componentFactory = new FactoryFinder("META-INF/services/org/apache/camel/component/");
+
+    public Component<E> resolveComponent(String uri, CamelContext context) {
+        String splitURI[] = ObjectHelper.splitOnCharacter(uri, ":", 2);
+        if (splitURI[1] == null) {
+            throw new IllegalArgumentException("Invalid URI, it did not contain a scheme: " + uri);
+        }
+        String scheme = splitURI[0];
+        Class type;
+        try {
+            type = componentFactory.findClass(scheme);
+        }
+        catch (NoFactoryAvailableException e) {
+            return null;
+        }
+        catch (Throwable e) {
+            throw new IllegalArgumentException("Invalid URI, no EndpointResolver registered for scheme : " + scheme, e);
+        }
+        if (type == null) {
+            return null;
+        }
+        if (Component.class.isAssignableFrom(type)) {
+            Component<E> answer = (Component<E>) context.getInjector().newInstance(type);
+            // lets add the component using the prefix
+            context.addComponent(scheme, answer);
+            // TODO should we start it?
+            return answer;
+        }
+        else {
+            throw new IllegalArgumentException("Type is not a Component implementation. Found: " + type.getName());
+        }
+    }
+}

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

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultComponentResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/FactoryFinder.java Wed Apr  4 07:19:48 2007
@@ -48,6 +48,15 @@
     public Object newInstance(String key, String propertyPrefix)
             throws IllegalAccessException, InstantiationException, IOException, ClassNotFoundException
     {
+        Class clazz = findClass(key, propertyPrefix);
+        return clazz.newInstance();
+    }
+
+    public Class findClass(String key) throws ClassNotFoundException, IOException {
+        return findClass(key, null);
+    }
+
+    public Class findClass(String key, String propertyPrefix) throws ClassNotFoundException, IOException {
         if (propertyPrefix == null)
             propertyPrefix = "";
 
@@ -56,7 +65,7 @@
             clazz = newInstance(doFindFactoryProperies(key), propertyPrefix);
             classMap.put(propertyPrefix + key, clazz);
         }
-        return clazz.newInstance();
+        return clazz;
     }
 
     private Class newInstance(Properties properties, String propertyPrefix) throws ClassNotFoundException, IOException {

Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original)
+++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Wed Apr  4 07:19:48 2007
@@ -95,6 +95,26 @@
     }
 
     /**
+     * Removes any starting characters on the given text which match the given character
+     *
+     * @param text the string
+     * @param ch the initial characters to remove
+     * @return either the original string or the new substring
+     */
+    public static String removeStartingCharacters(String text, char ch) {
+        int idx = 0;
+        while (text.charAt(idx) == ch) {
+            idx++;
+        }
+        if (idx > 0) {
+            return text.substring(idx);
+        }
+        return text;
+    }
+
+
+
+    /**
      * Returns true if the collection contains the specified value
      */
     public static boolean contains(Object collectionOrArray, Object value) {

Added: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java?view=auto&rev=525519
==============================================================================
--- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java (added)
+++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java Wed Apr  4 07:19:48 2007
@@ -0,0 +1,31 @@
+/**
+ *
+ * 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.util;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Revision$
+ */
+public class ObjectHelperTest extends TestCase {
+    public void testRemoveInitialCharacters() throws Exception {
+        assertEquals(ObjectHelper.removeStartingCharacters("foo", '/'), "foo");
+        assertEquals(ObjectHelper.removeStartingCharacters("/foo", '/'), "foo");
+        assertEquals(ObjectHelper.removeStartingCharacters("//foo", '/'), "foo");
+    }
+}

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfBinding.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfBinding.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfBinding.java (original)
+++ activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfBinding.java Wed Apr  4 07:19:48 2007
@@ -70,7 +70,9 @@
     public void storeCxfResponse(CxfExchange exchange, Message response) {
         // no need to process headers as we use the CXF message
         CxfMessage out = exchange.getOut();
-        out.setMessage(response);
-        out.setBody(getBody(response));
+        if (response != null) {
+            out.setMessage(response);
+            out.setBody(getBody(response));
+        }
     }
 }

Modified: activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java (original)
+++ activemq/camel/trunk/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfComponent.java Wed Apr  4 07:19:48 2007
@@ -18,6 +18,7 @@
 package org.apache.camel.component.cxf;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusException;
@@ -30,6 +31,7 @@
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Map;
 
 /**
  * @version $Revision$
@@ -44,14 +46,19 @@
         super(context);
     }
 
-    public synchronized CxfEndpoint createEndpoint(String uri, String[] urlParts) throws IOException, URISyntaxException {
-        String remainingUrl = uri.substring("cxf:".length());
-        URI u = new URI(remainingUrl);
+    @Override
+    public String[] getUriPrefixes() {
+        return new String[] {"cxf"};
+    }
+
+    @Override
+    protected Endpoint<CxfExchange> createEndpoint(String uri, String remaining, Map parameters) throws Exception {
+        URI u = new URI(remaining);
 
         // TODO this is a hack!!!
         EndpointInfo endpointInfo = new EndpointInfo(null, "http://schemas.xmlsoap.org/soap/http");
         AddressType a = new AddressType();
-        a.setLocation(remainingUrl);
+        a.setLocation(remaining);
         endpointInfo.addExtensor(a);
 
         return new CxfEndpoint(uri, this, endpointInfo);

Modified: activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/cxf
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/cxf?view=diff&rev=525519&r1=525477&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/cxf (original)
+++ activemq/camel/trunk/camel-cxf/src/main/resources/META-INF/services/org/apache/camel/component/cxf Wed Apr  4 07:19:48 2007
@@ -1 +1 @@
-class=org.apache.camel.component.cxf.CxfEndpointResolver
+class=org.apache.camel.component.cxf.CxfComponent

Modified: activemq/camel/trunk/camel-jbi/src/main/java/org/apache/camel/component/jbi/CamelJbiComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jbi/src/main/java/org/apache/camel/component/jbi/CamelJbiComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jbi/src/main/java/org/apache/camel/component/jbi/CamelJbiComponent.java (original)
+++ activemq/camel/trunk/camel-jbi/src/main/java/org/apache/camel/component/jbi/CamelJbiComponent.java Wed Apr  4 07:19:48 2007
@@ -41,7 +41,7 @@
  *
  * @version $Revision: 426415 $
  */
-public class CamelJbiComponent extends DefaultComponent implements Component<JbiExchange>, EndpointResolver {
+public class CamelJbiComponent extends DefaultComponent implements Component<Exchange> {
     private JbiBinding binding;
     private CamelContext camelContext;
     private ScheduledExecutorService executorService;
@@ -123,11 +123,7 @@
 
     // Resolve Camel Endpoints
     //-------------------------------------------------------------------------
-    public Component resolveComponent(CamelContext context, String uri) throws Exception {
-        return null;
-    }
-
-    public Endpoint resolveEndpoint(CamelContext context, String uri) throws Exception {
+    public Endpoint<Exchange> createEndpoint(String uri) {
         if (uri.startsWith("jbi:")) {
             uri = uri.substring("jbi:".length());
 

Modified: activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java (original)
+++ activemq/camel/trunk/camel-jms/src/main/java/org/apache/camel/component/jms/JmsComponent.java Wed Apr  4 07:19:48 2007
@@ -17,25 +17,22 @@
  */
 package org.apache.camel.component.jms;
 
-import com.sun.jndi.toolkit.url.Uri;
+import static org.apache.camel.util.ObjectHelper.removeStartingCharacters;
 import org.apache.camel.CamelContext;
-import org.apache.camel.Processor;
+import org.apache.camel.Endpoint;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.URISupport;
 
 import javax.jms.ConnectionFactory;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Map;
 
 /**
  * @version $Revision:520964 $
  */
 public class JmsComponent extends DefaultComponent<JmsExchange> {
-    public static final String QUEUE_PREFIX = "queue/";
-    public static final String TOPIC_PREFIX = "topic/";
+    public static final String QUEUE_PREFIX = "queue:";
+    public static final String TOPIC_PREFIX = "topic:";
     private JmsConfiguration configuration;
 
     /**
@@ -69,7 +66,7 @@
         return jmsComponent(template);
     }
 
-    protected JmsComponent() {
+    public JmsComponent() {
         this.configuration = new JmsConfiguration();
     }
 
@@ -82,38 +79,34 @@
         this.configuration = new JmsConfiguration();
     }
 
-    public JmsEndpoint createEndpoint(Uri uri) throws URISyntaxException {
-        // lets figure out from the URI whether its a queue, topic etc
-
-        String path = uri.getPath();
-        return createEndpoint(uri.toString(), path);
+    @Override
+    public String[] getUriPrefixes() {
+        return new String[]{"jms"};
     }
 
-    public JmsEndpoint createEndpoint(String uri, String path) throws URISyntaxException {
-        ObjectHelper.notNull(getCamelContext(), "camelContext");
+    @Override
+    protected Endpoint<JmsExchange> createEndpoint(String uri, String remaining, Map parameters) throws Exception {
 
         boolean pubSubDomain = false;
-        if (path.startsWith(QUEUE_PREFIX)) {
+        if (remaining.startsWith(QUEUE_PREFIX)) {
             pubSubDomain = false;
-            path = path.substring(QUEUE_PREFIX.length());
+            remaining = removeStartingCharacters(remaining.substring(QUEUE_PREFIX.length()), '/');
         }
-        else if (path.startsWith(TOPIC_PREFIX)) {
+        else if (remaining.startsWith(TOPIC_PREFIX)) {
             pubSubDomain = true;
-            path = path.substring(TOPIC_PREFIX.length());
+            remaining = removeStartingCharacters(remaining.substring(TOPIC_PREFIX.length()), '/');
         }
 
-        final String subject = convertPathToActualDestination(path);
+        final String subject = convertPathToActualDestination(remaining);
 
         // lets make sure we copy the configuration as each endpoint can customize its own version
         JmsEndpoint endpoint = new JmsEndpoint(uri, this, subject, pubSubDomain, getConfiguration().copy());
 
-        URI u = new URI(uri);
-        Map options = URISupport.parseParamters(u);
-        String selector = (String) options.remove("selector");
+        String selector = (String) parameters.remove("selector");
         if (selector != null) {
             endpoint.setSelector(selector);
         }
-        IntrospectionSupport.setProperties(endpoint.getConfiguration(), options);
+        IntrospectionSupport.setProperties(endpoint.getConfiguration(), parameters);
         return endpoint;
     }
 
@@ -136,13 +129,5 @@
      */
     protected String convertPathToActualDestination(String path) {
         return path;
-    }
-
-    public void activate(JmsEndpoint endpoint, Processor<JmsExchange> processor) {
-        // TODO Auto-generated method stub
-    }
-
-    public void deactivate(JmsEndpoint endpoint) {
-        // TODO Auto-generated method stub
     }
 }

Copied: activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/jms (from r525477, activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/jms)
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/jms?view=diff&rev=525519&p1=activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/jms&r1=525477&p2=activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/jms&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/EndpointResolver/jms (original)
+++ activemq/camel/trunk/camel-jms/src/main/resources/META-INF/services/org/apache/camel/component/jms Wed Apr  4 07:19:48 2007
@@ -1 +1 @@
-class=org.apache.camel.component.jms.JmsEndpointResolver
+class=org.apache.camel.component.jms.JmsComponent

Modified: activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java (original)
+++ activemq/camel/trunk/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java Wed Apr  4 07:19:48 2007
@@ -102,8 +102,8 @@
         // lets add some routes
         container.addRoutes(new RouteBuilder() {
             public void configure() {
-                from("jms:activemq:test.a").to("jms:activemq:test.b");
-                from("jms:activemq:test.b").process(new Processor<JmsExchange>() {
+                from("jms:queue:test.a").to("jms:queue:test.b");
+                from("jms:queue:test.b").process(new Processor<JmsExchange>() {
                     public void onExchange(JmsExchange e) {
                         System.out.println("Received exchange: " + e.getIn());
                         receivedExchange = e;
@@ -112,7 +112,7 @@
                 });
             }
         });
-        endpoint = container.resolveEndpoint("jms:activemq:test.a");
+        endpoint = container.resolveEndpoint("jms:queue:test.a");
         assertNotNull("No endpoint found!", endpoint);
 
         container.activateEndpoints();

Modified: activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaComponent.java (original)
+++ activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaComponent.java Wed Apr  4 07:19:48 2007
@@ -55,65 +55,16 @@
  *
  * @version $Revision$
  */
-public class JpaComponent extends DefaultComponent<Exchange> implements EndpointResolver {
+public class JpaComponent extends DefaultComponent<Exchange> {
     private EntityManagerFactory entityManagerFactory;
-    private Map entityManagerProperties;
-    private String entityManagerName = "camel";
-    private JpaTemplate template;
 
     public Component resolveComponent(CamelContext container, String uri) throws Exception {
         return null;
     }
 
-    public Endpoint resolveEndpoint(CamelContext container, String uri) throws Exception {
-        if (!uri.startsWith("jpa:")) {
-            return null;
-        }
-        URI u = new URI(uri);
-        String path = u.getHost();
-        if (path == null) {
-            path = u.getSchemeSpecificPart();
-        }
-        String[] paths = ObjectHelper.splitOnCharacter(path, ":", 4);
-        // ignore a prefix
-        if (paths[1] != null) {
-            path = paths[1];
-        }
-        JpaEndpoint endpoint = new JpaEndpoint(uri, this);
-        Map options = URISupport.parseParamters(u);
-        Map consumerProperties = IntrospectionSupport.extractProperties(options, "consumer.");
-        if (consumerProperties != null) {
-            endpoint.setConsumerProperties(consumerProperties);
-        }
-        IntrospectionSupport.setProperties(endpoint, options);
-
-        // lets interpret the next string as a class
-        if (path != null) {
-            Class<?> type = ObjectHelper.loadClass(path);
-            if (type != null) {
-                endpoint.setEntityType(type);
-            }
-        }
-        return endpoint;
-    }
-
     // Properties
     //-------------------------------------------------------------------------
-    public JpaTemplate getTemplate() {
-        if (template == null) {
-            template = createTemplate();
-        }
-        return template;
-    }
-
-    public void setTemplate(JpaTemplate template) {
-        this.template = template;
-    }
-
     public EntityManagerFactory getEntityManagerFactory() {
-        if (entityManagerFactory == null) {
-            entityManagerFactory = createEntityManagerFactory();
-        }
         return entityManagerFactory;
     }
 
@@ -121,61 +72,34 @@
         this.entityManagerFactory = entityManagerFactory;
     }
 
-    public Map getEntityManagerProperties() {
-        if (entityManagerProperties == null) {
-            entityManagerProperties = System.getProperties();
-        }
-        return entityManagerProperties;
-    }
-
-    public void setEntityManagerProperties(Map entityManagerProperties) {
-        this.entityManagerProperties = entityManagerProperties;
-    }
-
-    public String getEntityManagerName() {
-        return entityManagerName;
-    }
-
-    public void setEntityManagerName(String entityManagerName) {
-        this.entityManagerName = entityManagerName;
-    }
-
     // Implementation methods
     //-------------------------------------------------------------------------
-    protected JpaTemplate createTemplate() {
-  /*      EntityManagerFactory emf = getEntityManagerFactory();
-        JpaTransactionManager transactionManager = new JpaTransactionManager(emf);
-        transactionManager.afterPropertiesSet();
-
-        final TransactionTemplate tranasctionTemplate = new TransactionTemplate(transactionManager);
-        tranasctionTemplate.afterPropertiesSet();
-
-        // lets auto-default to a JpaTemplate which implicitly creates a transaction
-        // TODO surely there's a cleaner way to get the JpaTemplate to create a transaction if one is not present??
-        return new JpaTemplate(emf) {
-            @Override
-            public Object execute(final JpaCallback action, final boolean exposeNativeEntityManager) throws DataAccessException {
-                return tranasctionTemplate.execute(new TransactionCallback() {
-                    public Object doInTransaction(TransactionStatus status) {
-                        return doExecute(action, exposeNativeEntityManager);
-                    }
-                });
 
-            }
-
-            public Object doExecute(final JpaCallback action, final boolean exposeNativeEntityManager) throws DataAccessException {
-                return super.execute(action, exposeNativeEntityManager);
-            }
-        };*/
-        return new JpaTemplate(getEntityManagerFactory());
+    @Override
+    public String[] getUriPrefixes() {
+        return new String[] { "jpa" };
     }
 
-    protected EntityManagerFactory createEntityManagerFactory() {
-        //return Persistence.createEntityManagerFactory(entityManagerName);
-        return Persistence.createEntityManagerFactory(entityManagerName, getEntityManagerProperties());
-    }
+    @Override
+    protected Endpoint<Exchange> createEndpoint(String uri, String path, Map options) throws Exception {
+        JpaEndpoint endpoint = new JpaEndpoint(uri, this);
+        Map consumerProperties = IntrospectionSupport.extractProperties(options, "consumer.");
+        if (consumerProperties != null) {
+            endpoint.setConsumerProperties(consumerProperties);
+        }
+        Map emProperties = IntrospectionSupport.extractProperties(options, "emf.");
+        if (emProperties != null) {
+            endpoint.setEntityManagerProperties(emProperties);
+        }
 
-    protected EntityManager createEntityManager() {
-        return getEntityManagerFactory().createEntityManager();
+        // lets interpret the next string as a class
+        if (path != null) {
+            Class<?> type = ObjectHelper.loadClass(path);
+            if (type != null) {
+                endpoint.setEntityType(type);
+            }
+        }
+        return endpoint;
     }
+
 }

Modified: activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java (original)
+++ activemq/camel/trunk/camel-jpa/src/main/java/org/apache/camel/component/jpa/JpaEndpoint.java Wed Apr  4 07:19:48 2007
@@ -23,31 +23,33 @@
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
-import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.builder.ExpressionBuilder;
 import org.apache.camel.impl.DefaultEndpoint;
 import org.apache.camel.impl.DefaultExchange;
+import org.apache.camel.util.IntrospectionSupport;
 import org.springframework.orm.jpa.JpaTemplate;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
 import java.util.Map;
 
 /**
  * @version $Revision$
  */
 public class JpaEndpoint extends DefaultEndpoint<Exchange> {
-    private final JpaComponent component;
+    private EntityManagerFactory entityManagerFactory;
+    private String persistenceUnit = "camel";
     private JpaTemplate template;
     private Expression<Exchange> producerExpression;
     private int maximumResults = -1;
     private Class<?> entityType;
     private Map consumerProperties;
+    private Map entityManagerProperties;
 
     public JpaEndpoint(String uri, JpaComponent component) {
         super(uri, component);
-        this.component = component;
-        this.template = component.getTemplate();
+        entityManagerFactory = component.getEntityManagerFactory();
     }
 
     public Exchange createExchange() {
@@ -66,10 +68,12 @@
         return startService(consumer);
     }
 
-
     // Properties
     //-------------------------------------------------------------------------
     public JpaTemplate getTemplate() {
+        if (template == null) {
+            template = createTemplate();
+        }
         return template;
     }
 
@@ -112,14 +116,52 @@
         this.consumerProperties = consumerProperties;
     }
 
+    public EntityManagerFactory getEntityManagerFactory() {
+        if (entityManagerFactory == null) {
+            entityManagerFactory = createEntityManagerFactory();
+        }
+        return entityManagerFactory;
+    }
+
+    public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
+        this.entityManagerFactory = entityManagerFactory;
+    }
+
+    public Map getEntityManagerProperties() {
+        if (entityManagerProperties == null) {
+            entityManagerProperties = System.getProperties();
+        }
+        return entityManagerProperties;
+    }
+
+    public void setEntityManagerProperties(Map entityManagerProperties) {
+        this.entityManagerProperties = entityManagerProperties;
+    }
+
+    public String getPersistenceUnit() {
+        return persistenceUnit;
+    }
+
+    public void setPersistenceUnit(String persistenceUnit) {
+        this.persistenceUnit = persistenceUnit;
+    }
+
     // Implementation methods
     //-------------------------------------------------------------------------
+    protected JpaTemplate createTemplate() {
+        return new JpaTemplate(getEntityManagerFactory());
+    }
+
+    protected EntityManagerFactory createEntityManagerFactory() {
+        return Persistence.createEntityManagerFactory(persistenceUnit, getEntityManagerProperties());
+    }
+
     protected EntityManager createEntityManager() {
-        return component.createEntityManager();
+        return getEntityManagerFactory().createEntityManager();
     }
 
     protected TransactionStrategy createTransactionStrategy() {
-        EntityManagerFactory emf = component.getEntityManagerFactory();
+        EntityManagerFactory emf = getEntityManagerFactory();
         return JpaTemplateTransactionStrategy.newInstance(emf, getTemplate());
         //return new DefaultTransactionStrategy(emf);
     }

Added: activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/jpa
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/jpa?view=auto&rev=525519
==============================================================================
--- activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/jpa (added)
+++ activemq/camel/trunk/camel-jpa/src/main/resources/META-INF/services/org/apache/camel/component/jpa Wed Apr  4 07:19:48 2007
@@ -0,0 +1 @@
+class=org.apache.camel.component.jpa.JpaComponent

Modified: activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaTest.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaTest.java (original)
+++ activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaTest.java Wed Apr  4 07:19:48 2007
@@ -114,7 +114,7 @@
     }
 
     protected String getEndpointUri() {
-        return "jpa:" + SendEmail.class.getName();
+        return "jpa://" + SendEmail.class.getName();
     }
 
     @Override

Modified: activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsingCustomPersistenceUnitTest.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsingCustomPersistenceUnitTest.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsingCustomPersistenceUnitTest.java (original)
+++ activemq/camel/trunk/camel-jpa/src/test/java/org/apache/camel/component/jpa/JpaUsingCustomPersistenceUnitTest.java Wed Apr  4 07:19:48 2007
@@ -25,6 +25,6 @@
 public class JpaUsingCustomPersistenceUnitTest extends JpaTest {
 
     protected String getEndpointUri() {
-        return "jpa:custom:" + SendEmail.class.getName();
+        return "jpa://" + SendEmail.class.getName() + "?persistenceUnit=custom";
     }
 }

Modified: activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java?view=diff&rev=525519&r1=525518&r2=525519
==============================================================================
--- activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java (original)
+++ activemq/camel/trunk/camel-mina/src/main/java/org/apache/camel/component/mina/MinaComponent.java Wed Apr  4 07:19:48 2007
@@ -18,6 +18,7 @@
 package org.apache.camel.component.mina;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.mina.common.IoAcceptor;
 import org.apache.mina.common.IoConnector;
@@ -38,6 +39,7 @@
 import java.net.SocketAddress;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Map;
 
 /**
  * @version $Revision$
@@ -50,9 +52,14 @@
         super(context);
     }
 
-    public synchronized MinaEndpoint createEndpoint(String uri, String[] urlParts) throws IOException, URISyntaxException {
-        String remainingUrl = uri.substring("mina:".length());
-        URI u = new URI(remainingUrl);
+    @Override
+    public String[] getUriPrefixes() {
+        return new String[] { "mina" };
+    }
+
+    @Override
+    protected Endpoint<MinaExchange> createEndpoint(String uri, String remaining, Map parameters) throws Exception {
+        URI u = new URI(remaining);
 
         String protocol = u.getScheme();
         if (protocol.equals("tcp")) {

Added: activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/mina
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/mina?view=auto&rev=525519
==============================================================================
--- activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/mina (added)
+++ activemq/camel/trunk/camel-mina/src/main/resources/META-INF/services/org/apache/camel/component/mina Wed Apr  4 07:19:48 2007
@@ -0,0 +1 @@
+class=org.apache.camel.component.mina.MinaComponent



Mime
View raw message