use of com.sun.xml.ws.api.message.MessageHeaders in project metro-jax-ws by eclipse-ee4j.
the class WsaServerTube method processRequest.
@Override
@NotNull
public NextAction processRequest(Packet request) {
Message msg = request.getMessage();
if (msg == null) {
return doInvoke(next, request);
}
// hmm?
// expose bunch of addressing related properties for advanced applications
request.addSatellite(new WsaPropertyBag(addressingVersion, soapVersion, request));
// Store request ReplyTo and FaultTo in requestPacket.invocationProperties
// so that they can be used after responsePacket is received.
// These properties are used if a fault is thrown from the subsequent Pipe/Tubes.
MessageHeaders hl = request.getMessage().getHeaders();
String msgId;
try {
replyTo = AddressingUtils.getReplyTo(hl, addressingVersion, soapVersion);
faultTo = AddressingUtils.getFaultTo(hl, addressingVersion, soapVersion);
msgId = AddressingUtils.getMessageID(hl, addressingVersion, soapVersion);
} catch (InvalidAddressingHeaderException e) {
LOGGER.log(Level.WARNING, addressingVersion.getInvalidMapText() + ", Problem header:" + e.getProblemHeader() + ", Reason: " + e.getSubsubcode(), e);
// problematic header must be removed since it can fail during Fault message processing
hl.remove(e.getProblemHeader());
SOAPFault soapFault = helper.createInvalidAddressingHeaderFault(e, addressingVersion);
// WS-A fault processing for one-way methods
if ((wsdlPort != null) && request.getMessage().isOneWay(wsdlPort)) {
Packet response = request.createServerResponse(null, wsdlPort, null, binding);
return doReturnWith(response);
}
Message m = Messages.create(soapFault);
if (soapVersion == SOAPVersion.SOAP_11) {
FaultDetailHeader s11FaultDetailHeader = new FaultDetailHeader(addressingVersion, addressingVersion.problemHeaderQNameTag.getLocalPart(), e.getProblemHeader());
m.getHeaders().add(s11FaultDetailHeader);
}
Packet response = request.createServerResponse(m, wsdlPort, null, binding);
return doReturnWith(response);
}
// defaulting
if (replyTo == null) {
replyTo = addressingVersion.anonymousEpr;
}
if (faultTo == null) {
faultTo = replyTo;
}
// Save a copy into the packet such that we can save it with that
// packet if we're going to deliver the response at a later time
// (async from the request).
request.put(WsaPropertyBag.WSA_REPLYTO_FROM_REQUEST, replyTo);
request.put(WsaPropertyBag.WSA_FAULTTO_FROM_REQUEST, faultTo);
request.put(WsaPropertyBag.WSA_MSGID_FROM_REQUEST, msgId);
wbo = getWSDLBoundOperation(request);
isAnonymousRequired = isAnonymousRequired(wbo);
Packet p = validateInboundHeaders(request);
// then do no further processing
if (p.getMessage() == null) {
return doReturnWith(p);
}
// if we find an error in addressing header, just turn around the direction here
if (p.getMessage().isFault()) {
// we'll never use them
if (isEarlyBackchannelCloseAllowed && !(isAnonymousRequired) && !faultTo.isAnonymous() && request.transportBackChannel != null) {
request.transportBackChannel.close();
}
return processResponse(p);
}
// we'll never use them
if (isEarlyBackchannelCloseAllowed && !(isAnonymousRequired) && !replyTo.isAnonymous() && !faultTo.isAnonymous() && request.transportBackChannel != null) {
request.transportBackChannel.close();
}
return doInvoke(next, p);
}
use of com.sun.xml.ws.api.message.MessageHeaders in project metro-jax-ws by eclipse-ee4j.
the class SAAJMessageHeadersTest method testGetHeader.
public void testGetHeader() throws Exception {
// SAAJMessage saajMsg = new SAAJMessage(makeSOAPMessage());
MessageHeaders hdrs = new SAAJMessageHeaders(makeSOAPMessage(MESSAGE), SOAPVersion.SOAP_11);
Header actionHdr = hdrs.get(new QName(ADDRESSING_NS, "Action"), false);
assertNotNull(actionHdr);
assertTrue(actionHdr instanceof SAAJHeader);
SOAPHeaderElement hdrElem = ((SAAJHeader) actionHdr).getWrappedNode();
assertNotNull(hdrElem);
assertEquals(ACTION_HDR_VALUE, hdrElem.getFirstChild().getNodeValue());
Iterator<Header> iter = hdrs.getHeaders(ADDRESSING_NS, false);
assertTrue(iter.hasNext());
assertEquals(actionHdr, iter.next());
hdrs.remove(ADDRESSING_NS, "Action");
// should be gone after remove
iter = hdrs.getHeaders(ADDRESSING_NS, false);
assertFalse(iter.hasNext());
}
use of com.sun.xml.ws.api.message.MessageHeaders in project metro-jax-ws by eclipse-ee4j.
the class SAAJMessageHeadersTest method testGetAllHeaders.
public void testGetAllHeaders() throws Exception {
String soapMsgStr = "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<env:Header>" + "<wsa:Action xmlns:wsa=\"http://www.w3.org/2005/08/addressing\"></wsa:Action>" + "<wsa:MessageID xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">uuid:40a19d86-071d-4d3f-8b1b-8c8b5245b1de</wsa:MessageID>" + "<wsa:RelatesTo xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">uuid:bd2cf21b-d2ad-4dc6-b0ec-2928736b5ae2</wsa:RelatesTo>" + "<wsa:To xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">http://www.w3.org/2005/08/addressing/anonymous</wsa:To>" + "</env:Header>" + "<env:Body xmlns:wsrm11=\"http://docs.oasis-open.org/ws-rx/wsrm/200702\">" + "<wsrm11:CreateSequenceResponse>" + "<wsrm11:Identifier>35599b13-3672-462a-a51a-31e1820ef236</wsrm11:Identifier>" + "<wsrm11:Expires>P1D</wsrm11:Expires>" + "<wsrm11:IncompleteSequenceBehavior>NoDiscard</wsrm11:IncompleteSequenceBehavior>" + "</wsrm11:CreateSequenceResponse>" + "</env:Body></env:Envelope>";
SOAPMessage msg = makeSOAPMessage(soapMsgStr);
int numHdrs = 0;
MessageHeaders mh = new SAAJMessageHeaders(msg, SOAPVersion.SOAP_11);
// assertTrue(mh instanceof SAAJMessageHeaders);
Iterator<Header> iter = mh.getHeaders();
while (iter.hasNext()) {
iter.next();
numHdrs++;
}
assertEquals(4, numHdrs);
}
use of com.sun.xml.ws.api.message.MessageHeaders in project metro-jax-ws by eclipse-ee4j.
the class SAAJMessageHeadersTest method testMustUnderstand2.
/**
* Tests mustUnderstand using the getHeaders call with boolean rather than the "understood(..)" call
*/
public void testMustUnderstand2() throws Exception {
SOAPMessage sm = makeSOAPMessage(MESSAGE);
// SAAJMessage saajMsg = new SAAJMessage(sm);
MessageHeaders hdrs = new SAAJMessageHeaders(sm, SOAPVersion.SOAP_11);
// new must understand header
Header newHdr = new StringHeader(new QName("myNs", "stringHeader1"), "stringHeaderValue1", SOAPVersion.SOAP_11, true);
hdrs.add(newHdr);
String hdrTxt = "<streamHeader1 S:mustUnderstand=\"true\" xmlns=\"myNs\" xmlns:S=\"" + SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE + "\">streamHeaderValue1</streamHeader1>";
ByteArrayInputStream bis = new ByteArrayInputStream(hdrTxt.getBytes());
XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(bis);
while (rdr.getEventType() != XMLStreamReader.START_ELEMENT) rdr.next();
newHdr = new StreamHeader11(rdr);
hdrs.add(newHdr);
hdrTxt = "<streamHeader2 S:mustUnderstand=\"true\" xmlns=\"mySecondNs\" xmlns:S=\"" + SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE + "\">streamHeaderValue2</streamHeader2>";
bis = new ByteArrayInputStream(hdrTxt.getBytes());
rdr = XMLInputFactory.newInstance().createXMLStreamReader(bis);
while (rdr.getEventType() != XMLStreamReader.START_ELEMENT) rdr.next();
newHdr = new StreamHeader11(rdr);
hdrs.add(newHdr);
// now add a non-must understand string header
newHdr = new StringHeader(new QName("myNs", "stringHeader2"), "stringHeaderValue2", SOAPVersion.SOAP_11, false);
hdrs.add(newHdr);
Set<QName> notUnderstoods = hdrs.getNotUnderstoodHeaders(null, null, null);
assertNotNull(notUnderstoods);
assertEquals(3, notUnderstoods.size());
// mark hte headers in "myNs" namespace as understood when retrieving them
Iterator<Header> myNsHeaders = hdrs.getHeaders("myNs", true);
notUnderstoods = hdrs.getNotUnderstoodHeaders(null, null, null);
assertNotNull(notUnderstoods);
// should be only one header left that is not understood, and it should be the
// mySecondNs header
assertEquals(1, notUnderstoods.size());
QName q = notUnderstoods.iterator().next();
assertEquals(new QName("mySecondNs", "streamHeader2"), q);
// Now examine the headers we marked as understood and make sure they are the right ones
int myNsCount = 0;
while (myNsHeaders.hasNext()) {
Header h = myNsHeaders.next();
assertNotNull(h);
assertTrue(h instanceof SAAJHeader);
assertEquals("myNs", h.getNamespaceURI());
assertTrue("Unexpected header local name: " + h.getLocalPart() + " - must be streamHeader1 or stringHeader1 or stringHeader2", "streamHeader1".equals(h.getLocalPart()) || "stringHeader1".equals(h.getLocalPart()) || "stringHeader2".equals(h.getLocalPart()));
myNsCount++;
}
assertEquals(3, myNsCount);
Header h = hdrs.get("myNs", "stringHeader2", false);
// this should be the non-must understand header, still there
assertNotNull(h);
}
use of com.sun.xml.ws.api.message.MessageHeaders in project metro-jax-ws by eclipse-ee4j.
the class SAAJMessageHeadersTest method testUnderstandingOfHeadersInSoapMessage.
public void testUnderstandingOfHeadersInSoapMessage() throws Exception {
// this message has one header NOT marked as mustUnderstand
SOAPMessage sm = makeSOAPMessage(MESSAGE);
String hdrLocalName = "Action";
MessageHeaders hdrs = new SAAJMessageHeaders(sm, SOAPVersion.SOAP_11);
Set<QName> understood = hdrs.getUnderstoodHeaders();
// header has not been explicity understood so it shoud
// not be treated as understood
assertNull(understood);
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, hdrLocalName));
hdrs.understood(ADDRESSING_NS, hdrLocalName);
// now it should be understood
assertTrue(hdrs.isUnderstood(ADDRESSING_NS, hdrLocalName));
understood = hdrs.getUnderstoodHeaders();
assertNotNull(understood);
assertEquals(1, understood.size());
QName actionHdrName = understood.iterator().next();
assertEquals(ADDRESSING_NS, actionHdrName.getNamespaceURI());
assertEquals(hdrLocalName, actionHdrName.getLocalPart());
// now a more complex SOAPMessage with 2 mustUnderstand=true headers,
// one mustUnderstand=false and one with no mustUnderstand specified
String soapMsgStr = "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<env:Header>" + "<wsa:Action xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" env:mustUnderstand=\"true\"></wsa:Action>" + "<wsa:MessageID xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">uuid:40a19d86-071d-4d3f-8b1b-8c8b5245b1de</wsa:MessageID>" + "<wsa:RelatesTo xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" env:mustUnderstand=\"false\">uuid:bd2cf21b-d2ad-4dc6-b0ec-2928736b5ae2</wsa:RelatesTo>" + "<wsa:To xmlns:wsa=\"http://www.w3.org/2005/08/addressing\" env:mustUnderstand=\"true\">http://www.w3.org/2005/08/addressing/anonymous</wsa:To>" + "</env:Header>" + "<env:Body xmlns:wsrm11=\"http://docs.oasis-open.org/ws-rx/wsrm/200702\">" + "<wsrm11:CreateSequenceResponse>" + "<wsrm11:Identifier>35599b13-3672-462a-a51a-31e1820ef236</wsrm11:Identifier>" + "<wsrm11:Expires>P1D</wsrm11:Expires>" + "<wsrm11:IncompleteSequenceBehavior>NoDiscard</wsrm11:IncompleteSequenceBehavior>" + "</wsrm11:CreateSequenceResponse>" + "</env:Body></env:Envelope>";
sm = makeSOAPMessage(soapMsgStr);
hdrs = new SAAJMessageHeaders(sm, SOAPVersion.SOAP_11);
// check understood headers - none are marked understood yet
// mustUnderstand = false headers, NOT yet marked as understood
understood = hdrs.getUnderstoodHeaders();
assertNull(understood);
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, "MessageID"));
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, "RelatesTo"));
// mark NON-mustUnderstand header MessageID as understood
// it should now be "understood"
hdrs.understood(ADDRESSING_NS, "MessageID");
assertTrue(hdrs.isUnderstood(ADDRESSING_NS, "MessageID"));
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, "RelatesTo"));
understood = hdrs.getUnderstoodHeaders();
assertNotNull(understood);
assertEquals(1, understood.size());
QName understoodQName = understood.iterator().next();
assertEquals(ADDRESSING_NS, understoodQName.getNamespaceURI());
assertEquals("MessageID", understoodQName.getLocalPart());
// mark NON-mustUnderstand header RelatesTo as understood
// it should also now be "understood"
hdrs.understood(ADDRESSING_NS, "RelatesTo");
assertTrue(hdrs.isUnderstood(ADDRESSING_NS, "MessageID"));
assertTrue(hdrs.isUnderstood(ADDRESSING_NS, "RelatesTo"));
assertEquals(2, understood.size());
for (QName nextHdrName : understood) {
assertEquals(ADDRESSING_NS, nextHdrName.getNamespaceURI());
assertTrue("Unexpected header name " + nextHdrName.getLocalPart(), "MessageID".equals(nextHdrName.getLocalPart()) || "RelatesTo".equals(nextHdrName.getLocalPart()));
}
// NOW TEST the mustUnderstand=true headers
// initially they should be in the notUnderstood list (and nothing
// else should be in that list)
// check not understood headers
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, "Action"));
assertFalse(hdrs.isUnderstood(ADDRESSING_NS, "To"));
Set<QName> notUnderstood = hdrs.getNotUnderstoodHeaders(null, null, null);
assertNotNull(notUnderstood);
assertEquals(2, notUnderstood.size());
for (QName nextHdrName : notUnderstood) {
assertEquals(ADDRESSING_NS, nextHdrName.getNamespaceURI());
assertTrue("Action".equals(nextHdrName.getLocalPart()) || "To".equals(nextHdrName.getLocalPart()));
}
int prevSizeOfUnderstood = understood.size();
// add understood calls for mustUnderstand=true headers
// i.e. Action and To headers and make sure they are understood
hdrs.understood(ADDRESSING_NS, "Action");
assertTrue(hdrs.isUnderstood(ADDRESSING_NS, "Action"));
understood = hdrs.getUnderstoodHeaders();
assertNotNull(understood);
assertEquals(prevSizeOfUnderstood + 1, understood.size());
assertTrue(understood.contains(new QName(ADDRESSING_NS, "Action")));
prevSizeOfUnderstood = understood.size();
hdrs.understood(ADDRESSING_NS, "To");
understood = hdrs.getUnderstoodHeaders();
assertNotNull(understood);
assertEquals(prevSizeOfUnderstood + 1, understood.size());
assertTrue(understood.contains(new QName(ADDRESSING_NS, "To")));
// make sure marking a header understood a second time doesn't
// add to size of understood
prevSizeOfUnderstood = understood.size();
hdrs.understood(ADDRESSING_NS, "To");
understood = hdrs.getUnderstoodHeaders();
assertNotNull(understood);
assertEquals(prevSizeOfUnderstood, understood.size());
// make sure no more notUnderstood headers exist
notUnderstood = hdrs.getNotUnderstoodHeaders(null, null, null);
assertTrue(notUnderstood == null || notUnderstood.size() == 0);
}
Aggregations