You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by an...@apache.org on 2007/04/26 19:46:37 UTC

svn commit: r532823 - in /incubator/cxf/trunk: api/src/main/java/org/apache/cxf/message/ api/src/main/java/org/apache/cxf/phase/ rt/core/src/main/java/org/apache/cxf/interceptor/ rt/core/src/main/java/org/apache/cxf/service/invoker/ rt/ws/addr/src/main...

Author: andreasmyth
Date: Thu Apr 26 10:46:35 2007
New Revision: 532823

URL: http://svn.apache.org/viewvc?view=rev&rev=532823
Log:
* Enable outbound server side MAPCodec to process faults thrown on inbound interceptor chain before MAPAggregator.
* Allow interceptors to distinguish between application and runtime faults.

Added:
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java   (with props)
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java   (with props)
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java   (with props)
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java   (with props)
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml   (with props)
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml   (with props)
    incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java   (with props)
    incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java   (with props)
Modified:
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageUtils.java
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseComparator.java
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainInitiatorObserver.java
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
    incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
    incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/ControlImpl.java
    incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/Server.java
    incubator/cxf/trunk/testutils/src/main/resources/wsdl/greeter_control.wsdl

Added: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java (added)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,37 @@
+/**
+ * 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.message;
+
+/**
+ * 
+ */
+public enum FaultMode {
+    
+    RUNTIME_FAULT ("org.apache.cxf.runtime.fault"),
+    LOGICAL_RUNTIME_FAULT ("org.apache.cxf.runtime.fault.logical"),
+    CHECKED_APPLICATION_FAULT ("org.apache.cxf.application.fault.checked"),
+    UNCHECKED_APPLICATION_FAULT ("org.apache.cxf.application.fault.unchecked");
+    
+    String mode;
+    
+    FaultMode(String m) {
+        mode = m;
+    }
+}

Propchange: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/FaultMode.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageUtils.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageUtils.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageUtils.java Thu Apr 26 10:46:35 2007
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.message;
 
+
 /**
  * Holder for utility methods relating to messages.
  */
@@ -53,6 +54,27 @@
                && message.getExchange() != null
                && (message == message.getExchange().getInFaultMessage() || message == message.getExchange()
                    .getOutFaultMessage());
