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);
  }
Ejemplo n.º 2
0
 private static XMLStreamBuffer createBufferFromAddress(
     String address, AddressingVersion version) {
   try {
     MutableXMLStreamBuffer xsb = new MutableXMLStreamBuffer();
     StreamWriterBufferCreator w = new StreamWriterBufferCreator(xsb);
     w.writeStartDocument();
     w.writeStartElement(version.getPrefix(), "EndpointReference", version.nsUri);
     w.writeNamespace(version.getPrefix(), version.nsUri);
     w.writeStartElement(
         version.getPrefix(), W3CAddressingConstants.WSA_ADDRESS_NAME, version.nsUri);
     w.writeCharacters(address);
     w.writeEndElement();
     w.writeEndElement();
     w.writeEndDocument();
     w.close();
     return xsb;
   } catch (XMLStreamException e) {
     // can never happen because we are writing to XSB
     throw new AssertionError(e);
   }
 }
Ejemplo n.º 3
0
  private static XMLStreamBuffer createBufferFromData(
      AddressingVersion version,
      String address,
      List<Element> referenceParameters,
      QName service,
      QName port,
      QName portType,
      List<Element> metadata,
      String wsdlAddress) {

    StreamWriterBufferCreator writer = new StreamWriterBufferCreator();

    try {
      writer.writeStartDocument();
      writer.writeStartElement(version.getPrefix(), "EndpointReference", version.nsUri);
      writer.writeNamespace(version.getPrefix(), version.nsUri);
      writer.writeStartElement(version.getPrefix(), "Address", version.nsUri);
      writer.writeCharacters(address);
      writer.writeEndElement();
      if (referenceParameters != null) {
        writer.writeStartElement(version.getPrefix(), "ReferenceParameters", version.nsUri);
        for (Element e : referenceParameters) DOMUtil.serializeNode(e, writer);
        writer.writeEndElement();
      }

      switch (version) {
        case W3C:
          writeW3CMetaData(writer, service, port, portType, metadata, wsdlAddress);
          break;

        case MEMBER:
          writeMSMetaData(writer, service, port, portType, metadata);
          if (wsdlAddress != null) {
            // Inline the wsdl as extensibility element
            // Write mex:Metadata wrapper
            writer.writeStartElement(
                MemberSubmissionAddressingConstants.MEX_METADATA.getPrefix(),
                MemberSubmissionAddressingConstants.MEX_METADATA.getLocalPart(),
                MemberSubmissionAddressingConstants.MEX_METADATA.getNamespaceURI());
            writer.writeStartElement(
                MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getPrefix(),
                MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getLocalPart(),
                MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getNamespaceURI());
            writer.writeAttribute(
                MemberSubmissionAddressingConstants.MEX_METADATA_DIALECT_ATTRIBUTE,
                MemberSubmissionAddressingConstants.MEX_METADATA_DIALECT_VALUE);

            writeWsdl(writer, service, wsdlAddress);

            writer.writeEndElement();
            writer.writeEndElement();
          }

          break;
      }
      writer.writeEndElement();
      writer.writeEndDocument();
      writer.flush();

      return writer.getXMLStreamBuffer();
    } catch (XMLStreamException e) {
      throw new WebServiceException(e);
    }
  }
Ejemplo n.º 4
0
 /**
  * Creates from the spec version of {@link EndpointReference}.
  *
  * <p>This method performs the data conversion, so it's slow. Do not use this method in a
  * performance critical path.
  */
 public WSEndpointReference(EndpointReference epr) {
   this(epr, AddressingVersion.fromSpecClass(epr.getClass()));
 }