/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.ws.jaxws.cxf.bus;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Service;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.jboss.wsf.stack.cxf.client.ClientBusSelector;
import org.jboss.wsf.stack.cxf.client.Constants;
/**
*
* @author alessio.soldano@jboss.com
* @since 05-Oct-2010
*
*/
public class AbstractClient
{
public static void testBusCreation() throws BusTestException
{
Bus initialDefaultBus = BusFactory.getDefaultBus(false);
Bus initialThreadBus = BusFactory.getThreadDefaultBus(false);
BusFactory factory = BusFactory.newInstance();
Bus bus = factory.createBus();
assert (bus != null);
if (initialThreadBus == null) //if the thread bus was not set before, it should now be
{
checkThreadBus(bus);
}
checkDefaultBus(initialDefaultBus);
BusFactory.setThreadDefaultBus(initialThreadBus);
checkThreadBus(initialThreadBus);
checkDefaultBus(initialDefaultBus);
}
public static void testSOAPConnection(String host) throws BusTestException, Exception
{
Bus initialDefaultBus = BusFactory.getDefaultBus(false);
Bus initialThreadBus = BusFactory.getThreadDefaultBus(false);
//first call... the thread bus is reused if not null, otherwise a new one is created
performSOAPCall(getEndpointURL(host));
checkDefaultBus(initialDefaultBus);
if (initialThreadBus != null)
{
checkThreadBus(initialThreadBus);
}
else
{
initialThreadBus = BusFactory.getThreadDefaultBus(false);
}
//second call...
performSOAPCall(getEndpointURL(host));
checkThreadBus(initialThreadBus);
checkDefaultBus(initialDefaultBus);
}
public static void testWebServiceRef(Endpoint port) throws BusTestException
{
Bus initialDefaultBus = BusFactory.getDefaultBus(false);
Bus threadBus = BusFactory.getThreadDefaultBus(false);
performInvocation(port); //does not change anything to the bus, as the port is already created when injecting serviceref
checkDefaultBus(initialDefaultBus);
checkThreadBus(threadBus);
try
{
BusFactory.setThreadDefaultBus(null);
performInvocation(port); //does not change anything to the bus, as the port is already created when injecting serviceref
checkDefaultBus(initialDefaultBus);
checkThreadBus(null);
BusFactory factory = BusFactory.newInstance();
Bus bus = factory.createBus(); //internally sets the thread bus
performInvocation(port); //does not change anything to the bus, as the port is already created when injecting serviceref
checkDefaultBus(initialDefaultBus);
checkThreadBus(bus);
}
finally
{
BusFactory.setThreadDefaultBus(threadBus);
}
}
public static void testWebServiceClient(String host) throws BusTestException, Exception
{
Bus initialDefaultBus = BusFactory.getDefaultBus(false);
performInvocation(getEndpointURL(host));
checkDefaultBus(initialDefaultBus);
//check client usage does not rely on default bus when no thread bus is set
Bus threadBus = BusFactory.getThreadDefaultBus(false);
try
{
final String url = getEndpointURL(host);
BusFactory.setThreadDefaultBus(null);
performInvocation(url); //goes through ServiceDelegate which sets the thread bus if it's null
Bus newThreadBus = BusFactory.getThreadDefaultBus(false);
if (ClientBusSelector.getDefaultStrategy().equals(Constants.THREAD_BUS_STRATEGY)) {
if (newThreadBus == initialDefaultBus)
{
throw new BusTestException("Thread bus set to former default bus " + initialDefaultBus + " instead of a new bus!");
}
else if (newThreadBus == threadBus)
{
throw new BusTestException("Thread bus set to former thread bus " + threadBus + " instead of a new bus!");
}
} else {
if (newThreadBus != null) {
throw new BusTestException("Thread bus set to " + newThreadBus + " instead of null!");
}
}
performInvocation(url);
checkThreadBus(newThreadBus); //the thread bus is not changed as it's not null
checkDefaultBus(initialDefaultBus);
}
finally
{
BusFactory.setThreadDefaultBus(threadBus);
}
}
protected static String getEndpointURL(String host)
{
return "http://" + host + "/jaxws-cxf-bus/EndpointService/Endpoint";
}
protected static void performSOAPCall(String endpointAddress) throws SOAPException, MalformedURLException
{
SOAPFactory soapFac = SOAPFactory.newInstance();
MessageFactory msgFac = MessageFactory.newInstance();
SOAPConnectionFactory conFac = SOAPConnectionFactory.newInstance();
SOAPMessage msg = msgFac.createMessage();
SOAPConnection con = conFac.createConnection();
QName echo = new QName("http://org.jboss.ws/bus", "echo");
SOAPElement element = soapFac.createElement(echo);
element.addTextNode("John");
msg.getSOAPBody().addChildElement(element);
SOAPMessage response = con.call(msg, new URL(endpointAddress));
assert (response != null);
}
protected static void performInvocation(Endpoint endpoint)
{
String result = endpoint.echo("Alessio");
assert ("Alessio".equals(result));
}
protected static void performInvocation(String endpointUrl) throws MalformedURLException
{
URL wsdlURL = new URL(endpointUrl + "?wsdl");
QName serviceName = new QName("http://org.jboss.ws/bus", "EndpointService");
Service service = Service.create(wsdlURL, serviceName);
QName portQName = new QName("http://org.jboss.ws/bus", "EndpointPort");
Endpoint endpoint = (Endpoint) service.getPort(portQName, Endpoint.class);
performInvocation(endpoint);
}
protected static void checkDefaultBus(Bus expectedDefaultBus) throws BusTestException
{
Bus bus = BusFactory.getDefaultBus(false);
if (bus != expectedDefaultBus)
{
throw new BusTestException("Default bus set to " + bus + " instead of expected " + expectedDefaultBus);
}
}
protected static void checkThreadBus(Bus expectedThreadBus) throws BusTestException
{
Bus bus = BusFactory.getThreadDefaultBus(false);
if (expectedThreadBus == null && bus != null)
{
throw new BusTestException("Thread " + Thread.currentThread() + " associated with bus " + bus
+ " instead of expected null bus");
}
if (bus != expectedThreadBus)
{
throw new BusTestException("Thread " + Thread.currentThread() + " associated with bus " + bus
+ " instead of expected bus " + expectedThreadBus);
}
}
}