/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.tools.java2ws; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.cxf.common.util.Compiler; import org.apache.cxf.helpers.FileUtils; import org.apache.cxf.helpers.XPathUtils; import org.apache.cxf.staxutils.StaxUtils; import org.apache.cxf.tools.common.ToolContext; import org.apache.cxf.tools.common.ToolTestBase; import org.junit.After; import org.junit.Before; import org.junit.Test; public class JavaToWSTest extends ToolTestBase { protected String cp; protected ToolContext env; protected File output; protected File classDir; @Before public void setUpResource() throws Exception { super.setUp(); env = new ToolContext(); cp = System.getProperty("java.class.path"); URL url = getClass().getResource("."); output = new File(url.toURI()); System.setProperty("java.class.path", getClassPath()); output = new File(output, "/generated/"); FileUtils.mkDir(output); classDir = new File(output, "/classes/"); FileUtils.mkDir(classDir); } @After public void tearDown() { super.tearDown(); System.setProperty("java.class.path", cp); FileUtils.removeDir(output); output = null; } private File outputFile(String name) { return new File(output.getPath() + File.separator + name); } @Test public void testVersionOutput() throws Exception { String[] args = new String[] {"-v"}; JavaToWS.main(args); assertNotNull(getStdOut()); } @Test public void testFlagWSDL() throws Exception { File wsdlFile = outputFile("tmp.wsdl"); String[] args = new String[] {"-wsdl", "-o", wsdlFile.getAbsolutePath(), "-s", output.getPath(), "-client", "-server", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); checkStdErr(); assertTrue("Failed to generate WSDL file", wsdlFile.exists()); } @Test public void testCXF2941() throws Exception { String[] args = new String[] { "-wsdl", "-wrapperbean", "-s", output.getPath(), "-o", output.getPath() + "/cxf2941.wsdl", org.apache.cxf.tools.fortest.cxf2941.WebResultService.class.getName() }; JavaToWS.main(args); File wrapper = outputFile("org/apache/cxf/tools/fortest/cxf2941/jaxws/HelloStringResponse.java"); String str = FileUtils.getStringFromFile(wrapper); assertTrue("namespace value in annoataion @XmlElement is not correct", str.indexOf("hello/name") > -1); assertTrue("name value in annoataion @XmlElement is not correct", str.indexOf("\"name\"") > -1); } @Test public void testCXF2934() throws Exception { String[] args = new String[] { "-wsdl", "-wrapperbean", "-s", output.getPath(), "-o", output.getPath() + "/tmp.wsdl", "org.apache.cxf.tools.fortest.cxf2934.WebParamService" }; JavaToWS.main(args); File wrapper = outputFile("org/apache/cxf/tools/fortest/cxf2934/jaxws/HelloStringResponse.java"); String str = FileUtils.getStringFromFile(wrapper); assertTrue("namespace value in annoataion @XmlElement is not correct: " + str, str.indexOf("helloString/Name") > -1); } @Test public void testCXF1450() throws Exception { String[] args = new String[] { "-wsdl", "-wrapperbean", "-s", output.getPath(), "-o", output.getPath() + "/tmp.wsdl", "org.apache.cxf.tools.fortest.cxf1450.WebParamService" }; JavaToWS.main(args); File wrapper = outputFile("org/apache/cxf/tools/fortest/cxf1450/jaxws/HelloStringResponse.java"); String str = FileUtils.getStringFromFile(wrapper); assertTrue("namespace value in annoataion @XmlElement is not correct: " + str, str.indexOf("helloString/Name") > -1); } private void checkStdErr() { String err = getStdErr(); if (err != null) { assertEquals("errors: ", "", err); } } @Test public void testJaxwsFrontend() throws Exception { File wsdlFile = outputFile("tmp.wsdl"); String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-s", output.getPath(), "-frontend", "jaxws", "-client", "-server", "-address", "http://localhost:1234/test", "org.apache.hello_world_doc_lit.Greeter"}; JavaToWS.main(args); //checkStdErr(); assertTrue("Failed to generate WSDL file", wsdlFile.exists()); String str = FileUtils.getStringFromFile(wsdlFile); assertTrue("Port address in generated wsdl is not correct", str.indexOf("http://localhost:1234/test") > -1); File client = outputFile("org/apache/hello_world_doc_lit/GreeterClient.java"); str = FileUtils.getStringFromFile(client); assertTrue("Address generated in client side code is not correct", str.indexOf("http://localhost:1234/test") > -1); File server = outputFile("org/apache/hello_world_doc_lit/GreeterServer.java"); str = FileUtils.getStringFromFile(server); assertTrue("Address generated in server side code is not correct", str.indexOf("http://localhost:1234/test") > -1); File impl = outputFile("org/apache/hello_world_doc_lit/GreeterImpl.java"); Compiler compiler = new Compiler(); String[] files = new String[]{client.getAbsoluteFile().toString(), server.getAbsoluteFile().toString(), impl.getAbsoluteFile().toString()}; compiler.setOutputDir(this.classDir); compiler.compileFiles(files); } @Test public void testSimpleFrontend() throws Exception { String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-s", output.getPath(), "-frontend", "simple", "-client", "-server", "-address", "http://localhost:1234/test", "org.apache.cxf.tools.fortest.simple.Hello"}; JavaToWS.main(args); File client = outputFile("org/apache/cxf/tools/fortest/simple/HelloPortTypeClient.java"); File server = outputFile("org/apache/cxf/tools/fortest/simple/HelloPortTypeServer.java"); File impl = outputFile("org/apache/cxf/tools/fortest/simple/HelloPortTypeImpl.java"); File wsdl = outputFile("tmp.wsdl"); assertTrue("Failed to generate client file for simple front end ", client.exists()); assertTrue("Failed to generate server file for simple front end ", server.exists()); assertTrue("Failed to generate impl file for simple front end ", impl.exists()); assertTrue("Failed to generate wsdl file for simple front end ", wsdl.exists()); String str = FileUtils.getStringFromFile(client); assertTrue("Address generated in client side code is not correct", str.indexOf("http://localhost:1234/test") > -1); str = FileUtils.getStringFromFile(server); assertTrue("Address generated in server side code is not correct", str.indexOf("http://localhost:1234/test") > -1); str = FileUtils.getStringFromFile(wsdl); assertTrue("Address generated in wsdl is not correct", str.indexOf("http://localhost:1234/test") > -1); Compiler compiler = new Compiler(); String[] files = new String[]{client.getAbsoluteFile().toString(), server.getAbsoluteFile().toString(), impl.getAbsoluteFile().toString()}; compiler.setOutputDir(this.classDir); compiler.compileFiles(files); } @Test public void testMissingBeans() { String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-verbose", "-s", output.getPath(), "-frontend", "jaxws", "-client", "-server", "-beans", "nobodyHome.xml", "-beans", "nothing.xml", "org.apache.hello_world_doc_lit.Greeter"}; JavaToWS.main(args); String err = getStdErr(); assertTrue("Missing file error message", err.indexOf("Unable to open bean definition file nobodyHome.xml") >= 0); } @Test public void testClassNoWebServiceAnno() throws Exception { File wsdlFile = outputFile("tmp.wsdl"); String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-verbose", "-s", output.getPath(), "-frontend", "jaxws", "-client", "-server", "org.apache.cxf.tools.fortest.HelloWithNoAnno"}; JavaToWS.main(args); assertTrue("Failed to generate WSDL file", wsdlFile.exists()); assertTrue("Class does not carry WebService error should be detected", getStdErr() .indexOf("does not carry a WebService annotation") > -1); } @Test public void testClassWithRMI() throws Exception { File wsdlFile = outputFile("tmp.wsdl"); String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-verbose", "-s", output.getPath(), "-frontend", "jaxws", "-client", "-server", "org.apache.cxf.tools.fortest.HelloRMI"}; JavaToWS.main(args); assertTrue("Failed to generate WSDL file", wsdlFile.exists()); assertTrue("Parameter or return type implemented java.rmi.Remote interface error should be detected", getStdErr().indexOf("implemented the java.rmi.Remote interface") > -1); } @Test public void testGenServerAndClient() throws Exception { File client = outputFile("org/apache/hello_world_soap12_http/GreeterClient.java"); File server = outputFile("org/apache/hello_world_soap12_http/GreeterServer.java"); File impl = outputFile("org/apache/hello_world_soap12_http/GreeterImpl.java"); String[] args = new String[] {"-s", output.getPath(), "-client", "-server", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); checkStdErr(); assertTrue("Client was not generated", client.exists()); assertTrue("Greeter_GreeterPort_Server.java was not generated", server.exists()); assertTrue("Impl was not generated", impl.exists()); String implContent = FileUtils.getStringFromFile(impl); int idx = implContent.indexOf("serviceName"); assertFalse("serviceName annotation was not generated", idx == -1); implContent = implContent.substring(idx + 11).trim(); implContent = implContent.substring(1).trim(); assertTrue("serviceName annotation was not generated\n" + implContent, implContent.startsWith("\"GreeterService\"")); } @Test public void testGenServerAndImpl() throws Exception { File server = outputFile("org/apache/hello_world_soap12_http/GreeterServer.java"); File impl = outputFile("org/apache/hello_world_soap12_http/GreeterImpl.java"); String[] args = new String[] {"-s", output.getPath(), "-server", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); checkStdErr(); assertTrue("GreeterServer.java was not generated", server.exists()); assertTrue("GreeterImpl.java was not generated", impl.exists()); } @Test public void testGenWrapperBean() throws Exception { String[] args = new String[] {"-s", output.getPath(), "-wrapperbean", "-server", "org.apache.cxf.tools.java2ws.fortest.Calculator"}; JavaToWS.main(args); //checkStdErr(); will see java9 warning message here } @Test public void testInvalidFlag() throws Exception { String[] args = new String[] {"-frontend", "tmp", "-wsdl", "-o", output.getPath() + "/tmp.wsdl", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); assertTrue("invalid frontend flag should be detected", getStdErr() .indexOf("is not a valid frontend,") > -1); } @Test public void testInvalidFlag2() throws Exception { String[] args = new String[] {"-frontend", "simple", "-wrapperbean", "-wsdl", "-o", output.getPath() + "/tmp.wsdl", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); assertTrue("wrapperbean flag error should be detected", getStdErr() .indexOf("-wrapperbean is only valid for the jaxws front end.") > -1); } @Test public void testInvalidFlag3() throws Exception { String[] args = new String[] {"-databinding", "jaxb", "-frontend", "simple", "-wsdl", "-o", output.getPath() + "/tmp.wsdl", "org.apache.hello_world_soap12_http.Greeter"}; JavaToWS.main(args); assertTrue("jaxb databinding warning should be detected", getStdErr() .indexOf("Simple front end only supports aegis databinding") > -1); } @Test public void testImplClassWithoutSei() throws Exception { File wsdlFile = outputFile("tmp.wsdl"); String[] args = new String[] {"-wsdl", "-o", output.getPath() + "/tmp.wsdl", "-verbose", "-s", output.getPath(), "-frontend", "jaxws", "-client", "-server", org.apache.cxf.tools.fortest.GreeterImpl.class.getName()}; JavaToWS.main(args); assertTrue("Failed to generate WSDL file", wsdlFile.exists()); File sei = outputFile("org/apache/cxf/tools/fortest/GreeterImpl_PortType.java"); assertTrue("Failed to generate SEI file : GreeterImpl_PortType.java", sei.exists()); File client = outputFile("org/apache/cxf/tools/fortest/GreeterImpl_PortTypeClient.java"); assertTrue("Failed to generate client file : GreeterImpl_PortTypeClient.java", client.exists()); File server = outputFile("org/apache/cxf/tools/fortest/GreeterImpl_PortTypeServer.java"); assertTrue("Failed to generate SEI file : GreeterImpl_PortTypeServer.java", server.exists()); } @Test public void testXmlList() throws Exception { String[] args = new String[] {"-o", output.getPath() + "/xml-list.wsdl", "-verbose", "-wsdl", "org.apache.cxf.tools.fortest.xmllist.AddNumbersPortType"}; JavaToWS.main(args); File file = new File(output.getPath() + "/xml-list.wsdl"); Document doc = StaxUtils.read(file); Map<String, String> map = new HashMap<>(); map.put("xsd", "http://www.w3.org/2001/XMLSchema"); map.put("wsdl", "http://schemas.xmlsoap.org/wsdl/"); map.put("soap", "http://schemas.xmlsoap.org/wsdl/soap/"); XPathUtils util = new XPathUtils(map); Element node = (Element)util.getValueNode("//xsd:list", doc); assertNotNull(node); assertTrue(node.getAttribute("itemType").contains("string")); } @Test public void testXmlAttachementRef() throws Exception { String[] args = new String[] {"-o", output.getPath() + "/swa-ref.wsdl", "-verbose", "-wsdl", "org.apache.attachment.AddNumbersImpl"}; JavaToWS.main(args); File file = new File(output.getPath() + "/AddNumbers.wsdl"); String str = FileUtils.getStringFromFile(file); String swaImport = "http://ws-i.org/profiles/basic/1.1/xsd"; String schemaLoc = "http://ws-i.org/profiles/basic/1.1/swaref.xsd"; assertTrue("Java2wsdl did not generate swaRef type element", str.indexOf(":swaRef") > -1 && str.indexOf(swaImport) > -1 && str.indexOf(schemaLoc) > -1); } @Test public void testXmlJavaTypeAdapter() throws Exception { String[] args = new String[] {"-o", output.getPath() + "/xmladapter.wsdl", "-verbose", "-wsdl", "org.apache.xmladapter.GreeterImpl"}; JavaToWS.main(args); File file = new File(output.getPath() + "/xmladapter.wsdl"); Document doc = StaxUtils.read(file); Map<String, String> map = new HashMap<>(); map.put("xsd", "http://www.w3.org/2001/XMLSchema"); map.put("wsdl", "http://schemas.xmlsoap.org/wsdl/"); map.put("soap", "http://schemas.xmlsoap.org/wsdl/soap/"); XPathUtils util = new XPathUtils(map); Element node = (Element)util.getValueNode("//xsd:element[@name='arg0']", doc); assertNotNull(node); assertEquals("0", node.getAttribute("minOccurs")); assertTrue(node.getAttribute("type").contains("string")); } protected String getClassPath() throws URISyntaxException { ClassLoader loader = getClass().getClassLoader(); StringBuilder classPath = new StringBuilder(); if (loader instanceof URLClassLoader) { for (URL url : ((URLClassLoader)loader).getURLs()) { File file; file = new File(url.toURI()); String filename = file.getAbsolutePath(); if (filename.indexOf("junit") == -1) { classPath.append(filename); classPath.append(System.getProperty("path.separator")); } } } return classPath.toString(); } }