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/02/07 18:11:27 UTC

svn commit: r504621 [1/2] - in /incubator/cxf/trunk: api/src/main/java/org/apache/cxf/phase/ api/src/main/java/org/apache/cxf/ws/policy/ api/src/test/java/org/apache/cxf/phase/ rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ rt/ws/policy/src/main/...

Author: andreasmyth
Date: Wed Feb  7 09:11:23 2007
New Revision: 504621

URL: http://svn.apache.org/viewvc?view=rev&rev=504621
Log:
[JIRA CXF-376] Support for (WSDL 1.1) attachment to fault message policy subjects.
{JIRA CXF-379] Client side interceptors to determine effective policy for outbound message, choose an alternative and add the interceptors required to assert the chosen alternative's assertions. 

Added:
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyTest.java   (with props)
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/TestAssertion.java   (with props)
    incubator/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/policy/
    incubator/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/policy/RMPolicyInterceptorProvider.java   (with props)
    incubator/cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/policy/
    incubator/cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/policy/RMPolicyExtensionsTest.java   (with props)
Modified:
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/PolicyProvider.java
    incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/Messages.properties
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProvider.java
    incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilder.java
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProviderTest.java
    incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilderTest.java
    incubator/cxf/trunk/rt/ws/rm/pom.xml
    incubator/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMConstants.java
    incubator/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMOutInterceptor.java
    incubator/cxf/trunk/rt/ws/rm/src/main/resources/META-INF/cxf/cxf-extension-rm.xml
    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/SequenceTest.java

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java Wed Feb  7 09:11:23 2007
@@ -81,19 +81,27 @@
         }
         iterator = new PhaseInterceptorIterator();
     }
-
+    
     public void add(List<Interceptor> newhandlers) {
+        add(newhandlers, false);
+    }
+
+    public void add(List<Interceptor> newhandlers, boolean force) {
         if (newhandlers == null) {
             return;
         }
 
         for (Interceptor handler : newhandlers) {
-            add(handler);
+            add(handler, force);
         }
     }
 
-    @SuppressWarnings("unchecked")
     public void add(Interceptor i) {
+        add(i, false);
+    }
+    
+    @SuppressWarnings("unchecked")
+    public void add(Interceptor i, boolean force) {
         PhaseInterceptor pi = (PhaseInterceptor)i;
 
         if (LOG.isLoggable(Level.FINE)) {
@@ -106,7 +114,7 @@
         if (phase == null) {
             LOG.fine("Phase " + phaseName + " does not exist. Skipping handler "
                       + i.getClass().getName());
-        } else {
+        } else if (force | !phase.contains(pi)) {            
             insertInterceptor(phase, pi);
         }
     }
@@ -171,6 +179,7 @@
                     faultOccured = true;
                     if (LOG.isLoggable(Level.FINE)) {
                         LogUtils.log(LOG, Level.FINE, "Interceptor has thrown exception, unwinding now", ex);
+                        ex.printStackTrace();
                     }
                     message.setContent(Exception.class, ex);
                     if (message.getExchange() != null) {

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/PolicyProvider.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/PolicyProvider.java?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/PolicyProvider.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/ws/policy/PolicyProvider.java Wed Feb  7 09:11:23 2007
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.ws.policy;
 
+import org.apache.cxf.service.model.BindingFaultInfo;
 import org.apache.cxf.service.model.BindingMessageInfo;
 import org.apache.cxf.service.model.BindingOperationInfo;
 import org.apache.cxf.service.model.EndpointInfo;
@@ -37,5 +38,7 @@
     Policy getEffectivePolicy(BindingOperationInfo bi);
     
     Policy getEffectivePolicy(BindingMessageInfo bmi);
+    
+    Policy getEffectivePolicy(BindingFaultInfo bfi);
     
 }

Modified: incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java (original)
+++ incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java Wed Feb  7 09:11:23 2007
@@ -68,6 +68,20 @@
         assertSame(p, it.next());
         assertTrue(!it.hasNext());
     }
