/**
* 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.addressing.soap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
import org.apache.cxf.binding.soap.SoapBindingConstants;
import org.apache.cxf.binding.soap.SoapFault;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.SoapVersion;
import org.apache.cxf.headers.Header;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.ws.addressing.AddressingProperties;
import org.apache.cxf.ws.addressing.AttributedURIType;
import org.apache.cxf.ws.addressing.ContextUtils;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.ws.addressing.EndpointReferenceUtils;
import org.apache.cxf.ws.addressing.Names;
import org.apache.cxf.ws.addressing.RelatesToType;
import org.apache.cxf.ws.addressing.v200408.AttributedURI;
import org.apache.cxf.ws.addressing.v200408.Relationship;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.apache.cxf.message.Message.MIME_HEADERS;
import static org.apache.cxf.message.Message.REQUESTOR_ROLE;
import static org.apache.cxf.ws.addressing.JAXWSAConstants.ADDRESSING_PROPERTIES_INBOUND;
import static org.apache.cxf.ws.addressing.JAXWSAConstants.ADDRESSING_PROPERTIES_OUTBOUND;
public class MAPCodecTest extends Assert {
private MAPCodec codec;
private IMocksControl control;
private QName[] expectedNames;
private Object[] expectedValues;
private String expectedNamespaceURI;
private Map<String, List<String>> mimeHeaders;
private Exchange correlatedExchange;
private boolean expectRelatesTo;
private String nonReplyRelationship;
private boolean expectFaultTo;
@Before
public void setUp() {
codec = new MAPCodec();
control = EasyMock.createNiceControl();
}
@After
public void tearDown() throws Exception {
expectedNames = null;
expectedValues = null;
expectedNamespaceURI = null;
mimeHeaders = null;
correlatedExchange = null;
ContextUtils.setJAXBContext(null);
nonReplyRelationship = null;
}
@Test
public void testGetHeaders() throws Exception {
Set<QName> headers = codec.getUnderstoodHeaders();
assertTrue("expected From header", headers.contains(Names.WSA_FROM_QNAME));
assertTrue("expected To header", headers.contains(Names.WSA_TO_QNAME));
assertTrue("expected ReplyTo header", headers.contains(Names.WSA_REPLYTO_QNAME));
assertTrue("expected FaultTo header", headers.contains(Names.WSA_FAULTTO_QNAME));
assertTrue("expected Action header", headers.contains(Names.WSA_ACTION_QNAME));
assertTrue("expected MessageID header", headers.contains(Names.WSA_MESSAGEID_QNAME));
}
@Test
public void testRequestorInboundNonNative200403() throws Exception {
String uri = VersionTransformer.Names200403.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(true, false, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, false, false);
}
@Test
public void testResponderInboundNonNative200403() throws Exception {
String uri = VersionTransformer.Names200403.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(false, false, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, false, false);
}
@Test
public void testRequestorOutboundNonNative200403() throws Exception {
String uri = VersionTransformer.Names200403.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(true, true, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, true, false);
}
@Test
public void testResponderOutboundNonNative200403() throws Exception {
String uri = VersionTransformer.Names200403.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(false, true, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, true, false);
}
public void testRequestorOutbound() throws Exception {
SoapMessage message = setUpMessage(true, true);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, true, true);
}
@Test
public void testRequestorOutboundPreExistingSOAPAction() throws Exception {
SoapMessage message = setUpMessage(true, true, false, true);
codec.handleMessage(message);
verifyAction();
control.verify();
verifyMessage(message, true, true, true);
}
@Test
public void testRequestorOutboundNonNative() throws Exception {
String uri = VersionTransformer.Names200408.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(true, true, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, true, false);
}
@Test
public void testResponderInbound() throws Exception {
SoapMessage message = setUpMessage(false, false);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, false, true);
}
@Test
public void testResponderOutbound() throws Exception {
SoapMessage message = setUpMessage(false, true);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, true, true);
}
@Test
public void testResponderInboundWithRelatesTo() throws Exception {
SoapMessage message = setUpMessage(false, false, false, false, Boolean.TRUE,
Names.WSA_NAMESPACE_NAME);
//empty the uncorrelatedExchanges in responder
for (String key : codec.uncorrelatedExchanges.keySet()) {
codec.uncorrelatedExchanges.remove(key);
}
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, false, false);
}
@Test
public void testResponderInboundNonNative() throws Exception {
String uri = VersionTransformer.Names200408.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(false, false, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, false, false);
}
@Test
public void testResponderOutboundInvalidMAP() throws Exception {
SoapMessage message = setUpMessage(false, true, true);
try {
codec.handleMessage(message);
fail("expected SOAPFaultException on invalid MAP");
} catch (SoapFault sfe) {
assertEquals("unexpected fault string", "Duplicate Message ID urn:uuid:12345", sfe.getMessage());
}
control.verify();
verifyMessage(message, false, true, true);
}
@Test
public void testResponderOutboundPreExistingSOAPAction() throws Exception {
SoapMessage message = setUpMessage(false, true, false, true);
codec.handleMessage(message);
verifyAction();
control.verify();
verifyMessage(message, false, true, true);
}
@Test
public void testResponderOutboundNonNative() throws Exception {
String uri = VersionTransformer.Names200408.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(false, true, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, false, true, false);
}
@Test
public void testRequestorInbound() throws Exception {
SoapMessage message = setUpMessage(true, false);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, false, true);
}
@Test
public void testRequestorInboundNonNative() throws Exception {
String uri = VersionTransformer.Names200408.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(true, false, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, false, false);
}
@Test
public void testRequestorInboundNonReply() throws Exception {
nonReplyRelationship = "wsat:correlatedOneway";
SoapMessage message = setUpMessage(true, false);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, false, true);
}
@Test
public void testRequestorInboundNonNativeNonReply() throws Exception {
nonReplyRelationship = "wsat:correlatedOneway";
String uri = VersionTransformer.Names200408.WSA_NAMESPACE_NAME;
SoapMessage message = setUpMessage(true, false, false, false, uri);
codec.handleMessage(message);
control.verify();
verifyMessage(message, true, false, false);
}
private SoapMessage setUpMessage(boolean requestor, boolean outbound) throws Exception {
return setUpMessage(requestor, outbound, false);
}
private SoapMessage setUpMessage(boolean requestor, boolean outbound, boolean invalidMAP)
throws Exception {
return setUpMessage(requestor, outbound, invalidMAP, false);
}
private SoapMessage setUpMessage(boolean requestor, boolean outbound, boolean invalidMAP,
boolean preExistingSOAPAction) throws Exception {
return setUpMessage(requestor, outbound, invalidMAP, preExistingSOAPAction, Names.WSA_NAMESPACE_NAME);
}
private SoapMessage setUpMessage(boolean requestor, boolean outbound, boolean invalidMAP,
boolean preExistingSOAPAction, String exposeAs) throws Exception {
return setUpMessage(requestor, outbound, invalidMAP, preExistingSOAPAction, null, exposeAs);
}
private SoapMessage setUpMessage(boolean requestor, boolean outbound, boolean invalidMAP,
boolean preExistingSOAPAction, Boolean generateRelatesTo,
String exposeAs) throws Exception {
SoapMessage message = new SoapMessage(new MessageImpl());
setUpOutbound(message, outbound);
expectRelatesTo = generateRelatesTo != null ? generateRelatesTo
: (requestor && !outbound) || (!requestor && outbound);
message.put(REQUESTOR_ROLE, Boolean.valueOf(requestor));
String mapProperty = getMAPProperty(requestor, outbound);
AddressingProperties maps = getMAPs(requestor, outbound, exposeAs);
final Element header = control.createMock(Element.class);
codec.setHeaderFactory(new MAPCodec.HeaderFactory() {
public Element getHeader(SoapVersion version) {
return header;
}
});
List<Header> headers = message.getHeaders();
JAXBContext jaxbContext = control.createMock(JAXBContext.class);
ContextUtils.setJAXBContext(jaxbContext);
VersionTransformer.Names200408.setJAXBContext(jaxbContext);
VersionTransformer.Names200403.setJAXBContext(jaxbContext);
if (outbound) {
setUpEncode(requestor, message, header, maps, mapProperty, invalidMAP, preExistingSOAPAction);
} else {
setUpDecode(message, headers, maps, mapProperty, requestor);
}
control.replay();
return message;
}
private void setUpEncode(boolean requestor, SoapMessage message, Element header,
AddressingProperties maps, String mapProperty, boolean invalidMAP,
boolean preExistingSOAPAction) throws Exception {
message.put(mapProperty, maps);
mimeHeaders = new HashMap<>();
message.put(MIME_HEADERS, mimeHeaders);
if (preExistingSOAPAction) {
List<String> soapAction = new ArrayList<>();
soapAction.add("\"foobar\"");
mimeHeaders.put(SoapBindingConstants.SOAP_ACTION, soapAction);
}
if (invalidMAP) {
message.put("org.apache.cxf.ws.addressing.map.fault.name", Names.DUPLICATE_MESSAGE_ID_NAME);
message.put("org.apache.cxf.ws.addressing.map.fault.reason",
"Duplicate Message ID urn:uuid:12345");
}
}
private void setUpDecode(SoapMessage message, List<Header> headers, AddressingProperties maps,
String mapProperty, boolean requestor) throws Exception {
Unmarshaller unmarshaller = control.createMock(Unmarshaller.class);
ContextUtils.getJAXBContext().createUnmarshaller();
EasyMock.expectLastCall().andReturn(unmarshaller);
String uri = maps.getNamespaceURI();
boolean exposedAsNative = Names.WSA_NAMESPACE_NAME.equals(uri);
boolean exposedAs200408 = VersionTransformer.Names200408.WSA_NAMESPACE_NAME.equals(uri);
boolean exposedAs200403 = VersionTransformer.Names200403.WSA_NAMESPACE_NAME.equals(uri);
assertTrue("unexpected namescape URI: " + uri, exposedAsNative || exposedAs200408 || exposedAs200403);
setUpHeaderDecode(headers, uri, Names.WSA_ACTION_NAME, exposedAsNative
? AttributedURIType.class : exposedAs200408 ? AttributedURI.class : exposedAs200403
? org.apache.cxf.ws.addressing.v200403.AttributedURI.class : null, 0, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_MESSAGEID_NAME, exposedAsNative
? AttributedURIType.class : exposedAs200408 ? AttributedURI.class : exposedAs200403
? org.apache.cxf.ws.addressing.v200403.AttributedURI.class : null, 1, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_TO_NAME, exposedAsNative
? AttributedURIType.class : exposedAs200408 ? AttributedURI.class : exposedAs200403
? org.apache.cxf.ws.addressing.v200403.AttributedURI.class : null, 2, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_REPLYTO_NAME, exposedAsNative
? EndpointReferenceType.class : exposedAs200408
? VersionTransformer.Names200408.EPR_TYPE : exposedAs200403
? VersionTransformer.Names200403.EPR_TYPE : null, 3, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_RELATESTO_NAME, exposedAsNative
? RelatesToType.class : exposedAs200408 ? Relationship.class : exposedAs200403
? org.apache.cxf.ws.addressing.v200403.Relationship.class : null, 4, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_FAULTTO_NAME, exposedAsNative
? EndpointReferenceType.class : exposedAs200408
? VersionTransformer.Names200408.EPR_TYPE : exposedAs200403
? VersionTransformer.Names200403.EPR_TYPE : null, 5, unmarshaller);
setUpHeaderDecode(headers, uri, Names.WSA_FROM_NAME, exposedAsNative
? EndpointReferenceType.class : exposedAs200408
? VersionTransformer.Names200408.EPR_TYPE : exposedAs200403
? VersionTransformer.Names200403.EPR_TYPE : null, 6, unmarshaller);
}
private <T> void setUpHeaderDecode(List<Header> headers, String uri, String name, Class<?> clz,
int index, Unmarshaller unmarshaller) throws Exception {
Element headerElement = control.createMock(Element.class);
headers.add(new Header(new QName(uri, name), headerElement));
headerElement.getNamespaceURI();
EasyMock.expectLastCall().andReturn(uri);
headerElement.getLocalName();
EasyMock.expectLastCall().andReturn(name);
Object v = expectedValues[index];
@SuppressWarnings("unchecked")
JAXBElement<?> jaxbElement = new JAXBElement<Object>(new QName(uri, name), (Class<Object>)clz, clz.cast(v));
unmarshaller.unmarshal(headerElement, clz);
EasyMock.expectLastCall().andReturn(jaxbElement);
}
private void setUpOutbound(Message message, boolean outbound) {
Exchange exchange = new ExchangeImpl();
exchange.setOutMessage(outbound ? message : new MessageImpl());
message.setExchange(exchange);
}
private String getMAPProperty(boolean requestor, boolean outbound) {
return outbound ? ADDRESSING_PROPERTIES_OUTBOUND : ADDRESSING_PROPERTIES_INBOUND;
}
private AddressingProperties getMAPs(boolean requestor, boolean outbound, String uri) {
AddressingProperties maps = new AddressingProperties();
boolean exposeAsNative = Names.WSA_NAMESPACE_NAME.equals(uri);
boolean exposeAs200408 = VersionTransformer.Names200408.WSA_NAMESPACE_NAME.equals(uri);
boolean exposeAs200403 = VersionTransformer.Names200403.WSA_NAMESPACE_NAME.equals(uri);
AttributedURIType id = ContextUtils.getAttributedURI("urn:uuid:12345");
maps.setMessageID(id);
AttributedURIType to = ContextUtils.getAttributedURI("foobar");
EndpointReferenceType toEpr = EndpointReferenceUtils.getEndpointReference(to);
maps.setTo(toEpr);
EndpointReferenceType replyTo = new EndpointReferenceType();
String anonymous = exposeAsNative ? Names.WSA_ANONYMOUS_ADDRESS : exposeAs200408
? VersionTransformer.Names200408.WSA_ANONYMOUS_ADDRESS
: VersionTransformer.Names200403.WSA_ANONYMOUS_ADDRESS;
replyTo.setAddress(ContextUtils.getAttributedURI(anonymous));
maps.setReplyTo(replyTo);
EndpointReferenceType from = EndpointReferenceUtils.getEndpointReference("snafu");
maps.setFrom(from);
EndpointReferenceType faultTo = new EndpointReferenceType();
anonymous = exposeAsNative ? Names.WSA_ANONYMOUS_ADDRESS : exposeAs200408
? VersionTransformer.Names200408.WSA_ANONYMOUS_ADDRESS
: VersionTransformer.Names200403.WSA_ANONYMOUS_ADDRESS;
faultTo.setAddress(ContextUtils.getAttributedURI(anonymous));
maps.setFaultTo(faultTo);
RelatesToType relatesTo = null;
if (expectRelatesTo) {
String correlationID = "urn:uuid:67890";
relatesTo = new RelatesToType();
relatesTo.setValue(correlationID);
maps.setRelatesTo(relatesTo);
if (nonReplyRelationship == null) {
correlatedExchange = new ExchangeImpl();
codec.uncorrelatedExchanges.put(correlationID, correlatedExchange);
} else {
relatesTo.setRelationshipType(nonReplyRelationship);
}
}
AttributedURIType action = ContextUtils.getAttributedURI("http://foo/bar/SEI/opRequest");
maps.setAction(action);
maps.exposeAs(uri);
expectedNamespaceURI = uri;
expectedNames = new QName[] {
new QName(uri, Names.WSA_ACTION_NAME),
new QName(uri, Names.WSA_MESSAGEID_NAME),
new QName(uri, Names.WSA_TO_NAME),
new QName(uri, Names.WSA_REPLYTO_NAME),
new QName(uri, Names.WSA_RELATESTO_NAME),
new QName(uri, Names.WSA_FROM_NAME),
new QName(uri, Names.WSA_FAULTTO_NAME),
};
if (exposeAsNative) {
expectedValues = new Object[] {
action, id, to, replyTo, relatesTo, from, faultTo
};
} else if (exposeAs200408) {
expectedValues = new Object[] {
VersionTransformer.convert(action),
VersionTransformer.convert(id),
VersionTransformer.convert(to),
VersionTransformer.convert(replyTo),
VersionTransformer.convert(relatesTo),
VersionTransformer.convert(from),
VersionTransformer.convert(faultTo),
};
if (!outbound) {
// conversion from 2004/08 to 2005/08 anonymous address
// occurs transparently in VersionTransformer
VersionTransformer.Names200408.EPR_TYPE.cast(expectedValues[3]).getAddress()
.setValue(Names.WSA_ANONYMOUS_ADDRESS);
VersionTransformer.Names200408.EPR_TYPE.cast(expectedValues[5]).getAddress()
.setValue(Names.WSA_ANONYMOUS_ADDRESS);
}
} else if (exposeAs200403) {
expectedValues = new Object[] {
VersionTransformer.convertTo200403(action),
VersionTransformer.convertTo200403(id),
VersionTransformer.convertTo200403(to),
VersionTransformer.convertTo200403(replyTo),
VersionTransformer.convertTo200403(relatesTo),
VersionTransformer.convertTo200403(from),
VersionTransformer.convertTo200403(faultTo),
};
if (!outbound) {
// conversion from 2004/03 to 2005/08 anonymous address
// occurs transparently in VersionTransformer
VersionTransformer.Names200403.EPR_TYPE.cast(expectedValues[3]).getAddress()
.setValue(Names.WSA_ANONYMOUS_ADDRESS);
VersionTransformer.Names200403.EPR_TYPE.cast(expectedValues[5]).getAddress()
.setValue(Names.WSA_ANONYMOUS_ADDRESS);
}
} else {
fail("unexpected namespace URI: " + uri);
}
return maps;
}
private boolean verifyMAPs(Object obj) {
if (obj instanceof AddressingProperties) {
AddressingProperties other = (AddressingProperties)obj;
return compareExpected(other);
}
return false;
}
private boolean compareExpected(AddressingProperties other) {
boolean ret = false;
String uri = other.getNamespaceURI();
boolean exposedAsNative = Names.WSA_NAMESPACE_NAME.equals(uri);
boolean exposedAs200408 = VersionTransformer.Names200408.WSA_NAMESPACE_NAME.equals(uri);
boolean exposedAs200403 = VersionTransformer.Names200403.WSA_NAMESPACE_NAME.equals(uri);
if (exposedAsNative || exposedAs200408 || exposedAs200403) {
String expectedMessageID = exposedAsNative
? ((AttributedURIType)expectedValues[1]).getValue() : exposedAs200408
? ((AttributedURI)expectedValues[1]).getValue()
: ((org.apache.cxf.ws.addressing.v200403.AttributedURI)expectedValues[1]).getValue();
String expectedTo = exposedAsNative
? ((AttributedURIType)expectedValues[2]).getValue() : exposedAs200408
? ((AttributedURI)expectedValues[2]).getValue()
: ((org.apache.cxf.ws.addressing.v200403.AttributedURI)expectedValues[2]).getValue();
String expectedReplyTo = exposedAsNative ? ((EndpointReferenceType)expectedValues[3])
.getAddress().getValue() : exposedAs200408 ? (VersionTransformer.Names200408.EPR_TYPE
.cast(expectedValues[3])).getAddress().getValue() : (VersionTransformer.Names200403.EPR_TYPE
.cast(expectedValues[3])).getAddress().getValue();
String expectedAction = exposedAsNative
? ((AttributedURIType)expectedValues[0]).getValue() : exposedAs200408
? ((AttributedURI)expectedValues[0]).getValue()
: ((org.apache.cxf.ws.addressing.v200403.AttributedURI)expectedValues[0]).getValue();
ret = expectedMessageID.equals(other.getMessageID().getValue())
&& expectedTo.equals(other.getTo().getValue())
&& expectedReplyTo.equals(other.getReplyTo().getAddress().getValue())
&& expectedAction.equals(other.getAction().getValue())
&& expectedNamespaceURI.equals(other.getNamespaceURI());
if (expectRelatesTo) {
String expectedRelatesTo = exposedAsNative
? ((RelatesToType)expectedValues[4]).getValue() : exposedAs200408
? ((Relationship)expectedValues[4]).getValue()
: ((org.apache.cxf.ws.addressing.v200403.Relationship)expectedValues[4]).getValue();
ret = ret && expectedRelatesTo.equals(other.getRelatesTo().getValue());
}
}
return ret;
}
private void verifyAction() {
List<?> soapAction = mimeHeaders.get("SOAPAction");
assertNotNull("expected propogated action", soapAction);
assertEquals("expected single action", 1, soapAction.size());
String expectedAction = "\"" + ((AttributedURIType)expectedValues[0]).getValue() + "\"";
assertEquals("expected propogated action", expectedAction, soapAction.get(0));
}
private void verifyMessage(SoapMessage message, boolean requestor, boolean outbound,
boolean exposedAsNative) {
if (requestor) {
if (outbound) {
String id = expectedValues[1] instanceof AttributedURIType
? ((AttributedURIType)expectedValues[1]).getValue()
: expectedValues[0] instanceof AttributedURI
? ((AttributedURI)expectedValues[1]).getValue()
: ((org.apache.cxf.ws.addressing.v200403.AttributedURI)expectedValues[1]).getValue();
assertSame("unexpected correlated exchange",
codec.uncorrelatedExchanges.get(id),
message.getExchange());
} else {
if (isReply(exposedAsNative)) {
assertSame("unexpected correlated exchange",
correlatedExchange,
message.getExchange());
} else {
assertNotSame("unexpected correlated exchange",
correlatedExchange,
message.getExchange());
}
assertEquals("expected empty uncorrelated exchange cache",
0,
codec.uncorrelatedExchanges.size());
}
}
if (outbound) {
int expectedMarshals = requestor ? expectedValues.length - 1 : expectedValues.length;
if (!expectFaultTo) {
--expectedMarshals;
}
List<Header> headers = message.getHeaders();
assertTrue("expected holders added to header list", headers.size() >= expectedMarshals);
for (int i = 0; i < (expectFaultTo ? expectedValues.length : expectedValues.length - 1); i++) {
if (i == 4 && !expectRelatesTo) {
i++;
}
assertTrue("expected " + expectedNames[i] + " added to headers", message
.hasHeader(expectedNames[i]));
}
}
assertTrue("unexpected MAPs", verifyMAPs(message.get(getMAPProperty(requestor, outbound))));
}
private boolean isReply(boolean exposedAsNative) {
boolean isReply = false;
if (exposedAsNative) {
isReply =
Names.WSA_RELATIONSHIP_REPLY.equals(
((RelatesToType)expectedValues[4]).getRelationshipType());
} else {
QName relationship =
expectedValues[4] instanceof Relationship
? ((Relationship)expectedValues[4]).getRelationshipType()
: ((org.apache.cxf.ws.addressing.v200403.Relationship)expectedValues[4])
.getRelationshipType();
isReply = relationship == null
|| Names.WSA_REPLY_NAME.equalsIgnoreCase(relationship.getLocalPart());
}
return isReply;
}
}