/**
* 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.spring;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.anonymous_complex_type.AnonymousComplexType;
import org.apache.cxf.anonymous_complex_type.SplitNameResponse.Names;
import org.apache.cxf.binding.BindingConfiguration;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapBindingConfiguration;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.buslifecycle.BusLifeCycleListener;
import org.apache.cxf.buslifecycle.BusLifeCycleManager;
import org.apache.cxf.configuration.spring.AbstractFactoryBeanDefinitionParser;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.databinding.source.SourceDataBinding;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.ClientImpl;
import org.apache.cxf.endpoint.NullConduitSelector;
import org.apache.cxf.ext.logging.LoggingInInterceptor;
import org.apache.cxf.ext.logging.LoggingOutInterceptor;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.jaxws.service.Hello;
import org.apache.cxf.jaxws.spring.NamespaceHandler.SpringServerFactoryBean;
import org.apache.cxf.message.Message;
import org.apache.hello_world_soap_http.Greeter;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringBeansTest extends Assert {
@After
public void tearDown() throws Exception {
if (BusFactory.getDefaultBus(false) != null) {
BusFactory.getDefaultBus(false).shutdown(true);
}
}
private EndpointImpl getEndpointImplBean(String s, ClassPathXmlApplicationContext ctx) {
Object bean = ctx.getBean(s);
assertNotNull(bean);
return (EndpointImpl) bean;
}
@Test
public void testEndpoints() throws Exception {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/endpoints.xml"});
EndpointImpl ep = getEndpointImplBean("simple", ctx);
assertNotNull(ep.getImplementor());
assertNotNull(ep.getServer());
ep = getEndpointImplBean("simpleWithAddress", ctx);
if (!(ep.getImplementor() instanceof org.apache.hello_world_soap_http.GreeterImpl)) {
fail("can't get the right implementor object");
}
assertEquals("http://localhost:8080/simpleWithAddress",
ep.getServer().getEndpoint().getEndpointInfo().getAddress());
ep = getEndpointImplBean("inlineImplementor", ctx);
if (!(ep.getImplementor() instanceof org.apache.hello_world_soap_http.GreeterImpl)) {
fail("can't get the right implementor object");
}
org.apache.hello_world_soap_http.GreeterImpl impl =
(org.apache.hello_world_soap_http.GreeterImpl)ep.getImplementor();
assertEquals("The property was not injected rightly", impl.getPrefix(), "hello");
assertNotNull(ep.getServer());
ep = getEndpointImplBean("inlineInvoker", ctx);
assertTrue(ep.getInvoker() instanceof NullInvoker);
assertTrue(ep.getService().getInvoker() instanceof NullInvoker);
ep = getEndpointImplBean("simpleWithBindingUri", ctx);
assertEquals("get the wrong bindingId",
ep.getBindingUri(),
"http://cxf.apache.org/bindings/xformat");
assertEquals("get a wrong transportId",
"http://cxf.apache.org/transports/local", ep.getTransportId());
ep = getEndpointImplBean("simpleWithBinding", ctx);
BindingConfiguration bc = ep.getBindingConfig();
assertTrue(bc instanceof SoapBindingConfiguration);
SoapBindingConfiguration sbc = (SoapBindingConfiguration) bc;
assertTrue(sbc.getVersion() instanceof Soap12);
assertTrue("the soap configure should set isMtomEnabled to be true",
sbc.isMtomEnabled());
ep = getEndpointImplBean("implementorClass", ctx);
assertEquals(Hello.class, ep.getImplementorClass());
assertTrue(ep.getImplementor().getClass() == Object.class);
ep = getEndpointImplBean("epWithProps", ctx);
assertEquals("bar", ep.getProperties().get("foo"));
ep = getEndpointImplBean("classImpl", ctx);
assertTrue(ep.getImplementor() instanceof Hello);
QName name = ep.getServer().getEndpoint().getService().getName();
assertEquals("http://service.jaxws.cxf.apache.org/service", name.getNamespaceURI());
assertEquals("HelloServiceCustomized", name.getLocalPart());
name = ep.getServer().getEndpoint().getEndpointInfo().getName();
assertEquals("http://service.jaxws.cxf.apache.org/endpoint", name.getNamespaceURI());
assertEquals("HelloEndpointCustomized", name.getLocalPart());
Object bean = ctx.getBean("wsdlLocation");
assertNotNull(bean);
ep = getEndpointImplBean("publishedEndpointUrl", ctx);
String expectedEndpointUrl = "http://cxf.apache.org/Greeter";
assertEquals(expectedEndpointUrl, ep.getPublishedEndpointUrl());
ep = getEndpointImplBean("epWithDataBinding", ctx);
DataBinding dataBinding = ep.getDataBinding();
assertTrue(dataBinding instanceof JAXBDataBinding);
assertEquals("The namespace map should have an entry",
((JAXBDataBinding)dataBinding).getNamespaceMap().size(), 1);
// test for existence of Endpoint without an id element
boolean found = false;
String[] names = ctx.getBeanNamesForType(EndpointImpl.class);
for (String n : names) {
if (n.startsWith(EndpointImpl.class.getPackage().getName())) {
found = true;
}
}
assertTrue("Could not find server factory with autogenerated id", found);
ep = getEndpointImplBean("unpublishedEndpoint", ctx);
assertFalse("Unpublished endpoint is published", ep.isPublished());
testInterceptors(ctx);
}
private void testNamespaceMapping(ApplicationContext ctx) throws Exception {
AnonymousComplexType act = (AnonymousComplexType) ctx.getBean("bookClient");
Client client = ClientProxy.getClient(act);
assertNotNull(act);
StringWriter logWriter = new StringWriter();
PrintWriter writer = new PrintWriter(logWriter);
LoggingInInterceptor spy = new LoggingInInterceptor(writer);
client.getInInterceptors().add(spy);
Names n = act.splitName("Hello There");
assertEquals("Hello", n.getFirst());
assertTrue(logWriter.toString().contains("BeepBeep:"));
}
private void testInterceptors(ClassPathXmlApplicationContext ctx) {
EndpointImpl ep;
ep = (EndpointImpl) ctx.getBean("epWithInterceptors");
assertNotNull(ep);
List<Interceptor<? extends Message>> inInterceptors = ep.getInInterceptors();
boolean saaj = false;
boolean logging = false;
for (Interceptor<? extends Message> i : inInterceptors) {
if (i instanceof SAAJInInterceptor) {
saaj = true;
} else if (i instanceof LoggingInInterceptor) {
logging = true;
}
}
assertTrue(saaj);
assertTrue(logging);
saaj = false;
logging = false;
for (Interceptor<?> i : ep.getOutInterceptors()) {
if (i instanceof SAAJOutInterceptor) {
saaj = true;
} else if (i instanceof LoggingOutInterceptor) {
logging = true;
}
}
assertTrue(saaj);
}
@Test
public void testChildContext() throws Exception {
//Test for CXF-2283 - if a Child context is closed,
//we shouldn't be shutting down
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/servers.xml"});
final Bus b = (Bus)ctx.getBean("cxf");
BusLifeCycleManager lifeCycleManager = b.getExtension(BusLifeCycleManager.class);
BusLifeCycleListener listener = new BusLifeCycleListener() {
public void initComplete() {
}
public void postShutdown() {
b.setProperty("post.was.called", Boolean.TRUE);
}
public void preShutdown() {
b.setProperty("pre.was.called", Boolean.TRUE);
}
};
lifeCycleManager.registerLifeCycleListener(listener);
ClassPathXmlApplicationContext ctx2 =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/child.xml"},
ctx);
ctx2.close();
assertNull(b.getProperty("post.was.called"));
assertNull(b.getProperty("pre.was.called"));
}
@Test
public void testServers() throws Exception {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/servers.xml"});
JaxWsServerFactoryBean bean;
BindingConfiguration bc;
SoapBindingConfiguration sbc;
bean = (JaxWsServerFactoryBean) ctx.getBean("inlineSoapBindingRPC");
assertNotNull(bean);
bc = bean.getBindingConfig();
assertTrue(bc instanceof SoapBindingConfiguration);
sbc = (SoapBindingConfiguration) bc;
assertEquals("rpc", sbc.getStyle());
bean = (JaxWsServerFactoryBean) ctx.getBean("simple");
assertNotNull(bean);
bean = (JaxWsServerFactoryBean) ctx.getBean("inlineWsdlLocation");
assertNotNull(bean);
assertEquals(bean.getWsdlLocation(), "wsdl/hello_world_doc_lit.wsdl");
bean = (JaxWsServerFactoryBean) ctx.getBean("inlineSoapBinding");
assertNotNull(bean);
bc = bean.getBindingConfig();
assertTrue(bc instanceof SoapBindingConfiguration);
sbc = (SoapBindingConfiguration) bc;
assertTrue("Not soap version 1.2: " + sbc.getVersion(), sbc.getVersion() instanceof Soap12);
bean = (JaxWsServerFactoryBean) ctx.getBean("inlineDataBinding");
boolean found = false;
String[] names = ctx.getBeanNamesForType(SpringServerFactoryBean.class);
for (String n : names) {
if (n.startsWith(SpringServerFactoryBean.class.getName())) {
found = true;
}
}
assertTrue("Could not find server factory with autogenerated id", found);
testNamespaceMapping(ctx);
}
@Test
public void testClients() throws Exception {
AbstractFactoryBeanDefinitionParser.setFactoriesAreAbstract(false);
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/clients.xml"});
ClientHolderBean greeters = (ClientHolderBean)ctx.getBean("greeters");
assertEquals(4, greeters.greeterCount());
Object bean = ctx.getBean("client1.proxyFactory");
assertNotNull(bean);
Greeter greeter = (Greeter) ctx.getBean("client1");
Greeter greeter2 = (Greeter) ctx.getBean("client1");
assertNotNull(greeter);
assertNotNull(greeter2);
assertSame(greeter, greeter2);
Client client = ClientProxy.getClient(greeter);
assertNotNull("expected ConduitSelector", client.getConduitSelector());
assertTrue("unexpected ConduitSelector",
client.getConduitSelector() instanceof NullConduitSelector);
List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
boolean saaj = false;
boolean logging = false;
for (Interceptor<? extends Message> i : inInterceptors) {
if (i instanceof SAAJInInterceptor) {
saaj = true;
} else if (i instanceof LoggingInInterceptor) {
logging = true;
}
}
assertTrue(saaj);
assertTrue(logging);
saaj = false;
logging = false;
for (Interceptor<?> i : client.getOutInterceptors()) {
if (i instanceof SAAJOutInterceptor) {
saaj = true;
} else if (i instanceof LoggingOutInterceptor) {
logging = true;
}
}
assertTrue(saaj);
assertTrue(logging);
assertTrue(client.getEndpoint().getService().getDataBinding() instanceof SourceDataBinding);
JaxWsProxyFactoryBean factory = (JaxWsProxyFactoryBean)ctx.getBean("wsdlLocation.proxyFactory");
assertNotNull(factory);
String wsdlLocation = factory.getWsdlLocation();
assertEquals("We should get the right wsdl location", wsdlLocation, "wsdl/hello_world.wsdl");
factory = (JaxWsProxyFactoryBean)ctx.getBean("inlineSoapBinding.proxyFactory");
assertNotNull(factory);
BindingConfiguration bc = factory.getBindingConfig();
assertTrue(bc instanceof SoapBindingConfiguration);
SoapBindingConfiguration sbc = (SoapBindingConfiguration) bc;
assertTrue(sbc.getVersion() instanceof Soap12);
assertTrue("the soap configure should set isMtomEnabled to be true",
sbc.isMtomEnabled());
Greeter g1 = greeters.getGreet1();
Greeter g2 = greeters.getGreet2();
assertNotSame(g1, g2);
ctx.close();
}
@Test
public void testClientFromFactory() throws Exception {
AbstractFactoryBeanDefinitionParser.setFactoriesAreAbstract(false);
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/clients.xml"});
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Greeter g = factory.create(Greeter.class);
ClientImpl c = (ClientImpl)ClientProxy.getClient(g);
for (Interceptor<? extends Message> i : c.getInInterceptors()) {
if (i instanceof LoggingInInterceptor) {
ctx.close();
return;
}
}
ctx.close();
fail("Did not configure the client");
}
@Test
public void testClientUsingDifferentBus() throws Exception {
ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"/org/apache/cxf/jaxws/spring/clients.xml"});
Greeter greeter = (Greeter) ctx.getBean("differentBusGreeter");
assertNotNull(greeter);
Client client = ClientProxy.getClient(greeter);
assertEquals("snarf", client.getBus().getProperty("foo"));
Greeter greeter1 = (Greeter) ctx.getBean("client1");
assertNotNull(greeter1);
Client client1 = ClientProxy.getClient(greeter1);
assertEquals("barf", client1.getBus().getProperty("foo"));
Greeter greeter2 = (Greeter) ctx.getBean("wsdlLocation");
assertNotNull(greeter2);
Client client2 = ClientProxy.getClient(greeter2);
assertSame(client1.getBus(), client2.getBus());
ctx.close();
}
@Test
public void testTwoEndpointsWithTwoBuses() throws Exception {
ClassPathXmlApplicationContext ctx = null;
Bus cxf1 = null;
Bus cxf2 = null;
try {
ctx = new ClassPathXmlApplicationContext("/org/apache/cxf/jaxws/spring/endpoints2.xml");
EndpointImpl ep1 = (EndpointImpl) ctx.getBean("ep1");
assertNotNull(ep1);
cxf1 = (Bus) ctx.getBean("cxf1");
assertNotNull(cxf1);
assertEquals(cxf1, ep1.getBus());
assertEquals("barf", ep1.getBus().getProperty("foo"));
EndpointImpl ep2 = (EndpointImpl) ctx.getBean("ep2");
assertNotNull(ep2);
cxf2 = (Bus) ctx.getBean("cxf2");
assertNotNull(cxf2);
assertEquals(cxf2, ep2.getBus());
assertEquals("snarf", ep2.getBus().getProperty("foo"));
} finally {
if (cxf1 != null) {
cxf1.shutdown(true);
}
if (cxf2 != null) {
cxf2.shutdown(true);
}
if (ctx != null) {
ctx.close();
}
}
}
@Test
public void testEndpointWithUndefinedBus() throws Exception {
try {
new ClassPathXmlApplicationContext("/org/apache/cxf/jaxws/spring/endpoints3.xml").close();
fail("Should have thrown an exception");
} catch (BeanCreationException ex) {
assertEquals("ep2", ex.getBeanName());
assertTrue(ex.getMessage().contains("cxf1"));
}
}
@Test
public void testCXF3959NormalImport() throws Exception {
PostConstructCalledCount.reset();
ClassPathXmlApplicationContext ctx
= new ClassPathXmlApplicationContext("/org/apache/cxf/jaxws/spring/cxf3959a.xml");
assertNotNull(ctx);
assertEquals(2, PostConstructCalledCount.getCount());
assertEquals(2, PostConstructCalledCount.getInjectedCount());
}
@Test
public void testCXF3959NoImport() throws Exception {
PostConstructCalledCount.reset();
ClassPathXmlApplicationContext ctx
= new ClassPathXmlApplicationContext("/org/apache/cxf/jaxws/spring/cxf3959b.xml");
assertNotNull(ctx);
assertEquals(2, PostConstructCalledCount.getCount());
assertEquals(2, PostConstructCalledCount.getInjectedCount());
}
@Test
public void testCXF3959SpringInject() throws Exception {
PostConstructCalledCount.reset();
ClassPathXmlApplicationContext ctx
= new ClassPathXmlApplicationContext("/org/apache/cxf/jaxws/spring/cxf3959c.xml");
assertNotNull(ctx);
assertEquals(2, PostConstructCalledCount.getCount());
//only one will have the WebServiceContext injected in properly before PostConstruct
assertEquals(0, PostConstructCalledCount.getInjectedCount());
PostConstructCalledCount pc = ctx.getBean("theBean", PostConstructCalledCount.class);
assertNotNull(pc.getContext());
}
}