src/share/jaxws_classes/com/sun/xml/internal/ws/addressing/EndpointReferenceUtil.java

Thu, 12 Oct 2017 19:44:07 +0800

author
aoqi
date
Thu, 12 Oct 2017 19:44:07 +0800
changeset 760
e530533619ec
parent 637
9c07ef4934dd
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.xml.internal.ws.addressing;
    28 import com.sun.istack.internal.Nullable;
    29 import com.sun.istack.internal.NotNull;
    30 import com.sun.xml.internal.stream.buffer.XMLStreamBufferSource;
    31 import com.sun.xml.internal.stream.buffer.stax.StreamWriterBufferCreator;
    32 import com.sun.xml.internal.ws.api.addressing.AddressingVersion;
    33 import com.sun.xml.internal.ws.developer.MemberSubmissionEndpointReference;
    34 import com.sun.xml.internal.ws.util.DOMUtil;
    35 import com.sun.xml.internal.ws.util.xml.XmlUtil;
    36 import com.sun.xml.internal.ws.wsdl.parser.WSDLConstants;
    37 import com.sun.xml.internal.ws.addressing.v200408.MemberSubmissionAddressingConstants;
    38 import org.w3c.dom.*;
    40 import javax.xml.namespace.QName;
    41 import javax.xml.stream.XMLStreamException;
    42 import javax.xml.transform.dom.DOMResult;
    43 import javax.xml.ws.EndpointReference;
    44 import javax.xml.ws.WebServiceException;
    45 import javax.xml.ws.wsaddressing.W3CEndpointReference;
    46 import java.util.ArrayList;
    47 import java.util.HashMap;
    48 import java.util.Map;
    50 /**
    51  * @author Rama Pulavarthi
    52  */
    54 public class EndpointReferenceUtil {
    55     /**
    56      * Gives the EPR based on the clazz. It may need to perform tranformation from
    57      * W3C EPR to MS EPR or vise-versa.
    58      */
    59     public static <T extends EndpointReference> T transform(Class<T> clazz, @NotNull EndpointReference epr) {
    60         assert epr != null;
    61         if (clazz.isAssignableFrom(W3CEndpointReference.class)) {
    62             if (epr instanceof W3CEndpointReference) {
    63                 return (T) epr;
    64             } else if (epr instanceof MemberSubmissionEndpointReference) {
    65                 return (T) toW3CEpr((MemberSubmissionEndpointReference) epr);
    66             }
    67         } else if (clazz.isAssignableFrom(MemberSubmissionEndpointReference.class)) {
    68             if (epr instanceof W3CEndpointReference) {
    69                 return (T) toMSEpr((W3CEndpointReference) epr);
    70             } else if (epr instanceof MemberSubmissionEndpointReference) {
    71                 return (T) epr;
    72             }
    73         }
    75         //This must be an EPR that we dont know
    76         throw new WebServiceException("Unknwon EndpointReference: " + epr.getClass());
    77     }
    79     //TODO: bit of redundency on writes of w3c epr, should modularize it
    80     private static W3CEndpointReference toW3CEpr(MemberSubmissionEndpointReference msEpr) {
    81         StreamWriterBufferCreator writer = new StreamWriterBufferCreator();
    82         w3cMetadataWritten = false;
    83         try {
    84             writer.writeStartDocument();
    85             writer.writeStartElement(AddressingVersion.W3C.getPrefix(),
    86                     "EndpointReference", AddressingVersion.W3C.nsUri);
    87             writer.writeNamespace(AddressingVersion.W3C.getPrefix(),
    88                     AddressingVersion.W3C.nsUri);
    89             //write wsa:Address
    90             writer.writeStartElement(AddressingVersion.W3C.getPrefix(),
    91                     AddressingVersion.W3C.eprType.address
    92                     , AddressingVersion.W3C.nsUri);
    93             writer.writeCharacters(msEpr.addr.uri);
    94             writer.writeEndElement();
    95             //TODO: write extension attributes on wsa:Address
    96             if ((msEpr.referenceProperties != null && msEpr.referenceProperties.elements.size() > 0) ||
    97                     (msEpr.referenceParameters != null && msEpr.referenceParameters.elements.size() > 0)) {
    99                 writer.writeStartElement(AddressingVersion.W3C.getPrefix(), "ReferenceParameters", AddressingVersion.W3C.nsUri);
   101                 //write ReferenceProperties
   102                 if (msEpr.referenceProperties != null) {
   103                     for (Element e : msEpr.referenceProperties.elements) {
   104                         DOMUtil.serializeNode(e, writer);
   105                     }
   106                 }
   107                 //write referenceParameters
   108                 if (msEpr.referenceParameters != null) {
   109                     for (Element e : msEpr.referenceParameters.elements) {
   110                         DOMUtil.serializeNode(e, writer);
   111                     }
   112                 }
   113                 writer.writeEndElement();
   114             }
   115             // Supress writing ServiceName and EndpointName in W3CEPR,
   116             // Until the ns for those metadata elements is resolved.
   117             /*
   118             //Write Interface info
   119             if (msEpr.portTypeName != null) {
   120                 writeW3CMetadata(writer);
   121                 writer.writeStartElement(AddressingVersion.W3C.getWsdlPrefix(),
   122                         AddressingVersion.W3C.eprType.portTypeName ,
   123                         AddressingVersion.W3C.wsdlNsUri);
   124                 writer.writeNamespace(AddressingVersion.W3C.getWsdlPrefix(),
   125                         AddressingVersion.W3C.wsdlNsUri);
   126                 String portTypePrefix = fixNull(msEpr.portTypeName.name.getPrefix());
   127                 writer.writeNamespace(portTypePrefix, msEpr.portTypeName.name.getNamespaceURI());
   128                 if (portTypePrefix.equals(""))
   129                     writer.writeCharacters(msEpr.portTypeName.name.getLocalPart());
   130                 else
   131                     writer.writeCharacters(portTypePrefix + ":" + msEpr.portTypeName.name.getLocalPart());
   132                 writer.writeEndElement();
   133             }
   134             if (msEpr.serviceName != null) {
   135                 writeW3CMetadata(writer);
   136                 //Write service and Port info
   137                 writer.writeStartElement(AddressingVersion.W3C.getWsdlPrefix(),
   138                         AddressingVersion.W3C.eprType.serviceName ,
   139                         AddressingVersion.W3C.wsdlNsUri);
   140                 writer.writeNamespace(AddressingVersion.W3C.getWsdlPrefix(),
   141                         AddressingVersion.W3C.wsdlNsUri);
   143                 String servicePrefix = fixNull(msEpr.serviceName.name.getPrefix());
   144                 if (msEpr.serviceName.portName != null)
   145                     writer.writeAttribute(AddressingVersion.W3C.eprType.portName,
   146                             msEpr.serviceName.portName);
   148                 writer.writeNamespace(servicePrefix, msEpr.serviceName.name.getNamespaceURI());
   149                 if (servicePrefix.length() > 0)
   150                     writer.writeCharacters(servicePrefix + ":" + msEpr.serviceName.name.getLocalPart());
   151                 else
   152                     writer.writeCharacters(msEpr.serviceName.name.getLocalPart());
   153                 writer.writeEndElement();
   154             }
   155             */
   156             //TODO: revisit this
   157             Element wsdlElement = null;
   158             //Check for wsdl in extension elements
   159             if ((msEpr.elements != null) && (msEpr.elements.size() > 0)) {
   160                 for (Element e : msEpr.elements) {
   161                     if(e.getNamespaceURI().equals(MemberSubmissionAddressingConstants.MEX_METADATA.getNamespaceURI()) &&
   162                             e.getLocalName().equals(MemberSubmissionAddressingConstants.MEX_METADATA.getLocalPart())) {
   163                         NodeList nl = e.getElementsByTagNameNS(WSDLConstants.NS_WSDL,
   164                                 WSDLConstants.QNAME_DEFINITIONS.getLocalPart());
   165                         if(nl != null) {
   166                             wsdlElement = (Element) nl.item(0);
   167                         }
   168                     }
   169                 }
   170             }
   171             //write WSDL
   172             if (wsdlElement != null) {
   173                 DOMUtil.serializeNode(wsdlElement, writer);
   174             }
   176             if (w3cMetadataWritten) {
   177                 writer.writeEndElement();
   178             }
   179             //TODO revisit this
   180             //write extension elements
   181             if ((msEpr.elements != null) && (msEpr.elements.size() > 0)) {
   182                 for (Element e : msEpr.elements) {
   183                     if (e.getNamespaceURI().equals(WSDLConstants.NS_WSDL) &&
   184                             e.getLocalName().equals(WSDLConstants.QNAME_DEFINITIONS.getLocalPart())) {
   185                         // Don't write it as this is written already in Metadata
   186                     }
   187                     DOMUtil.serializeNode(e, writer);
   188                 }
   189             }
   191             //TODO:write extension attributes
   193             //</EndpointReference>
   194             writer.writeEndElement();
   195             writer.writeEndDocument();
   196             writer.flush();
   197         } catch (XMLStreamException e) {
   198             throw new WebServiceException(e);
   199         }
   200         return new W3CEndpointReference(new XMLStreamBufferSource(writer.getXMLStreamBuffer()));
   201     }
   203     private static boolean w3cMetadataWritten = false;
   205 //    private static void writeW3CMetadata(StreamWriterBufferCreator writer) throws XMLStreamException {
   206 //        if (!w3cMetadataWritten) {
   207 //            writer.writeStartElement(AddressingVersion.W3C.getPrefix(), AddressingVersion.W3C.eprType.wsdlMetadata.getLocalPart(), AddressingVersion.W3C.nsUri);
   208 //            w3cMetadataWritten = true;
   209 //        }
   210 //    }
   211 //
   212     private static MemberSubmissionEndpointReference toMSEpr(W3CEndpointReference w3cEpr) {
   213         DOMResult result = new DOMResult();
   214         w3cEpr.writeTo(result);
   215         Node eprNode = result.getNode();
   216         Element e = DOMUtil.getFirstElementChild(eprNode);
   217         if (e == null) {
   218             return null;
   219         }
   221         MemberSubmissionEndpointReference msEpr = new MemberSubmissionEndpointReference();
   223         NodeList nodes = e.getChildNodes();
   224         for (int i = 0; i < nodes.getLength(); i++) {
   225             if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
   226                 Element child = (Element) nodes.item(i);
   227                 if (child.getNamespaceURI().equals(AddressingVersion.W3C.nsUri) &&
   228                         child.getLocalName().equals(AddressingVersion.W3C.eprType.address)) {
   229                     if (msEpr.addr == null) {
   230                         msEpr.addr = new MemberSubmissionEndpointReference.Address();
   231                     }
   232                     msEpr.addr.uri = XmlUtil.getTextForNode(child);
   234                 } else if (child.getNamespaceURI().equals(AddressingVersion.W3C.nsUri) &&
   235                         child.getLocalName().equals("ReferenceParameters")) {
   236                     NodeList refParams = child.getChildNodes();
   237                     for (int j = 0; j < refParams.getLength(); j++) {
   238                         if (refParams.item(j).getNodeType() == Node.ELEMENT_NODE) {
   239                             if (msEpr.referenceParameters == null) {
   240                                 msEpr.referenceParameters = new MemberSubmissionEndpointReference.Elements();
   241                                 msEpr.referenceParameters.elements = new ArrayList<Element>();
   242                             }
   243                             msEpr.referenceParameters.elements.add((Element) refParams.item(j));
   244                         }
   245                     }
   246                 } else if (child.getNamespaceURI().equals(AddressingVersion.W3C.nsUri) &&
   247                         child.getLocalName().equals(AddressingVersion.W3C.eprType.wsdlMetadata.getLocalPart())) {
   248                     NodeList metadata = child.getChildNodes();
   249                     String wsdlLocation = child.getAttributeNS(W3CAddressingMetadataConstants.WSAM_WSDLI_ATTRIBUTE_NAMESPACE,
   250                             W3CAddressingMetadataConstants.WSAM_WSDLI_ATTRIBUTE_LOCALNAME);
   251                     Element wsdlDefinitions = null;
   252                     for (int j = 0; j < metadata.getLength(); j++) {
   253                         Node node = metadata.item(j);
   254                         if (node.getNodeType() != Node.ELEMENT_NODE) {
   255                             continue;
   256                         }
   258                         Element elm = (Element) node;
   259                         if ((elm.getNamespaceURI().equals(AddressingVersion.W3C.wsdlNsUri) ||
   260                                 elm.getNamespaceURI().equals(W3CAddressingMetadataConstants.WSAM_NAMESPACE_NAME)) &&
   261                                 elm.getLocalName().equals(AddressingVersion.W3C.eprType.serviceName)) {
   262                             msEpr.serviceName = new MemberSubmissionEndpointReference.ServiceNameType();
   263                             msEpr.serviceName.portName = elm.getAttribute(AddressingVersion.W3C.eprType.portName);
   265                             String service = elm.getTextContent();
   266                             String prefix = XmlUtil.getPrefix(service);
   267                             String name = XmlUtil.getLocalPart(service);
   269                             //if there is no service name then its not a valid EPR but lets continue as its optional anyway
   270                             if (name == null) {
   271                                 continue;
   272                             }
   274                             if (prefix != null) {
   275                                 String ns = elm.lookupNamespaceURI(prefix);
   276                                 if (ns != null) {
   277                                     msEpr.serviceName.name = new QName(ns, name, prefix);
   278                                 }
   279                             } else {
   280                                 msEpr.serviceName.name = new QName(null, name);
   281                             }
   282                             msEpr.serviceName.attributes = getAttributes(elm);
   283                         } else if ((elm.getNamespaceURI().equals(AddressingVersion.W3C.wsdlNsUri) ||
   284                                 elm.getNamespaceURI().equals(W3CAddressingMetadataConstants.WSAM_NAMESPACE_NAME)) &&
   285                                 elm.getLocalName().equals(AddressingVersion.W3C.eprType.portTypeName)) {
   286                             msEpr.portTypeName = new MemberSubmissionEndpointReference.AttributedQName();
   288                             String portType = elm.getTextContent();
   289                             String prefix = XmlUtil.getPrefix(portType);
   290                             String name = XmlUtil.getLocalPart(portType);
   292                             //if there is no portType name then its not a valid EPR but lets continue as its optional anyway
   293                             if (name == null) {
   294                                 continue;
   295                             }
   297                             if (prefix != null) {
   298                                 String ns = elm.lookupNamespaceURI(prefix);
   299                                 if (ns != null) {
   300                                     msEpr.portTypeName.name = new QName(ns, name, prefix);
   301                                 }
   302                             } else {
   303                                 msEpr.portTypeName.name = new QName(null, name);
   304                             }
   305                             msEpr.portTypeName.attributes = getAttributes(elm);
   306                         } else if(elm.getNamespaceURI().equals(WSDLConstants.NS_WSDL) &&
   307                                 elm.getLocalName().equals(WSDLConstants.QNAME_DEFINITIONS.getLocalPart())) {
   308                             wsdlDefinitions = elm;
   309                         } else {
   310                             //TODO : Revisit this
   311                             //its extensions in META-DATA and should be copied to extensions in MS EPR
   312                             if (msEpr.elements == null) {
   313                                 msEpr.elements = new ArrayList<Element>();
   314                             }
   315                             msEpr.elements.add(elm);
   316                         }
   317                     }
   320                     Document doc = DOMUtil.createDom();
   321                     Element mexEl = doc.createElementNS(MemberSubmissionAddressingConstants.MEX_METADATA.getNamespaceURI(),
   322                             MemberSubmissionAddressingConstants.MEX_METADATA.getPrefix() + ":"
   323                                     + MemberSubmissionAddressingConstants.MEX_METADATA.getLocalPart());
   324                     Element metadataEl = doc.createElementNS(MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getNamespaceURI(),
   325                             MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getPrefix() + ":"
   326                                     + MemberSubmissionAddressingConstants.MEX_METADATA_SECTION.getLocalPart());
   327                     metadataEl.setAttribute(MemberSubmissionAddressingConstants.MEX_METADATA_DIALECT_ATTRIBUTE,
   328                             MemberSubmissionAddressingConstants.MEX_METADATA_DIALECT_VALUE);
   329                     if (wsdlDefinitions == null && wsdlLocation != null && !wsdlLocation.equals("")) {
   330                         wsdlLocation = wsdlLocation.trim();
   331                         String wsdlTns = wsdlLocation.substring(0, wsdlLocation.indexOf(' '));
   332                         wsdlLocation = wsdlLocation.substring(wsdlLocation.indexOf(' ') + 1);
   333                         Element wsdlEl = doc.createElementNS(WSDLConstants.NS_WSDL,
   334                                 WSDLConstants.PREFIX_NS_WSDL + ":"
   335                                         + WSDLConstants.QNAME_DEFINITIONS.getLocalPart());
   336                         Element wsdlImportEl = doc.createElementNS(WSDLConstants.NS_WSDL,
   337                                 WSDLConstants.PREFIX_NS_WSDL + ":"
   338                                         + WSDLConstants.QNAME_IMPORT.getLocalPart());
   339                         wsdlImportEl.setAttribute("namespace", wsdlTns);
   340                         wsdlImportEl.setAttribute("location", wsdlLocation);
   341                         wsdlEl.appendChild(wsdlImportEl);
   342                         metadataEl.appendChild(wsdlEl);
   343                     } else if(wsdlDefinitions != null){
   344                         metadataEl.appendChild(wsdlDefinitions);
   345                     }
   346                     mexEl.appendChild(metadataEl);
   348                     if (msEpr.elements == null) {
   349                         msEpr.elements = new ArrayList<Element>();
   350                     }
   351                     msEpr.elements.add(mexEl);
   354                 } else {
   355                     //its extensions
   356                     if (msEpr.elements == null) {
   357                         msEpr.elements = new ArrayList<Element>();
   358                     }
   359                     msEpr.elements.add((Element) child);
   361                 }
   362             } else if (nodes.item(i).getNodeType() == Node.ATTRIBUTE_NODE) {
   363                 Node n = nodes.item(i);
   364                 if (msEpr.attributes == null) {
   365                     msEpr.attributes = new HashMap<QName, String>();
   366                     String prefix = fixNull(n.getPrefix());
   367                     String ns = fixNull(n.getNamespaceURI());
   368                     String localName = n.getLocalName();
   369                     msEpr.attributes.put(new QName(ns, localName, prefix), n.getNodeValue());
   370                 }
   371             }
   372         }
   374         return msEpr;
   375     }
   377     private static Map<QName, String> getAttributes(Node node) {
   378         Map<QName, String> attribs = null;
   380         NamedNodeMap nm = node.getAttributes();
   381         for (int i = 0; i < nm.getLength(); i++) {
   382             if (attribs == null) {
   383                 attribs = new HashMap<QName, String>();
   384             }
   385             Node n = nm.item(i);
   386             String prefix = fixNull(n.getPrefix());
   387             String ns = fixNull(n.getNamespaceURI());
   388             String localName = n.getLocalName();
   389             if (prefix.equals("xmlns") || prefix.length() == 0 && localName.equals("xmlns")) {
   390                 continue;
   391             }
   393             //exclude some attributes
   394             if (!localName.equals(AddressingVersion.W3C.eprType.portName)) {
   395                 attribs.put(new QName(ns, localName, prefix), n.getNodeValue());
   396             }
   397         }
   398         return attribs;
   399     }
   401     private static
   402     @NotNull
   403     String fixNull(@Nullable String s) {
   404         if (s == null) {
   405             return "";
   406         } else {
   407             return s;
   408         }
   409     }
   411 }

mercurial