Return-Path: Delivered-To: apmail-incubator-cxf-commits-archive@locus.apache.org Received: (qmail 23535 invoked from network); 11 Apr 2007 08:33:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 11 Apr 2007 08:33:46 -0000 Received: (qmail 34562 invoked by uid 500); 11 Apr 2007 08:33:52 -0000 Delivered-To: apmail-incubator-cxf-commits-archive@incubator.apache.org Received: (qmail 34482 invoked by uid 500); 11 Apr 2007 08:33:52 -0000 Mailing-List: contact cxf-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: cxf-dev@incubator.apache.org Delivered-To: mailing list cxf-commits@incubator.apache.org Received: (qmail 34465 invoked by uid 99); 11 Apr 2007 08:33:52 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 11 Apr 2007 01:33:52 -0700 X-ASF-Spam-Status: No, hits=-98.6 required=10.0 tests=ALL_TRUSTED,INFO_TLD,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 11 Apr 2007 01:33:43 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 327631A9838; Wed, 11 Apr 2007 01:33:23 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r527411 - in /incubator/cxf/trunk: api/src/main/java/org/apache/cxf/message/ rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/ rt/transports/http/src/main/java/org/apache/cxf/transport/http/ rt/transports/http/src/... Date: Wed, 11 Apr 2007 08:33:18 -0000 To: cxf-commits@incubator.apache.org From: andreasmyth@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070411083323.327631A9838@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: andreasmyth Date: Wed Apr 11 01:33:10 2007 New Revision: 527411 URL: http://svn.apache.org/viewvc?view=rev&rev=527411 Log: [JIRA CXF-473] WS-Policification of HTTPServerPolicy * Implementation of compatible and equals for http server policy. * All policy interceptors to throw Fault (wrapping PolicyException) instead of PolicyException. * System test demonstrating the use of HTTPServerPolicy assertions in wsp:Policy elements attached to different subjects (port, operation, binding,...): policies attached to operation and message subjects must - if used - be equal to effective policy for endpoint. * HTTPDestination initialisation to take into account policies. * Removed static method copyProperties added to MessageImpl earlier - it was never used. Added: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java (with props) incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java (with props) incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml (with props) incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl (with props) Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageImpl.java incubator/cxf/trunk/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilder.java incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/Messages.properties incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/PolicyUtils.java incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilderTest.java incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/PolicyUtilsTest.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/AbstractPolicyInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInFaultInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationOutInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyInInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutFaultInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutInterceptor.java incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPClientPolicyTest.java incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/PolicyLoggingInterceptor.java Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageImpl.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageImpl.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageImpl.java (original) +++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/MessageImpl.java Wed Apr 11 01:33:10 2007 @@ -150,10 +150,4 @@ m2.setContent(c, m1.getContent(c)); } } - - public static void copyProperties(Message m1, Message m2) { - for (String s : m1.keySet()) { - m2.put(s, m1.get(s)); - } - } } Modified: incubator/cxf/trunk/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java (original) +++ incubator/cxf/trunk/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java Wed Apr 11 01:33:10 2007 @@ -54,6 +54,7 @@ import org.apache.cxf.transports.http.QueryHandlerRegistry; import org.apache.cxf.transports.http.configuration.HTTPServerPolicy; import org.apache.cxf.ws.addressing.EndpointReferenceType; +import org.apache.cxf.ws.policy.PolicyEngine; import org.apache.cxf.wsdl.EndpointReferenceUtils; import org.easymock.classextension.EasyMock; import org.junit.After; @@ -324,6 +325,8 @@ } else { bus = EasyMock.createMock(Bus.class); bus.getExtension(EndpointResolverRegistry.class); + EasyMock.expectLastCall().andReturn(null); + bus.getExtension(PolicyEngine.class); EasyMock.expectLastCall().andReturn(null); EasyMock.replay(bus); } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java Wed Apr 11 01:33:10 2007 @@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.xml.namespace.QName; import org.apache.cxf.Bus; import org.apache.cxf.common.logging.LogUtils; @@ -52,13 +53,17 @@ import org.apache.cxf.transport.AbstractDestination; import org.apache.cxf.transport.Conduit; import org.apache.cxf.transport.ConduitInitiator; +import org.apache.cxf.transport.http.policy.PolicyUtils; import org.apache.cxf.transports.http.configuration.HTTPServerPolicy; import org.apache.cxf.ws.addressing.EndpointReferenceType; +import org.apache.cxf.ws.policy.Assertor; +import org.apache.cxf.ws.policy.PolicyEngine; /** * Common base for HTTP Destination implementations. */ -public abstract class AbstractHTTPDestination extends AbstractDestination implements Configurable { +public abstract class AbstractHTTPDestination extends AbstractDestination + implements Configurable, Assertor { public static final String HTTP_REQUEST = "HTTP.REQUEST"; public static final String HTTP_RESPONSE = "HTTP.RESPONSE"; @@ -246,7 +251,14 @@ } private void initConfig() { - this.server = endpointInfo.getTraversedExtensor(new HTTPServerPolicy(), HTTPServerPolicy.class); + PolicyEngine engine = bus.getExtension(PolicyEngine.class); + // for a decoupled endpoint there is no service info + if (null != engine && engine.isEnabled() && null != endpointInfo.getService()) { + server = PolicyUtils.getServer(engine, endpointInfo, this); + } + if (null == server) { + server = endpointInfo.getTraversedExtensor(new HTTPServerPolicy(), HTTPServerPolicy.class); + } this.sslServer = endpointInfo.getTraversedExtensor(null, SSLServerPolicy.class); } @@ -450,4 +462,16 @@ public void setSslServer(SSLServerPolicy sslServer) { this.sslServer = sslServer; } + + public void assertMessage(Message message) { + PolicyUtils.assertServerPolicy(message, server); + } + + public boolean canAssert(QName type) { + return PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME.equals(type); + } + + + + } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilder.java Wed Apr 11 01:33:10 2007 @@ -73,7 +73,14 @@ } JaxbAssertion other = JaxbAssertion.cast((Assertion)policyComponent); return PolicyUtils.equals(this.getData(), other.getData()); - } + } + + @Override + protected Assertion cloneMandatory() { + HTTPClientPolicyAssertion a = new HTTPClientPolicyAssertion(); + a.setData(getData()); + return a; + } } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilder.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilder.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilder.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilder.java Wed Apr 11 01:33:10 2007 @@ -25,6 +25,7 @@ import org.apache.cxf.ws.policy.builder.jaxb.JaxbAssertion; import org.apache.cxf.ws.policy.builder.jaxb.JaxbAssertionBuilder; import org.apache.neethi.Assertion; +import org.apache.neethi.PolicyComponent; /** * @@ -46,12 +47,39 @@ if (null == compatible) { return null; } - JaxbAssertion ca = - new JaxbAssertion(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, - a.isOptional() && b.isOptional()); + + JaxbAssertion ca = buildAssertion(); + ca.setOptional(a.isOptional() && b.isOptional()); ca.setData(compatible); return ca; } return null; + } + + @Override + protected JaxbAssertion buildAssertion() { + return new HTTPServerPolicyAssertion(); + } + + class HTTPServerPolicyAssertion extends JaxbAssertion { + HTTPServerPolicyAssertion() { + super(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, false); + } + + @Override + public boolean equal(PolicyComponent policyComponent) { + if (!super.equal(policyComponent)) { + return false; + } + JaxbAssertion other = JaxbAssertion.cast((Assertion)policyComponent); + return PolicyUtils.equals(this.getData(), other.getData()); + } + + @Override + protected Assertion cloneMandatory() { + HTTPServerPolicyAssertion a = new HTTPServerPolicyAssertion(); + a.setData(getData()); + return a; + } } } Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/Messages.properties URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/Messages.properties?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/Messages.properties (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/Messages.properties Wed Apr 11 01:33:10 2007 @@ -19,3 +19,4 @@ # # INCOMPATIBLE_HTTPCLIENTPOLICY_ASSERTIONS = Incompatible HTTPClientPolicy assertions. +INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS = Incompatible HTTPServerPolicy assertions. Modified: incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/PolicyUtils.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/PolicyUtils.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/PolicyUtils.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/policy/PolicyUtils.java Wed Apr 11 01:33:10 2007 @@ -31,6 +31,7 @@ import org.apache.cxf.message.MessageUtils; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.Conduit; +import org.apache.cxf.transport.Destination; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.apache.cxf.transports.http.configuration.HTTPServerPolicy; import org.apache.cxf.ws.policy.AssertionInfo; @@ -63,11 +64,13 @@ /** - * Returns a HTTPClientPolicy that is compatible with the assertions included in the - * service, endpoint, operation and message policy subjects AND the HTTPClientPolicy configured - * for the conduit. + * Returns a HTTPClientPolicy that is compatible with the assertions included in the + * service, endpoint, operation and message policy subjects AND the HTTPClientPolicy + * passed as a second argument. * @param message the message + * @param confPolicy the additional policy to be compatible with * @return the HTTPClientPolicy for the message + * @throws PolicyException if no compatible HTTPClientPolicy can be determined */ public static HTTPClientPolicy getClient(Message message, HTTPClientPolicy confPolicy) { AssertionInfoMap amap = message.get(AssertionInfoMap.class); @@ -96,12 +99,51 @@ } /** + * Returns a HTTPServerPolicy that is compatible with the assertions included in the + * service, endpoint, operation and message policy subjects AND the HTTPServerPolicy + * passed as a second argument. + * @param message the message + * @param confPolicy the additional policy to be compatible with + * @return the HTTPServerPolicy for the message + * @throws PolicyException if no compatible HTTPServerPolicy can be determined + */ + public static HTTPServerPolicy getServer(Message message, HTTPServerPolicy confPolicy) { + AssertionInfoMap amap = message.get(AssertionInfoMap.class); + if (null == amap) { + return confPolicy; + } + Collection ais = amap.get(HTTPSERVERPOLICY_ASSERTION_QNAME); + if (null == ais) { + return confPolicy; + } + Collection alternative = new ArrayList(); + for (AssertionInfo ai : ais) { + alternative.add(ai.getAssertion()); + } + HTTPServerPolicy compatible = getServer(alternative); + if (null != compatible && null != confPolicy) { + if (PolicyUtils.compatible(compatible, confPolicy)) { + compatible = intersect(compatible, confPolicy); + } else { + LogUtils.log(LOG, Level.SEVERE, "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS"); + throw new PolicyException(new org.apache.cxf.common.i18n.Message( + "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS", LOG)); + } + } + return compatible; + } + + /** * Returns a HTTPClientPolicy that is compatible with the assertions included in the * service and endpoint policy subjects, or null if there are no such assertions. + * @param pe the policy engine + * @param ei the endpoint info + * @param c the conduit + * @return the compatible policy + * @throws PolicyException if no compatible HTTPClientPolicy can be determined */ public static HTTPClientPolicy getClient(PolicyEngine pe, EndpointInfo ei, Conduit c) { Collection alternative = pe.getClientEndpointPolicy(ei, c).getChosenAlternative(); - HTTPClientPolicy compatible = null; for (Assertion a : alternative) { if (HTTPCLIENTPOLICY_ASSERTION_QNAME.equals(a.getName())) { @@ -119,9 +161,44 @@ } } return compatible; - } + /** + * Returns a HTTPServerPolicy that is compatible with the assertions included in the + * service and endpoint policy subjects, or null if there are no such assertions. + * @param pe the policy engine + * @param ei the endpoint info + * @param d the destination + * @return the compatible policy + * @throws PolicyException if no compatible HTTPServerPolicy can be determined + */ + public static HTTPServerPolicy getServer(PolicyEngine pe, EndpointInfo ei, Destination d) { + Collection alternative = pe.getServerEndpointPolicy(ei, d).getChosenAlternative(); + HTTPServerPolicy compatible = null; + for (Assertion a : alternative) { + if (HTTPSERVERPOLICY_ASSERTION_QNAME.equals(a.getName())) { + HTTPServerPolicy p = JaxbAssertion.cast(a, HTTPServerPolicy.class).getData(); + if (null == compatible) { + compatible = p; + } else { + compatible = intersect(compatible, p); + if (null == compatible) { + LogUtils.log(LOG, Level.SEVERE, "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS"); + throw new PolicyException(new org.apache.cxf.common.i18n.Message( + "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS", LOG)); + } + } + } + } + return compatible; + } + + /** + * Asserts all HTTPClientPolicy assertions that are compatible with the specified + * client policy. + * @param message the current message + * @param client the client policy + */ public static void assertClientPolicy(Message message, HTTPClientPolicy client) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); @@ -151,9 +228,43 @@ } /** + * Asserts all HTTPServerPolicy assertions that are equal to the specified + * server policy. + * @param message the current message + * @param server the server policy + */ + public static void assertServerPolicy(Message message, HTTPServerPolicy server) { + + AssertionInfoMap aim = message.get(AssertionInfoMap.class); + if (null == aim) { + return; + } + Collection ais = aim.get(HTTPSERVERPOLICY_ASSERTION_QNAME); + if (null == ais || ais.size() == 0) { + return; + } + + // assert all assertion(s) that are equal to the value configured for the conduit + + if (MessageUtils.isOutbound(message)) { + for (AssertionInfo ai : ais) { + ai.setAsserted(true); + } + } else { + for (AssertionInfo ai : ais) { + HTTPServerPolicy p = (JaxbAssertion.cast(ai.getAssertion(), + HTTPServerPolicy.class)).getData(); + if (equals(p, server)) { + ai.setAsserted(true); + } + } + } + } + + /** * Checks if two HTTPClientPolicy objects are compatible. - * @param p1 one policy - * @param p2 another policy + * @param p1 one client policy + * @param p2 another client policy * @return true iff policies are compatible */ public static boolean compatible(HTTPClientPolicy p1, HTTPClientPolicy p2) { @@ -198,6 +309,8 @@ compatible &= compatible(p1.getCookie(), p2.getCookie()); } + // REVISIT: Should compatibility require strict equality? + if (compatible) { compatible &= compatible(p1.getDecoupledEndpoint(), p2.getDecoupledEndpoint()); } @@ -237,7 +350,7 @@ /** - * Returns a new HTTPClientPolicy which is compatible with the two specified policies or + * Returns a new HTTPClientPolicy that is compatible with the two specified policies or * null if no compatible policy can be determined. * @param p1 one policy * @param p2 another policy @@ -306,9 +419,55 @@ } /** + * Determines if two HTTPClientPolicy objects are equal. + * REVISIT: Check if this can be replaced by a generated equals method. + * @param p1 one client policy + * @param p2 another client policy + * @return true iff the two policies are equal + */ + public static boolean equals(HTTPClientPolicy p1, HTTPClientPolicy p2) { + if (p1 == p2) { + return true; + } + boolean result = true; + result &= (p1.isAllowChunking() == p2.isAllowChunking()) + && (p1.isAutoRedirect() == p2.isAutoRedirect()) + && equals(p1.getAccept(), p2.getAccept()) + && equals(p1.getAcceptEncoding(), p2.getAcceptEncoding()) + && equals(p1.getAcceptLanguage(), p2.getAcceptLanguage()) + && equals(p1.getBrowserType(), p2.getBrowserType()); + if (!result) { + return false; + } + + result &= (p1.getCacheControl() == null + ? p2.getCacheControl() == null + : p1.getCacheControl().value().equals(p2.getCacheControl().value()) + && p1.getConnection().value().equals(p2.getConnection().value())) + && (p1.getConnectionTimeout() == p2.getConnectionTimeout()) + && equals(p1.getContentType(), p2.getContentType()) + && equals(p1.getCookie(), p2.getCookie()) + && equals(p1.getDecoupledEndpoint(), p2.getDecoupledEndpoint()) + && equals(p1.getHost(), p2.getHost()); + if (!result) { + return false; + } + + result &= equals(p1.getProxyServer(), p2.getProxyServer()) + && (p1.isSetProxyServerPort() + ? p1.getProxyServerPort() == p2.getProxyServerPort() + : !p2.isSetProxyServerPort()) + && p1.getProxyServerType().value().equals(p2.getProxyServerType().value()) + && (p1.getReceiveTimeout() == p2.getReceiveTimeout()) + && equals(p1.getReferer(), p2.getReferer()); + + return result; + } + + /** * Checks if two HTTPServerPolicy objects are compatible. - * @param p1 one policy - * @param p2 another policy + * @param p1 one server policy + * @param p2 another server policy * @return true iff policies are compatible */ public static boolean compatible(HTTPServerPolicy p1, HTTPServerPolicy p2) { @@ -360,7 +519,7 @@ } /** - * Returns a new HTTPServerPolicy which is compatible with the two specified policies or + * Returns a new HTTPServerPolicy that is compatible with the two specified policies or * null if no compatible policy can be determined. * @param p1 one policy * @param p2 another policy @@ -409,6 +568,38 @@ return p; } + /** + * Determines if two HTTPServerPolicy objects are equal. + * REVISIT: Check if this can be replaced by a generated equals method. + * @param p1 one server policy + * @param p2 another server policy + * @return true iff the two policies are equal + */ + public static boolean equals(HTTPServerPolicy p1, HTTPServerPolicy p2) { + if (p1 == p2) { + return true; + } + boolean result = true; + + result &= (p1.isHonorKeepAlive() == p2.isHonorKeepAlive()) + && (p1.getCacheControl() == null + ? p2.getCacheControl() == null + : p1.getCacheControl().value().equals(p2.getCacheControl().value())) + && equals(p1.getContentEncoding(), p2.getContentEncoding()) + && equals(p1.getContentLocation(), p2.getContentLocation()) + && equals(p1.getContentType(), p2.getContentType()); + if (!result) { + return false; + } + result &= (p1.getReceiveTimeout() == p2.getReceiveTimeout()) + && equals(p1.getRedirectURL(), p2.getRedirectURL()) + && equals(p1.getServerType(), p2.getServerType()) + && (p1.isSuppressClientReceiveErrors() == p2.isSuppressClientReceiveErrors()) + && (p1.isSuppressClientSendErrors() == p2.isSuppressClientSendErrors()); + + return result; + } + private static String combine(String s1, String s2) { return s1 == null ? s2 : s1; } @@ -443,6 +634,28 @@ return compatible; } + private static HTTPServerPolicy getServer(Collection alternative) { + HTTPServerPolicy compatible = null; + for (Assertion a : alternative) { + if (HTTPSERVERPOLICY_ASSERTION_QNAME.equals(a.getName())) { + HTTPServerPolicy p = JaxbAssertion.cast(a, HTTPServerPolicy.class).getData(); + if (null == compatible) { + compatible = p; + } else { + compatible = intersect(compatible, p); + if (null == compatible) { + LogUtils.log(LOG, Level.SEVERE, "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS"); + org.apache.cxf.common.i18n.Message m = + new org.apache.cxf.common.i18n.Message( + "INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS", LOG); + throw new PolicyException(m); + } + } + } + } + return compatible; + } + public static String toString(HTTPClientPolicy p) { StringBuffer buf = new StringBuffer(); buf.append(p); @@ -452,41 +665,19 @@ buf.append(p.getReceiveTimeout()); buf.append("])"); return buf.toString(); - } - public static boolean equals(HTTPClientPolicy p1, HTTPClientPolicy p2) { - if (p1 == p2) { - return true; - } - boolean result = true; - result &= p1.isAllowChunking() == p2.isAllowChunking() - && p1.isAutoRedirect() == p2.isAutoRedirect() - && equals(p1.getAccept(), p2.getAccept()) - && equals(p1.getAcceptEncoding(), p2.getAcceptEncoding()) - && equals(p1.getAcceptLanguage(), p2.getAcceptLanguage()) - && equals(p1.getBrowserType(), p2.getBrowserType()); - if (!result) { - return false; - } + public static String toString(HTTPServerPolicy p) { + StringBuffer buf = new StringBuffer(); + buf.append(p); + buf.append("[ContentType=\""); + buf.append(p.getContentType()); + buf.append("\", ReceiveTimeout="); + buf.append(p.getReceiveTimeout()); + buf.append("])"); + return buf.toString(); - result &= p1.getCacheControl() == null - ? p2.getCacheControl() == null - : p1.getCacheControl().value().equals(p2.getCacheControl().value()) - && p1.getConnection().value().equals(p2.getConnection().value()) - && p1.getConnectionTimeout() == p2.getConnectionTimeout() - && equals(p1.getContentType(), p2.getContentType()) - && equals(p1.getCookie(), p2.getCookie()) - && equals(p1.getDecoupledEndpoint(), p2.getDecoupledEndpoint()) - && equals(p1.getHost(), p2.getHost()); - if (!result) { - return false; - } - result &= equals(p1.getProxyServer(), p2.getProxyServer()) - && p1.getProxyServerPort() == p2.getProxyServerPort() - && p1.getProxyServerType().value().equals(p2.getProxyServerType().value()) - && p1.getReceiveTimeout() == p2.getReceiveTimeout() - && equals(p1.getReferer(), p2.getReferer()); - return result; } + + } Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilderTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilderTest.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilderTest.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPClientAssertionBuilderTest.java Wed Apr 11 01:33:10 2007 @@ -30,6 +30,7 @@ */ public class HTTPClientAssertionBuilderTest extends Assert { + @Test public void testBuildCompatible() throws Exception { HTTPClientAssertionBuilder ab = new HTTPClientAssertionBuilder(); JaxbAssertion a = ab.buildAssertion(); @@ -53,6 +54,7 @@ assertTrue(!a.isOptional()); } + @Test public void testHTTPCLientPolicyAssertionEqual() throws Exception { HTTPClientAssertionBuilder ab = new HTTPClientAssertionBuilder(); JaxbAssertion a = ab.buildAssertion(); @@ -66,7 +68,6 @@ b.setData(pb); assertTrue(a.equal(b)); pa.setDecoupledEndpoint("http://localhost:9999/decoupled_endpoint"); - assertTrue(!a.equal(b)); - } - + assertTrue(!a.equal(b)); + } } Added: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java?view=auto&rev=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java (added) +++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java Wed Apr 11 01:33:10 2007 @@ -0,0 +1,74 @@ +/** + * 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.transport.http.policy; + +import org.apache.cxf.transports.http.configuration.HTTPServerPolicy; +import org.apache.cxf.ws.policy.builder.jaxb.JaxbAssertion; +import org.apache.neethi.Assertion; +import org.junit.Assert; +import org.junit.Test; + +/** + * + */ +public class HTTPServerAssertionBuilderTest extends Assert { + + @Test + public void testBuildCompatible() throws Exception { + HTTPServerAssertionBuilder ab = new HTTPServerAssertionBuilder(); + JaxbAssertion a = ab.buildAssertion(); + HTTPServerPolicy pa = new HTTPServerPolicy(); + a.setData(pa); + JaxbAssertion b = ab.buildAssertion(); + HTTPServerPolicy pb = new HTTPServerPolicy(); + b.setData(pb); + JaxbAssertion c = + JaxbAssertion.cast(ab.buildCompatible(a, b), HTTPServerPolicy.class); + assertNotNull(c); + } + + @Test + public void testBuildAssertion() throws Exception { + HTTPServerAssertionBuilder ab = new HTTPServerAssertionBuilder(); + Assertion a = ab.buildAssertion(); + assertTrue(a instanceof JaxbAssertion); + assertTrue(a instanceof HTTPServerAssertionBuilder.HTTPServerPolicyAssertion); + assertEquals(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, a.getName()); + assertTrue(!a.isOptional()); + } + + @Test + public void testHTTPServerPolicyAssertionEqual() throws Exception { + HTTPServerAssertionBuilder ab = new HTTPServerAssertionBuilder(); + JaxbAssertion a = ab.buildAssertion(); + assertTrue(a.equal(a)); + JaxbAssertion b = ab.buildAssertion(); + assertTrue(a.equal(b)); + HTTPServerPolicy pa = new HTTPServerPolicy(); + a.setData(pa); + assertTrue(a.equal(a)); + HTTPServerPolicy pb = new HTTPServerPolicy(); + b.setData(pb); + assertTrue(a.equal(b)); + pa.setSuppressClientSendErrors(true); + assertTrue(!a.equal(b)); + } + +} Propchange: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/HTTPServerAssertionBuilderTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/PolicyUtilsTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/PolicyUtilsTest.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/PolicyUtilsTest.java (original) +++ incubator/cxf/trunk/rt/transports/http/src/test/java/org/apache/cxf/transport/http/policy/PolicyUtilsTest.java Wed Apr 11 01:33:10 2007 @@ -85,6 +85,20 @@ p = PolicyUtils.intersect(p1, p2); assertTrue(!p.isAllowChunking()); } + + @Test + public void testEqualClientPolicies() { + HTTPClientPolicy p1 = new HTTPClientPolicy(); + assertTrue(PolicyUtils.equals(p1, p1)); + HTTPClientPolicy p2 = new HTTPClientPolicy(); + assertTrue(PolicyUtils.equals(p1, p2)); + p1.setDecoupledEndpoint("http://localhost:8080/decoupled"); + assertTrue(!PolicyUtils.equals(p1, p2)); + p2.setDecoupledEndpoint("http://localhost:8080/decoupled"); + assertTrue(PolicyUtils.equals(p1, p2)); + p1.setReceiveTimeout(10000L); + assertTrue(!PolicyUtils.equals(p1, p2)); + } @Test public void testCompatibleServerPolicies() { @@ -104,7 +118,7 @@ p2.setSuppressClientSendErrors(true); assertTrue("Policies are compatible.", PolicyUtils.compatible(p1, p2)); } - + @Test public void testIntersectServerPolicies() { HTTPServerPolicy p1 = new HTTPServerPolicy(); @@ -124,8 +138,32 @@ assertTrue(p.isSuppressClientSendErrors()); } + + @Test + public void testEqualServerPolicies() { + HTTPServerPolicy p1 = new HTTPServerPolicy(); + assertTrue(PolicyUtils.equals(p1, p1)); + HTTPServerPolicy p2 = new HTTPServerPolicy(); + assertTrue(PolicyUtils.equals(p1, p2)); + p1.setContentEncoding("encoding"); + assertTrue(!PolicyUtils.equals(p1, p2)); + p2.setContentEncoding("encoding"); + assertTrue(PolicyUtils.equals(p1, p2)); + p1.setSuppressClientSendErrors(true); + assertTrue(!PolicyUtils.equals(p1, p2)); + } + @Test public void testAssertClientPolicyNoop() { + testAssertPolicyNoop(true); + } + + @Test + public void testAssertServerPolicyNoop() { + testAssertPolicyNoop(false); + } + + void testAssertPolicyNoop(boolean isRequestor) { Message message = control.createMock(Message.class); EasyMock.expect(message.get(AssertionInfoMap.class)).andReturn(null); control.replay(); @@ -137,7 +175,11 @@ AssertionInfoMap aim = new AssertionInfoMap(as); EasyMock.expect(message.get(AssertionInfoMap.class)).andReturn(aim); control.replay(); - PolicyUtils.assertClientPolicy(message, null); + if (isRequestor) { + PolicyUtils.assertClientPolicy(message, null); + } else { + PolicyUtils.assertServerPolicy(message, null); + } control.verify(); } @@ -193,6 +235,67 @@ assertTrue(eai.isAsserted()); assertTrue(cmai.isAsserted()); assertTrue(outbound ? !icmai.isAsserted() : icmai.isAsserted()); + control.verify(); + } + + @Test + public void testAssertServerPolicyOutbound() { + testAssertServerPolicy(true); + } + + @Test + public void testAssertServerPolicyInbound() { + testAssertServerPolicy(false); + } + + void testAssertServerPolicy(boolean outbound) { + Message message = control.createMock(Message.class); + HTTPServerPolicy ep = new HTTPServerPolicy(); + HTTPServerPolicy mp = new HTTPServerPolicy(); + HTTPServerPolicy cmp = new HTTPServerPolicy(); + cmp.setReceiveTimeout(60000L); + HTTPServerPolicy icmp = new HTTPServerPolicy(); + icmp.setSuppressClientSendErrors(true); + + JaxbAssertion ea = + new JaxbAssertion(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, false); + ea.setData(ep); + JaxbAssertion ma = + new JaxbAssertion(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, false); + ma.setData(mp); + JaxbAssertion cma = + new JaxbAssertion(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, false); + cma.setData(cmp); + JaxbAssertion icma = + new JaxbAssertion(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, false); + icma.setData(icmp); + + AssertionInfo eai = new AssertionInfo(ea); + AssertionInfo mai = new AssertionInfo(ma); + AssertionInfo cmai = new AssertionInfo(cma); + AssertionInfo icmai = new AssertionInfo(icma); + + AssertionInfoMap aim = new AssertionInfoMap(CastUtils.cast(Collections.EMPTY_LIST, Assertion.class)); + Collection ais = new ArrayList(); + ais.add(eai); + ais.add(mai); + ais.add(cmai); + ais.add(icmai); + aim.put(PolicyUtils.HTTPSERVERPOLICY_ASSERTION_QNAME, ais); + EasyMock.expect(message.get(AssertionInfoMap.class)).andReturn(aim); + Exchange ex = control.createMock(Exchange.class); + EasyMock.expect(message.getExchange()).andReturn(ex); + EasyMock.expect(ex.getOutMessage()).andReturn(outbound ? message : null); + if (!outbound) { + EasyMock.expect(ex.getOutFaultMessage()).andReturn(null); + } + + control.replay(); + PolicyUtils.assertServerPolicy(message, ep); + assertTrue(eai.isAsserted()); + assertTrue(mai.isAsserted()); + assertTrue(outbound ? cmai.isAsserted() : !cmai.isAsserted()); + assertTrue(outbound ? icmai.isAsserted() : !icmai.isAsserted()); control.verify(); } } Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/AbstractPolicyInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/AbstractPolicyInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/AbstractPolicyInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/AbstractPolicyInterceptor.java Wed Apr 11 01:33:10 2007 @@ -20,6 +20,7 @@ package org.apache.cxf.ws.policy; import org.apache.cxf.Bus; +import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; @@ -42,6 +43,14 @@ public Bus getBus() { return bus; } + + public void handleMessage(Message message) throws Fault { + try { + handle(message); + } catch (PolicyException ex) { + throw new Fault(ex); + } + } protected void getTransportAssertions(Message message) { Exchange ex = message.getExchange(); @@ -88,4 +97,7 @@ } return bfi; } + + protected abstract void handle(Message message) throws PolicyException; + } Modified: 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=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInFaultInterceptor.java Wed Apr 11 01:33:10 2007 @@ -47,7 +47,7 @@ setPhase(Phase.RECEIVE); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (!MessageUtils.isRequestor(msg)) { LOG.fine("Not a requestor."); return; Modified: 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=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyInInterceptor.java Wed Apr 11 01:33:10 2007 @@ -47,7 +47,7 @@ setPhase(Phase.RECEIVE); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (!MessageUtils.isRequestor(msg)) { LOG.fine("Not a requestor."); return; Modified: 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=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ClientPolicyOutInterceptor.java Wed Apr 11 01:33:10 2007 @@ -48,7 +48,7 @@ setPhase(Phase.SETUP); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (!MessageUtils.isRequestor(msg)) { LOG.fine("Not a requestor."); return; @@ -80,7 +80,7 @@ // add the required interceptors EffectivePolicy effectivePolicy = pe.getEffectiveClientRequestPolicy(ei, boi, conduit); - PolicyUtils.logPolicy(LOG, Level.FINE, "Using effective policy: ", effectivePolicy.getPolicy()); + PolicyUtils.logPolicy(LOG, Level.FINEST, "Using effective policy: ", effectivePolicy.getPolicy()); List interceptors = effectivePolicy.getInterceptors(); for (Interceptor i : interceptors) { @@ -92,14 +92,16 @@ Collection assertions = effectivePolicy.getChosenAlternative(); if (null != assertions) { - StringBuffer buf = new StringBuffer(); - buf.append("Chosen alternative: "); - String nl = System.getProperty("line.separator"); - buf.append(nl); - for (Assertion a : assertions) { - PolicyUtils.printPolicyComponent(a, buf, 1); + if (LOG.isLoggable(Level.FINEST)) { + StringBuffer buf = new StringBuffer(); + buf.append("Chosen alternative: "); + String nl = System.getProperty("line.separator"); + buf.append(nl); + for (Assertion a : assertions) { + PolicyUtils.printPolicyComponent(a, buf, 1); + } + LOG.finest(buf.toString()); } - LOG.fine(buf.toString()); msg.put(AssertionInfoMap.class, new AssertionInfoMap(assertions)); } } Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInFaultInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInFaultInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInFaultInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInFaultInterceptor.java Wed Apr 11 01:33:10 2007 @@ -23,7 +23,6 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.endpoint.Endpoint; -import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; @@ -49,8 +48,9 @@ * is supported. * * @param message + * @throws PolicyException if none of the alternatives is supported */ - public void handleMessage(Message message) throws Fault { + protected void handle(Message message) { if (!MessageUtils.isRequestor(message)) { LOG.fine("Not a requestor."); Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationInInterceptor.java Wed Apr 11 01:33:10 2007 @@ -23,7 +23,6 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.endpoint.Endpoint; -import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; @@ -47,8 +46,9 @@ * is supported. * * @param message + * @throws PolicyException if none of the alternatives is supported */ - public void handleMessage(Message message) throws Fault { + protected void handle(Message message) { Exchange exchange = message.getExchange(); assert null != exchange; Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationOutInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationOutInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationOutInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/PolicyVerificationOutInterceptor.java Wed Apr 11 01:33:10 2007 @@ -43,8 +43,9 @@ * interceptors necessary to assert the assertions are present, it is not possible * to predict if these interceptors actually have asserted their assertions. * @param message + * @throws PolicyException if none of the alternatives is supported */ - public void handleMessage(Message message) { + protected void handle(Message message) { if (MessageUtils.isPartialResponse(message)) { LOG.fine("Not verifying policies on outbound partial response."); Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyInInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyInInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyInInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyInInterceptor.java Wed Apr 11 01:33:10 2007 @@ -47,7 +47,7 @@ setPhase(Phase.RECEIVE); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (MessageUtils.isRequestor(msg)) { LOG.fine("Is a requestor."); return; @@ -68,7 +68,7 @@ return; } - Destination destination = msg.getDestination(); + Destination destination = exchange.getDestination(); // We do not know the underlying message type yet - so we pre-emptively add interceptors // that can deal with any messages to this endpoint Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutFaultInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutFaultInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutFaultInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutFaultInterceptor.java Wed Apr 11 01:33:10 2007 @@ -49,7 +49,7 @@ setPhase(Phase.SETUP); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (MessageUtils.isRequestor(msg)) { LOG.fine("Is a requestor."); return; @@ -76,7 +76,7 @@ return; } - Destination destination = msg.getDestination(); + Destination destination = exchange.getDestination(); Exception ex = exchange.get(Exception.class); assert null != ex; Modified: incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutInterceptor.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/main/java/org/apache/cxf/ws/policy/ServerPolicyOutInterceptor.java Wed Apr 11 01:33:10 2007 @@ -48,7 +48,7 @@ setPhase(Phase.SETUP); } - public void handleMessage(Message msg) { + protected void handle(Message msg) { if (MessageUtils.isRequestor(msg)) { LOG.fine("Is a requestor."); return; @@ -75,7 +75,7 @@ return; } - Destination destination = msg.getDestination(); + Destination destination = exchange.getDestination(); EffectivePolicy effectivePolicy = pe.getEffectiveServerResponsePolicy(ei, boi, destination); List interceptors = effectivePolicy.getInterceptors(); Modified: 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=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java (original) +++ incubator/cxf/trunk/rt/ws/policy/src/test/java/org/apache/cxf/ws/policy/PolicyInterceptorsTest.java Wed Apr 11 01:33:10 2007 @@ -358,7 +358,7 @@ EasyMock.expect(exchange.getConduit()).andReturn(conduit); } else { destination = control.createMock(Destination.class); - EasyMock.expect(message.getDestination()).andReturn(destination); + EasyMock.expect(exchange.getDestination()).andReturn(destination); } } Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPClientPolicyTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPClientPolicyTest.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPClientPolicyTest.java (original) +++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPClientPolicyTest.java Wed Apr 11 01:33:10 2007 @@ -94,20 +94,17 @@ } @Test - public void testUsingAddressing() throws Exception { + public void testUsingHTTPClientPolicies() throws Exception { SpringBusFactory bf = new SpringBusFactory(); bus = bf.createBus("org/apache/cxf/systest/ws/policy/http.xml"); BusFactory.setDefaultBus(bus); LoggingInInterceptor in = new LoggingInInterceptor(); bus.getInInterceptors().add(in); bus.getInFaultInterceptors().add(in); - bus.getInInterceptors().add(new PolicyLoggingInterceptor(false)); - bus.getInFaultInterceptors().add(new PolicyLoggingInterceptor(false)); LoggingOutInterceptor out = new LoggingOutInterceptor(); bus.getOutInterceptors().add(out); bus.getOutFaultInterceptors().add(out); - bus.getOutInterceptors().add(new PolicyLoggingInterceptor(true)); - + // use a client wsdl with policies attached to endpoint, operation and message subjects URL url = HTTPClientPolicyTest.class.getResource("http_client_greeter.wsdl"); Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java?view=auto&rev=527411 ============================================================================== --- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java (added) +++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java Wed Apr 11 01:33:10 2007 @@ -0,0 +1,138 @@ +/** + * 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.ws.policy; + +import java.util.logging.Logger; + +import javax.xml.ws.Endpoint; + +import org.apache.cxf.Bus; +import org.apache.cxf.binding.soap.SoapFault; +import org.apache.cxf.bus.spring.SpringBusFactory; +import org.apache.cxf.greeter_control.BasicGreeterService; +import org.apache.cxf.greeter_control.Greeter; +import org.apache.cxf.greeter_control.PingMeFault; +import org.apache.cxf.interceptor.LoggingInInterceptor; +import org.apache.cxf.interceptor.LoggingOutInterceptor; +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; +import org.apache.cxf.testutil.common.AbstractBusTestServerBase; +import org.junit.BeforeClass; +import org.junit.Test; + + +/** + * Tests the use of the WS-Policy Framework to determine the behaviour of the HTTP client + * by policies including the HTTPClientPolicy assertion attached to different subjects + * of the contract (endpoint, operation, binding, messager). + * The server in this test is not policy aware. + * Neither client nor server do have addressing interceptors installed: there are no addressing + * assertions that would trigger the installation of the interceptors on the client side. The use + * of the DecoupledEndpoint attribute in the HTTPClientPolicy assertions is merely for illustrating + * the use of multiple compatible or incompatible assertions. + */ +public class HTTPServerPolicyTest extends AbstractBusClientServerTestBase { + + private static final Logger LOG = Logger.getLogger(HTTPServerPolicyTest.class.getName()); + + public static class Server extends AbstractBusTestServerBase { + + protected void run() { + SpringBusFactory bf = new SpringBusFactory(); + Bus bus = bf.createBus("org/apache/cxf/systest/ws/policy/http-server.xml"); + + GreeterImpl implementor = new GreeterImpl(); + implementor.setThrowAlways(true); + Endpoint.publish("http://localhost:9020/SoapContext/GreeterPort", implementor); + + LOG.info("Published greeter endpoint."); + + LoggingInInterceptor in = new LoggingInInterceptor(); + LoggingOutInterceptor out = new LoggingOutInterceptor(); + + bus.getInInterceptors().add(in); + bus.getOutInterceptors().add(out); + bus.getOutFaultInterceptors().add(out); + } + + + 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!"); + } + } + } + + @BeforeClass + public static void startServers() throws Exception { + assertTrue("server did not launch correctly", launchServer(Server.class)); + } + + @Test + public void testUsingHTTPServerPolicies() throws Exception { + + // use a plain client + + SpringBusFactory bf = new SpringBusFactory(); + Bus bus = bf.createBus(); + + BasicGreeterService gs = new BasicGreeterService(); + final Greeter greeter = gs.getGreeterPort(); + LoggingInInterceptor in = new LoggingInInterceptor(); + LoggingOutInterceptor out = new LoggingOutInterceptor(); + + bus.getInInterceptors().add(in); + bus.getOutInterceptors().add(out); + + LOG.fine("Created greeter client."); + + // sayHi - this operation has message policies that are incompatible with + // the endpoint policies + + try { + greeter.sayHi(); + fail("Did not receive expected Exception."); + } catch (SoapFault sf) { + assertEquals("Server", sf.getFaultCode().getLocalPart()); + assertEquals("None of the policy alternatives can be satisfied.", sf.getMessage()); + // assertEquals("INCOMPATIBLE_HTTPSERVERPOLICY_ASSERTIONS", ex.getCode()); + } + + // greetMe - no operation or message specific policies + + assertEquals("CXF", greeter.greetMe("cxf")); + + // pingMe - policy attached to binding operation fault should have no effect + + try { + greeter.pingMe(); + fail("Expected PingMeFault not thrown."); + } catch (PingMeFault ex) { + assertEquals(2, (int)ex.getFaultInfo().getMajor()); + assertEquals(1, (int)ex.getFaultInfo().getMinor()); + } + + } +} Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/HTTPServerPolicyTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/PolicyLoggingInterceptor.java URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/PolicyLoggingInterceptor.java?view=diff&rev=527411&r1=527410&r2=527411 ============================================================================== --- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/PolicyLoggingInterceptor.java (original) +++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/PolicyLoggingInterceptor.java Wed Apr 11 01:33:10 2007 @@ -20,66 +20,65 @@ package org.apache.cxf.systest.ws.policy; import java.util.Collection; +import java.util.Iterator; import java.util.logging.Logger; +import org.apache.cxf.Bus; +import org.apache.cxf.endpoint.Endpoint; +import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; -import org.apache.cxf.service.model.OperationInfo; +import org.apache.cxf.service.model.BindingOperationInfo; +import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.http.policy.PolicyUtils; -import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; -import org.apache.cxf.ws.policy.AssertionInfo; -import org.apache.cxf.ws.policy.AssertionInfoMap; +import org.apache.cxf.transports.http.configuration.HTTPServerPolicy; +import org.apache.cxf.ws.policy.EffectivePolicy; +import org.apache.cxf.ws.policy.PolicyEngine; import org.apache.cxf.ws.policy.builder.jaxb.JaxbAssertion; +import org.apache.neethi.Assertion; public class PolicyLoggingInterceptor extends AbstractPhaseInterceptor { private static final Logger LOG = Logger.getLogger(PolicyLoggingInterceptor.class.getName()); private boolean outbound; + private Bus bus; PolicyLoggingInterceptor(boolean o) { outbound = o; - setPhase(Phase.PRE_LOGICAL); - /* + // setPhase(Phase.PRE_LOGICAL); if (outbound) { setPhase(Phase.POST_STREAM); - addBefore(PolicyVerificationOutInterceptor.class.getName()); + // addBefore(PolicyVerificationOutInterceptor.class.getName()); } else { - setPhase(Phase.PRE_INVOKE); - addBefore(PolicyVerificationInInterceptor.class.getName()); + setPhase(Phase.POST_INVOKE); + // addBefore(PolicyVerificationInInterceptor.class.getName()); } - */ + } + + public void setBus(Bus b) { + bus = b; } public void handleMessage(Message message) throws Fault { - StringBuffer buf = new StringBuffer(); - String nl = System.getProperty("line.separator"); - buf.append(outbound ? "Outbound " : "Inbound "); - buf.append("message for operation: " + message.getExchange().get(OperationInfo.class).getName()); - buf.append(nl); - buf.append("Policies:"); - buf.append(nl); - AssertionInfoMap aim = message.get(AssertionInfoMap.class); - if (null != aim) { - for (Collection ais : aim.values()) { - for (AssertionInfo ai : ais) { - JaxbAssertion cp = JaxbAssertion.cast((JaxbAssertion)ai.getAssertion(), - HTTPClientPolicy.class); - buf.append(cp); - buf.append(nl); - buf.append(" data: "); - buf.append(PolicyUtils.toString(cp.getData())); - buf.append(nl); - buf.append(" asserted: "); - buf.append(ai.isAsserted()); - buf.append(nl); - } + EndpointInfo ei = message.getExchange().get(Endpoint.class).getEndpointInfo(); + BindingOperationInfo boi = message.getExchange().get(BindingOperationInfo.class); + LOG.fine("Getting effective server request policy for endpoint " + ei + + " and binding operation " + boi); + EffectivePolicy ep = + bus.getExtension(PolicyEngine.class).getEffectiveServerRequestPolicy(ei, boi); + for (Iterator it = ep.getPolicy().getAlternatives(); it.hasNext();) { + Collection as = CastUtils.cast((Collection)it.next(), Assertion.class); + LOG.fine("Checking alternative with " + as.size() + " assertions."); + for (Assertion a : as) { + LOG.fine("Assertion: " + a.getClass().getName()); + HTTPServerPolicy p = (JaxbAssertion.cast(a, HTTPServerPolicy.class)).getData(); + LOG.fine("server policy: " + PolicyUtils.toString(p)); } } - LOG.fine(buf.toString()); - + } } Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml?view=auto&rev=527411 ============================================================================== --- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml (added) +++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml Wed Apr 11 01:33:10 2007 @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + \ No newline at end of file Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http-server.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl?view=auto&rev=527411 ============================================================================== --- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl (added) +++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl Wed Apr 11 01:33:10 2007 @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/ws/policy/http_server_greeter.wsdl ------------------------------------------------------------------------------ svn:mime-type = text/xml