Mercurial > hg > icedtea7-forest-aarch64 > jdk
changeset 8207:4c1747bcb284
8038966: JAX-WS handles wrongly xsd:any arguments for Web services
Reviewed-by: coffeys
author | aefimov |
---|---|
date | Wed, 08 Oct 2014 14:24:54 +0400 |
parents | b8bcafe8f811 |
children | 014a34d10e44 |
files | test/javax/xml/ws/xsanymixed/CopyingResponse.java test/javax/xml/ws/xsanymixed/ServiceImpl.java test/javax/xml/ws/xsanymixed/Test.java test/javax/xml/ws/xsanymixed/compile-wsdl.sh test/javax/xml/ws/xsanymixed/service.wsdl |
diffstat | 5 files changed, 409 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/xsanymixed/CopyingResponse.java Wed Oct 08 14:24:54 2014 +0400 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +import org.somewhere.ws.EchoRequest; +import org.somewhere.ws.EchoResponse; + +public class CopyingResponse extends EchoResponse { + + public CopyingResponse() {} + + public CopyingResponse(EchoRequest request) { + content = request.getContent(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/xsanymixed/ServiceImpl.java Wed Oct 08 14:24:54 2014 +0400 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import org.somewhere.ws.EchoRequest; +import org.somewhere.ws.EchoResponse; +import org.somewhere.ws.TestPort; + +import java.util.ArrayList; + +import javax.jws.WebService; +import javax.xml.namespace.QName; + + +/** + * Simple Webservice implementation just copying xml part as is + * from incoming request into outgoing response + */ +@WebService( + endpointInterface = "org.somewhere.ws.TestPort", + targetNamespace = "http://ws.somewhere.org/", + serviceName = "TestService", + portName = "TestPort") +public class ServiceImpl implements TestPort { + + public static final QName PORT_NAME = new QName("http://ws.somewhere.org/", "TestPort"); + public static final QName SERVICE_NAME = new QName("http://ws.somewhere.org/", "TestService"); + + @Override + public EchoResponse echo(EchoRequest request) { + System.err.println( "request.getContent="+(ArrayList)(request.getContent())); + return new CopyingResponse(request); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/xsanymixed/Test.java Wed Oct 08 14:24:54 2014 +0400 @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8036981 8038966 8051441 + * @summary the content of xs:any content:mixed should remain as is, + * no white space changes and no changes to namespace prefixes + * @run shell compile-wsdl.sh + * @run main/othervm Test + */ + +import com.sun.net.httpserver.HttpServer; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.net.InetSocketAddress; +import java.net.URL; +import java.nio.file.FileVisitResult; +import static java.nio.file.FileVisitResult.CONTINUE; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import javax.xml.ws.Dispatch; +import javax.xml.ws.Endpoint; +import javax.xml.ws.Service; + +public class Test { + + private static HttpServer httpServer; + private static Endpoint endpoint; + private static final String NL = System.getProperty("line.separator"); + + private static final String XS_ANY_MIXED_PART = + "<AppHdr xmlns=\"urn:head.001\">" + NL + + " <Fr>" + NL + NL + + "<FIId xmlns=\"urn:head.009\">" + NL + NL + + " any" + NL + + " white" + NL + + " space" + NL + NL + + " <FinInstnId>... and" + NL + NL + + " NO namespace prefixes!!!" + NL + NL + + " </FinInstnId>" + NL + NL + + " </FIId>" + NL + + "</Fr>" + NL + + "</AppHdr>"; + + private static final String XML_REQUEST = "<soap:Envelope " + + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + + "xmlns:ws=\"http://ws.somewhere.org/\">" + + "<soap:Header/><soap:Body>" + + "<ws:echoRequest>" + NL + + XS_ANY_MIXED_PART + NL + + "</ws:echoRequest>" + + "</soap:Body></soap:Envelope>"; + + private static String deployWebservice() throws IOException { + // Manually create HttpServer here using ephemeral address for port + // so as to not end up with attempt to bind to an in-use port + httpServer = HttpServer.create(new InetSocketAddress(0), 0); + httpServer.start(); + + endpoint = Endpoint.create(new ServiceImpl()); + endpoint.publish(httpServer.createContext("/wservice")); + + String wsdlAddress = "http://localhost:" + httpServer.getAddress().getPort() + "/wservice?wsdl"; + log("address = " + wsdlAddress); + return wsdlAddress; + } + + private static void stopWebservice() { + if (endpoint != null && endpoint.isPublished()) { + endpoint.stop(); + } + if (httpServer != null) { + httpServer.stop(0); + } + } + + public static void main(String[] args) throws IOException, TransformerException { + + try { + String address = deployWebservice(); + Service service = Service.create(new URL(address), ServiceImpl.SERVICE_NAME); + + log( "PORT="+ServiceImpl.PORT_NAME+" service="+service); + Dispatch<Source> d = service.createDispatch(ServiceImpl.PORT_NAME, Source.class, Service.Mode.MESSAGE); + Source response = d.invoke(new StreamSource(new StringReader(XML_REQUEST))); + + log( "reponse="+response ); + String resultXml = toString(response); + + log("= request ======== \n"); + log(XML_REQUEST); + log("= result ========= \n"); + log(resultXml); + log("\n=================="); + + boolean xsAnyMixedPartSame = resultXml.contains(XS_ANY_MIXED_PART); + log("resultXml.contains(XS_ANY_PART) = " + xsAnyMixedPartSame); + if (!xsAnyMixedPartSame) { + fail("The xs:any content=mixed part is supposed to be same in request and response."); + throw new RuntimeException(); + } + + log("TEST PASSED"); + } finally { + stopWebservice(); + + // if you need to debug or explore wsdl generation result + // comment this line out: + deleteGeneratedFiles(); + } + } + + private static String toString(Source response) throws TransformerException, IOException { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + StreamResult xmlOutput = new StreamResult(new StringWriter()); + transformer.transform(response, xmlOutput); + return xmlOutput.getWriter().toString(); + } + + private static void fail(String message) { + log("TEST FAILED."); + throw new RuntimeException(message); + } + + private static void log(String msg) { + System.out.println(msg); + } + + private static void deleteGeneratedFiles() { + Path p = Paths.get("..", "classes", "javax", "xml", "ws", "xsanymixed", "org"); + System.out.println("performing cleanup, deleting wsdl compilation result: " + p.toFile().getAbsolutePath()); + if (Files.exists(p)) { + try { + Files.walkFileTree(p, new SimpleFileVisitor<Path>() { + @Override + public FileVisitResult visitFile( + Path file, + BasicFileAttributes attrs) throws IOException { + + System.out.println("deleting file [" + file.toFile().getAbsoluteFile() + "]"); + Files.delete(file); + return CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory( + Path dir, + IOException exc) throws IOException { + + System.out.println("deleting dir [" + dir.toFile().getAbsoluteFile() + "]"); + if (exc == null) { + Files.delete(dir); + return CONTINUE; + } else { + throw exc; + } + } + }); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Wed Oct 08 14:24:54 2014 +0400 @@ -0,0 +1,36 @@ +#! /bin/sh + +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# + +if [ "x$TESTJAVA" = x ]; then + TESTJAVA=$1; shift + TESTCLASSES=. +fi + +echo "compiling [test-service.wsdl] wsdl ..." +$TESTJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl + +echo "WSDL compiled. Main test class Test.java can be compiled now."
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/ws/xsanymixed/service.wsdl Wed Oct 08 14:24:54 2014 +0400 @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + + This code is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License version 2 only, as + published by the Free Software Foundation. + + This code is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + version 2 for more details (a copy is included in the LICENSE file that + accompanied this code). + + You should have received a copy of the GNU General Public License version + 2 along with this work; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + + Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + or visit www.oracle.com if you need additional information or have any + questions. +--> +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://ws.somewhere.org/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" + name="TestService" + targetNamespace="http://ws.somewhere.org/"> + + <types> + <xsd:schema targetNamespace="http://ws.somewhere.org/" version="1.0" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.somewhere.org/"> + + <xsd:element type="tns:echoRequest" name="echoRequest"/> + <xsd:element type="tns:echoResponse" name="echoResponse"/> + + <xsd:complexType name="echoRequest" mixed="true"> + <xsd:sequence> + <xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="echoResponse" mixed="true"> + <xsd:sequence> + <xsd:any namespace="##any" processContents="skip" minOccurs="1" maxOccurs="10"/> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </types> + + <message name="echoRequest"> + <part element="tns:echoRequest" name="parameters"/> + </message> + <message name="echoResponse"> + <part element="tns:echoResponse" name="parameters"/> + </message> + + <portType name="TestPort"> + <operation name="echo"> + <input message="tns:echoRequest" wsam:Action="http://ws.somewhere.org/tester/echoRequest"/> + <output message="tns:echoResponse" wsam:Action="http://ws.somewhere.org/tester/echoResponse"/> + </operation> + </portType> + + <binding name="TestServicePortBinding" type="tns:TestPort"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http"/> + + <operation name="echo"> + <soap:operation soapAction=""/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="TestService"> + <port binding="tns:TestServicePortBinding" name="TestPort"> + <soap:address location="http://localhost/ws/tester"/> + </port> + </service> +</definitions>