Author: gnodet
Date: Wed Oct 18 16:07:50 2006
New Revision: 465412

URL: http://svn.apache.org/viewvc?view=rev&rev=465412
Log:
SM-695: Dynamic HTTP provider endpoint
Patch provided by James Lorrenzen, thx

Modified:
    
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/JbiConstants.java
    
incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ProviderProcessor.java
    
incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpProviderTest.java

Modified: 
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/JbiConstants.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/JbiConstants.java?view=diff&rev=465412&r1=465411&r2=465412
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/JbiConstants.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-core/src/main/java/org/apache/servicemix/JbiConstants.java
 Wed Oct 18 16:07:50 2006
@@ -40,5 +40,7 @@
     String STATELESS_PROVIDER = "org.apache.servicemix.provider.stateless";
     
     String SENDER_ENDPOINT = "org.apache.servicemix.senderEndpoint";
+
+    String HTTP_DESTINATION_URI = "org.apache.servicemix.http.destination.uri";
     
 }

Modified: 
incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ProviderProcessor.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ProviderProcessor.java?view=diff&rev=465412&r1=465411&r2=465412
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ProviderProcessor.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-http/src/main/java/org/apache/servicemix/http/processors/ProviderProcessor.java
 Wed Oct 18 16:07:50 2006
@@ -46,6 +46,8 @@
 import org.apache.commons.httpclient.methods.RequestEntity;
 import org.apache.commons.httpclient.protocol.Protocol;
 import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.servicemix.JbiConstants;
 import org.apache.servicemix.common.ExchangeProcessor;
 import org.apache.servicemix.http.HttpComponent;
