/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2004-2013 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package testutil; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.ws.EndpointReference; import javax.xml.ws.wsaddressing.W3CEndpointReference; import javax.xml.transform.dom.DOMResult; import javax.xml.namespace.QName; import com.sun.xml.ws.developer.MemberSubmissionEndpointReference; /** * @author Rama Pulavarthi */ public class EprUtil extends junit.framework.Assert { private static final String W3C_EPR_NS = "http://www.w3.org/2005/08/addressing"; private static final String W3C_EPR_WSDLBINDING_NS = "http://www.w3.org/2006/05/addressing/wsdl"; private static final String MS_EPR_NS = "http://schemas.xmlsoap.org/ws/2004/08/addressing"; public static final QName WSDL_DEFINITIONS_NAME = new QName("http://schemas.xmlsoap.org/wsdl/", "definitions"); private static final String W3C_EPR_METADATA_NS = "http://www.w3.org/2007/05/addressing/metadata"; public static final String WSAM_WSDLI_ATTRIBUTE_NAMESPACE="http://www.w3.org/ns/wsdl-instance"; public static final String WSAM_WSDLI_ATTRIBUTE_LOCALNAME="wsdlLocation"; @Deprecated public static boolean validateEPR(Node node, Class epr, String endpointAddress, QName serviceName, QName portName, QName portTypeName, boolean hasWSDL) { //Default validation is as per Metadata NS; return validateEPR(node,epr,endpointAddress,serviceName,portName, portTypeName,hasWSDL,false,null); } public static boolean validateEPR(Node node, Class epr, String endpointAddress, QName serviceName, QName portName, QName portTypeName, String wsdlLocation) { return validateEPR(node,epr,endpointAddress,serviceName,portName, portTypeName,(wsdlLocation!=null)?true:false,false,wsdlLocation); } public static boolean validateEPR(Node node, Class epr, String endpointAddress, QName serviceName, QName portName, QName portTypeName, String wsdlLocation, boolean useWsdlBindingNS) { return validateEPR(node,epr,endpointAddress,serviceName,portName, portTypeName,(wsdlLocation!=null)?true:false,false,wsdlLocation); } private static boolean validateEPR(Node node, Class epr, String endpointAddress, QName serviceName, QName portName, QName portTypeName, boolean hasWSDL, boolean useWsdlBindingNS, String wsdlLocation) { if (node.getNodeType() == Node.DOCUMENT_NODE) node = node.getFirstChild(); if (epr.isAssignableFrom(W3CEndpointReference.class)) { String W3C_EPR_WSDL_NS; if(useWsdlBindingNS) W3C_EPR_WSDL_NS = W3C_EPR_WSDLBINDING_NS; else W3C_EPR_WSDL_NS = W3C_EPR_METADATA_NS; assertTrue(node.getNamespaceURI().equals(W3C_EPR_NS) && node.getLocalName().equals("EndpointReference")); Element elm = (Element) node; Element add = XmlUtil.getFirstElementChild(node); String value = XmlUtil.getTextForNode(add); assertTrue(value.equals(endpointAddress)); if(serviceName == null && portName == null && !hasWSDL) { // Need not check metadata return true; } NodeList nl = elm.getElementsByTagNameNS(W3C_EPR_NS, "Metadata"); assertTrue(nl.getLength() == 1); Element metdata = (Element) nl.item(0); String qname; String prefix; String name; String ns; //service if(serviceName != null) { nl = metdata.getElementsByTagNameNS(W3C_EPR_WSDL_NS, "ServiceName"); assertTrue(nl.getLength() == 1); Node service = nl.item(0); qname = XmlUtil.getTextForNode(service); prefix = XmlUtil.getPrefix(qname); name = XmlUtil.getLocalPart(qname); ns = service.lookupNamespaceURI(prefix); assertEquals(ns, serviceName.getNamespaceURI()); assertEquals(name, serviceName.getLocalPart()); //port if (portName != null) { String port = ((Element) service).getAttribute("EndpointName"); assertEquals(port, portName.getLocalPart()); } } if(portTypeName != null) { //validate portType nl = metdata.getElementsByTagNameNS(W3C_EPR_WSDL_NS, "InterfaceName"); assertTrue(nl.getLength() == 1); Node portType = nl.item(0); qname = XmlUtil.getTextForNode(portType); prefix = XmlUtil.getPrefix(qname); name = XmlUtil.getLocalPart(qname); ns = portType.lookupNamespaceURI(prefix); assertEquals(ns, portTypeName.getNamespaceURI()); assertEquals(name, portTypeName.getLocalPart()); } if (hasWSDL) { //validate WSDL if (useWsdlBindingNS) { nl = metdata.getElementsByTagNameNS(WSDL_DEFINITIONS_NAME.getNamespaceURI(), WSDL_DEFINITIONS_NAME.getLocalPart()); assertTrue(nl.getLength() > 0); Node wsdl = nl.item(0); //TODO:What else to do to validate this WSDL? } else { String wsdliLocation = metdata.getAttributeNS(WSAM_WSDLI_ATTRIBUTE_NAMESPACE, WSAM_WSDLI_ATTRIBUTE_LOCALNAME); assertNotNull(wsdliLocation); String tns = wsdliLocation.substring(0,wsdliLocation.indexOf(' ')); String wsdlAddress = wsdliLocation.substring(wsdliLocation.indexOf(' ')+1); if(serviceName != null) assertEquals(serviceName.getNamespaceURI(),tns); if(wsdlAddress != null) assertEquals(wsdlLocation,wsdlAddress); } } return true; } else if (epr.isAssignableFrom(MemberSubmissionEndpointReference.class)) { assertTrue(node.getNamespaceURI().equals(MS_EPR_NS) && node.getLocalName().equals("EndpointReference")); Element elm = (Element) node; Element add = XmlUtil.getFirstElementChild(node); String value = XmlUtil.getTextForNode(add); assertTrue(value.equals(endpointAddress)); NodeList nl; String qname; String prefix; String name; String ns; //service if (serviceName != null) { nl = elm.getElementsByTagNameNS(MS_EPR_NS, "ServiceName"); assertTrue(nl.getLength() == 1); Node service = nl.item(0); qname = XmlUtil.getTextForNode(service); prefix = XmlUtil.getPrefix(qname); name = XmlUtil.getLocalPart(qname); ns = service.lookupNamespaceURI(prefix); assertEquals(ns, serviceName.getNamespaceURI()); assertEquals(name, serviceName.getLocalPart()); //port if (portName != null) { String port = ((Element) service).getAttribute("PortName"); assertEquals(port, portName.getLocalPart()); } } if (hasWSDL) { //validate portType nl = elm.getElementsByTagNameNS(MS_EPR_NS, "PortType"); assertTrue(nl.getLength() == 1); Node portType = nl.item(0); qname = XmlUtil.getTextForNode(portType); prefix = XmlUtil.getPrefix(qname); name = XmlUtil.getLocalPart(qname); ns = portType.lookupNamespaceURI(prefix); assertEquals(ns, portTypeName.getNamespaceURI()); assertEquals(name, portTypeName.getLocalPart()); } if (hasWSDL) { //validate WSDL nl = elm.getElementsByTagNameNS(WSDL_DEFINITIONS_NAME.getNamespaceURI(), WSDL_DEFINITIONS_NAME.getLocalPart()); assertTrue(nl.getLength() > 0); Node wsdl = nl.item(0); //TODO:What else to do to validate this WSDL? } return true; } return false; } public static boolean validateEPR(EndpointReference epr, String endpointAddress, QName serviceName, QName portName, QName portTypeName, boolean hasWSDL) { assertTrue(epr != null); DOMResult dr = new DOMResult(); epr.writeTo(dr); Node node = dr.getNode(); return validateEPR(node, epr.getClass(), endpointAddress, serviceName, portName, portTypeName, hasWSDL); } }