/**
* 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.jaxws.support;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.jws.WebService;
import javax.wsdl.Definition;
import javax.wsdl.factory.WSDLFactory;
import javax.xml.namespace.QName;
import javax.xml.ws.Binding;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.soap.MTOMFeature;
import javax.xml.ws.soap.SOAPBinding;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.apache.cxf.Bus;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.AbstractJaxWsTest;
import org.apache.cxf.mtom_xop.TestMtomImpl;
import org.apache.cxf.no_body_parts.NoBodyPartsImpl;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.invoker.BeanInvoker;
import org.apache.cxf.service.model.FaultInfo;
import org.apache.cxf.service.model.InterfaceInfo;
import org.apache.cxf.service.model.MessageInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.OperationInfo;
import org.apache.cxf.service.model.SchemaInfo;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean;
import org.apache.cxf.wsdl11.ServiceWSDLBuilder;
import org.apache.hello_world_soap_http.GreeterImpl;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.junit.Test;
public class JaxWsServiceFactoryBeanTest extends AbstractJaxWsTest {
@Test
public void testDocLiteralPartWithType() throws Exception {
ReflectionServiceFactoryBean serviceFactory = new JaxWsServiceFactoryBean();
serviceFactory.setBus(getBus());
serviceFactory.setServiceClass(NoBodyPartsImpl.class);
Service service = serviceFactory.create();
ServiceInfo serviceInfo =
service.getServiceInfos().get(0);
QName qname = new QName("urn:org:apache:cxf:no_body_parts/wsdl",
"operation1");
MessageInfo mi = serviceInfo.getMessage(qname);
qname = new QName("urn:org:apache:cxf:no_body_parts/wsdl",
"mimeAttachment");
MessagePartInfo mpi = mi.getMessagePart(qname);
QName elementQName = mpi.getElementQName();
XmlSchemaElement element =
serviceInfo.getXmlSchemaCollection().getElementByQName(elementQName);
assertNotNull(element);
}
@Test
public void testEndpoint() throws Exception {
ReflectionServiceFactoryBean bean = new JaxWsServiceFactoryBean();
URL resource = getClass().getResource("/wsdl/hello_world.wsdl");
assertNotNull(resource);
bean.setWsdlURL(resource.toString());
Bus bus = getBus();
bean.setBus(bus);
bean.setServiceClass(GreeterImpl.class);
BeanInvoker invoker = new BeanInvoker(new GreeterImpl());
bean.setInvoker(invoker);
Service service = bean.create();
String ns = "http://apache.org/hello_world_soap_http";
assertEquals("SOAPService", service.getName().getLocalPart());
assertEquals(ns, service.getName().getNamespaceURI());
InterfaceInfo intf = service.getServiceInfos().get(0).getInterface();
OperationInfo op = intf.getOperation(new QName(ns, "sayHi"));
Class<?> wrapper = op.getInput().getMessageParts().get(0).getTypeClass();
assertNotNull(wrapper);
wrapper = op.getOutput().getMessageParts().get(0).getTypeClass();
assertNotNull(wrapper);
assertEquals(invoker, service.getInvoker());
op = intf.getOperation(new QName(ns, "testDocLitFault"));
Collection<FaultInfo> faults = op.getFaults();
assertEquals(2, faults.size());
FaultInfo f = op.getFault(new QName(ns, "BadRecordLitFault"));
assertNotNull(f);
Class<?> c = f.getProperty(Class.class.getName(), Class.class);
assertNotNull(c);
assertEquals(1, f.getMessageParts().size());
MessagePartInfo mpi = f.getMessagePartByIndex(0);
assertNotNull(mpi.getTypeClass());
}
@Test
public void testHolder() throws Exception {
ReflectionServiceFactoryBean bean = new JaxWsServiceFactoryBean();
Bus bus = getBus();
bean.setBus(bus);
bean.setServiceClass(TestMtomImpl.class);
Service service = bean.create();
InterfaceInfo intf = service.getServiceInfos().get(0).getInterface();
OperationInfo op = intf.getOperation(
new QName("http://cxf.apache.org/mime", "testXop"));
assertNotNull(op);
Iterator<MessagePartInfo> itr = op.getInput().getMessageParts().iterator();
assertTrue(itr.hasNext());
MessagePartInfo part = itr.next();
assertEquals("testXop", part.getElementQName().getLocalPart());
op = op.getUnwrappedOperation();
assertNotNull(op);
// test setup of input parts
itr = op.getInput().getMessageParts().iterator();
assertTrue(itr.hasNext());
part = itr.next();
assertEquals("name", part.getName().getLocalPart());
assertEquals(String.class, part.getTypeClass());
/*
* revisit, try to use other wsdl operation rewrite test in future
assertTrue(itr.hasNext());
part = itr.next();
assertEquals(Boolean.TRUE, part.getProperty(JaxWsServiceFactoryBean.MODE_INOUT));
assertEquals(byte[].class, part.getTypeClass());
assertFalse(itr.hasNext());
// test output setup
itr = op.getOutput().getMessageParts().iterator();
assertTrue(itr.hasNext());
part = itr.next();
assertEquals(Boolean.TRUE, part.getProperty(JaxWsServiceFactoryBean.MODE_INOUT));
*/
}
@Test
public void testWrappedDocLit() throws Exception {
ReflectionServiceFactoryBean bean = new JaxWsServiceFactoryBean();
Bus bus = getBus();
bean.setBus(bus);
bean.setServiceClass(org.apache.hello_world_doc_lit.Greeter.class);
Service service = bean.create();
ServiceInfo si = service.getServiceInfos().get(0);
InterfaceInfo intf = si.getInterface();
assertEquals(4, intf.getOperations().size());
String ns = si.getName().getNamespaceURI();
assertEquals("http://apache.org/hello_world_doc_lit", ns);
OperationInfo greetMeOp = intf.getOperation(new QName(ns, "greetMe"));
assertNotNull(greetMeOp);
assertEquals("greetMe", greetMeOp.getInput().getName().getLocalPart());
assertEquals("http://apache.org/hello_world_doc_lit", greetMeOp.getInput().getName()
.getNamespaceURI());
List<MessagePartInfo> messageParts = greetMeOp.getInput().getMessageParts();
assertEquals(1, messageParts.size());
MessagePartInfo inMessagePart = messageParts.get(0);
assertEquals("http://apache.org/hello_world_doc_lit", inMessagePart.getName().getNamespaceURI());
assertEquals("http://apache.org/hello_world_doc_lit/types", inMessagePart.getElementQName()
.getNamespaceURI());
// test output
messageParts = greetMeOp.getOutput().getMessageParts();
assertEquals(1, messageParts.size());
assertEquals("greetMeResponse", greetMeOp.getOutput().getName().getLocalPart());
MessagePartInfo outMessagePart = messageParts.get(0);
//assertEquals("result", outMessagePart.getName().getLocalPart());
assertEquals("http://apache.org/hello_world_doc_lit", outMessagePart.getName().getNamespaceURI());
assertEquals("http://apache.org/hello_world_doc_lit/types", outMessagePart.getElementQName()
.getNamespaceURI());
OperationInfo greetMeOneWayOp = si.getInterface().getOperation(new QName(ns, "greetMeOneWay"));
assertEquals(1, greetMeOneWayOp.getInput().getMessageParts().size());
assertNull(greetMeOneWayOp.getOutput());
Collection<SchemaInfo> schemas = si.getSchemas();
assertEquals(1, schemas.size());
}
@Test
public void testBareBug() throws Exception {
ReflectionServiceFactoryBean bean = new JaxWsServiceFactoryBean();
Bus bus = getBus();
bean.setBus(bus);
bean.setServiceClass(org.apache.cxf.test.TestInterfacePort.class);
Service service = bean.create();
ServiceInfo si = service.getServiceInfos().get(0);
ServiceWSDLBuilder builder = new ServiceWSDLBuilder(bus, si);
Definition def = builder.build();
Document wsdl = WSDLFactory.newInstance().newWSDLWriter().getDocument(def);
NodeList nodeList = assertValid("/wsdl:definitions/wsdl:types/xsd:schema"
+ "[@targetNamespace='http://cxf.apache.org/"
+ "org.apache.cxf.test.TestInterface/xsd']"
+ "/xsd:element[@name='getMessage']", wsdl);
assertEquals(1, nodeList.getLength());
assertValid("/wsdl:definitions/wsdl:message[@name='setMessage']"
+ "/wsdl:part[@name = 'parameters'][@element='ns1:setMessage']" , wsdl);
assertValid("/wsdl:definitions/wsdl:message[@name='echoCharResponse']"
+ "/wsdl:part[@name = 'y'][@element='ns1:charEl_y']" , wsdl);
assertValid("/wsdl:definitions/wsdl:message[@name='echoCharResponse']"
+ "/wsdl:part[@name = 'return'][@element='ns1:charEl_return']" , wsdl);
assertValid("/wsdl:definitions/wsdl:message[@name='echoCharResponse']"
+ "/wsdl:part[@name = 'z'][@element='ns1:charEl_z']" , wsdl);
assertValid("/wsdl:definitions/wsdl:message[@name='echoChar']"
+ "/wsdl:part[@name = 'x'][@element='ns1:charEl_x']" , wsdl);
assertValid("/wsdl:definitions/wsdl:message[@name='echoChar']"
+ "/wsdl:part[@name = 'y'][@element='ns1:charEl_y']" , wsdl);
}
@Test
public void testMtomFeature() throws Exception {
JaxWsServiceFactoryBean bean = new JaxWsServiceFactoryBean();
bean.setBus(getBus());
bean.setServiceClass(GreeterImpl.class);
bean.setWsdlURL(getClass().getResource("/wsdl/hello_world.wsdl"));
bean.setWsFeatures(Arrays.asList(new WebServiceFeature[]{new MTOMFeature()}));
Service service = bean.create();
Endpoint endpoint = service.getEndpoints().values().iterator().next();
assertTrue(endpoint instanceof JaxWsEndpointImpl);
Binding binding = ((JaxWsEndpointImpl)endpoint).getJaxwsBinding();
assertTrue(binding instanceof SOAPBinding);
assertTrue(((SOAPBinding)binding).isMTOMEnabled());
}
@Test
public void testWebSeviceException() throws Exception {
ReflectionServiceFactoryBean bean = new JaxWsServiceFactoryBean();
Bus bus = getBus();
bean.setBus(bus);
bean.setServiceClass(WebServiceExceptionTestImpl.class);
Service service = bean.create();
ServiceInfo si = service.getServiceInfos().get(0);
ServiceWSDLBuilder builder = new ServiceWSDLBuilder(bus, si);
Definition def = builder.build();
Document wsdl = WSDLFactory.newInstance().newWSDLWriter().getDocument(def);
assertInvalid("/wsdl:definitions/wsdl:message[@name='WebServiceException']", wsdl);
}
@WebService
public static class WebServiceExceptionTestImpl {
public int echoInt(int i) throws WebServiceException {
return i;
}
}
}