You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2009/07/02 13:37:39 UTC

svn commit: r790553 - in /cxf/trunk: api/src/main/java/org/apache/cxf/feature/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/ systests/src/test/java/org/apache/cxf/systest/jaxrs/

Author: sergeyb
Date: Thu Jul  2 11:37:39 2009
New Revision: 790553

URL: http://svn.apache.org/viewvc?rev=790553&view=rev
Log:
[CXF-2323] : Support for features in JAX-RS clients (patch from Eamonn with minor modifications, thanks)

Added:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java   (with props)
Modified:
    cxf/trunk/api/src/main/java/org/apache/cxf/feature/AbstractFeature.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/feature/AbstractFeature.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/feature/AbstractFeature.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/feature/AbstractFeature.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/feature/AbstractFeature.java Thu Jul  2 11:37:39 2009
@@ -43,6 +43,10 @@
         initializeProvider(client, bus);
     }
     
+    public void initialize(InterceptorProvider interceptorProvider, Bus bus) {
+        initializeProvider(interceptorProvider, bus);
+    }
+    
     public void initialize(Bus bus) {
         initializeProvider(bus, bus);
     }
@@ -71,4 +75,4 @@
         }
         return active;
     }
-}
\ No newline at end of file
+}

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Thu Jul  2 11:37:39 2009
@@ -50,7 +50,6 @@
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.i18n.BundleUtils;
 import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.common.util.ModCountCopyOnWriteArrayList;
 import org.apache.cxf.endpoint.ConduitSelector;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.helpers.IOUtils;
@@ -75,23 +74,17 @@
  *
  */
 public class AbstractClient implements Client, InvocationHandlerAware {
-
     private static final Logger LOG = LogUtils.getL7dLogger(AbstractClient.class);
     private static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractClient.class);
-    
-    protected List<Interceptor> inInterceptors = new ModCountCopyOnWriteArrayList<Interceptor>();
-    protected List<Interceptor> outInterceptors = new ModCountCopyOnWriteArrayList<Interceptor>();
-    protected ConduitSelector conduitSelector;
-    protected Bus bus;
 
+    protected ClientConfiguration cfg = new ClientConfiguration();
+    
     private MultivaluedMap<String, String> requestHeaders = new MetadataMap<String, String>();
     private ResponseBuilder responseBuilder;
     
     private URI baseURI;
     private UriBuilder currentBuilder;
 
-    
-    
     protected AbstractClient(URI baseURI, URI currentURI) {
         this.baseURI = baseURI;
         this.currentBuilder = new UriBuilderImpl(currentURI);
@@ -485,31 +478,31 @@
         }
     }
     
