public static int getLastSequenceID(SOAPHeader soapHeader) { Iterator headers = soapHeader.getHeadersToProcess(null, "http://www.w3.org/2005/08/addressing"); int seqId = -1; int lastSeqId = -1; boolean isReset = false; SOAPHeaderBlock referenceParametersHeaderBlock = null; while (headers.hasNext()) { SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) headers.next(); String localName = soapHeaderBlock.getLocalName(); if (localName.equals("SequenceID")) { try { seqId = Integer.parseInt(soapHeaderBlock.getText()); } catch (NumberFormatException e) { // if the client didn't send a SeqID, then there's nothing we can do return -1; } return seqId; } } return -1; }
/** * Creates a DOM Document using the SOAP Envelope. * * @param env An org.apache.axiom.soap.SOAPEnvelope instance * @return Returns the DOM Document of the given SOAP Envelope. * @throws Exception */ public static Document getDocumentFromSOAPEnvelope(SOAPEnvelope env, boolean useDoom) throws WSSecurityException { try { if (env instanceof Element) { return ((Element) env).getOwnerDocument(); } if (useDoom) { env.build(); // Workaround to prevent a bug in AXIOM where // there can be an incomplete OMElement as the first child body OMElement firstElement = env.getBody().getFirstElement(); if (firstElement != null) { firstElement.build(); } // Get processed headers SOAPHeader soapHeader = env.getHeader(); ArrayList processedHeaderQNames = new ArrayList(); if (soapHeader != null) { Iterator headerBlocs = soapHeader.getChildElements(); while (headerBlocs.hasNext()) { SOAPHeaderBlock element = (SOAPHeaderBlock) headerBlocs.next(); if (element.isProcessed()) { processedHeaderQNames.add(element.getQName()); } } } // Check the namespace and find SOAP version and factory String nsURI = null; SOAPFactory factory; if (env.getNamespace() .getNamespaceURI() .equals(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) { nsURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI; factory = DOOMAbstractFactory.getSOAP11Factory(); } else { nsURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI; factory = DOOMAbstractFactory.getSOAP12Factory(); } StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder(env.getXMLStreamReader(), factory, nsURI); SOAPEnvelope envelope = (stAXSOAPModelBuilder).getSOAPEnvelope(); ((OMNode) envelope.getParent()).build(); // Set the processed flag of the processed headers SOAPHeader header = envelope.getHeader(); for (Iterator iter = processedHeaderQNames.iterator(); iter.hasNext(); ) { QName name = (QName) iter.next(); Iterator omKids = header.getChildrenWithName(name); if (omKids.hasNext()) { ((SOAPHeaderBlock) omKids.next()).setProcessed(); } } Element envElem = (Element) envelope; return envElem.getOwnerDocument(); } else { ByteArrayOutputStream baos = new ByteArrayOutputStream(); env.build(); env.serialize(baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); return factory.newDocumentBuilder().parse(bais); } } catch (Exception e) { throw new WSSecurityException("Error in converting SOAP Envelope to Document", e); } }
public Object fromHeaderBlock(SOAPHeaderBlock sequenceAckElement) throws OMException, SandeshaException { originalSequenceAckElement = sequenceAckElement; OMElement identifierPart = null; Iterator childElements = sequenceAckElement.getChildElements(); while (childElements.hasNext()) { OMElement element = (OMElement) childElements.next(); String elementNamespace = element.getQName().getNamespaceURI(); String elementLocalName = element.getQName().getLocalPart(); if (namespaceValue.equals(elementNamespace)) { if (Sandesha2Constants.WSRM_COMMON.ACK_RANGE.equals(elementLocalName)) { String lowerAttribValue = element.getAttributeValue(new QName(Sandesha2Constants.WSRM_COMMON.LOWER)); String upperAttribValue = element.getAttributeValue(new QName(Sandesha2Constants.WSRM_COMMON.UPPER)); if (lowerAttribValue == null || upperAttribValue == null) throw new OMException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.noUpperOrLowerAttributesInElement, element.toString())); try { long lower = Long.parseLong(lowerAttribValue); long upper = Long.parseLong(upperAttribValue); acknowledgementRangeList.add(new Range(lower, upper)); } catch (Exception ex) { throw new OMException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.ackRandDoesNotHaveCorrectValues, element.toString())); } } else if (Sandesha2Constants.WSRM_COMMON.NACK.equals(elementLocalName)) { try { Long nack = Long.valueOf(element.getText()); nackList.add(nack); } catch (Exception ex) { throw new OMException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.nackDoesNotContainValidLongValue)); } } else if (Sandesha2Constants.WSRM_COMMON.IDENTIFIER.equals(elementLocalName)) { identifierPart = element; } else { String rmSpecVersion = SpecSpecificConstants.getSpecVersionString(namespaceValue); if (SpecSpecificConstants.isAckFinalAllowed(rmSpecVersion)) { if (Sandesha2Constants.WSRM_COMMON.FINAL.equals(elementLocalName)) { ackFinal = true; } } if (SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) { if (Sandesha2Constants.WSRM_COMMON.NONE.equals(elementLocalName)) { ackNone = true; } } } } } identifier = new Identifier(namespaceValue); identifier.fromOMElement(identifierPart); // Indicate that we have processed this part of the message. sequenceAckElement.setProcessed(); return this; }
/** * Builds a SOAPEnvelope from DOM Document. * * @param doc - The dom document that contains a SOAP message * @param useDoom * @return * @throws WSSecurityException */ public static SOAPEnvelope getSOAPEnvelopeFromDOMDocument(Document doc, boolean useDoom) throws WSSecurityException { if (useDoom) { try { // Get processed headers SOAPEnvelope env = (SOAPEnvelope) doc.getDocumentElement(); ArrayList processedHeaderQNames = new ArrayList(); SOAPHeader soapHeader = env.getHeader(); if (soapHeader != null) { Iterator headerBlocs = soapHeader.getChildElements(); while (headerBlocs.hasNext()) { OMElement element = (OMElement) headerBlocs.next(); SOAPHeaderBlock header = null; if (element instanceof SOAPHeaderBlock) { header = (SOAPHeaderBlock) element; // If a header block is not an instance of SOAPHeaderBlock, it means that // it is a header we have added in rampart eg. EncryptedHeader and should // be converted to SOAPHeaderBlock for processing } else { header = soapHeader.addHeaderBlock(element.getLocalName(), element.getNamespace()); Iterator attrIter = element.getAllAttributes(); while (attrIter.hasNext()) { OMAttribute attr = (OMAttribute) attrIter.next(); header.addAttribute( attr.getLocalName(), attr.getAttributeValue(), attr.getNamespace()); } Iterator nsIter = element.getAllDeclaredNamespaces(); while (nsIter.hasNext()) { OMNamespace ns = (OMNamespace) nsIter.next(); header.declareNamespace(ns); } // retrieve all child nodes (including any text nodes) // and re-attach to header block Iterator children = element.getChildren(); while (children.hasNext()) { OMNode child = (OMNode) children.next(); child.detach(); header.addChild(child); } element.detach(); soapHeader.build(); header.setProcessed(); } if (header.isProcessed()) { processedHeaderQNames.add(element.getQName()); } } } XMLStreamReader reader = ((OMElement) doc.getDocumentElement()).getXMLStreamReader(); StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder(reader, null); SOAPEnvelope envelope = stAXSOAPModelBuilder.getSOAPEnvelope(); // Set the processed flag of the processed headers SOAPHeader header = envelope.getHeader(); for (Iterator iter = processedHeaderQNames.iterator(); iter.hasNext(); ) { QName name = (QName) iter.next(); Iterator omKids = header.getChildrenWithName(name); if (omKids.hasNext()) { ((SOAPHeaderBlock) omKids.next()).setProcessed(); } } envelope.build(); return envelope; } catch (FactoryConfigurationError e) { throw new WSSecurityException(e.getMessage()); } } else { try { ByteArrayOutputStream os = new ByteArrayOutputStream(); XMLUtils.outputDOM(doc.getDocumentElement(), os, true); ByteArrayInputStream bais = new ByteArrayInputStream(os.toByteArray()); StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder( XMLInputFactory.newInstance().createXMLStreamReader(bais), null); return stAXSOAPModelBuilder.getSOAPEnvelope(); } catch (Exception e) { throw new WSSecurityException(e.getMessage()); } } }
public void toHeader(SOAPHeader header) throws SandeshaException { SOAPHeaderBlock sequenceAcknowledgementHeaderBlock = header.addHeaderBlock(Sandesha2Constants.WSRM_COMMON.SEQUENCE_ACK, omNamespace); if (identifier == null) throw new OMException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.invalidIdentifier, header.toString())); // SequenceACK messages should always have the MustUnderstand flag set to true // Unless it is a piggybacked ack if (piggybacked) { sequenceAcknowledgementHeaderBlock.setMustUnderstand(false); } else { sequenceAcknowledgementHeaderBlock.setMustUnderstand(true); } identifier.toOMElement(sequenceAcknowledgementHeaderBlock, omNamespace); Iterator<Range> ackRangeIt = acknowledgementRangeList.iterator(); while (ackRangeIt.hasNext()) { Range ackRange = (Range) ackRangeIt.next(); if (ackRange.upperValue <= 0 || ackRange.lowerValue <= 0 || ackRange.lowerValue > ackRange.upperValue) throw new OMException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.ackRandDoesNotHaveCorrectValues, ackRange.upperValue + ":" + ackRange.lowerValue)); OMFactory factory = sequenceAcknowledgementHeaderBlock.getOMFactory(); OMAttribute lowerAttrib = factory.createOMAttribute( Sandesha2Constants.WSRM_COMMON.LOWER, null, Long.toString(ackRange.lowerValue)); OMAttribute upperAttrib = factory.createOMAttribute( Sandesha2Constants.WSRM_COMMON.UPPER, null, Long.toString(ackRange.upperValue)); OMElement acknowledgementRangeElement = factory.createOMElement(Sandesha2Constants.WSRM_COMMON.ACK_RANGE, omNamespace); acknowledgementRangeElement.addAttribute(lowerAttrib); acknowledgementRangeElement.addAttribute(upperAttrib); sequenceAcknowledgementHeaderBlock.addChild(acknowledgementRangeElement); } Iterator<Long> nackIt = nackList.iterator(); while (nackIt.hasNext()) { Long nack = (Long) nackIt.next(); if (nack.longValue() <= 0) throw new OMException( SandeshaMessageHelper.getMessage(SandeshaMessageKeys.nackDoesNotContainValidLongValue)); OMElement nackElement = sequenceAcknowledgementHeaderBlock .getOMFactory() .createOMElement(Sandesha2Constants.WSRM_COMMON.NACK, omNamespace); nackElement.setText(nack.toString()); sequenceAcknowledgementHeaderBlock.addChild(nackElement); } String rmSpecVersion = SpecSpecificConstants.getSpecVersionString(namespaceValue); // setting a 'None' when nothing is there (for the correct RM version) if (ackNone == false && acknowledgementRangeList.size() == 0 && nackList.size() == 0 && SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) { ackNone = true; } if (ackNone != false) { if (!SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) { throw new SandeshaException( SandeshaMessageHelper.getMessage( SandeshaMessageKeys.noneNotAllowedNamespace, rmSpecVersion)); } if (acknowledgementRangeList.size() > 0) { throw new SandeshaException( SandeshaMessageHelper.getMessage(SandeshaMessageKeys.noneNotAllowedAckRangesPresent)); } if (nackList.size() > 0) { throw new SandeshaException( SandeshaMessageHelper.getMessage(SandeshaMessageKeys.noneNotAllowedNackPresent)); } OMElement noneElement = sequenceAcknowledgementHeaderBlock .getOMFactory() .createOMElement(Sandesha2Constants.WSRM_COMMON.NONE, omNamespace); sequenceAcknowledgementHeaderBlock.addChild(noneElement); } if (ackFinal != false) { if (!SpecSpecificConstants.isAckFinalAllowed(rmSpecVersion)) { throw new SandeshaException( SandeshaMessageHelper.getMessage(SandeshaMessageKeys.finalNotAllowedNamespace)); } if (nackList.size() > 0) { throw new SandeshaException( SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotHaveFinalWithNack)); } OMElement finalElement = sequenceAcknowledgementHeaderBlock .getOMFactory() .createOMElement(Sandesha2Constants.WSRM_COMMON.FINAL, omNamespace); sequenceAcknowledgementHeaderBlock.addChild(finalElement); } }