use of javax.xml.soap.SOAPHeader in project nhin-d by DirectProject.
the class DirectSOAPHandler method handleMessage.
/**
* This method handles the incoming and outgoing SOAP-Message. It's an
* excellent point to manipulate the SOAP.
*
* @param SOAPMessageContext
* The SOAPMessageContext object.
* @return true for successful handling, false otherwise.
*/
@Override
public boolean handleMessage(SOAPMessageContext context) {
LOGGER.info("Entering DirectSOAPHandler.handleMessage(SOAPMessageContext)");
// Inquire incoming or outgoing message.
boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
if (outbound) {
LOGGER.info("Handling an outbound message");
boolean isACK = !context.containsKey(ENDPOINT_ADDRESS);
SafeThreadData threadData = SafeThreadData.GetThreadInstance(Thread.currentThread().getId());
SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
dumpSOAPMessage(msg);
SOAPPart sp = msg.getSOAPPart();
// edit Envelope
SOAPEnvelope env = sp.getEnvelope();
SOAPHeader sh = env.addHeader();
@SuppressWarnings("unused") SOAPBody sb = env.getBody();
try {
if (threadData.getAction() != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "Action");
SOAPHeaderElement saction = sh.addHeaderElement(qname);
boolean must = true;
saction.setMustUnderstand(must);
saction.setValue(threadData.getAction());
}
if (threadData.getRelatesTo() != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "RelatesTo");
SOAPHeaderElement relates = sh.addHeaderElement(qname);
relates.setValue(threadData.getRelatesTo());
}
if (threadData.getFrom() != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "From");
QName child = new QName("http://www.w3.org/2005/08/addressing", "Address");
SOAPHeaderElement efrom = sh.addHeaderElement(qname);
SOAPElement address = efrom.addChildElement(child);
address.setValue(threadData.getFrom());
}
if (threadData.getMessageId() != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "MessageID");
SOAPHeaderElement message = sh.addHeaderElement(qname);
message.setValue(threadData.getMessageId());
}
if (threadData.getTo() != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "To");
SOAPHeaderElement sto = sh.addHeaderElement(qname);
sto.setValue(threadData.getTo());
}
SOAPHeaderElement directHeader = sh.addHeaderElement(new QName("urn:direct:addressing", "addressBlock"));
directHeader.setPrefix("direct");
directHeader.setRole("urn:direct:addressing:destination");
directHeader.setRelay(true);
if (StringUtils.isNotBlank(threadData.getDirectFrom())) {
SOAPElement directFromElement = directHeader.addChildElement(new QName("from"));
directFromElement.setPrefix("direct");
URI uri = new URI(threadData.getDirectFrom());
directFromElement.setValue((new URI("mailto", uri.getSchemeSpecificPart(), null)).toString());
}
if (StringUtils.isNotBlank(threadData.getDirectTo())) {
/**
* consider multiple recipients
*/
String[] directTos = threadData.getDirectTo().split(";");
for (String directToAddr : directTos) {
SOAPElement directToElement = directHeader.addChildElement(new QName("to"));
directToElement.setPrefix("direct");
URI uri = new URI(directToAddr);
directToElement.setValue((new URI("mailto", uri.getSchemeSpecificPart(), null)).toString());
}
}
SOAPElement directMetadataLevelElement = directHeader.addChildElement(new QName("metadata-level"));
directMetadataLevelElement.setPrefix("direct");
directMetadataLevelElement.setValue(MetadataLevelEnum.MINIMAL.getLevel());
} catch (Throwable tb) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Failed to write SOAP Header", tb);
} else {
LOGGER.error("Failed to write SOAP Header: " + tb.getMessage());
}
}
if (isACK) {
SafeThreadData.clean(Thread.currentThread().getId());
}
} else {
LOGGER.info("Handling an inbound message");
SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
boolean isResponse = isResponse(msg);
if (!isResponse) {
// Issue 249 - before handling the inbound case, we should clear
// out the old thread data if we don't this the To: (SMTP recipients) will
// append from the previous thread data
SafeThreadData.clean(Thread.currentThread().getId());
}
SafeThreadData threadData = SafeThreadData.GetThreadInstance(Thread.currentThread().getId());
ServletRequest sr = (ServletRequest) context.get(MessageContext.SERVLET_REQUEST);
if (sr != null) {
threadData.setRemoteHost(sr.getRemoteHost());
threadData.setThisHost(sr.getServerName());
threadData.setPid(getPID());
}
SOAPPart sp = msg.getSOAPPart();
// edit Envelope
SOAPEnvelope env = sp.getEnvelope();
SOAPHeader sh = env.getHeader();
@SuppressWarnings("unchecked") Iterator<Node> it = sh.extractAllHeaderElements();
while (it.hasNext()) {
try {
Node header = it.next();
if (StringUtils.contains(header.toString(), "MessageID")) {
threadData.setMessageId(header.getTextContent());
} else if (StringUtils.contains(header.toString(), "Action")) {
threadData.setAction(header.getTextContent());
} else if (StringUtils.contains(header.toString(), "RelatesTo")) {
threadData.setRelatesTo(header.getTextContent());
} else if (StringUtils.contains(header.toString(), "ReplyTo")) {
NodeList reps = header.getChildNodes();
for (int i = 0; i < reps.getLength(); i++) {
Node address = reps.item(i);
if (StringUtils.contains(address.getNodeName(), "Address")) {
threadData.setEndpoint(address.getTextContent());
}
}
} else if (StringUtils.contains(header.toString(), "From")) {
NodeList reps = header.getChildNodes();
for (int i = 0; i < reps.getLength(); i++) {
Node address = reps.item(i);
if (StringUtils.contains(address.getNodeName(), "Address")) {
threadData.setFrom(address.getTextContent());
}
}
} else if (// must be after ReplyTo
StringUtils.contains(header.toString(), "To")) {
threadData.setTo(header.getTextContent());
} else if (StringUtils.contains(header.toString(), "addressBlock")) {
NodeList childNodes = header.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
if (StringUtils.contains(node.getNodeName(), "from")) {
threadData.setDirectFrom(node.getTextContent());
} else if (StringUtils.contains(node.getNodeName(), "to")) {
// XDR-MULTIPLE-RECIPIENT-ISSUE - this is the part where old thread data
// gets into the To: and will cause unwanted recipients
// (see above for the clear)
String recipient = node.getTextContent();
if (threadData.getDirectTo() == null) {
threadData.setDirectTo(recipient);
} else {
/**
* if multiple recipients, save addresses in one parameters separate by (;)
*/
threadData.setDirectTo(threadData.getDirectTo() + ";" + recipient);
}
} else if (StringUtils.contains(node.getNodeName(), "metadata-level")) {
threadData.setDirectMetadataLevel(node.getTextContent());
}
}
}
} catch (Throwable tb) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Failed to read input parameter.", tb);
} else {
LOGGER.error("Failed to read input parameter.");
}
}
}
threadData.save();
}
} catch (Exception e) {
LOGGER.warn("Error handling SOAP message.", e);
return false;
}
return true;
}
use of javax.xml.soap.SOAPHeader in project ddf by codice.
the class SoapRequestDecoder method decodeRelayState.
public String decodeRelayState(String samlRequest) {
String relayState = null;
try {
SOAPPart soapMessage = SamlProtocol.parseSoapMessage(samlRequest);
SOAPEnvelope envelope = soapMessage.getEnvelope();
SOAPHeader header = envelope.getHeader();
Iterator iterator = header.examineAllHeaderElements();
while (iterator.hasNext()) {
SOAPHeaderElement soapHeaderElement = (SOAPHeaderElement) iterator.next();
if ("RelayState".equals(soapHeaderElement.getLocalName())) {
relayState = soapHeaderElement.getValue();
break;
}
}
} catch (XMLStreamException e) {
throw new IllegalArgumentException("Unable to convert parse SOAP request.");
} catch (SOAPException e) {
throw new IllegalArgumentException("Unable to get SOAP envelope.");
}
return relayState;
}
use of javax.xml.soap.SOAPHeader in project nhin-d by DirectProject.
the class RepositorySOAPHandler method handleMessage.
/**
* This method handles the incoming and outgoing SOAP-Message. It's an
* excellent point to manipulate the SOAP.
*
* @param SOAPMessageContext
* The SOAPMessageContext object.
*
* @return true if successful handling, false otherwise.
*/
@Override
public boolean handleMessage(SOAPMessageContext context) {
//Inquire incoming or outgoing message.
boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
if (outbound) {
getHeaderData();
SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
// dumpSOAPMessage(msg);
SOAPPart sp = msg.getSOAPPart();
// edit Envelope
SOAPEnvelope env = sp.getEnvelope();
SOAPHeader sh = env.addHeader();
@SuppressWarnings("unused") SOAPBody sb = env.getBody();
if (action != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "Action");
SOAPHeaderElement saction = sh.addHeaderElement(qname);
boolean must = true;
saction.setMustUnderstand(must);
saction.setValue(action);
}
if (relatesTo != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "RelatesTo");
SOAPHeaderElement relates = sh.addHeaderElement(qname);
relates.setValue(relatesTo);
}
if (from != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "From");
QName child = new QName("http://www.w3.org/2005/08/addressing", "Address");
SOAPHeaderElement efrom = sh.addHeaderElement(qname);
SOAPElement address = efrom.addChildElement(child);
address.setValue(from);
}
if (messageId != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "MessageID");
SOAPHeaderElement message = sh.addHeaderElement(qname);
message.setValue(messageId);
}
if (to != null) {
QName qname = new QName("http://www.w3.org/2005/08/addressing", "To");
SOAPHeaderElement sto = sh.addHeaderElement(qname);
sto.setValue(to);
}
} else {
//should not be any inbound
}
} catch (Exception e) {
LOGGER.error("Error handling SOAP message", e);
return false;
}
return true;
}
use of javax.xml.soap.SOAPHeader in project cxf by apache.
the class SAAJInInterceptor method replaceHeaders.
public static void replaceHeaders(SOAPMessage soapMessage, SoapMessage message) throws SOAPException {
SOAPHeader header = SAAJUtils.getHeader(soapMessage);
if (header == null) {
return;
}
Element elem = DOMUtils.getFirstElement(header);
elem = (Element) DOMUtils.getDomElement(elem);
while (elem != null) {
Bus b = message.getExchange() == null ? null : message.getExchange().getBus();
HeaderProcessor p = null;
if (b != null && b.getExtension(HeaderManager.class) != null) {
p = b.getExtension(HeaderManager.class).getHeaderProcessor(elem.getNamespaceURI());
}
Object obj;
DataBinding dataBinding = null;
if (p == null || p.getDataBinding() == null) {
obj = elem;
} else {
dataBinding = p.getDataBinding();
obj = p.getDataBinding().createReader(Node.class).read(elem);
}
SoapHeader shead = new SoapHeader(new QName(elem.getNamespaceURI(), elem.getLocalName()), obj, dataBinding);
shead.setDirection(SoapHeader.Direction.DIRECTION_IN);
String mu = elem.getAttributeNS(message.getVersion().getNamespace(), message.getVersion().getAttrNameMustUnderstand());
String act = elem.getAttributeNS(message.getVersion().getNamespace(), message.getVersion().getAttrNameRole());
shead.setActor(act);
shead.setMustUnderstand(Boolean.valueOf(mu) || "1".equals(mu));
Header oldHdr = message.getHeader(new QName(elem.getNamespaceURI(), elem.getLocalName()));
if (oldHdr != null) {
message.getHeaders().remove(oldHdr);
}
message.getHeaders().add(shead);
elem = DOMUtils.getNextElement(elem);
}
}
use of javax.xml.soap.SOAPHeader in project cxf by apache.
the class SAAJStreamWriter method createElementNS.
@Override
protected Element createElementNS(String ns, String pfx, String local) {
Element cur = getCurrentNode();
if (cur instanceof SOAPBody) {
try {
if (StringUtils.isEmpty(pfx) && StringUtils.isEmpty(ns)) {
Element el = ((SOAPBody) cur).addBodyElement(new QName(local));
cur.removeChild(el);
return el;
}
Element el = ((SOAPBody) cur).addBodyElement(new QName(ns, local, pfx == null ? "" : pfx));
cur.removeChild(el);
return el;
} catch (SOAPException e) {
// ignore
}
} else if (cur instanceof SOAPHeader) {
try {
Element el = ((SOAPHeader) cur).addHeaderElement(new QName(ns, local, pfx == null ? "" : pfx));
cur.removeChild(el);
return el;
} catch (SOAPException e) {
// ignore
}
} else if (cur instanceof SOAPElement) {
try {
Element el = null;
if (StringUtils.isEmpty(pfx) && StringUtils.isEmpty(ns)) {
el = ((SOAPElement) cur).addChildElement(local, "", "");
} else {
el = ((SOAPElement) cur).addChildElement(local, pfx == null ? "" : pfx, ns);
adjustPrefix(el, pfx);
}
cur.removeChild(el);
return el;
} catch (SOAPException e) {
// ignore
}
}
return super.createElementNS(ns, pfx, local);
}
Aggregations