Exemplo n.º 1
0
  /**
   * 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());
      }
    }
  }
Exemplo n.º 2
0
  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);
    }
  }