@@ -67,18 +69,22 @@
  */
 public class ProviderProcessor implements ExchangeProcessor {
 
+    private static Log log = LogFactory.getLog(ProviderProcessor.class);
+
     protected HttpEndpoint endpoint;
-    protected HostConfiguration host;
     protected SoapHelper soapHelper;
     protected DeliveryChannel channel;
-    private String relUri;
     private Map methods;
     
     public ProviderProcessor(HttpEndpoint endpoint) {
         this.endpoint = endpoint;
         this.soapHelper = new SoapHelper(endpoint);
-        java.net.URI uri = java.net.URI.create(endpoint.getLocationURI());
-        relUri = uri.getPath();
+        this.methods = new ConcurrentHashMap();
+    }
+
+    private String getRelUri(String locationUri) {
+        java.net.URI uri = java.net.URI.create(locationUri);
+        String relUri = uri.getPath();
         if (!relUri.startsWith("/")) {
             relUri = "/" + relUri;
         }
@@ -88,7 +94,7 @@
         if (uri.getFragment() != null) {
             relUri += "#" + uri.getFragment();
         }
-        this.methods = new ConcurrentHashMap();
+        return relUri;
     }
 
     public void process(MessageExchange exchange) throws Exception {
@@ -105,7 +111,17 @@
         if (nm == null) {
             throw new IllegalStateException("Exchange has no input message");
         }
-        PostMethod method = new PostMethod(relUri);
+
+        String locationURI = endpoint.getLocationURI();
+
+        // Incorporated because of JIRA SM-695
+        Object newDestinationURI = 
nm.getProperty(JbiConstants.HTTP_DESTINATION_URI);
+        if (newDestinationURI != null) {
+            locationURI = (String) newDestinationURI;
+            log.debug("Location URI overridden: " + locationURI);
+        }
+
+        PostMethod method = new PostMethod(getRelUri(locationURI));
         SoapMessage soapMessage = new SoapMessage();
         soapHelper.getJBIMarshaler().fromNMS(soapMessage, nm);
         Context context = soapHelper.createContext(soapMessage);
@@ -149,7 +165,7 @@
             if (endpoint.getBasicAuthentication() != null) {
                 endpoint.getBasicAuthentication().applyCredentials( 
getClient() );
             }
-            int response = getClient().executeMethod(host, method);
+            int response = 
getClient().executeMethod(getHostConfiguration(locationURI), method);
             if (response != HttpStatus.SC_OK && response != 
HttpStatus.SC_ACCEPTED) {
                 if (exchange instanceof InOnly == false) {
                     SoapReader reader = 
soapHelper.getSoapMarshaler().createReader();
@@ -225,24 +241,30 @@
         }
     }
 
-    public void start() throws Exception {
-        URI uri = new URI(endpoint.getLocationURI(), false);
+    private HostConfiguration getHostConfiguration(String locationURI) throws 
Exception {
+        HostConfiguration host;
+        URI uri = new URI(locationURI, false);
         if (uri.getScheme().equals("https")) {
             ProtocolSocketFactory sf = new CommonsHttpSSLSocketFactory(
                             endpoint.getSsl(),
                             endpoint.getKeystoreManager());
             Protocol protocol = new Protocol("https", sf, 443);
-            HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), 
protocol);
-            this.host = new HostConfiguration();
-            this.host.setHost(host);
+            HttpHost httphost = new HttpHost(uri.getHost(), uri.getPort(), 
protocol);
+            host = new HostConfiguration();
+            host.setHost(httphost);
         } else {
-            this.host = new HostConfiguration();
-            this.host.setHost(uri.getHost(), uri.getPort());
+            host = new HostConfiguration();
+            host.setHost(uri.getHost(), uri.getPort());
         }
+
+        return host;
+    }
+
+    public void start() throws Exception {
         channel = 
endpoint.getServiceUnit().getComponent().getComponentContext().getDeliveryChannel();
     }
     
-    protected HttpConfiguration getConfiguration(HttpEndpoint endpoint) {
+    protected HttpConfiguration getConfiguration() {
         HttpComponent comp = (HttpComponent) 
endpoint.getServiceUnit().getComponent();
         return comp.getConfiguration();
     }
@@ -271,8 +293,7 @@
     }
        
     protected RequestEntity writeMessage(SoapWriter writer) throws Exception {
-        HttpComponent comp = (HttpComponent) 
endpoint.getServiceUnit().getComponent();
-        if (comp.getConfiguration().isStreamingEnabled()) {
+        if (getConfiguration().isStreamingEnabled()) {
             return new StreamingRequestEntity(writer);
         } else {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -282,7 +303,7 @@
     }
 
     protected HttpClient getClient() {
-        HttpComponent comp = (HttpComponent) 
endpoint.getServiceUnit().getComponent();
+        HttpComponent comp =  (HttpComponent) 
endpoint.getServiceUnit().getComponent();
         return comp.getClient();
     }
 

Modified: 
incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpProviderTest.java
URL: 
http://svn.apache.org/viewvc/incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpProviderTest.java?view=diff&rev=465412&r1=465411&r2=465412
==============================================================================
--- 
incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpProviderTest.java
 (original)
+++ 
incubator/servicemix/trunk/servicemix-http/src/test/java/org/apache/servicemix/http/HttpProviderTest.java
 Wed Oct 18 16:07:50 2006
@@ -24,179 +24,247 @@
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOut;
 import javax.jbi.messaging.RobustInOnly;
-import javax.jbi.messaging.MessageExchange.Role;
 import javax.xml.namespace.QName;
 import javax.xml.transform.stream.StreamSource;
 
 import junit.framework.TestCase;
 
 import org.apache.servicemix.client.DefaultServiceMixClient;
+import org.apache.servicemix.components.http.HttpConnector;
 import org.apache.servicemix.components.util.EchoComponent;
 import org.apache.servicemix.jbi.container.ActivationSpec;
 import org.apache.servicemix.jbi.container.JBIContainer;
 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
-import org.apache.servicemix.soap.SoapHelper;
 import org.apache.servicemix.tck.Receiver;
 import org.apache.servicemix.tck.ReceiverComponent;
+import org.apache.servicemix.JbiConstants;
 
 public class HttpProviderTest extends TestCase {
 
-       protected JBIContainer container;
+    protected JBIContainer container;
 
-       protected void setUp() throws Exception {
-               container = new JBIContainer();
-               container.setUseMBeanServer(false);
-               container.setCreateMBeanServer(false);
-               container.setEmbedded(true);
-               container.init();
-       }
-
-       protected void tearDown() throws Exception {
-               if (container != null) {
-                       container.shutDown();
-               }
-       }
-
-       protected long testInOnly(String msg, boolean streaming) throws 
Exception {
-               // HTTP Component
-               HttpComponent component = new HttpComponent();
-               component.getConfiguration().setStreamingEnabled(streaming);
-               container.activateComponent(component, "HttpProviderTest");
-
-               // Add a receiver component
-               Receiver receiver = new ReceiverComponent();
-               ActivationSpec asReceiver = new ActivationSpec("receiver", 
receiver);
-               asReceiver.setService(new QName("test", "receiver"));
-               container.activateComponent(asReceiver);
-
-               // Add the http receiver
-        HttpComponent connector = new HttpComponent();
-        HttpEndpoint endpoint = new HttpEndpoint();
-        endpoint.setRole(Role.CONSUMER);
-        endpoint.setLocationURI("http://localhost:8192/";);
-        endpoint.setSoap(false);
-        endpoint.setDefaultMep(SoapHelper.IN_ONLY);
-        endpoint.setService(new QName("test", "receiver"));
-        endpoint.setEndpoint("BC");
-        connector.setEndpoints(new HttpEndpoint[] { endpoint });
-               ActivationSpec asConnector = new ActivationSpec("connector", 
connector);
-               container.activateComponent(asConnector);
-
-               // Start container
-               container.start();
-
-               // Deploy SU
-               URL url = 
getClass().getClassLoader().getResource("provider/http.wsdl");
-               File path = new File(new URI(url.toString()));
-               path = path.getParentFile();
-               component.getServiceUnitManager().deploy("provider",
-                               path.getAbsolutePath());
-               component.getServiceUnitManager().start("provider");
-
-               // Call it
-               DefaultServiceMixClient client = new 
DefaultServiceMixClient(container);
-               RobustInOnly in = client.createRobustInOnlyExchange();
-               in.setInterfaceName(new QName("http://http.servicemix.org/Test";,
-                               "ProviderInterface"));
-               in.getInMessage().setContent(
-                               new StreamSource(new 
ByteArrayInputStream(msg.getBytes())));
-
-               long t0 = System.currentTimeMillis();
-               client.sendSync(in);
-               long t1 = System.currentTimeMillis();
-               assertTrue(in.getStatus() == ExchangeStatus.DONE);
-
-               // Check we received the message
-               receiver.getMessageList().assertMessagesReceived(1);
-
-               component.getServiceUnitManager().stop("provider");
-               component.getServiceUnitManager().shutDown("provider");
-               component.getServiceUnitManager().undeploy("provider",
-                               path.getAbsolutePath());
-
-               return t1 - t0;
-       }
-
-       protected String testInOut(String msg, boolean streaming) throws 
Exception {
-               // HTTP Component
-               HttpComponent component = new HttpComponent();
-               component.getConfiguration().setStreamingEnabled(streaming);
-               container.activateComponent(component, "HTTPComponent");
-
-               // Add a echo component
-               EchoComponent echo = new EchoComponent();
-               ActivationSpec asReceiver = new ActivationSpec("echo", echo);
-               asReceiver.setService(new QName("test", "echo"));
-               container.activateComponent(asReceiver);
-
-               // Add the http receiver
-        HttpComponent connector = new HttpComponent();
-        HttpEndpoint endpoint = new HttpEndpoint();
-        endpoint.setRole(Role.CONSUMER);
-        endpoint.setLocationURI("http://localhost:8192/";);
-        endpoint.setSoap(false);
-        endpoint.setDefaultMep(SoapHelper.IN_OUT);
-        endpoint.setService(new QName("test", "echo"));
-        endpoint.setEndpoint("BC");
-        connector.setEndpoints(new HttpEndpoint[] { endpoint });
+    protected void setUp() throws Exception {
+        container = new JBIContainer();
+        container.setUseMBeanServer(false);
+        container.setCreateMBeanServer(false);
+        container.setEmbedded(true);
+        container.init();
+    }
+
+    protected void tearDown() throws Exception {
+        if (container != null) {
+            container.shutDown();
+        }
+    }
+
+    protected long testInOnly(String msg, boolean streaming) throws Exception {
+        // HTTP Component
+        HttpComponent component = new HttpComponent();
+        ((HttpLifeCycle) component.getLifeCycle()).getConfiguration()
+                .setStreamingEnabled(streaming);
+        container.activateComponent(component, "HttpProviderTest");
+
+        // Add a receiver component
+        Receiver receiver = new ReceiverComponent();
+        ActivationSpec asReceiver = new ActivationSpec("receiver", receiver);
+        asReceiver.setService(new QName("test", "receiver"));
+        container.activateComponent(asReceiver);
+
+        // Add the http receiver
+        HttpConnector connector = new HttpConnector("localhost", 8192);
+        connector.setDefaultInOut(false);
         ActivationSpec asConnector = new ActivationSpec("connector", 
connector);
+        asConnector.setDestinationService(new QName("test", "receiver"));
         container.activateComponent(asConnector);
 
-               // Start container
-               container.start();
+        // Start container
+        container.start();
 
-               // Deploy SU
-               URL url = 
getClass().getClassLoader().getResource("provider/http.wsdl");
-               File path = new File(new URI(url.toString()));
-               path = path.getParentFile();
-               component.getServiceUnitManager().deploy("provider",
-                               path.getAbsolutePath());
-               component.getServiceUnitManager().start("provider");
-
-               // Call it
-               DefaultServiceMixClient client = new 
DefaultServiceMixClient(container);
-               InOut inout = client.createInOutExchange();
-               inout.setInterfaceName(new 
QName("http://http.servicemix.org/Test";,
-                               "ProviderInterface"));
-               inout.getInMessage().setContent(
-                               new StreamSource(new 
ByteArrayInputStream(msg.getBytes())));
-
-               long t0 = System.currentTimeMillis();
-               client.sendSync(inout);
-               long t1 = System.currentTimeMillis();
-               assertTrue(inout.getStatus() == ExchangeStatus.ACTIVE);
-
-               // Check we received the message
-               assertNotNull(inout.getOutMessage());
-               assertNotNull(inout.getOutMessage().getContent());
-               SourceTransformer sourceTransformer = new SourceTransformer();
-               String reply = sourceTransformer.toString(inout.getOutMessage()
-                               .getContent());
-               String inputMesage = sourceTransformer.toString(new 
StreamSource(
-                               new ByteArrayInputStream(msg.getBytes())));
-               System.out.println("Msg Sent [" + inputMesage + "]");
-               System.out.println("Msg Recieved [" + reply + "]");
-
-               assertEquals(inputMesage.length(), reply.length());
-               assertEquals(inputMesage, reply);
-
-               component.getServiceUnitManager().stop("provider");
-               component.getServiceUnitManager().shutDown("provider");
-               component.getServiceUnitManager().undeploy("provider",
-                               path.getAbsolutePath());
-
-               System.out.println("Executed in " + (t1 - t0) + "ms");
-
-               return reply;
-       }
-
-       public void testInOnly() throws Exception {
-               testInOnly("<hello>world</hello>", false);
-       }
-
-       public void testInOut() throws Exception {
-               testInOut("<hello>world</hello>", true);
-       }
+        // Deploy SU
+        URL url = 
getClass().getClassLoader().getResource("provider/http.wsdl");
+        File path = new File(new URI(url.toString()));
+        path = path.getParentFile();
+        component.getServiceUnitManager().deploy("provider",
+                path.getAbsolutePath());
+        component.getServiceUnitManager().start("provider");
+
+        // Call it
+        DefaultServiceMixClient client = new 
DefaultServiceMixClient(container);
+        RobustInOnly in = client.createRobustInOnlyExchange();
+        in.setInterfaceName(new QName("http://http.servicemix.org/Test";,
+                "ProviderInterface"));
+        in.getInMessage().setContent(
+                new StreamSource(new ByteArrayInputStream(msg.getBytes())));
+
+        long t0 = System.currentTimeMillis();
+        client.sendSync(in);
+        long t1 = System.currentTimeMillis();
+        assertTrue(in.getStatus() == ExchangeStatus.DONE);
+
+        // Check we received the message
+        receiver.getMessageList().assertMessagesReceived(1);
+
+        component.getServiceUnitManager().stop("provider");
+        component.getServiceUnitManager().shutDown("provider");
+        component.getServiceUnitManager().undeploy("provider",
+                path.getAbsolutePath());
+
+        return t1 - t0;
+    }
+
+    /**
+     * The http.wsdl specifies the location URI as localhost:8192.
+     * Set a NormalizedMessage property to override this value.
+     * Therefore don't start the HttpConnector on 8192, rather on
+     * another port to prove this functionality works.
+     * @param msg
+     * @param streaming
+     * @return
+     * @throws Exception
+     */
+    protected long testInOnlyOverrideDestination(String msg, boolean streaming)
+            throws Exception {
+        // HTTP Component
+        HttpComponent component = new HttpComponent();
+        ((HttpLifeCycle) component.getLifeCycle()).getConfiguration()
+                .setStreamingEnabled(streaming);
+        container.activateComponent(component, "HttpProviderTest");
+
+        // Add a receiver component
+        Receiver receiver = new ReceiverComponent();
+        ActivationSpec asReceiver = new ActivationSpec("receiver", receiver);
+        asReceiver.setService(new QName("test", "receiver"));
+        container.activateComponent(asReceiver);
+
+        // Add the http receiver
+        HttpConnector connector = new HttpConnector("localhost", 9192);
+        connector.setDefaultInOut(false);
+        ActivationSpec asConnector = new ActivationSpec("connector", 
connector);
+        asConnector.setDestinationService(new QName("test", "receiver"));
+        container.activateComponent(asConnector);
+
+        // Start container
+        container.start();
+
+        // Deploy SU
+        URL url = 
getClass().getClassLoader().getResource("provider/http.wsdl");
+        File path = new File(new URI(url.toString()));
+        path = path.getParentFile();
+        component.getServiceUnitManager().deploy("provider",
+                path.getAbsolutePath());
+        component.getServiceUnitManager().start("provider");
+
+        // Call it
+        DefaultServiceMixClient client = new 
DefaultServiceMixClient(container);
+        RobustInOnly in = client.createRobustInOnlyExchange();
+        in.setInterfaceName(new QName("http://http.servicemix.org/Test";,
+                "ProviderInterface"));
+        in.getInMessage().setContent(
+                new StreamSource(new ByteArrayInputStream(msg.getBytes())));
+        in.getInMessage().setProperty(JbiConstants.HTTP_DESTINATION_URI,
+                "http://localhost:9192/CheckAvailability";);
+
+        long t0 = System.currentTimeMillis();
+        client.sendSync(in);
+        long t1 = System.currentTimeMillis();
+        assertTrue(in.getStatus() == ExchangeStatus.DONE);
+
+        // Check we received the message
+        receiver.getMessageList().assertMessagesReceived(1);
+
+        component.getServiceUnitManager().stop("provider");
+        component.getServiceUnitManager().shutDown("provider");
+        component.getServiceUnitManager().undeploy("provider",
+                path.getAbsolutePath());
+
+        return t1 - t0;
+    }
+
+    protected String testInOut(String msg, boolean streaming) throws Exception 
{
+        // HTTP Component
+        HttpComponent component = new HttpComponent();
+        ((HttpLifeCycle) component.getLifeCycle()).getConfiguration()
+                .setStreamingEnabled(streaming);
+        container.activateComponent(component, "HTTPComponent");
+
+        // Add a echo component
+        EchoComponent echo = new EchoComponent();
+        ActivationSpec asReceiver = new ActivationSpec("echo", echo);
+        asReceiver.setService(new QName("test", "echo"));
+        container.activateComponent(asReceiver);
+
+        // Add the http receiver
+        HttpConnector connector = new HttpConnector("localhost", 8192);
+        connector.setDefaultInOut(true);
+        ActivationSpec asConnector = new ActivationSpec("connector", 
connector);
+        asConnector.setDestinationService(new QName("test", "echo"));
+        container.activateComponent(asConnector);
+
+        // Start container
+        container.start();
+
+        // Deploy SU
+        URL url = 
getClass().getClassLoader().getResource("provider/http.wsdl");
+        File path = new File(new URI(url.toString()));
+        path = path.getParentFile();
+        component.getServiceUnitManager().deploy("provider",
+                path.getAbsolutePath());
+        component.getServiceUnitManager().start("provider");
+
+        // Call it
+        DefaultServiceMixClient client = new 
DefaultServiceMixClient(container);
+        InOut inout = client.createInOutExchange();
+        inout.setInterfaceName(new QName("http://http.servicemix.org/Test";,
+                "ProviderInterface"));
+        inout.getInMessage().setContent(
+                new StreamSource(new ByteArrayInputStream(msg.getBytes())));
+
+        long t0 = System.currentTimeMillis();
+        client.sendSync(inout);
+        long t1 = System.currentTimeMillis();
+        assertTrue(inout.getStatus() == ExchangeStatus.ACTIVE);
+
+        // Check we received the message
+        assertNotNull(inout.getOutMessage());
+        assertNotNull(inout.getOutMessage().getContent());
+        SourceTransformer sourceTransformer = new SourceTransformer();
+        String reply = sourceTransformer.toString(inout.getOutMessage()
+                .getContent());
+        String inputMesage = sourceTransformer.toString(new StreamSource(
+                new ByteArrayInputStream(msg.getBytes())));
+        System.out.println("Msg Sent [" + inputMesage + "]");
+        System.out.println("Msg Recieved [" + reply + "]");
+
+        assertEquals(inputMesage.length(), reply.length());
+        assertEquals(inputMesage, reply);
+
+        component.getServiceUnitManager().stop("provider");
+        component.getServiceUnitManager().shutDown("provider");
+        component.getServiceUnitManager().undeploy("provider",
+                path.getAbsolutePath());
+
+        System.out.println("Executed in " + (t1 - t0) + "ms");
+
+        return reply;
+    }
+
+    public void testInOnly() throws Exception {
+        testInOnly("<hello>world</hello>", false);
+    }
+
+    /**
+     * JIRA SM-695.
+     * Tests the ability of the ProviderProcessor to override
+     * the locationURI using the property JbiConstants.HTTP_DESTINATION_URI
+     * @throws Exception
+     */
+    public void testInOnlyOverrideDestination() throws Exception {
+        testInOnlyOverrideDestination("<hello>world</hello>", false);
+    }
+
+    public void testInOut() throws Exception {
+        testInOut("<hello>world</hello>", true);
+    }
 
        public void testPerfInOnlyWithBigMessage() throws Exception {
                int nbRuns = 10;


Reply via email to