Author: dkulp Date: Mon Aug 3 20:11:02 2009 New Revision: 800524 URL: http://svn.apache.org/viewvc?rev=800524&view=rev Log: Merged revisions 799444 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.2.x-fixes
................ r799444 | dkulp | 2009-07-30 17:20:38 -0400 (Thu, 30 Jul 2009) | 10 lines Merged revisions 799439 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r799439 | dkulp | 2009-07-30 17:04:55 -0400 (Thu, 30 Jul 2009) | 2 lines Allow and endpoint to specify what headers it can process itself thus allowing other mustUnderstands to be caught before invoke ........ ................ Modified: cxf/branches/2.1.x-fixes/ (props changed) cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/Server.java Propchange: cxf/branches/2.1.x-fixes/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Aug 3 20:11:02 2009 @@ -1,2 +1,2 @@ -/cxf/branches/2.2.x-fixes:743446,753380,753397,753421,754585,755365,757499,757859,757899,757935,757951,758195,758303,758308,758378,758690,758910,759890,759961,759963-759964,759966,760029,760073,760150,760171,760178,760198,760212,760456,760468,760582,760938,761094,761113,761120,761317,761759,761789,762393,762518,762567,763200,763272,763495,763854,763931,763942,763953,764033-764034,764581,764599-764606,764887,765357,766013,766058,766100-766101,766763,766770,766860,766962-766963,767159,767191,767927,771416,772143,772402,772658,772714,773009-773010,773027,773049,773146,773581,773691,773693,774446-774496,774558,774760,774851,774979,775423,776024-776025,776218,776429,776459,777189,777224,777243,777481,777505,777572,777580,780033,780184,780213,780421,780664,780800,780902,780911,781497,781841,782733,782735-782736,783099,783407,784064,784197,785293,785296,785298-785299,785301,785656,786158,786587,786589,786591-786592,786640,787272,787276,787282-787283,787285,787295,787307,787324,7873 67,788824-788825,788827-788828,788830,789423,789429,789707,789709-789710,789712,789721,789905,789908,789910,789912,790295,790646-790647,790651,790654-790655,790659,791948,791950,791952,791955,792276,792288,792291,792992,792995,792998,794402,794404,794735,794797,794799,794803,795161-795162,796300-796301,796598,797449,797452-797453,797460,797463-797464,797521-797522,797584-797585,797645,797652,797701,797884,797886,798348-798350,798568,798574-798575,798577-798578,798586,798608,798655,798752,798942 -/cxf/trunk:782181,782728-782730,783097,783396,784059,784181,784895,785279-785282,785468,786142,786271,786395,786582-786583,786638,786647,787269,787277-787279,787290,787305,787323,787366,788060,788187,788703,788774,788820,789371,789420,789527-789529,789704-789705,789896,789898-789900,790294,790637-790644,791354,791538,791753,791947,792261-792263,792684,792975,792985,794297,794396,794728,794778-794780,794892,795160,796022-796023,796593,796780,797194,797231-797233,797442,797505,797517,797581-797582,797640,797651,797699,797882-797883,798344-798346,798479,798533,798551,798557,798561-798562,798570,798573,798584,798654,798749,798929 +/cxf/branches/2.2.x-fixes:743446,753380,753397,753421,754585,755365,757499,757859,757899,757935,757951,758195,758303,758308,758378,758690,758910,759890,759961,759963-759964,759966,760029,760073,760150,760171,760178,760198,760212,760456,760468,760582,760938,761094,761113,761120,761317,761759,761789,762393,762518,762567,763200,763272,763495,763854,763931,763942,763953,764033-764034,764581,764599-764606,764887,765357,766013,766058,766100-766101,766763,766770,766860,766962-766963,767159,767191,767927,771416,772143,772402,772658,772714,773009-773010,773027,773049,773146,773581,773691,773693,774446-774496,774558,774760,774851,774979,775423,776024-776025,776218,776429,776459,777189,777224,777243,777481,777505,777572,777580,780033,780184,780213,780421,780664,780800,780902,780911,781497,781841,782733,782735-782736,783099,783407,784064,784197,785293,785296,785298-785299,785301,785656,786158,786587,786589,786591-786592,786640,787272,787276,787282-787283,787285,787295,787307,787324,7873 67,788824-788825,788827-788828,788830,789423,789429,789707,789709-789710,789712,789721,789905,789908,789910,789912,790295,790646-790647,790651,790654-790655,790659,791948,791950,791952,791955,792276,792288,792291,792992,792995,792998,794402,794404,794735,794797,794799,794803,795161-795162,796300-796301,796598,797449,797452-797453,797460,797463-797464,797521-797522,797584-797585,797645,797652,797701,797884,797886,798348-798350,798568,798574-798575,798577-798578,798586,798608,798655,798752,798942,799444 +/cxf/trunk:782181,782728-782730,783097,783396,784059,784181,784895,785279-785282,785468,786142,786271,786395,786582-786583,786638,786647,787269,787277-787279,787290,787305,787323,787366,788060,788187,788703,788774,788820,789371,789420,789527-789529,789704-789705,789896,789898-789900,790294,790637-790644,791354,791538,791753,791947,792261-792263,792684,792975,792985,794297,794396,794728,794778-794780,794892,795160,796022-796023,796593,796780,797194,797231-797233,797442,797505,797517,797581-797582,797640,797651,797699,797882-797883,798344-798346,798479,798533,798551,798557,798561-798562,798570,798573,798584,798654,798749,798929,799439 Propchange: cxf/branches/2.1.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java?rev=800524&r1=800523&r2=800524&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java (original) +++ cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/MustUnderstandInterceptor.java Mon Aug 3 20:11:02 2009 @@ -20,7 +20,10 @@ package org.apache.cxf.binding.soap.interceptor; import java.net.URI; +import java.util.Collection; +import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import java.util.Set; @@ -37,6 +40,7 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.headers.Header; +import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.phase.Phase; @@ -63,22 +67,62 @@ Set<Header> ultimateReceiverHeaders = new HashSet<Header>(); Set<QName> mustUnderstandQNames = new HashSet<QName>(); + initServiceSideInfo(mustUnderstandQNames, soapMessage, serviceRoles); buildMustUnderstandHeaders(mustUnderstandHeaders, soapMessage, serviceRoles, ultimateReceiverHeaders); - initServiceSideInfo(mustUnderstandQNames, soapMessage, serviceRoles); - checkUnderstand(mustUnderstandHeaders, mustUnderstandQNames, - notUnderstandHeaders); + checkUnderstand(mustUnderstandHeaders, mustUnderstandQNames, notUnderstandHeaders); + if (!notUnderstandHeaders.isEmpty()) { throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notUnderstandHeaders), soapVersion.getMustUnderstand()); } if (!ultimateReceiverHeaders.isEmpty() && !isRequestor(soapMessage)) { - soapMessage.getInterceptorChain() - .add(new UltimateReceiverMustUnderstandInterceptor(mustUnderstandQNames)); + checkUltimateReceiverHeaders(ultimateReceiverHeaders, mustUnderstandQNames, soapMessage); } } + private void checkUltimateReceiverHeaders(Set<Header> ultimateReceiverHeaders, + Set<QName> mustUnderstandQNames, + SoapMessage soapMessage) { + soapMessage.getInterceptorChain() + .add(new UltimateReceiverMustUnderstandInterceptor(mustUnderstandQNames)); + Object o = soapMessage.getContextualProperty("endpoint.handles.headers"); + if (o == null) { + //The default here really should be to make o = "" and process + //so any mustUnderstands are kill immediately. That will break + //existing apps though. Thus, it's a migration issue. + return; + } + Collection<Object> o2; + if (o instanceof Collection) { + o2 = CastUtils.cast((Collection<?>)o); + } else { + o2 = Collections.singleton(o); + } + for (Object obj : o2) { + QName qn; + if (obj instanceof QName) { + qn = (QName)obj; + } else { + qn = QName.valueOf((String)obj); + } + Iterator<Header> hit = ultimateReceiverHeaders.iterator(); + while (hit.hasNext()) { + if (qn.equals(hit.next().getName())) { + hit.remove(); + } + } + } + if (!ultimateReceiverHeaders.isEmpty()) { + Set<QName> notFound = new HashSet<QName>(); + for (Header h : ultimateReceiverHeaders) { + notFound.add(h.getName()); + } + throw new SoapFault(new Message("MUST_UNDERSTAND", BUNDLE, notFound), + soapMessage.getVersion().getMustUnderstand()); + } + } private void initServiceSideInfo(Set<QName> mustUnderstandQNames, SoapMessage soapMessage, Set<URI> serviceRoles) { Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java?rev=800524&r1=800523&r2=800524&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java (original) +++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/OOBHeaderTest.java Mon Aug 3 20:11:02 2009 @@ -34,6 +34,8 @@ import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Holder; +import javax.xml.ws.soap.SOAPFaultException; + import org.w3c.dom.Node; import org.apache.cxf.BusFactory; @@ -79,7 +81,7 @@ assertTrue("server did not launch correctly", launchServer(Server.class, true)); } - private void addOutOfBoundHeader(PutLastTradedPricePortType portType, boolean invalid) { + private void addOutOfBoundHeader(PutLastTradedPricePortType portType, boolean invalid, boolean mu) { InvocationHandler handler = Proxy.getInvocationHandler(portType); BindingProvider bp = null; @@ -97,7 +99,7 @@ new QName(TEST_HDR_NS, TEST_HDR_REQUEST_ELEM), ob, new JAXBDataBinding(ob.getClass())); - hdr.setMustUnderstand(true); + hdr.setMustUnderstand(mu); List<Header> holder = new ArrayList<Header>(); holder.add(hdr); @@ -180,18 +182,52 @@ TradePriceData priceData = new TradePriceData(); priceData.setTickerPrice(1.0f); priceData.setTickerSymbol("CELTIX"); - Holder<TradePriceData> holder = new Holder<TradePriceData>(priceData); - - addOutOfBoundHeader(putLastTradedPrice, false); - putLastTradedPrice.sayHi(holder); - checkReturnedOOBHeader(putLastTradedPrice); + + assertTrue(check(0, putLastTradedPrice, false, true, priceData)); + assertFalse(check(1, putLastTradedPrice, false, true, priceData)); + assertTrue(check(2, putLastTradedPrice, false, true, priceData)); + + assertFalse(check(0, putLastTradedPrice, true, true, priceData)); + assertFalse(check(1, putLastTradedPrice, true, true, priceData)); + assertFalse(check(2, putLastTradedPrice, true, true, priceData)); + + assertTrue(check(0, putLastTradedPrice, false, false, priceData)); + assertTrue(check(1, putLastTradedPrice, false, false, priceData)); + assertTrue(check(2, putLastTradedPrice, false, false, priceData)); + + assertTrue(check(0, putLastTradedPrice, true, false, priceData)); + assertTrue(check(1, putLastTradedPrice, true, false, priceData)); + assertTrue(check(2, putLastTradedPrice, true, false, priceData)); + } + + private boolean check(int i, PutLastTradedPricePortType putLastTradedPrice, + boolean invalid, boolean mu, + TradePriceData priceData) { + String address = ""; + switch (i) { + case 0: + address = "http://localhost:9107/SOAPDocLitBareService/SoapPort"; + break; + case 1: + address = "http://localhost:9107/SOAPDocLitBareService/SoapPortNoHeader"; + break; + default: + address = "http://localhost:9107/SOAPDocLitBareService/SoapPortHeader"; + } + ((BindingProvider)putLastTradedPrice).getRequestContext() + .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, address); - addOutOfBoundHeader(putLastTradedPrice, true); + Holder<TradePriceData> holder = new Holder<TradePriceData>(priceData); try { + addOutOfBoundHeader(putLastTradedPrice, invalid, mu); putLastTradedPrice.sayHi(holder); - fail("mustUnderstand header should not have been processed"); - } catch (Exception ex) { - assertTrue(ex.getMessage(), ex.getMessage().contains("MustUnderstand")); + checkReturnedOOBHeader(putLastTradedPrice); + return true; + } catch (SOAPFaultException ex) { + if (ex.getMessage().contains("MustUnderstand")) { + return false; + } + throw ex; } } } Modified: cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/Server.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/Server.java?rev=800524&r1=800523&r2=800524&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/Server.java (original) +++ cxf/branches/2.1.x-fixes/systests/src/test/java/org/apache/cxf/systest/outofband/header/Server.java Mon Aug 3 20:11:02 2009 @@ -49,14 +49,32 @@ // Register expected Headers (namespace, element and class type mapping) Object implementor = new OOBHdrServiceImpl(); - String address = "http://localhost:9107/SOAPDocLitBareService/SoapPort"; Endpoint ep = Endpoint.create(implementor); Map<String, Object> props = new HashMap<String, Object>(2); props.put(Endpoint.WSDL_SERVICE, new QName("http://apache.org/hello_world_doc_lit_bare", "SOAPService")); props.put(Endpoint.WSDL_PORT, new QName("http://apache.org/hello_world_doc_lit_bare", "SoapPort")); ep.setProperties(props); - ep.publish(address); + ep.publish("http://localhost:9107/SOAPDocLitBareService/SoapPort"); + + ep = Endpoint.create(implementor); + props = new HashMap<String, Object>(2); + props.put(Endpoint.WSDL_SERVICE, new QName("http://apache.org/hello_world_doc_lit_bare", + "SOAPService")); + props.put(Endpoint.WSDL_PORT, new QName("http://apache.org/hello_world_doc_lit_bare", "SoapPort")); + props.put("endpoint.handles.headers", ""); + ep.setProperties(props); + ep.publish("http://localhost:9107/SOAPDocLitBareService/SoapPortNoHeader"); + + ep = Endpoint.create(implementor); + props = new HashMap<String, Object>(2); + props.put(Endpoint.WSDL_SERVICE, new QName("http://apache.org/hello_world_doc_lit_bare", + "SOAPService")); + props.put(Endpoint.WSDL_PORT, new QName("http://apache.org/hello_world_doc_lit_bare", "SoapPort")); + props.put("endpoint.handles.headers", "{http://cxf.apache.org/outofband/Header}outofbandHeader"); + ep.setProperties(props); + ep.publish("http://localhost:9107/SOAPDocLitBareService/SoapPortHeader"); + }