+    }
+    
+    /**
+     * Determine the fault mode for the underlying (fault) message 
+     * (for use on server side only).
+     * 
+     * @param message the fault message
+     * @return the FaultMode
+     */
+    public static FaultMode getFaultMode(Message message) {
+        if (message != null
+            && message.getExchange() != null
+            && message == message.getExchange().getOutFaultMessage()) {
+            FaultMode mode = message.get(FaultMode.class);
+            if (null != mode) {
+                return mode;
+            } else {
+                return FaultMode.RUNTIME_FAULT;
+            }
+        }
+        return null;    
     }
 
     /**

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseComparator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseComparator.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseComparator.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseComparator.java Thu Apr 26 10:46:35 2007
@@ -21,7 +21,7 @@
 
 import java.util.Comparator;
 
-class PhaseComparator implements Comparator<Phase> {
+public class PhaseComparator implements Comparator<Phase> {
 
     public int compare(Phase o1, Phase o2) {
         return o1.getPriority() - o2.getPriority();

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainInitiatorObserver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainInitiatorObserver.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainInitiatorObserver.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/AbstractFaultChainInitiatorObserver.java Thu Apr 26 10:46:35 2007
@@ -27,6 +27,7 @@
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.Phase;
 import org.apache.cxf.phase.PhaseInterceptorChain;
@@ -44,7 +45,7 @@
 
     public void onMessage(Message message) {
       
-        assert  null != message;
+        assert null != message;
         Exchange exchange = message.getExchange();
 
         Message faultMessage = null;
@@ -57,12 +58,16 @@
             if (!(ex instanceof Fault)) {
                 ex = new Fault(ex);
             }
+            FaultMode mode = (FaultMode)message.get(FaultMode.class);
             
             faultMessage = exchange.getOutMessage();
             if (null == faultMessage) {
                 faultMessage = exchange.get(Endpoint.class).getBinding().createMessage();
             }
             faultMessage.setContent(Exception.class, ex);
+            if (null != mode) {
+                faultMessage.put(FaultMode.class, mode);
+            }
             assert exchange.get(Exception.class) == ex;
             exchange.setOutMessage(null);
             exchange.setOutFaultMessage(faultMessage);

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java Thu Apr 26 10:46:35 2007
@@ -29,6 +29,7 @@
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.service.model.BindingOperationInfo;
 
@@ -80,8 +81,10 @@
             if (t == null) {
                 t = e;
             }
+            exchange.getInMessage().put(FaultMode.class, FaultMode.CHECKED_APPLICATION_FAULT);
             throw new Fault(t);
         } catch (Exception e) {
+            exchange.getInMessage().put(FaultMode.class, FaultMode.UNCHECKED_APPLICATION_FAULT);
             throw new Fault(e);
         }
     }

Modified: incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java (original)
+++ incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java Thu Apr 26 10:46:35 2007
@@ -36,6 +36,7 @@
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
@@ -249,6 +250,8 @@
             boolean isOneway = message.getExchange().isOneWay();
             continueProcessing = validateIncomingMAPs(maps, message);
             if (continueProcessing) {
+                // any faults thrown from here on can be correlated with this message
+                message.put(FaultMode.class, FaultMode.LOGICAL_RUNTIME_FAULT);
                 if (isOneway
                     || !ContextUtils.isGenericAddress(maps.getReplyTo())) {
                     ContextUtils.rebaseResponse(maps.getReplyTo(),

Modified: incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java (original)
+++ incubator/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java Thu Apr 26 10:46:35 2007
@@ -569,7 +569,7 @@
      * @param maps the addressing properties
      */
     private void restoreExchange(SoapMessage message, AddressingProperties maps) {
-        if (maps.getRelatesTo() != null) {
+        if (maps != null && maps.getRelatesTo() != null) {
             Exchange correlatedExchange =
                 uncorrelatedExchanges.remove(maps.getRelatesTo().getValue());
             if (correlatedExchange != null) {
@@ -595,7 +595,7 @@
      * @param message the current message
      */
     private void markPartialResponse(SoapMessage message, AddressingProperties maps) {
-        if (ContextUtils.isRequestor(message) && null == maps.getRelatesTo()) {
+        if (ContextUtils.isRequestor(message) && null != maps && null == maps.getRelatesTo()) {
             message.put(Message.PARTIAL_RESPONSE_MESSAGE, Boolean.TRUE);
         } 
     }

Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,60 @@
+/**
+ * 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.systest.interceptor;
+
+import org.apache.cxf.greeter_control.PingMeFault;
+import org.apache.cxf.greeter_control.types.FaultDetail;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.FaultMode;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+/**
+ * 
+ */
+public class FaultHandlingInterceptor extends AbstractPhaseInterceptor {
+    
+    public FaultHandlingInterceptor() {
+        super.setPhase(Phase.USER_LOGICAL);
+    }
+    
+    public synchronized void handleMessage(Message message) throws Fault {
+        FaultMode mode = MessageUtils.getFaultMode(message);
+        System.out.println("FaultMode: " + mode);
+        if (null != mode) {
+            Throwable cause = message.getContent(Exception.class).getCause();
+            
+            if (FaultMode.CHECKED_APPLICATION_FAULT == mode) {
+                PingMeFault original = (PingMeFault)cause;                
+                FaultDetail detail = new FaultDetail();
+                detail.setMajor((short)20);
+                detail.setMinor((short)10);
+                PingMeFault replaced = new PingMeFault(original.getMessage(), detail);
+                message.setContent(Exception.class, new Fault(replaced));
+            } else {
+                RuntimeException original = (RuntimeException)cause;
+                RuntimeException replaced = new RuntimeException(original.getMessage().toUpperCase());
+                message.setContent(Exception.class, new Fault(replaced));                
+            }
+        }
+    }
+}

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/FaultHandlingInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,36 @@
+/**
+ * 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.systest.interceptor;
+
+import javax.jws.WebService;
+
+import org.apache.cxf.greeter_control.AbstractGreeterImpl;
+
+/**
+ * 
+ */
+
+@WebService(serviceName = "BasicGreeterService",
+            portName = "GreeterPort",
+            endpointInterface = "org.apache.cxf.greeter_control.Greeter",
+            targetNamespace = "http://cxf.apache.org/greeter_control",
+            wsdlLocation = "testutils/greeter_control.wsdl")
+public class GreeterImpl extends AbstractGreeterImpl {
+}

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/GreeterImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,350 @@
+/**
+ * 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.systest.interceptor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.WebServiceException;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.greeter_control.Control;
+import org.apache.cxf.greeter_control.ControlImpl;
+import org.apache.cxf.greeter_control.ControlService;
+import org.apache.cxf.greeter_control.FaultThrowingInterceptor;
+import org.apache.cxf.greeter_control.Greeter;
+import org.apache.cxf.greeter_control.GreeterService;
+import org.apache.cxf.greeter_control.PingMeFault;
+import org.apache.cxf.greeter_control.types.FaultLocation;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.phase.PhaseComparator;
+import org.apache.cxf.phase.PhaseManager;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.cxf.ws.addressing.MAPAggregator;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class InterceptorFaultTest extends AbstractBusClientServerTestBase {
+    private static final Logger LOG = Logger.getLogger(InterceptorFaultTest.class.getName());
+
+    private static final QName SOAP_FAULT_CODE = new QName("http://schemas.xmlsoap.org/soap/envelope/",
+                                                           "Server");
+    private static final String FAULT_CODE = "COULD_NOT_SEND";
+    private static final String FAULT_MESSAGE = "Could not send Message.";
+    
+    private static final String CONTROL_PORT_ADDRESS = 
+        "http://localhost:9001/SoapContext/ControlPort";
+    
+    private static int decoupledEndpointPort = 10000;
+    private static String decoupledEndpoint;
+    
+
+    /**
+     * Tests that a fault thrown by a server side interceptor is reported back to
+     * the client in appropriate form (plain Fault in case of one way requests, 
+     * SoapFault in case of two way requests).
+     * Also demonstrates how an interceptor on the server out fault chain can 
+     * distinguish different fault modes (the capability to do so is crucial to
+     * QOS interceptors such as the RM, addressing and policy interceptors).
+     *
+     */
+    public static class Server extends AbstractBusTestServerBase {
+
+        protected void run() {
+            SpringBusFactory factory = new SpringBusFactory();
+            Bus bus = factory.createBus();
+            BusFactory.setDefaultBus(bus);
+            setBus(bus);
+
+            ControlImpl implementor = new ControlImpl();
+            GreeterImpl greeterImplementor = new GreeterImpl();
+            greeterImplementor.setThrowAlways(true);
+            implementor.setImplementor(greeterImplementor);
+            Endpoint.publish(CONTROL_PORT_ADDRESS, implementor);
+            LOG.fine("Published control endpoint.");
+        }
+
+        public static void main(String[] args) {
+            try {
+                Server s = new Server();
+                s.start();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                System.exit(-1);
+            } finally {
+                System.out.println("done!");
+            }
+        }
+    }
+    
+    private Bus controlBus;
+    private Control control;
+    private Bus greeterBus;
+    private Greeter greeter;
+    private List<Phase> inPhases;
+    private PhaseComparator comparator;
+    private Phase preLogicalPhase;
+    
+    
+
+    @BeforeClass
+    public static void startServers() throws Exception {
+        assertTrue("server did not launch correctly", launchServer(Server.class));
+    }
+    
+    @After
+    public void tearDown() {
+        if (null != greeter) {
+            assertTrue("Failed to stop greeter.", control.stopGreeter());
+            greeterBus.shutdown(true);
+            greeterBus = null;
+        }
+        if (null != control) {  
+            assertTrue("Failed to stop greeter", control.stopGreeter());
+            controlBus.shutdown(true);
+        }
+    }
+
+    @Test
+    public void testWithoutAddressing() throws Exception {
+        
+        setupGreeter("org/apache/cxf/systest/interceptor/no-addr.xml", false);
+
+        // all interceptors pass
+
+        greeter.greetMeOneWay("one");
+        assertEquals("one", greeter.greetMe("two"));
+        try {
+            greeter.pingMe();
+            fail("Expected PingMeFault not thrown.");
+        } catch (PingMeFault f) {
+            assertEquals(20, (int)f.getFaultInfo().getMajor());
+            assertEquals(10, (int)f.getFaultInfo().getMinor());
+        }
+
+        // behaviour is identicial for all phases
+        
+        Iterator<Phase> it = inPhases.iterator();
+        Phase p = null;
+        FaultLocation location = new org.apache.cxf.greeter_control.types.ObjectFactory()
+            .createFaultLocation();        
+        
+        while (it.hasNext()) {
+            p = it.next();
+            location.setPhase(p.getName());
+            if (Phase.INVOKE.equals(p.getName())) {
+                break;
+            }             
+            testFail(location);
+        }
+    }
+    
+    @Test
+    public void testWithAddressingAnonymousReplies() throws Exception {
+        setupGreeter("org/apache/cxf/systest/interceptor/addr.xml", false);
+
+        // all interceptors pass
+
+        greeter.greetMeOneWay("one");
+        assertEquals("one", greeter.greetMe("two"));
+        try {
+            greeter.pingMe();
+            fail("Expected PingMeFault not thrown.");
+        } catch (PingMeFault f) {
+            assertEquals(20, (int)f.getFaultInfo().getMajor());
+            assertEquals(10, (int)f.getFaultInfo().getMinor());
+        }
+        
+        // test failure in phases before Phase.PRE_LOGICAL
+        
+        Iterator<Phase> it = inPhases.iterator();
+        Phase p = null;
+        FaultLocation location = new org.apache.cxf.greeter_control.types.ObjectFactory()
+            .createFaultLocation();
+        location.setAfter(MAPAggregator.class.getName());
+        
+        // test failure occuring before logical addressing interceptor 
+
+        while (it.hasNext()) {
+            p = it.next();
+            location.setPhase(p.getName());
+            if (Phase.PRE_LOGICAL.equals(p.getName())) {
+                break;
+            }   
+            testFail(location, true);
+        }
+        
+        // test failure occuring after logical addressing interceptor -
+        // won't get a fault in case of oneways (partial response already sent)
+        
+        do {  
+            location.setPhase(p.getName());
+            if (Phase.INVOKE.equals(p.getName())) {
+                break;
+            }             
+            testFail(location, true);
+            p = it.hasNext() ? it.next() : null;
+        } while (null != p);
+    }
+    
+    @Ignore
+    @Test
+    public void testWithAddressingNonAnonymousReplies() {
+    }
+    
+    private void testFail(FaultLocation location) throws PingMeFault {
+        testFail(location, false);
+    }
+   
+    private void testFail(FaultLocation location, boolean usingAddressing) throws PingMeFault {
+        // System.out.print("Test interceptor failing in phase: " + location.getPhase()); 
+        
+        control.setFaultLocation(location);       
+       
+        String expectedMsg = getExpectedInterceptorFaultMessage(location.getPhase());
+
+        // oneway reports a plain fault (although server sends a soap fault)
+
+        boolean expectOnewayFault = !usingAddressing 
+            || comparator.compare(preLogicalPhase, getPhase(location.getPhase())) > 0;
+        
+        try {
+            greeter.greetMeOneWay("oneway");
+            if (expectOnewayFault) {
+                fail("Oneway operation unexpectedly succeded.");
+            }
+        } catch (WebServiceException ex) {
+            if (!expectOnewayFault) {
+                fail("Oeway operation unexpectedly failed.");
+            }
+            Throwable cause = ex.getCause();
+            Fault f = (Fault)cause;
+            assertEquals(FAULT_CODE, f.getCode());
+            assertEquals(FAULT_MESSAGE, f.getMessage());
+        }
+        
+        try {
+            greeter.greetMe("cxf");
+            fail("Twoway operation unexpectedly succeded.");
+        } catch (WebServiceException ex) {
+            Throwable cause = ex.getCause();
+            SoapFault sf = (SoapFault)cause;
+            assertEquals(expectedMsg, sf.getReason());
+            assertEquals(SOAP_FAULT_CODE, sf.getFaultCode());
+            assertNull(sf.getDetail());
+        }
+        
+        try {
+            greeter.pingMe();
+            fail("Expected PingMeFault not thrown.");
+        } catch (WebServiceException ex) {
+            Throwable cause = ex.getCause();
+            SoapFault sf = (SoapFault)cause;
+            assertEquals(expectedMsg, sf.getReason());
+            assertEquals(SOAP_FAULT_CODE, sf.getFaultCode());
+            assertNull(sf.getDetail());
+        }  
+    }
+   
+    
+    
+    private void setupGreeter(String cfgResource, boolean useDecoupledEndpoint) {
+        
+        SpringBusFactory bf = new SpringBusFactory();
+        
+        controlBus = bf.createBus();
+        BusFactory.setDefaultBus(controlBus);
+
+        ControlService cs = new ControlService();
+        control = cs.getControlPort();
+        
+        assertTrue("Failed to start greeter", control.startGreeter(cfgResource));
+        
+        greeterBus = bf.createBus(cfgResource);
+        BusFactory.setDefaultBus(greeterBus);
+        LOG.fine("Initialised greeter bus with configuration: " + cfgResource);
+        
+        if (null == comparator) {
+            comparator = new PhaseComparator();
+        }
+        if (null == inPhases) {
+            inPhases = new ArrayList<Phase>();
+            inPhases.addAll(greeterBus.getExtension(PhaseManager.class).getInPhases());
+            Collections.sort(inPhases, comparator);
+        }        
+        if (null == preLogicalPhase) {
+            preLogicalPhase = getPhase(Phase.PRE_LOGICAL);
+        }
+       
+        GreeterService gs = new GreeterService();
+
+        greeter = gs.getGreeterPort();
+        LOG.fine("Created greeter client.");
+       
+        if (!useDecoupledEndpoint) {
+            return;
+        }
+
+        // programatically configure decoupled endpoint that is guaranteed to
+        // be unique across all test cases
+        
+        decoupledEndpointPort--;
+        decoupledEndpoint = "http://localhost:" + decoupledEndpointPort + "/decoupled_endpoint";
+
+        Client c = ClientProxy.getClient(greeter);
+        HTTPConduit hc = (HTTPConduit)(c.getConduit());
+        HTTPClientPolicy cp = hc.getClient();
+        cp.setDecoupledEndpoint(decoupledEndpoint);
+
+        LOG.fine("Using decoupled endpoint: " + cp.getDecoupledEndpoint());
+    }
+
+    private String getExpectedInterceptorFaultMessage(String phase) {
+        return FaultThrowingInterceptor.MESSAGE_FORMAT.format(new Object[] {phase}).toUpperCase();
+    }
+    
+    private Phase getPhase(String name) {
+        for (Phase p : inPhases) {
+            if (p.getName().equals(name)) {
+                return p;
+            }
+        }
+        return null;
+    }
+}

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/InterceptorFaultTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml Thu Apr 26 10:46:35 2007
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:http="http://cxf.apache.org/transports/http/configuration"
+       xsi:schemaLocation="
+http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schema/transports/http.xsd
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    <bean id="mapAggregator" class="org.apache.cxf.ws.addressing.MAPAggregator"/>
+    <bean id="mapCodec" class="org.apache.cxf.ws.addressing.soap.MAPCodec"/>
+    <bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+    <bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+    <bean id="catcher" class="org.apache.cxf.systest.interceptor.FaultHandlingInterceptor"/>
+    
+    <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
+        <property name="inInterceptors">
+            <list>
+                <ref bean="logIn"/>
+                <ref bean="mapCodec"/>
+                <ref bean="mapAggregator"/>
+            </list>
+        </property>
+        <property name="outInterceptors">
+            <list>
+                <ref bean="logOut"/>
+                <ref bean="mapCodec"/>
+                <ref bean="mapAggregator"/>
+            </list>
+        </property>
+        <property name="outFaultInterceptors">
+            <list>
+                <ref bean="logOut"/>
+                <ref bean="catcher"/>
+                <ref bean="mapCodec"/>
+                <ref bean="mapAggregator"/>
+            </list>
+        </property>
+        <property name="inFaultInterceptors">
+            <list>
+                <ref bean="mapCodec"/>
+                <ref bean="mapAggregator"/>
+            </list>
+        </property>
+    </bean>
+    
+</beans>

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/addr.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml Thu Apr 26 10:46:35 2007
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:http="http://cxf.apache.org/transports/http/configuration"
+       xsi:schemaLocation="
+http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schema/transports/http.xsd
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    
+    <bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
+    <bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
+    <bean id="catcher" class="org.apache.cxf.systest.interceptor.FaultHandlingInterceptor"/>
+    
+    <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl">
+        <property name="inInterceptors">
+            <list>
+                <ref bean="logIn"/>
+            </list>
+        </property>
+        <property name="outInterceptors">
+            <list>
+                <ref bean="logOut"/>
+            </list>
+        </property>
+        <property name="outFaultInterceptors">
+            <list>
+                <ref bean="logOut"/>
+                <ref bean="catcher"/>
+            </list>
+        </property>
+    </bean>
+    
+</beans>

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/interceptor/no-addr.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/ControlImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/ControlImpl.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/ControlImpl.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/ControlImpl.java Thu Apr 26 10:46:35 2007
@@ -20,51 +20,27 @@
 
 package org.apache.cxf.systest.ws.rm;
 
-import java.util.concurrent.Future;
 import java.util.logging.Logger;
 
 import javax.jws.WebService;
-import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Endpoint;
-import javax.xml.ws.Response;
 
-import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.spring.SpringBusFactory;
-import org.apache.cxf.greeter_control.Control;
-import org.apache.cxf.greeter_control.types.StartGreeterResponse;
-import org.apache.cxf.greeter_control.types.StopGreeterResponse;
-import org.apache.cxf.systest.ws.util.InMessageRecorder;
-import org.apache.cxf.systest.ws.util.OutMessageRecorder;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
 import org.apache.cxf.ws.rm.RMManager;
 
-
 @WebService(serviceName = "ControlService", 
             portName = "ControlPort", 
             endpointInterface = "org.apache.cxf.greeter_control.Control", 
             targetNamespace = "http://cxf.apache.org/greeter_control")
-public class ControlImpl implements Control {
+public class ControlImpl  extends org.apache.cxf.greeter_control.ControlImpl {
     
     private static final Logger LOG = Logger.getLogger(ControlImpl.class.getName());
-    private Endpoint endpoint;
-    private Bus greeterBus;
     
-    public boolean startGreeter(String cfgResource) {
-       
-        SpringBusFactory bf = new SpringBusFactory();
-        greeterBus = bf.createBus(cfgResource);
-        BusFactory.setDefaultBus(greeterBus);
-        LOG.info("Initialised bus with cfg file resource: " + cfgResource);
-        greeterBus.getOutInterceptors().add(new OutMessageRecorder());
-        greeterBus.getInInterceptors().add(new InMessageRecorder());
-        
-        GreeterImpl implementor = new GreeterImpl();
-        String address = "http://localhost:9020/SoapContext/GreeterPort";
-        endpoint = Endpoint.publish(address, implementor);
-        LOG.info("Published greeter endpoint.");
-        return true;        
-    }
-
+    @Override
     public boolean stopGreeter() {  
         
         if (null != endpoint) {
@@ -81,27 +57,24 @@
         }
         return true;
     }
-    
-    public Future<?> startGreeterAsync(String requestType, AsyncHandler<StartGreeterResponse> asyncHandler) {
-        // never called
-        return null;
-    }
-
-    public Response<StartGreeterResponse> startGreeterAsync(String requestType) {
-        // never called
-        return null;
-    }
 
-    public Response<StopGreeterResponse> stopGreeterAsync() {
-        // never called
-        return null;
-    }
-
-    public Future<?> stopGreeterAsync(AsyncHandler<StopGreeterResponse> asyncHandler) {
-        // never called
-        return null;
+    @Override
+    public boolean startGreeter(String cfgResource) {
+        SpringBusFactory bf = new SpringBusFactory();
+        greeterBus = bf.createBus(cfgResource);
+        BusFactory.setDefaultBus(greeterBus);
+        LOG.info("Initialised bus with cfg file resource: " + cfgResource);
+        
+        Interceptor logIn = new LoggingInInterceptor();
+        Interceptor logOut = new LoggingOutInterceptor();
+        greeterBus.getInInterceptors().add(logIn);
+        greeterBus.getOutInterceptors().add(logOut);
+        greeterBus.getOutFaultInterceptors().add(logOut);
+        
+        Endpoint.publish(address, implementor);
+        LOG.info("Published greeter endpoint.");
+        
+        return true;        
     }
-    
-    
     
 }

Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/Server.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/Server.java?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/Server.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/rm/Server.java Thu Apr 26 10:46:35 2007
@@ -39,6 +39,8 @@
         setBus(bus);
 
         ControlImpl implementor = new ControlImpl();
+        GreeterImpl greeterImplementor = new GreeterImpl();
+        implementor.setImplementor(greeterImplementor);
         Endpoint.publish(ADDRESS, implementor);
     }
 

Added: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java (added)
+++ incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,160 @@
+/**
+ * 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.greeter_control;
+
+import java.util.List;
+import java.util.concurrent.Future;
+import java.util.logging.Logger;
+
+import javax.jws.WebService;
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Response;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.configuration.Configurer;
+import org.apache.cxf.greeter_control.types.FaultLocation;
+import org.apache.cxf.greeter_control.types.StartGreeterResponse;
+import org.apache.cxf.greeter_control.types.StopGreeterResponse;
+import org.apache.cxf.interceptor.Interceptor;
+
+@WebService(serviceName = "ControlService", 
+            portName = "ControlPort", 
+            endpointInterface = "org.apache.cxf.greeter_control.Control", 
+            targetNamespace = "http://cxf.apache.org/greeter_control")
+public class ControlImpl implements Control {
+    
+    private static final Logger LOG = Logger.getLogger(ControlImpl.class.getName());
+    protected Object implementor;
+    protected String address;
+    protected Endpoint endpoint;
+    protected Bus greeterBus;
+
+    public void setImplementor(Object i) {
+        implementor = i;
+    }
+ 
+    public Object getImplementor() {
+        return implementor;
+    }
+
+    public void setAddress(String a) {
+        address = a;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+    
+    public boolean startGreeter(String cfgResource) {
+        LOG.fine("Starting greeter with cfgResource: " + cfgResource);
+        greeterBus = null;
+        BusFactory.setDefaultBus(null);
+        String original = System.clearProperty(Configurer.USER_CFG_FILE_PROPERTY_NAME);
+        try {
+            if (cfgResource != null && cfgResource.length() > 0) {
+                System.setProperty(Configurer.USER_CFG_FILE_PROPERTY_NAME, cfgResource);
+            }
+    
+            String a = address == null ? "http://localhost:9020/SoapContext/GreeterPort" : address;
+            Object i = implementor == null ? new GreeterImpl() : implementor;
+            endpoint = Endpoint.publish(a, i);
+            LOG.info("Published greeter endpoint on bus with cfg file resource: " + cfgResource);
+            greeterBus = BusFactory.getDefaultBus();
+        } finally {
+            System.clearProperty(Configurer.USER_CFG_FILE_PROPERTY_NAME);
+            if (null != original) {
+                System.setProperty(Configurer.USER_CFG_FILE_PROPERTY_NAME, cfgResource);
+            }
+        }
+        return null != greeterBus; 
+    }
+
+    public boolean stopGreeter() {  
+        LOG.fine("Stopping greeter");
+        
+        if (null != endpoint) {
+            LOG.info("Stopping Greeter endpoint");
+            endpoint.stop();
+        } else {
+            LOG.info("No endpoint active.");
+        }
+        endpoint = null;
+        if (null != greeterBus) {
+            greeterBus.shutdown(true);
+        }
+        greeterBus = null;
+        return true;
+    }
+
+    public void setFaultLocation(FaultLocation fl) {
+        List<Interceptor> interceptors = greeterBus.getInInterceptors();
+        FaultThrowingInterceptor fi = null;
+        for (Interceptor i : interceptors) {
+            if (i instanceof FaultThrowingInterceptor) {
+                interceptors.remove(i);
+                LOG.fine("Removed existing FaultThrowingInterceptor");
+                break;
+            }
+        }
+        
+        fi = new FaultThrowingInterceptor(fl.getPhase());
+        if (null != fl.getBefore() && !"".equals(fl.getBefore())) {
+            fi.addBefore(fl.getBefore()); 
+        }
+        if (null != fl.getAfter() && !"".equals(fl.getAfter())) {
+            fi.addAfter(fl.getAfter()); 
+        }
+
+        interceptors.add(fi);
+        LOG.fine("Added FaultThrowingInterceptor to phase " + fl.getPhase());
+    }
+    
+    public Future<?> startGreeterAsync(String requestType, AsyncHandler<StartGreeterResponse> asyncHandler) {
+        // never called
+        return null;
+    }
+
+    public Response<StartGreeterResponse> startGreeterAsync(String requestType) {
+        // never called
+        return null;
+    }
+
+    public Response<StopGreeterResponse> stopGreeterAsync() {
+        // never called
+        return null;
+    }
+
+    public Future<?> stopGreeterAsync(AsyncHandler<StopGreeterResponse> asyncHandler) {
+        // never called
+        return null;
+    }
+
+    @WebService(serviceName = "GreeterService",
+            portName = "GreeterPort",
+            endpointInterface = "org.apache.cxf.greeter_control.Greeter",
+            targetNamespace = "http://cxf.apache.org/greeter_control")
+    class GreeterImpl extends AbstractGreeterImpl {
+    } 
+    
+}
+

Propchange: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/ControlImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java?view=auto&rev=532823
==============================================================================
--- incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java (added)
+++ incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java Thu Apr 26 10:46:35 2007
@@ -0,0 +1,57 @@
+/**
+ * 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.greeter_control;
+
+import java.text.MessageFormat;
+import java.util.logging.Logger;
+
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+/**
+ * 
+ */
+public class FaultThrowingInterceptor extends AbstractPhaseInterceptor {
+
+    public static final MessageFormat MESSAGE_FORMAT
+        = new MessageFormat("Interceptor fault in phase {0}.");
+    private static final Logger LOG = Logger.getLogger(FaultThrowingInterceptor.class.getName());
+    
+    public FaultThrowingInterceptor() {
+        super.setPhase(Phase.USER_LOGICAL);
+    }
+    
+    
+    public FaultThrowingInterceptor(String phase) {
+        super.setPhase(phase);
+    }
+
+    public synchronized void handleMessage(Message message) throws Fault {
+        if (MessageUtils.isRequestor(message)) {
+            return;
+        }
+        String msg = MESSAGE_FORMAT.format(new Object[] {getPhase()});
+        LOG.fine(msg);
+        throw new Fault(new RuntimeException(msg));
+    }
+}

Propchange: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/testutils/src/main/java/org/apache/cxf/greeter_control/FaultThrowingInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/cxf/trunk/testutils/src/main/resources/wsdl/greeter_control.wsdl
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/testutils/src/main/resources/wsdl/greeter_control.wsdl?view=diff&rev=532823&r1=532822&r2=532823
==============================================================================
--- incubator/cxf/trunk/testutils/src/main/resources/wsdl/greeter_control.wsdl (original)
+++ incubator/cxf/trunk/testutils/src/main/resources/wsdl/greeter_control.wsdl Thu Apr 26 10:46:35 2007
@@ -97,6 +97,15 @@
                     </sequence>
                 </complexType>
             </element>
+            <element name="faultLocation">
+                <complexType>
+                    <sequence>
+                        <element name="phase" type="xsd:string"/>
+                        <element name="before" type="xsd:string"/>
+                        <element name="after" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
 
         </schema>
     </wsdl:types>
@@ -139,6 +148,9 @@
     <wsdl:message name="stopGreeterResponse">
         <wsdl:part element="x1:stopGreeterResponse" name="out"/>
     </wsdl:message>
+    <wsdl:message name="setFaultLocationRequest">
+        <wsdl:part element="x1:faultLocation" name="in"/>
+    </wsdl:message>
     
     <wsdl:portType name="Greeter">
         <wsdl:operation name="sayHi">
@@ -172,6 +184,10 @@
             <wsdl:input message="tns:stopGreeterRequest" name="stopGreeterRequest"/>
             <wsdl:output message="tns:stopGreeterResponse" name="stopGreeterResponse"/>
         </wsdl:operation>
+
+        <wsdl:operation name="setFaultLocation">
+            <wsdl:input message="tns:setFaultLocationRequest" name="setFaultLocationRequest"/>
+        </wsdl:operation>
     </wsdl:portType>
 
     <wsdl:binding name="GreeterSOAPBinding" type="tns:Greeter">
@@ -238,6 +254,12 @@
             <wsdl:output name="stopGreeterResponse">
                 <soap:body use="literal"/>
             </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="setFaultLocation">
+            <soap:operation soapAction="" style="document"/>
+            <wsdl:input name="setFaultLocationRequest">
+                <soap:body use="literal"/>
+            </wsdl:input>
         </wsdl:operation>
     </wsdl:binding>