-    protected void setConduitSelector(ConduitSelector cs) {
-        this.conduitSelector = cs;
+    protected ClientConfiguration getConfiguration() {
+        return cfg;
     }
     
-    protected void setBus(Bus bus) {
-        this.bus = bus;
+    protected void setConfiguration(ClientConfiguration config) {
+        cfg = config;
     }
     
     protected void prepareConduitSelector(Message message) {
-        conduitSelector.prepare(message);
-        message.getExchange().put(ConduitSelector.class, conduitSelector);
+        cfg.getConduitSelector().prepare(message);
+        message.getExchange().put(ConduitSelector.class, cfg.getConduitSelector());
     }
     
     protected PhaseInterceptorChain setupOutInterceptorChain(Endpoint endpoint) { 
-        PhaseManager pm = bus.getExtension(PhaseManager.class);
-        List<Interceptor> i1 = bus.getOutInterceptors();
-        List<Interceptor> i2 = outInterceptors;
+        PhaseManager pm = cfg.getBus().getExtension(PhaseManager.class);
+        List<Interceptor> i1 = cfg.getBus().getOutInterceptors();
+        List<Interceptor> i2 = cfg.getOutInterceptors();
         List<Interceptor> i3 = endpoint.getOutInterceptors();
         return new PhaseChainCache().get(pm.getOutPhases(), i1, i2, i3);
     }
     
     protected PhaseInterceptorChain setupInInterceptorChain(Endpoint endpoint) { 
-        PhaseManager pm = bus.getExtension(PhaseManager.class);
-        List<Interceptor> i1 = bus.getInInterceptors();
-        List<Interceptor> i2 = inInterceptors;
+        PhaseManager pm = cfg.getBus().getExtension(PhaseManager.class);
+        List<Interceptor> i1 = cfg.getBus().getInInterceptors();
+        List<Interceptor> i2 = cfg.getInInterceptors();
         List<Interceptor> i3 = endpoint.getInInterceptors();
         return new PhaseChainCache().get(pm.getInPhases(), i1, i2, i3);
     }
@@ -523,7 +516,7 @@
     protected Message createMessage(String httpMethod, 
                                     MultivaluedMap<String, String> headers,
                                     URI currentURI) {
-        Message m = conduitSelector.getEndpoint().getBinding().createMessage();
+        Message m = cfg.getConduitSelector().getEndpoint().getBinding().createMessage();
         m.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
         m.put(Message.INBOUND_MESSAGE, Boolean.FALSE);
         
@@ -538,13 +531,13 @@
         Exchange exchange = new ExchangeImpl();
         exchange.setSynchronous(true);
         exchange.setOutMessage(m);
-        exchange.put(Bus.class, bus);
+        exchange.put(Bus.class, cfg.getBus());
         exchange.put(MessageObserver.class, new ClientMessageObserver());
-        exchange.put(Endpoint.class, conduitSelector.getEndpoint());
+        exchange.put(Endpoint.class, cfg.getConduitSelector().getEndpoint());
         exchange.setOneWay(false);
         m.setExchange(exchange);
         
-        PhaseInterceptorChain chain = setupOutInterceptorChain(conduitSelector.getEndpoint());
+        PhaseInterceptorChain chain = setupOutInterceptorChain(cfg.getConduitSelector().getEndpoint());
         m.setInterceptorChain(chain);
         
         //setup conduit selector
@@ -553,26 +546,18 @@
         return m;
     }
 
-    protected void setInInterceptors(List<Interceptor> interceptors) {
-        inInterceptors = interceptors;
-    }
-    
-    protected void setOutInterceptors(List<Interceptor> interceptors) {
-        outInterceptors = interceptors;
-    }
-    
     private class ClientMessageObserver implements MessageObserver {
 
         public void onMessage(Message m) {
             
-            Message message = conduitSelector.getEndpoint().getBinding().createMessage(m);
+            Message message = cfg.getConduitSelector().getEndpoint().getBinding().createMessage(m);
             message.put(Message.REQUESTOR_ROLE, Boolean.FALSE);
             message.put(Message.INBOUND_MESSAGE, Boolean.TRUE);
-            PhaseInterceptorChain chain = setupInInterceptorChain(conduitSelector.getEndpoint());
+            PhaseInterceptorChain chain = setupInInterceptorChain(cfg.getConduitSelector().getEndpoint());
             message.setInterceptorChain(chain);
             message.getExchange().setInMessage(message);
             Bus origBus = BusFactory.getThreadDefaultBus(false);
-            BusFactory.setThreadDefaultBus(bus);
+            BusFactory.setThreadDefaultBus(cfg.getBus());
 
             // execute chain
             try {
@@ -587,4 +572,6 @@
     public Object getInvocationHandler() {
         return this;
     }
+
+
 }

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java?rev=790553&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java Thu Jul  2 11:37:39 2009
@@ -0,0 +1,85 @@
+/**
+ * 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.cxf.jaxrs.client;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.common.util.ModCountCopyOnWriteArrayList;
+import org.apache.cxf.endpoint.ConduitSelector;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.InterceptorProvider;
+
+public class ClientConfiguration implements InterceptorProvider {
+
+    private List<Interceptor> inInterceptors = new ModCountCopyOnWriteArrayList<Interceptor>();
+    private List<Interceptor> outInterceptors = new ModCountCopyOnWriteArrayList<Interceptor>();
+    private List<Interceptor> outFault  = new ModCountCopyOnWriteArrayList<Interceptor>();
+    private List<Interceptor> inFault  = new ModCountCopyOnWriteArrayList<Interceptor>();
+    private ConduitSelector conduitSelector;
+    private Bus bus;
+
+    public void setConduitSelector(ConduitSelector cs) {
+        this.conduitSelector = cs;
+    }
+    
+    public ConduitSelector getConduitSelector() {
+        return conduitSelector;
+    }
+    
+    public void setBus(Bus bus) {
+        this.bus = bus;
+    }
+    
+    public Bus getBus() {
+        return bus;
+    }
+    
+    public List<Interceptor> getInFaultInterceptors() {
+        return inFault;
+    }
+
+    public List<Interceptor> getInInterceptors() {
+        return inInterceptors;
+    }
+
+    public List<Interceptor> getOutFaultInterceptors() {
+        return outFault;
+    }
+
+    public List<Interceptor> getOutInterceptors() {
+        return outInterceptors;
+    }
+
+    public void setInInterceptors(List<Interceptor> interceptors) {
+        inInterceptors = interceptors;
+    }
+
+    public void setOutInterceptors(List<Interceptor> interceptors) {
+        outInterceptors = interceptors;
+    }
+    
+    public void setInFaultInterceptors(List<Interceptor> interceptors) {
+        inFault = interceptors;
+    }
+
+    public void setOutFaultInterceptors(List<Interceptor> interceptors) {
+        outFault = interceptors;
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientConfiguration.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Thu Jul  2 11:37:39 2009
@@ -145,10 +145,7 @@
                 reportInvalidResourceMethod(m, "INVALID_SUBRESOURCE");
             }
             ClientProxyImpl proxyImpl = new ClientProxyImpl(getBaseURI(), uri, subCri, false, inheritHeaders);
-            proxyImpl.setBus(bus);
-            proxyImpl.setConduitSelector(conduitSelector);
-            proxyImpl.setInInterceptors(inInterceptors);
-            proxyImpl.setOutInterceptors(outInterceptors);
+            proxyImpl.setConfiguration(getConfiguration());
             
             Object proxy = JAXRSClientFactory.create(m.getReturnType(), proxyImpl);
             if (inheritHeaders) {

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBean.java Thu Jul  2 11:37:39 2009
@@ -29,6 +29,7 @@
 import org.apache.cxf.endpoint.ConduitSelector;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.endpoint.UpfrontConduitSelector;
+import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean;
 import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
 import org.apache.cxf.jaxrs.JAXRSServiceImpl;
@@ -167,14 +168,22 @@
             ep.getEndpointInfo().addExtensor(authPolicy);
         }
         
-        
-        client.setConduitSelector(getConduitSelector(ep));
-        client.setBus(getBus());
-        client.setOutInterceptors(getOutInterceptors());
-        client.setInInterceptors(getInInterceptors());
+        applyFeatures(client);
+        client.getConfiguration().setConduitSelector(getConduitSelector(ep));
+        client.getConfiguration().setBus(getBus());
+        client.getConfiguration().getOutInterceptors().addAll(getOutInterceptors());
+        client.getConfiguration().getInInterceptors().addAll(getInInterceptors());
         if (headers != null) {
             client.headers(headers);
         }
         setupFactory(ep);
     }
+    
+    protected void applyFeatures(AbstractClient client) {
+        if (getFeatures() != null) {
+            for (AbstractFeature feature : getFeatures()) {
+                feature.initialize(client.getConfiguration(), getBus());
+            }
+        }
+    }
 } 

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Thu Jul  2 11:37:39 2009
@@ -536,10 +536,7 @@
     static void copyProperties(Client toClient, Client fromClient) {
         AbstractClient newClient = toAbstractClient(toClient);
         AbstractClient oldClient = toAbstractClient(fromClient);
-        newClient.bus = oldClient.bus;
-        newClient.conduitSelector = oldClient.conduitSelector;
-        newClient.inInterceptors = oldClient.inInterceptors;
-        newClient.outInterceptors = oldClient.outInterceptors;
+        newClient.setConfiguration(oldClient.getConfiguration());
     }
     
     private static AbstractClient toAbstractClient(Client client) {

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/JAXRSClientFactoryBeanTest.java Thu Jul  2 11:37:39 2009
@@ -19,8 +19,18 @@
 
 package org.apache.cxf.jaxrs.client;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.feature.AbstractFeature;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.InterceptorProvider;
 import org.apache.cxf.jaxrs.resources.BookStore;
 import org.apache.cxf.jaxrs.resources.BookStoreSubresourcesOnly;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -68,4 +78,57 @@
                      WebClient.client(store2).getCurrentURI().toString());
     }
     
+    @Test
+    public void testAddLoggingToClient() throws Exception {
+        JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+        bean.setAddress("http://bar");
+        bean.setResourceClass(BookStoreSubresourcesOnly.class);
+        TestFeature testFeature = new TestFeature();
+        List<AbstractFeature> features = new ArrayList<AbstractFeature>();
+        features.add((AbstractFeature)testFeature);
+        bean.setFeatures(features);
+        
+        BookStoreSubresourcesOnly store = bean.create(BookStoreSubresourcesOnly.class, 1, 2, 3);
+        assertTrue("TestFeature wasn't initialized", testFeature.isInitialized());
+        BookStoreSubresourcesOnly store2 = store.getItself3("id4");
+        assertEquals("http://bar/bookstore/1/2/3/id4/sub3", 
+                     WebClient.client(store2).getCurrentURI().toString());
+    }
+    
+    
+    private class TestFeature extends AbstractFeature {
+        private TestInterceptor testInterceptor;
+
+        @Override
+        protected void initializeProvider(InterceptorProvider provider, Bus bus) {
+            testInterceptor = new TestInterceptor();
+            provider.getOutInterceptors().add(testInterceptor);
+        }
+
+        protected boolean isInitialized() {
+            return testInterceptor.isInitialized();
+        }
+    }
+ 
+    private class TestInterceptor extends AbstractPhaseInterceptor<Message> {
+        private boolean isInitialized;
+
+        public TestInterceptor() {
+            this(Phase.PRE_STREAM);
+        }
+
+        public TestInterceptor(String s) {
+            super(Phase.PRE_STREAM);
+            isInitialized = true;
+        } 
+
+        public void handleMessage(Message message) throws Fault {
+        }
+
+        protected boolean isInitialized() {
+            return isInitialized;
+        }
+
+    }
+    
 }

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=790553&r1=790552&r2=790553&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Thu Jul  2 11:37:39 2009
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -40,8 +41,11 @@
 import org.apache.commons.httpclient.methods.FileRequestEntity;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.cxf.Bus;
+import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.InterceptorProvider;
 import org.apache.cxf.io.CachedOutputStream;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
@@ -389,6 +393,23 @@
             getStringFromInputStream(getHttpInputStream("http://localhost:9092/test/services"));
         assertNotNull(listings);
     }
+    
+    @Test
+    public void testAddFeatureToClient() throws Exception {
+        String baseAddress = "http://localhost:9092/test/services/rest";
+        JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+        bean.setAddress(baseAddress);
+        bean.setResourceClass(BookStoreJaxrsJaxws.class);
+        TestFeature testFeature = new TestFeature();
+        List<AbstractFeature> features = new ArrayList<AbstractFeature>();
+        features.add((AbstractFeature)testFeature);
+        bean.setFeatures(features);
+        BookStoreJaxrsJaxws proxy = (BookStoreJaxrsJaxws)bean.create();
+        Book b = proxy.getBook(new Long("123"));
+        assertTrue("Interceptor not invoked", testFeature.handleMessageCalled());
+        assertEquals(123, b.getId());
+        assertEquals("CXF in Action", b.getName());
+    }
 
     private String getStringFromInputStream(InputStream in) throws Exception {        
         CachedOutputStream bos = new CachedOutputStream();
@@ -427,7 +448,7 @@
         }
         
     }
-    
+
     @Ignore 
     public class TestStreamDrainInterptor extends AbstractPhaseInterceptor<Message> {
         public TestStreamDrainInterptor() {
@@ -444,7 +465,7 @@
                 // input stream will be closed by readBytesFromStream()
                 payload = IOUtils.readBytesFromStream(is);
                 assertTrue("payload was null", payload != null);
-                assertTrue("payload was EMPTYR", payload.length > 0);
+                assertTrue("payload was EMPTY", payload.length > 0);
                 message.setContent(InputStream.class, new ByteArrayInputStream(payload));
             } catch (Exception e) {
                 String error = "Failed to read the stream properly due to " + e.getMessage();
@@ -453,4 +474,41 @@
         }
 
     }
+    
+    @Ignore
+    private class TestFeature extends AbstractFeature {
+        private TestInterceptor testInterceptor;
+
+        @Override
+        protected void initializeProvider(InterceptorProvider provider, Bus bus) {
+            testInterceptor = new TestInterceptor();
+            provider.getOutInterceptors().add(testInterceptor);
+        }
+
+        protected boolean handleMessageCalled() {
+            return testInterceptor.handleMessageCalled();
+        }
+    }
+ 
+    @Ignore
+    private class TestInterceptor extends AbstractPhaseInterceptor<Message> {
+        private boolean handleMessageCalled;
+        public TestInterceptor() {
+            this(Phase.PRE_STREAM);
+        }
+
+        public TestInterceptor(String s) {
+            super(Phase.PRE_STREAM);
+            
+        } 
+
+        public void handleMessage(Message message) throws Fault {
+            handleMessageCalled = true;
+        }
+
+        protected boolean handleMessageCalled() {
+            return handleMessageCalled;
+        }
+
+    }
 }