Ejemplo n.º 1
0
  /** Parses inside EPR and mark all reference parameters. */
  private void parse() throws XMLStreamException {
    // TODO: validate the EPR structure.
    // check for non-existent Address, that sort of things.

    StreamReaderBufferProcessor xsr = infoset.readAsXMLStreamReader();

    // parser should be either at the start element or the start document
    if (xsr.getEventType() == XMLStreamReader.START_DOCUMENT) xsr.nextTag();
    assert xsr.getEventType() == XMLStreamReader.START_ELEMENT;

    String rootLocalName = xsr.getLocalName();
    if (!xsr.getNamespaceURI().equals(version.nsUri))
      throw new WebServiceException(
          AddressingMessages.WRONG_ADDRESSING_VERSION(version.nsUri, xsr.getNamespaceURI()));

    // since often EPR doesn't have a reference parameter, create array lazily
    List<Header> marks = null;

    while (xsr.nextTag() == XMLStreamReader.START_ELEMENT) {
      String localName = xsr.getLocalName();
      if (version.isReferenceParameter(localName)) {
        XMLStreamBuffer mark;
        while ((mark = xsr.nextTagAndMark()) != null) {
          if (marks == null) marks = new ArrayList<Header>();

          // TODO: need a different header for member submission version
          marks.add(
              version.createReferenceParameterHeader(
                  mark, xsr.getNamespaceURI(), xsr.getLocalName()));
          XMLStreamReaderUtil.skipElement(xsr);
        }
      } else if (localName.equals("Address")) {
        if (address != null) // double <Address>. That's an error.
        throw new InvalidAddressingHeaderException(
              new QName(version.nsUri, rootLocalName),
              AddressingVersion.fault_duplicateAddressInEpr);
        address = xsr.getElementText().trim();
      } else {
        XMLStreamReaderUtil.skipElement(xsr);
      }
    }

    // hit to </EndpointReference> by now

    if (marks == null) {
      this.referenceParameters = EMPTY_ARRAY;
    } else {
      this.referenceParameters = marks.toArray(new Header[marks.size()]);
    }

    if (address == null)
      throw new InvalidAddressingHeaderException(
          new QName(version.nsUri, rootLocalName), version.fault_missingAddressInEpr);
  }