/** 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); }
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); } }
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); } }
/** * 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())); }