+    
+    public void testForceAddOneInterceptor() {
+        AbstractPhaseInterceptor p = setUpPhaseInterceptor("phase1", "p1");
+        control.replay();
+        chain.add(p, false);
+        Iterator<Interceptor<? extends Message>> it = chain.iterator();
+        assertSame(p, it.next());
+        assertTrue(!it.hasNext());
+        chain.add(p, true);
+        it = chain.iterator();
+        assertSame(p, it.next());
+        assertSame(p, it.next());
+        assertTrue(!it.hasNext());        
+    }
 
     @SuppressWarnings("unchecked")
     public void testAddTwoInterceptorsSamePhase() {

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,88 @@
+/**
+ * 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.ws.policy;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Conduit;
+
+/**
+ * 
+ */
+public class ClientPolicyInFaultInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private Bus bus;
+    
+    public ClientPolicyInFaultInterceptor() {
+        setPhase(Phase.PRE_LOGICAL);
+    }
+        
+    public void setBus(Bus b) {
+        bus = b;
+    }
+    
+    public Bus getBus() {
+        return bus;
+    }
+    
+    public void handleMessage(Message msg) {        
+        if (!PolicyUtils.isRequestor(msg)) {
+            return;
+        }
+        
+        BindingOperationInfo boi = msg.get(BindingOperationInfo.class);
+        if (null == boi) {
+            return;
+        }
+        
+        EndpointInfo ei = msg.get(EndpointInfo.class);
+        if (null == ei) {
+            return;
+        }
+        
+        PolicyEngine pe = bus.getExtension(PolicyEngine.class);
+        if (null == pe) {
+            return;
+        }
+        
+        Conduit conduit = msg.getConduit();
+        
+        // We do not know the underlying message type yet - so we pre-emptively add interceptors 
+        // that can deal with the response and all of the operation's possible fault messages.
+        
+        List<Interceptor> policyInFaultInterceptors = pe.getClientInFaultInterceptors(boi, ei, conduit);
+        for (Interceptor poi : policyInFaultInterceptors) {
+            msg.getInterceptorChain().add(poi);
+        }
+        
+        // TODO:
+        // In addition we add an interceptor that towards the end of the chain determines the
+        // effective policy of the underlying message and checks if any of its alternatives are
+        // supported.
+        
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,88 @@
+/**
+ * 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.ws.policy;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Conduit;
+
+/**
+ * 
+ */
+public class ClientPolicyInInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private Bus bus;
+    
+    public ClientPolicyInInterceptor() {
+        setPhase(Phase.PRE_LOGICAL);
+    }
+        
+    public void setBus(Bus b) {
+        bus = b;
+    }
+    
+    public Bus getBus() {
+        return bus;
+    }
+    
+    public void handleMessage(Message msg) {        
+        if (!PolicyUtils.isRequestor(msg)) {
+            return;
+        }
+        
+        BindingOperationInfo boi = msg.get(BindingOperationInfo.class);
+        if (null == boi) {
+            return;
+        }
+        
+        EndpointInfo ei = msg.get(EndpointInfo.class);
+        if (null == ei) {
+            return;
+        }
+        
+        PolicyEngine pe = bus.getExtension(PolicyEngine.class);
+        if (null == pe) {
+            return;
+        }
+        
+        Conduit conduit = msg.getConduit();
+        
+        // We do not know the underlying message type yet - so we pre-emptively add interceptors 
+        // that can deal with the response and all of the operation's possible fault messages.
+        
+        List<Interceptor> policyInInterceptors = pe.getClientInInterceptors(boi, ei, conduit);
+        for (Interceptor poi : policyInInterceptors) {
+            msg.getInterceptorChain().add(poi);
+        }
+        
+        // TODO:
+        // In addition we add an interceptor that towards the end of the chain determines the
+        // effective policy of the underlying message and checks if any of its alternatives are
+        // supported..
+        
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,203 @@
+/**
+ * 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.ws.policy;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.AbstractAttributedInterceptorProvider;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.service.model.BindingFaultInfo;
+import org.apache.cxf.service.model.BindingMessageInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Conduit;
+import org.apache.neethi.Assertion;
+import org.apache.neethi.Policy;
+
+/**
+ * 
+ */
+public class ClientPolicyInfo extends AbstractAttributedInterceptorProvider  {
+    
+    private static final ResourceBundle BUNDLE = BundleUtils.getBundle(ClientPolicyInfo.class);
+    
+    private Policy requestPolicy;
+    private Policy responsePolicy;
+     
+    private List<Assertion> chosenAlternative;
+    private List<Assertion> responseVocabulary;
+    
+    void initialise(BindingOperationInfo boi, EndpointInfo ei, Conduit conduit, PolicyEngine engine) {
+        initialiseRequestPolicy(boi, ei, engine);
+        chooseAlternative(conduit, engine);
+        initialiseOutInterceptors(engine);  
+        initialiseResponsePolicy(boi, ei, engine);
+        initialiseInInterceptors(engine);
+    }
+    
+    public Policy getRequestPolicy() {
+        return requestPolicy;        
+    }
+    
+    void setRequestPolicy(Policy ep) {
+        requestPolicy = ep;
+    }
+    
+    public Policy getResponsePolicy() {
+        return responsePolicy;        
+    }
+    
+    void setResponsePolicy(Policy ep) {
+        responsePolicy = ep;
+    }
+    
+    public List<Assertion> getChosenAlternative() {
+        return chosenAlternative;
+    }
+    
+    void setChosenAlternative(List<Assertion> c) {
+        chosenAlternative = c;
+    }
+    
+    public List<Assertion> getResponseVolcabulary() {
+        return responseVocabulary;
+    }
+    
+    void setResponseVocabulary(List<Assertion> rv) {
+        responseVocabulary = rv;
+    }
+    
+    /**
+     * Get the effective policy for the outbound message specified by the binding operation 
+     * by merging the policies from the policy providers and normalising the result.
+     * 
+     * @param boi the binding operation info specifying the outbound message
+     * @param engine the policy engine
+     * 
+     * @return the normalised, effective policy for the outbound message
+     */
+    void initialiseRequestPolicy(BindingOperationInfo boi, EndpointInfo ei, PolicyEngine engine) {
+        BindingMessageInfo bmi = boi.getInput();
+
+        requestPolicy = engine.getAggregatedMessagePolicy(bmi);
+        requestPolicy = requestPolicy.merge(engine.getAggregatedOperationPolicy(boi));
+        requestPolicy = requestPolicy.merge(engine.getAggregatedEndpointPolicy(ei));
+        requestPolicy = requestPolicy.merge(engine.getAggregatedServicePolicy(ei.getService()));
+        requestPolicy = (Policy)requestPolicy.normalize(true);
+    }
+
+    /**
+     * Choose the first alternative for which the vocabulary is supported.
+     * 
+     * @param conduit the conduit
+     * @param engine the policy engine
+     * @throws PolicyException if no such alternative exists
+     */
+    void chooseAlternative(Conduit conduit, PolicyEngine engine) {
+        Iterator alternatives = requestPolicy.getAlternatives();
+        while (alternatives.hasNext()) {
+            List<Assertion> alternative = CastUtils.cast((List)alternatives.next(), Assertion.class);
+            if (engine.supportsAlternative(alternative, conduit)) {
+                setChosenAlternative(alternative);
+                return;
+            }
+        }
+        throw new PolicyException(new Message("CLIENT_OUT_NO_ALTERNATIVE_EXC", BUNDLE));
+
+    }
+    
+
+    /** 
+     * Based on the chosen alternative, determine the interceptors that need to be present on the
+     * outbound chain in order to support the assertions in this alternative.
+     * @param engine the policy engine
+     */
+    void initialiseOutInterceptors(PolicyEngine engine) {
+        PolicyInterceptorProviderRegistry reg 
+            = engine.getBus().getExtension(PolicyInterceptorProviderRegistry.class);
+        List<Interceptor> out = new ArrayList<Interceptor>();
+        for (Assertion a : getChosenAlternative()) {
+            if (a.isOptional()) {
+                continue;
+            }
+            QName qn = a.getName();
+            PolicyInterceptorProvider pp = reg.get(qn);
+            if (null != pp) {
+                out.addAll(pp.getOutInterceptors());
+            }
+        }
+        setOutInterceptors(out);
+    }
+    
+    void initialiseResponsePolicy(BindingOperationInfo boi, EndpointInfo ei, PolicyEngine engine) {
+        BindingMessageInfo bmi = boi.getOutput();
+        if (null == bmi) {
+            return;
+        }
+        responsePolicy = engine.getAggregatedMessagePolicy(bmi);
+        for (BindingFaultInfo bfi : boi.getFaults()) {
+            responsePolicy = responsePolicy.merge(engine.getAggregatedFaultPolicy(bfi));
+        }
+        responsePolicy = responsePolicy.merge(engine.getAggregatedOperationPolicy(boi));
+        responsePolicy = responsePolicy.merge(engine.getAggregatedEndpointPolicy(ei));
+        responsePolicy = responsePolicy.merge(engine.getAggregatedServicePolicy(ei.getService()));
+        responsePolicy = (Policy)responsePolicy.normalize(true);         
+    }
+    
+    /** 
+     * Based on the calculated response policy, determine the interceptors that need to be present on the
+     * outbound chain in order to support the assertions in this alternative.
+     * @param engine the policy engine
+     */
+    void initialiseInInterceptors(PolicyEngine engine) {
+        if (null == responsePolicy) {
+            return;
+        }
+        PolicyInterceptorProviderRegistry reg 
+            = engine.getBus().getExtension(PolicyInterceptorProviderRegistry.class);
+        List<Interceptor> in = new ArrayList<Interceptor>();
+        List<Interceptor> inFault = new ArrayList<Interceptor>();
+        Iterator alternatives = responsePolicy.getAlternatives();
+        while (alternatives.hasNext()) {
+            List<Assertion> alternative = CastUtils.cast((List)alternatives.next(), Assertion.class);
+            for (Assertion a : alternative) {
+                if (a.isOptional()) {
+                    continue;
+                }
+                QName qn = a.getName();
+                PolicyInterceptorProvider pp = reg.get(qn);
+                if (null != pp) {
+                    in.addAll(pp.getInInterceptors());
+                    inFault.addAll(pp.getInFaultInterceptors());
+                }
+            }
+        }
+        setInInterceptors(in);
+        setInFaultInterceptors(inFault);
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInfo.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,81 @@
+/**
+ * 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.ws.policy;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Conduit;
+
+/**
+ * 
+ */
+public class ClientPolicyOutInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private Bus bus;
+    
+    public ClientPolicyOutInterceptor() {
+        setPhase(Phase.PRE_LOGICAL);
+    }
+    
+    public void setBus(Bus b) {
+        bus = b;
+    }
+    
+    public Bus getBus() {
+        return bus;
+    }
+    
+    public void handleMessage(Message msg) {
+        if (!PolicyUtils.isRequestor(msg)) {
+            return;
+        }
+        
+        BindingOperationInfo boi = msg.get(BindingOperationInfo.class);
+        if (null == boi) {
+            return;
+        }
+        
+        EndpointInfo ei = msg.get(EndpointInfo.class);
+        if (null == ei) {
+            return;
+        }        
+        
+        PolicyEngine pe = bus.getExtension(PolicyEngine.class);
+        if (null == pe) {
+            return;
+        }
+        
+        Conduit conduit = msg.getConduit();
+        
+        // add the interceptors required to satisfy the policies
+        // for this operation
+        List<Interceptor> policyOutInterceptors = pe.getClientOutInterceptors(boi, ei, conduit);
+        for (Interceptor poi : policyOutInterceptors) {
+            msg.getInterceptorChain().add(poi);
+        }
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/Messages.properties?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/Messages.properties (original)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/Messages.properties Wed Feb  7 09:11:23 2007
@@ -21,4 +21,5 @@
 IMMUTABLE_POLICY_MODIFICATION_EXC = Attempt to modify immutable policy object.
 NO_ASSERTIONBUILDER_EXC = No assertion builder for type {0} registered.
 NOT_A_POLICY_ELEMENT_EXC = Specified element is not a Policy element.
-NOT_A_POLICYREF_ELEMENT_EXC = Specified element is not a PolicyReference element.
\ No newline at end of file
+NOT_A_POLICYREF_ELEMENT_EXC = Specified element is not a PolicyReference element.
+CLIENT_OUT_NO_ALTERNATIVE_EXC = None of the policy alternatives can be satisfied.
\ No newline at end of file

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,236 @@
+/**
+ * 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.ws.policy;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.extension.BusExtensionRegistrar;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.service.model.BindingFaultInfo;
+import org.apache.cxf.service.model.BindingMessageInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.transport.Conduit;
+import org.apache.cxf.ws.policy.attachment.wsdl11.Wsdl11AttachmentPolicyProvider;
+import org.apache.neethi.Assertion;
+import org.apache.neethi.Policy;
+
+/**
+ * 
+ */
+public class PolicyEngine {
+    
+    private Bus bus;
+    private PolicyBuilder builder;
+    private List<PolicyProvider> policyProviders;
+
+    private Map<BindingOperationInfo, ClientPolicyInfo> clientInfo 
+        = new ConcurrentHashMap<BindingOperationInfo, ClientPolicyInfo>();
+
+    public PolicyEngine() {
+        this(null);
+    }
+    public PolicyEngine(BusExtensionRegistrar registrar) {
+        if (null != registrar) {
+            registrar.registerExtension(this, PolicyEngine.class);
+            bus = registrar.getBus();
+        }
+    }
+    
+    public void setBus(Bus b) {
+        bus = b;
+    }
+    
+    public Bus getBus() {
+        return bus;
+    }
+    
+    public void setPolicyProviders(List<PolicyProvider> p) {
+        policyProviders = p;
+    }
+   
+    public List<PolicyProvider> getPolicyProviders() {
+        return policyProviders;
+    }
+    
+    public void setBuilder(PolicyBuilder b) {
+        builder = b;
+    }
+    
+    public PolicyBuilder getBuilder() {
+        return builder;
+    }
+        
+    @PostConstruct
+    void init() {
+        if (null == builder && null != bus) {
+            builder = new PolicyBuilder();
+            builder.setAssertionBuilderRegistry(bus.getExtension(AssertionBuilderRegistry.class));
+        }
+
+        if (null == policyProviders) {
+            // TODO:
+            // include attachment provider for wsdl 2.0 and
+            // for external attachments
+            Wsdl11AttachmentPolicyProvider wpp = new Wsdl11AttachmentPolicyProvider();
+            wpp.setBuilder(builder);
+            policyProviders = Collections.singletonList((PolicyProvider)wpp);
+        }    
+    }
+    
+    @PostConstruct
+    void addBusInterceptors() {
+        if (null == bus) {
+            return;
+        }
+
+        ClientPolicyOutInterceptor clientOut = new ClientPolicyOutInterceptor();
+        clientOut.setBus(bus);
+        bus.getOutInterceptors().add(clientOut);
+        ClientPolicyInInterceptor clientIn = new ClientPolicyInInterceptor();
+        clientIn.setBus(bus);
+        bus.getInInterceptors().add(clientIn);
+        ClientPolicyInFaultInterceptor clientInFault = new ClientPolicyInFaultInterceptor();
+        clientInFault.setBus(bus);
+        bus.getInFaultInterceptors().add(clientInFault);
+        
+        // TODO: server side
+    }
+
+    public List<Interceptor> getClientOutInterceptors(BindingOperationInfo boi, 
+                                                      EndpointInfo ei, Conduit conduit) {
+        return getClientPolicyInfo(boi, ei, conduit).getOutInterceptors();
+    }
+    
+    public List<Interceptor> getClientInInterceptors(BindingOperationInfo boi, 
+                                                     EndpointInfo ei, Conduit conduit) {
+        return getClientPolicyInfo(boi, ei, conduit).getInInterceptors();
+    }
+    
+    public List<Interceptor> getClientInFaultInterceptors(BindingOperationInfo boi, 
+                                                     EndpointInfo ei, Conduit conduit) {
+        return getClientPolicyInfo(boi, ei, conduit).getInFaultInterceptors();
+    }
+
+    public Policy getAggregatedServicePolicy(ServiceInfo si) {
+        Policy aggregated = null;
+        for (PolicyProvider pp : getPolicyProviders()) {
+            Policy p = pp.getEffectivePolicy(si);
+            if (null == aggregated) {
+                aggregated = p;
+            } else {
+                aggregated = aggregated.merge(p);
+            }
+        }
+        return aggregated == null ? new Policy() : aggregated;
+    }
+
+    public Policy getAggregatedEndpointPolicy(EndpointInfo ei) {
+        Policy aggregated = null;
+        for (PolicyProvider pp : getPolicyProviders()) {
+            Policy p = pp.getEffectivePolicy(ei);
+            if (null == aggregated) {
+                aggregated = p;
+            } else {
+                aggregated = aggregated.merge(p);
+            }
+        }
+        return aggregated == null ? new Policy() : aggregated;
+    }
+    
+    public Policy getAggregatedOperationPolicy(BindingOperationInfo boi) {
+        Policy aggregated = null;
+        for (PolicyProvider pp : getPolicyProviders()) {
+            Policy p = pp.getEffectivePolicy(boi);
+            if (null == aggregated) {
+                aggregated = p;
+            } else {
+                aggregated = aggregated.merge(p);
+            }
+        }
+        return aggregated == null ? new Policy() : aggregated;
+    }
+    
+    public Policy getAggregatedMessagePolicy(BindingMessageInfo bmi) {
+        Policy aggregated = null;
+        for (PolicyProvider pp : getPolicyProviders()) {
+            Policy p = pp.getEffectivePolicy(bmi);
+            if (null == aggregated) {
+                aggregated = p;
+            } else {
+                aggregated = aggregated.merge(p);
+            }
+        }
+        return aggregated == null ? new Policy() : aggregated;
+    }
+    
+    public Policy getAggregatedFaultPolicy(BindingFaultInfo bfi) {
+        Policy aggregated = null;
+        for (PolicyProvider pp : getPolicyProviders()) {
+            Policy p = pp.getEffectivePolicy(bfi);
+            if (null == aggregated) {
+                aggregated = p;
+            } else {
+                aggregated = aggregated.merge(p);
+            }
+        }
+        return aggregated == null ? new Policy() : aggregated;
+    }
+
+    /**
+     * Check if a given list of assertions can be supported by the conduit or
+     * interceptors (which, if necessary, can be added to the interceptor
+     * chain).
+     * 
+     * @param alternative the policy alternative
+     * @param conduit the conduit
+     * @return true iff the alternative can be supported
+     */
+    boolean supportsAlternative(List<Assertion> alternative, Conduit conduit) {
+        PolicyInterceptorProviderRegistry pipr = bus.getExtension(PolicyInterceptorProviderRegistry.class);
+        for (Assertion a : alternative) {
+            if (!(a.isOptional() 
+                || (null != pipr.get(a.getName())) 
+                || ((conduit instanceof Assertor) && ((Assertor)conduit).asserts(a)))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    ClientPolicyInfo getClientPolicyInfo(BindingOperationInfo boi, EndpointInfo ei, Conduit conduit) {
+        ClientPolicyInfo cpi = clientInfo.get(boi);
+        if (null == cpi) {
+            cpi = new ClientPolicyInfo();
+            cpi.initialise(boi, ei, conduit, this);
+            clientInfo.put(boi, cpi);
+        }
+        return cpi;
+    }
+
+
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyEngine.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,42 @@
+/**
+ * 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.ws.policy;
+
+import org.apache.cxf.message.Message;
+
+/**
+ * 
+ */
+public final class PolicyUtils {
+
+    private PolicyUtils() {
+    }
+
+    /**
+     * Determine if current messaging role is that of requestor.
+     * 
+     * @param message the current Message
+     * @return true iff the current messaging role is that of requestor
+     */
+    public static boolean isRequestor(Message message) {
+        Boolean requestor = (Boolean)message.get(Message.REQUESTOR_ROLE);
+        return requestor != null && requestor.booleanValue();
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyUtils.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProvider.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProvider.java?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProvider.java (original)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/attachment/wsdl11/Wsdl11AttachmentPolicyProvider.java Wed Feb  7 09:11:23 2007
@@ -40,6 +40,7 @@
 import org.apache.cxf.service.model.DescriptionInfo;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.service.model.Extensible;
+import org.apache.cxf.service.model.FaultInfo;
 import org.apache.cxf.service.model.MessageInfo;
 import org.apache.cxf.service.model.ServiceInfo;
 import org.apache.cxf.ws.policy.PolicyBuilder;
@@ -63,7 +64,7 @@
         new HashMap<DescriptionInfo, Map<String, Policy>>();
     
     
-    void setBuilder(PolicyBuilder b) {
+    public void setBuilder(PolicyBuilder b) {
         builder = b;
     }
     
@@ -94,7 +95,7 @@
      * element that defines the operation merged with that of the corresponding 
      * wsdl11:binding/wsdl11:operation element.
      * 
-     * @param bi the BindingOperationInfo identifying the oeration in relation to a port
+     * @param bi the BindingOperationInfo identifying the operation in relation to a port
      * @return the effective policy
      */
     public Policy getEffectivePolicy(BindingOperationInfo bi) {
@@ -106,10 +107,10 @@
     
     /**
      * The effective policy for a specific WSDL message (input or output) is calculated
-     * in relation to a specific port. and includes the element policy of the wsdl:message
-     * element that defines the message's type mered with the element policy of the 
+     * in relation to a specific port, and includes the element policy of the wsdl:message
+     * element that defines the message's type merged with the element policy of the 
      * wsdl11:binding and wsdl11:portType message definitions that describe the message.
-     * For example, the effective policy of a specific inout message for a specific port
+     * For example, the effective policy of a specific input message for a specific port
      * would be the (element policies of the) wsdl11:message element defining the message type,
      * the wsdl11:portType/wsdl11:operation/wsdl11:input element and the corresponding
      * wsdl11:binding/wsdl11:operation/wsdl11:input element for that message.
@@ -122,11 +123,9 @@
         DescriptionInfo di = si.getDescription();
 
         Policy p = getElementPolicy(bmi, di);
-        p = p.merge(getElementPolicy(bmi.getMessageInfo(), di));
-
         MessageInfo mi = bmi.getMessageInfo();
+        p = p.merge(getElementPolicy(mi, di));
         Extensible ex = getMessageTypeInfo(mi.getName(), di);
-  
         p = p.merge(getElementPolicy(ex, di));
 
         return p;
@@ -134,8 +133,17 @@
     
 
     
-    Policy getEffectivePolicy(BindingFaultInfo bfi) {
-        return null;
+    public Policy getEffectivePolicy(BindingFaultInfo bfi) {
+        ServiceInfo si = bfi.getBindingOperation().getBinding().getService();
+        DescriptionInfo di = si.getDescription();
+
+        Policy p = getElementPolicy(bfi, di);
+        FaultInfo fi = bfi.getFaultInfo();
+        p = p.merge(getElementPolicy(fi, di));
+        Extensible ex = getMessageTypeInfo(fi.getName(), di);
+        p = p.merge(getElementPolicy(ex, di));
+
+        return p;
     }
     
     Policy getElementPolicy(AbstractDescriptionElement adh) {

Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilder.java?view=diff&rev=504621&r1=504620&r2=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilder.java (original)
+++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/builders/jaxb/JaxbAssertionBuilder.java Wed Feb  7 09:11:23 2007
@@ -32,7 +32,9 @@
 
 import org.w3c.dom.Element;
 
+import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.jaxb.JAXBUtils;
 import org.apache.cxf.ws.policy.AssertionBuilder;
 import org.apache.neethi.Assertion;
 import org.apache.neethi.Constants;
@@ -43,16 +45,43 @@
     private Unmarshaller unmarshaller;
     private Collection<QName> supportedTypes;
     
+    /**
+     * Constructs a JAXBAssertionBuilder from the QName of the schema type
+     * @param qn the schema type
+     * @throws JAXBException
+     * @throws ClassNotFoundException
+     */
+    public JaxbAssertionBuilder(QName qn) throws JAXBException, ClassNotFoundException {
+        this(JAXBUtils.namespaceURIToPackage(qn.getNamespaceURI())
+            + "." + JAXBUtils.nameToIdentifier(qn.getLocalPart(), JAXBUtils.IdentifierType.CLASS), qn);
+    }
+    
+    /**
+     * Constructs a JAXBAssertionBuilder from the specified class name and schema type. 
+     * @param className the name of the class to which the schema type is mapped
+     * @param qn the schema type
+     * @throws JAXBException
+     * @throws ClassNotFoundException
+     */
+    @SuppressWarnings("unchecked")
+    public JaxbAssertionBuilder(String className, QName qn) throws JAXBException, ClassNotFoundException {
+        this(ClassLoaderUtils.loadClass(className, JaxbAssertionBuilder.class), qn);
+    }
     
+    /**
+    * Constructs a JAXBAssertionBuilder from the specified class and schema type. 
+    * @param class the class to which the schema type is mapped
+    * @param qn the schema type
+    * @throws JAXBException
+    * @throws ClassNotFoundException
+    */
     public JaxbAssertionBuilder(Class<T> type, QName qn) throws JAXBException {
 
         JAXBContext context = JAXBContext.newInstance(type.getPackage().getName());
         unmarshaller = context.createUnmarshaller();
         supportedTypes = Collections.singletonList(qn);
-        
     }
-   
-    
+       
     @SuppressWarnings("unchecked")
     public Assertion build(Element element) {
         Object obj = null;

Added: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,29 @@
+/**
+ * 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.ws.policy;
+
+import org.apache.cxf.transport.Conduit;
+
+/**
+ * 
+ */
+public interface AssertingConduit extends Assertor, Conduit {
+
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/AssertingConduit.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,313 @@
+/**
+ * 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.ws.policy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.service.model.BindingFaultInfo;
+import org.apache.cxf.service.model.BindingMessageInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.transport.Conduit;
+import org.apache.neethi.All;
+import org.apache.neethi.Assertion;
+import org.apache.neethi.ExactlyOne;
+import org.apache.neethi.Policy;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
+
+/**
+ * 
+ */
+public class ClientPolicyInfoTest extends TestCase {
+
+    private IMocksControl control;
+    
+    public void setUp() {
+        control = EasyMock.createNiceControl();        
+    } 
+    
+    public void testAccessors() {
+        ClientPolicyInfo cpi = new ClientPolicyInfo();
+        Policy p = control.createMock(Policy.class);
+        Assertion a = control.createMock(Assertion.class);
+        List<Assertion> la = Collections.singletonList(a);
+        control.replay();
+        cpi.setRequestPolicy(p);
+        assertSame(p, cpi.getRequestPolicy());
+        cpi.setChosenAlternative(la);
+        assertSame(la, cpi.getChosenAlternative());
+        cpi.setResponsePolicy(p);
+        assertSame(p, cpi.getResponsePolicy());
+        control.verify();
+    }
+    
+    public void testInitialiseRequestPolicy() {
+        BindingOperationInfo boi = control.createMock(BindingOperationInfo.class);
+        EndpointInfo ei = control.createMock(EndpointInfo.class);
+        ServiceInfo si = control.createMock(ServiceInfo.class);
+        BindingMessageInfo bmi = control.createMock(BindingMessageInfo.class);
+        PolicyEngine engine = control.createMock(PolicyEngine.class);
+           
+        EasyMock.expect(boi.getInput()).andReturn(bmi);
+        Policy mp = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedMessagePolicy(bmi)).andReturn(mp);
+        Policy op = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedOperationPolicy(boi)).andReturn(op);
+        Policy merged = control.createMock(Policy.class);
+        EasyMock.expect(mp.merge(op)).andReturn(merged);
+        Policy ep = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedEndpointPolicy(ei)).andReturn(ep);
+        EasyMock.expect(merged.merge(ep)).andReturn(merged);
+        EasyMock.expect(ei.getService()).andReturn(si);
+        Policy sp = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedServicePolicy(si)).andReturn(sp);
+        EasyMock.expect(merged.merge(sp)).andReturn(merged);
+        EasyMock.expect(merged.normalize(true)).andReturn(merged);
+        
+        control.replay();
+        ClientPolicyInfo cpi = new ClientPolicyInfo();
+        cpi.initialiseRequestPolicy(boi, ei, engine);
+        assertSame(merged, cpi.getRequestPolicy());
+        control.verify();
+    }
+    
+    public void testChooseAlternative() {
+        ClientPolicyInfo cpi = new ClientPolicyInfo();
+        cpi.setRequestPolicy(new Policy());
+        
+        PolicyEngine engine = control.createMock(PolicyEngine.class);
+        Conduit conduit = control.createMock(Conduit.class);
+               
+        Policy policy = new Policy();
+        ExactlyOne ea = new ExactlyOne();
+        All all = new All();
+        Assertion a1 = new TestAssertion(); 
+        all.addAssertion(a1);
+        ea.addPolicyComponent(all);
+        List<Assertion> firstAlternative = CastUtils.cast(all.getPolicyComponents(), Assertion.class);
+        policy.addPolicyComponent(ea);
+        cpi.setRequestPolicy(policy);
+        
+        EasyMock.expect(engine.supportsAlternative(firstAlternative, conduit)).andReturn(false);
+        control.replay();
+        try {
+            cpi.chooseAlternative(conduit, engine);  
+            fail("Expected PolicyException not thrown.");
+        } catch (PolicyException ex) {
+            // expected
+        }
+        control.verify();
+        
+        control.reset();        
+        EasyMock.expect(engine.supportsAlternative(firstAlternative, conduit)).andReturn(true);
+        control.replay();        
+        cpi.chooseAlternative(conduit, engine); 
+        
+        List<Assertion> chosen = cpi.getChosenAlternative();
+        assertSame(1, chosen.size());
+        assertSame(chosen.size(), firstAlternative.size());
+        assertSame(chosen.get(0), firstAlternative.get(0));
+        
+        // assertSame(cpi.getChosenAlternative(), firstAlternative);
+        control.verify();
+        
+        control.reset();
+        All other = new All();
+        other.addAssertion(a1);
+        ea.addPolicyComponent(other);
+        List<Assertion> secondAlternative = CastUtils.cast(other.getPolicyComponents(), Assertion.class);
+        EasyMock.expect(engine.supportsAlternative(firstAlternative, conduit)).andReturn(false);
+        EasyMock.expect(engine.supportsAlternative(secondAlternative, conduit)).andReturn(true);
+        control.replay();        
+        cpi.chooseAlternative(conduit, engine); 
+        chosen = cpi.getChosenAlternative();
+        assertSame(1, chosen.size());
+        assertSame(chosen.size(), secondAlternative.size());
+        assertSame(chosen.get(0), secondAlternative.get(0));
+        control.verify();
+    }
+    
+    public void testInitialiseOutInterceptors() {
+        ClientPolicyInfo cpi = new ClientPolicyInfo();        
+        List<Assertion> alternative = new ArrayList<Assertion>();
+        cpi.setChosenAlternative(alternative);
+        
+        PolicyEngine engine = control.createMock(PolicyEngine.class);
+        PolicyInterceptorProviderRegistry reg = control.createMock(PolicyInterceptorProviderRegistry.class);
+        setupPolicyInterceptorProviderRegistry(engine, reg);
+        
+        control.replay();
+        cpi.initialiseOutInterceptors(engine);
+        assertEquals(0, cpi.getOutInterceptors().size());
+        control.verify();
+        
+        control.reset();
+        setupPolicyInterceptorProviderRegistry(engine, reg);
+        Assertion a = control.createMock(Assertion.class);        
+        alternative.add(a);
+        EasyMock.expect(a.isOptional()).andReturn(true);
+        control.replay();
+        cpi.initialiseOutInterceptors(engine);
+        assertEquals(0, cpi.getOutInterceptors().size());
+        control.verify();
+        
+        control.reset();
+        setupPolicyInterceptorProviderRegistry(engine, reg);
+        EasyMock.expect(a.isOptional()).andReturn(false);
+        QName qn = new QName("http://x.y.z", "a");
+        EasyMock.expect(a.getName()).andReturn(qn);
+        EasyMock.expect(reg.get(qn)).andReturn(null);
+        control.replay();
+        cpi.initialiseOutInterceptors(engine);
+        assertEquals(0, cpi.getOutInterceptors().size());
+        control.verify();
+        
+        control.reset();
+        setupPolicyInterceptorProviderRegistry(engine, reg);
+        EasyMock.expect(a.isOptional()).andReturn(false);
+        EasyMock.expect(a.getName()).andReturn(qn);        
+        PolicyInterceptorProvider pp = control.createMock(PolicyInterceptorProvider.class);               
+        EasyMock.expect(reg.get(qn)).andReturn(pp);
+        Interceptor pi = control.createMock(Interceptor.class);
+        EasyMock.expect(pp.getOutInterceptors()).andReturn(Collections.singletonList(pi));
+        control.replay();
+        cpi.initialiseOutInterceptors(engine);
+        assertEquals(1, cpi.getOutInterceptors().size());
+        assertSame(pi, cpi.getOutInterceptors().get(0));
+        control.verify();     
+    }
+
+ 
+    public void testInitialiseResponsePolicyOn() {
+        BindingOperationInfo boi = control.createMock(BindingOperationInfo.class);
+        EndpointInfo ei = control.createMock(EndpointInfo.class);
+        PolicyEngine engine = control.createMock(PolicyEngine.class);
+        
+        EasyMock.expect(boi.getOutput()).andReturn(null);
+        control.replay();
+        ClientPolicyInfo cpi = new ClientPolicyInfo();
+        cpi.initialiseResponsePolicy(boi, ei, engine);
+        assertNull(cpi.getResponsePolicy());
+        control.verify();
+        control.reset();
+        
+        
+        ServiceInfo si = control.createMock(ServiceInfo.class);
+        BindingMessageInfo bmi = control.createMock(BindingMessageInfo.class);                     
+        EasyMock.expect(boi.getOutput()).andReturn(bmi);        
+        Policy mp = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedMessagePolicy(bmi)).andReturn(mp);
+        BindingFaultInfo bfi = control.createMock(BindingFaultInfo.class);
+        EasyMock.expect(boi.getFaults()).andReturn(Collections.singletonList(bfi));
+        Policy fp = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedFaultPolicy(bfi)).andReturn(fp);
+        Policy merged = control.createMock(Policy.class);
+        EasyMock.expect(mp.merge(fp)).andReturn(merged);        
+        Policy op = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedOperationPolicy(boi)).andReturn(op);    
+        EasyMock.expect(merged.merge(op)).andReturn(merged);
+        Policy ep = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedEndpointPolicy(ei)).andReturn(ep);
+        EasyMock.expect(merged.merge(ep)).andReturn(merged);
+        EasyMock.expect(ei.getService()).andReturn(si);
+        Policy sp = control.createMock(Policy.class);
+        EasyMock.expect(engine.getAggregatedServicePolicy(si)).andReturn(sp);
+        EasyMock.expect(merged.merge(sp)).andReturn(merged);
+        EasyMock.expect(merged.normalize(true)).andReturn(merged);
+        
+        control.replay();
+        cpi = new ClientPolicyInfo();
+        cpi.initialiseResponsePolicy(boi, ei, engine);
+        assertSame(merged, cpi.getResponsePolicy());
+        control.verify();
+    }
+    
+    public void testInitialiseInInterceptors() {
+        ClientPolicyInfo cpi = new ClientPolicyInfo();    
+        Policy responsePolicy = new Policy();
+        ExactlyOne ea = new ExactlyOne();
+        All alt1 = new All();  
+        QName qn1 = new QName("http://x.y.z", "a1");
+        TestAssertion a1 = new TestAssertion(qn1);
+        alt1.addAssertion(a1);
+        All alt2 = new All();
+        QName qn2 = new QName("http://x.y.z", "a2");
+        TestAssertion a2 = new TestAssertion(qn2);
+        alt2.addAssertion(a2);
+        ea.addPolicyComponent(alt1);
+        ea.addPolicyComponent(alt2);
+        responsePolicy.addPolicyComponent(ea);        
+ 
+        PolicyEngine engine = control.createMock(PolicyEngine.class);
+        PolicyInterceptorProviderRegistry reg = control.createMock(PolicyInterceptorProviderRegistry.class);
+        
+        control.replay();
+        cpi.initialiseInInterceptors(engine);
+        assertTrue(cpi.getInInterceptors().isEmpty());
+        assertTrue(cpi.getInFaultInterceptors().isEmpty());
+        control.verify();
+        
+        control.reset();
+        cpi.setResponsePolicy(responsePolicy);
+        setupPolicyInterceptorProviderRegistry(engine, reg);
+        PolicyInterceptorProvider p1 = control.createMock(PolicyInterceptorProvider.class);
+        EasyMock.expect(reg.get(qn1)).andReturn(p1);
+        PolicyInterceptorProvider p2 = control.createMock(PolicyInterceptorProvider.class);
+        EasyMock.expect(reg.get(qn2)).andReturn(p2);
+        Interceptor i1 = control.createMock(Interceptor.class);
+        EasyMock.expect(p1.getInInterceptors()).andReturn(Collections.singletonList(i1));
+        EasyMock.expect(p1.getInFaultInterceptors())
+            .andReturn(CastUtils.cast(Collections.EMPTY_LIST, Interceptor.class));
+        Interceptor i2 = control.createMock(Interceptor.class);
+        EasyMock.expect(p2.getInInterceptors()).andReturn(Collections.singletonList(i2));
+        Interceptor fi2 = control.createMock(Interceptor.class);
+        EasyMock.expect(p2.getInFaultInterceptors())
+            .andReturn(Collections.singletonList(fi2));
+           
+        control.replay();
+        cpi.initialiseInInterceptors(engine);
+        assertEquals(2, cpi.getInInterceptors().size());
+        assertEquals(1, cpi.getInFaultInterceptors().size());
+        control.verify();
+    }
+    
+    private void setupPolicyInterceptorProviderRegistry(PolicyEngine engine, 
+                                                        PolicyInterceptorProviderRegistry reg) {
+        Bus bus = control.createMock(Bus.class);        
+        EasyMock.expect(engine.getBus()).andReturn(bus);
+        EasyMock.expect(bus.getExtension(PolicyInterceptorProviderRegistry.class)).andReturn(reg);
+    }
+   
+    
+    
+    
+   
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/ClientPolicyInfoTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,354 @@
+/**
+ * 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.ws.policy;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.extension.BusExtensionRegistrar;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.service.model.BindingFaultInfo;
+import org.apache.cxf.service.model.BindingMessageInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.transport.Conduit;
+import org.apache.neethi.Policy;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
+
+/**
+ * 
+ */
+public class PolicyEngineTest extends TestCase {
+
+    private IMocksControl control;
+    private PolicyEngine engine;
+    
+    public void setUp() {
+        control = EasyMock.createNiceControl(); 
+    } 
+    
+    public void testAccessors() {
+        engine = new PolicyEngine();
+        assertNull(engine.getBuilder());
+        assertNull(engine.getPolicyProviders());
+        PolicyBuilder builder = control.createMock(PolicyBuilder.class);
+        engine.setBuilder(builder);
+        Bus bus = control.createMock(Bus.class);
+        engine.setBus(bus);
+        List<PolicyProvider> providers = CastUtils.cast(Collections.EMPTY_LIST, PolicyProvider.class);
+        engine.setPolicyProviders(providers);
+        assertSame(builder, engine.getBuilder());
+        assertSame(bus, engine.getBus());
+        assertSame(providers, engine.getPolicyProviders());
+    }
+    
+    public void testInit() {  
+        Bus bus = control.createMock(Bus.class);
+        BusExtensionRegistrar br = control.createMock(BusExtensionRegistrar.class);
+        br.registerExtension((PolicyEngine)EasyMock.isA(PolicyEngine.class), 
+                             EasyMock.eq(PolicyEngine.class));
+        EasyMock.expectLastCall();
+        EasyMock.expect(br.getBus()).andReturn(bus);
+        AssertionBuilderRegistry abr = control.createMock(AssertionBuilderRegistry.class);
+        EasyMock.expect(bus.getExtension(AssertionBuilderRegistry.class)).andReturn(abr);
+        
+        control.replay();
+        engine = new PolicyEngine(br);
+        engine.init();
+        assertSame(bus, engine.getBus());
+        assertEquals(1, engine.getPolicyProviders().size());
+        assertNotNull(engine.getBuilder());
+        control.verify();    
+    }
+    
+    public void testAddBusInterceptors() {        
+        engine = new PolicyEngine();
+        engine.addBusInterceptors();
+        
+        Bus bus = control.createMock(Bus.class);
+        engine.setBus(bus);
+        List<Interceptor> out = new ArrayList<Interceptor>();
+        List<Interceptor> in = new ArrayList<Interceptor>();
+        List<Interceptor> inFault = new ArrayList<Interceptor>();
+        EasyMock.expect(bus.getOutInterceptors()).andReturn(out);
+        EasyMock.expect(bus.getInInterceptors()).andReturn(in);
+        EasyMock.expect(bus.getInFaultInterceptors()).andReturn(inFault);
+        
+        control.replay();
+        engine.addBusInterceptors();
+        assertEquals(1, out.size());
+        assertTrue(out.get(0) instanceof ClientPolicyOutInterceptor);
+        assertEquals(1, in.size());
+        assertTrue(in.get(0) instanceof ClientPolicyInInterceptor);
+        assertEquals(1, inFault.size());
+        assertTrue(inFault.get(0) instanceof ClientPolicyInFaultInterceptor);
+        control.verify();
+    }
+    
+    public void testGetAggregatedServicePolicy() {
+        engine = new PolicyEngine();
+        List<PolicyProvider> providers = new ArrayList<PolicyProvider>();
+        engine.setPolicyProviders(providers);
+        ServiceInfo si = control.createMock(ServiceInfo.class);
+        
+        control.replay();
+        Policy p = engine.getAggregatedServicePolicy(si);
+        assertTrue(p.isEmpty());
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider1 = control.createMock(PolicyProvider.class);
+        providers.add(provider1);
+        Policy p1 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(si)).andReturn(p1);
+        
+        control.replay();
+        assertSame(p1, engine.getAggregatedServicePolicy(si));
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider2 = control.createMock(PolicyProvider.class);
+        providers.add(provider2);
+        Policy p2 = control.createMock(Policy.class);
+        Policy p3 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(si)).andReturn(p1);
+        EasyMock.expect(provider2.getEffectivePolicy(si)).andReturn(p2);
+        EasyMock.expect(p1.merge(p2)).andReturn(p3);
+        
+        control.replay();
+        assertSame(p3, engine.getAggregatedServicePolicy(si));
+        control.verify();      
+    }
+    
+    public void testGetAggregatedEndpointPolicy() {
+        engine = new PolicyEngine();
+        List<PolicyProvider> providers = new ArrayList<PolicyProvider>();
+        engine.setPolicyProviders(providers);
+        EndpointInfo ei = control.createMock(EndpointInfo.class);
+        
+        control.replay();
+        Policy p = engine.getAggregatedEndpointPolicy(ei);
+        assertTrue(p.isEmpty());
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider1 = control.createMock(PolicyProvider.class);
+        providers.add(provider1);
+        Policy p1 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(ei)).andReturn(p1);
+        
+        control.replay();
+        assertSame(p1, engine.getAggregatedEndpointPolicy(ei));
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider2 = control.createMock(PolicyProvider.class);
+        providers.add(provider2);
+        Policy p2 = control.createMock(Policy.class);
+        Policy p3 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(ei)).andReturn(p1);
+        EasyMock.expect(provider2.getEffectivePolicy(ei)).andReturn(p2);
+        EasyMock.expect(p1.merge(p2)).andReturn(p3);
+        
+        control.replay();
+        assertSame(p3, engine.getAggregatedEndpointPolicy(ei));
+        control.verify();      
+    }
+    
+    public void testGetAggregatedOperationPolicy() {
+        engine = new PolicyEngine();
+        List<PolicyProvider> providers = new ArrayList<PolicyProvider>();
+        engine.setPolicyProviders(providers);
+        BindingOperationInfo boi = control.createMock(BindingOperationInfo.class);
+        
+        control.replay();
+        Policy p = engine.getAggregatedOperationPolicy(boi);
+        assertTrue(p.isEmpty());
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider1 = control.createMock(PolicyProvider.class);
+        providers.add(provider1);
+        Policy p1 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(boi)).andReturn(p1);
+        
+        control.replay();
+        assertSame(p1, engine.getAggregatedOperationPolicy(boi));
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider2 = control.createMock(PolicyProvider.class);
+        providers.add(provider2);
+        Policy p2 = control.createMock(Policy.class);
+        Policy p3 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(boi)).andReturn(p1);
+        EasyMock.expect(provider2.getEffectivePolicy(boi)).andReturn(p2);
+        EasyMock.expect(p1.merge(p2)).andReturn(p3);
+        
+        control.replay();
+        assertSame(p3, engine.getAggregatedOperationPolicy(boi));
+        control.verify();      
+    }
+    
+    public void testGetAggregatedMessagePolicy() {
+        engine = new PolicyEngine();
+        List<PolicyProvider> providers = new ArrayList<PolicyProvider>();
+        engine.setPolicyProviders(providers);
+        BindingMessageInfo bmi = control.createMock(BindingMessageInfo.class);
+        
+        control.replay();
+        Policy p = engine.getAggregatedMessagePolicy(bmi);
+        assertTrue(p.isEmpty());
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider1 = control.createMock(PolicyProvider.class);
+        providers.add(provider1);
+        Policy p1 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(bmi)).andReturn(p1);
+        
+        control.replay();
+        assertSame(p1, engine.getAggregatedMessagePolicy(bmi));
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider2 = control.createMock(PolicyProvider.class);
+        providers.add(provider2);
+        Policy p2 = control.createMock(Policy.class);
+        Policy p3 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(bmi)).andReturn(p1);
+        EasyMock.expect(provider2.getEffectivePolicy(bmi)).andReturn(p2);
+        EasyMock.expect(p1.merge(p2)).andReturn(p3);
+        
+        control.replay();
+        assertSame(p3, engine.getAggregatedMessagePolicy(bmi));
+        control.verify();      
+    }
+    
+    public void testGetAggregatedFaultPolicy() {
+        engine = new PolicyEngine();
+        List<PolicyProvider> providers = new ArrayList<PolicyProvider>();
+        engine.setPolicyProviders(providers);
+        BindingFaultInfo bfi = control.createMock(BindingFaultInfo.class);
+        
+        control.replay();
+        Policy p = engine.getAggregatedFaultPolicy(bfi);
+        assertTrue(p.isEmpty());
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider1 = control.createMock(PolicyProvider.class);
+        providers.add(provider1);
+        Policy p1 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(bfi)).andReturn(p1);
+        
+        control.replay();
+        assertSame(p1, engine.getAggregatedFaultPolicy(bfi));
+        control.verify();
+        control.reset();
+        
+        PolicyProvider provider2 = control.createMock(PolicyProvider.class);
+        providers.add(provider2);
+        Policy p2 = control.createMock(Policy.class);
+        Policy p3 = control.createMock(Policy.class);
+        EasyMock.expect(provider1.getEffectivePolicy(bfi)).andReturn(p1);
+        EasyMock.expect(provider2.getEffectivePolicy(bfi)).andReturn(p2);
+        EasyMock.expect(p1.merge(p2)).andReturn(p3);
+        
+        control.replay();
+        assertSame(p3, engine.getAggregatedFaultPolicy(bfi));
+        control.verify();      
+    }
+    
+    public void testGetClientOutInterceptors() throws NoSuchMethodException { 
+        doTestGetClientInterceptors(true, false);                
+    }
+    
+    public void testGetClientInInterceptors() throws NoSuchMethodException { 
+        doTestGetClientInterceptors(false, false);       
+    }
+    
+    public void testGetClientInFaultInterceptors() throws NoSuchMethodException { 
+        doTestGetClientInterceptors(false, true);       
+    }
+    
+    public void doTestGetClientInterceptors(boolean out, boolean fault) throws NoSuchMethodException { 
+        Method m = PolicyEngine.class.getDeclaredMethod("getClientPolicyInfo", 
+            new Class[] {BindingOperationInfo.class, EndpointInfo.class, Conduit.class});
+        engine = control.createMock(PolicyEngine.class, new Method[] {m});
+        BindingOperationInfo boi = control.createMock(BindingOperationInfo.class);
+        EndpointInfo ei = control.createMock(EndpointInfo.class);
+        Conduit conduit = control.createMock(Conduit.class);
+        
+        ClientPolicyInfo cpi = control.createMock(ClientPolicyInfo.class);
+        EasyMock.expect(engine.getClientPolicyInfo(boi, ei, conduit)).andReturn(cpi);
+        Interceptor i = control.createMock(Interceptor.class);
+        List<Interceptor> li = Collections.singletonList(i);
+        if (out) {
+            EasyMock.expect(cpi.getOutInterceptors()).andReturn(li);
+        } else {
+            if (fault) {
+                EasyMock.expect(cpi.getInFaultInterceptors()).andReturn(li);
+            } else {
+                EasyMock.expect(cpi.getInInterceptors()).andReturn(li);
+            }
+        }
+        
+        control.replay();
+        List<Interceptor> clientInterceptors = out ? engine.getClientOutInterceptors(boi, ei, conduit)
+            : (fault ? engine.getClientInFaultInterceptors(boi, ei, conduit) 
+                : engine.getClientInInterceptors(boi, ei, conduit));        
+        assertSame(li, clientInterceptors);        
+        control.verify();                
+    }
+    
+    public void xtestSupportsAlternative() {
+        doTestSupportsAlternative(true);
+    }    
+    
+    void doTestSupportsAlternative(boolean supported) {
+        /*
+        PolicyInterceptorProviderRegistry pipr = control.createMock(PolicyInterceptorProviderRegistry.class);
+        EasyMock.expect(bus.getExtension(PolicyInterceptorProviderRegistry.class)).andReturn(pipr);
+        Assertion a = control.createMock(Assertion.class);
+        List<Assertion> alternative = Collections.singletonList(a);
+        EasyMock.expect(a.isOptional()).andReturn(false);
+        QName qn = new QName("http://x.y.z", "a");
+        EasyMock.expect(a.getName()).andReturn(qn);
+        EasyMock.expect(pipr.get(qn)).andReturn(null);
+        AssertingConduit ac = control.createMock(AssertingConduit.class);
+        EasyMock.expect(ac.asserts(a)).andReturn(supported);
+                
+        control.replay();
+        assertEquals(supported, engine.supportsAlternative(alternative, ac));
+        control.verify();
+        */
+    }
+    
+    
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyEngineTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java?view=auto&rev=504621
==============================================================================
--- incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java (added)
+++ incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java Wed Feb  7 09:11:23 2007
@@ -0,0 +1,181 @@
+/**
+ * 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.ws.policy;
+
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.interceptor.InterceptorChain;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Conduit;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
+
+/**
+ * 
+ */
+public class PolicyInterceptorsTest extends TestCase {
+    
+    private IMocksControl control;
+    private Message message;
+    private BindingOperationInfo boi;
+    private EndpointInfo ei;
+    private Bus bus;
+    private PolicyEngine pe;
+    private Conduit conduit;
+    
+    
+    public void setUp() {
+        control = EasyMock.createNiceControl();
+        bus = control.createMock(Bus.class);       
+    } 
+    
+    public void testClientPolicyOutInterceptor() {
+        ClientPolicyOutInterceptor interceptor = new ClientPolicyOutInterceptor();
+        interceptor.setBus(bus);
+       
+        doTestBasics(interceptor);
+        
+        control.reset();
+        setupMessage(true, true, true, true);
+        Interceptor i = control.createMock(Interceptor.class);
+        EasyMock.expect(pe.getClientOutInterceptors(boi, ei, conduit))
+            .andReturn(CastUtils.cast(Collections.singletonList(i), Interceptor.class));
+        InterceptorChain ic = control.createMock(InterceptorChain.class);
+        EasyMock.expect(message.getInterceptorChain()).andReturn(ic);
+        ic.add(i);
+        EasyMock.expectLastCall();
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();        
+    }
+    
+    public void testClientPolicyInInterceptor() {
+        ClientPolicyInInterceptor interceptor = new ClientPolicyInInterceptor();
+        interceptor.setBus(bus);
+        
+        doTestBasics(interceptor);
+        
+        control.reset();
+        setupMessage(true, true, true, true);
+        Interceptor i = control.createMock(Interceptor.class);
+        EasyMock.expect(pe.getClientInInterceptors(boi, ei, conduit))
+            .andReturn(CastUtils.cast(Collections.singletonList(i), Interceptor.class));
+        InterceptorChain ic = control.createMock(InterceptorChain.class);
+        EasyMock.expect(message.getInterceptorChain()).andReturn(ic);
+        ic.add(i);
+        EasyMock.expectLastCall();
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();        
+    }
+    
+    public void testClientPolicyInFaultInterceptor() {
+        ClientPolicyInFaultInterceptor interceptor = new ClientPolicyInFaultInterceptor();
+        interceptor.setBus(bus);
+        
+        doTestBasics(interceptor);
+        
+        control.reset();
+        setupMessage(true, true, true, true);
+        Interceptor i = control.createMock(Interceptor.class);
+        EasyMock.expect(pe.getClientInFaultInterceptors(boi, ei, conduit))
+            .andReturn(CastUtils.cast(Collections.singletonList(i), Interceptor.class));
+        InterceptorChain ic = control.createMock(InterceptorChain.class);
+        EasyMock.expect(message.getInterceptorChain()).andReturn(ic);
+        ic.add(i);
+        EasyMock.expectLastCall();
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();        
+    }
+    
+    private void doTestBasics(Interceptor<Message> interceptor) {
+        setupMessage(false, false, false, false);
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();
+        
+        control.reset();
+        setupMessage(true, false, false, false);
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();
+        
+        control.reset();
+        setupMessage(true, true, false, false);
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();
+            
+        control.reset();
+        setupMessage(true, true, true, false);
+        control.replay();
+        interceptor.handleMessage(message);
+        control.verify();
+    }
+    
+    void setupMessage(boolean setupRequestor, 
+                      boolean setupOperation, 
+                      boolean setupEndpoint, 
+                      boolean setupEngine) {
+        message = control.createMock(Message.class);
+        EasyMock.expect(message.get(Message.REQUESTOR_ROLE))
+            .andReturn(setupRequestor ? Boolean.TRUE : Boolean.FALSE);
+        if (!setupRequestor) {
+            return;
+        }        
+
+        if (null == boi) {
+            boi = control.createMock(BindingOperationInfo.class);
+        }
+        EasyMock.expect(message.get(BindingOperationInfo.class)).andReturn(setupOperation ? boi : null);
+        if (!setupOperation) {
+            return;
+        }
+               
+        if (null == ei) {
+            ei = control.createMock(EndpointInfo.class);
+        }
+        EasyMock.expect(message.get(EndpointInfo.class)).andReturn(setupEndpoint ? ei : null);
+        if (!setupEndpoint) {
+            return;
+        }
+        if (null == pe) {
+            pe = control.createMock(PolicyEngine.class);
+        }
+        EasyMock.expect(bus.getExtension(PolicyEngine.class)).andReturn(setupEngine ? pe : null);
+        if (!setupEngine) {
+            return;
+        }
+            
+        if (null == conduit) {
+            conduit = control.createMock(Conduit.class);
+        }
+        EasyMock.expect(message.getConduit()).andReturn(conduit);
+      
+    }
+}

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date