package org.marketcetera.util.ws.stateless; import java.util.HashMap; import java.util.Map; import org.apache.cxf.endpoint.Server; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.marketcetera.util.log.SLF4JLoggerProxy; import org.marketcetera.util.misc.ClassVersion; import org.marketcetera.util.ws.ContextClassProvider; /* $License$ */ /** * A server node for stateless communication. * * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: StatelessServer.java 16853 2014-03-06 02:10:11Z colin $ */ @ClassVersion("$Id: StatelessServer.java 16853 2014-03-06 02:10:11Z colin $") public class StatelessServer extends Node { /** * Create a new StatelessServer instance. * * @param inHost a <code>String</code> value * @param inPort an <code>int</code> value * @param inContextClassProvider a <code>ContextClassProvider</code> value */ public StatelessServer(String inHost, int inPort, ContextClassProvider inContextClassProvider) { super(inHost, inPort); contextClassProvider = inContextClassProvider; } /** * Creates a new server node with the given server host name and port. * * @param inHost a <code>String</code> value * @param inPort an <code>int</code> value */ public StatelessServer(String inHostname, int inPort) { this(inHostname, inPort, null); } /** * Creates a new server node with the default server host name and port. */ public StatelessServer() { this(DEFAULT_HOST, DEFAULT_PORT); } /** * Publishes the given service interface, supported by the given * implementation, and returns a handle that can be used to stop * the interface. * * @param impl The implementation. * @param iface The interface class. * * @return The handle. */ public <T extends StatelessServiceBase> ServiceInterface publish(T impl, Class<T> iface) { factory = new JaxWsServerFactoryBean(); Map<String,Object> props = factory.getProperties(); if(props == null) { props = new HashMap<String,Object>(); } if(contextClassProvider != null) { SLF4JLoggerProxy.debug(this, "Using additional context: {}", //$NON-NLS-1$ contextClassProvider); props.put("jaxb.additionalContextClasses", //$NON-NLS-1$ contextClassProvider.getContextClasses()); } factory.setProperties(props); factory.setServiceClass(iface); factory.setAddress(getConnectionUrl(iface)); factory.setServiceBean(impl); server = factory.create(); return new ServiceInterface(server); } /** * Shuts down the receiver. */ public void stop() { if(server != null) { server.stop(); server.destroy(); server = null; } if(factory != null) { factory.getBus().shutdown(true); factory = null; } } /** * context classes to add to the server context, if any */ private final ContextClassProvider contextClassProvider; /** * published server object */ private Server server; /** * factory used to create server objects */ private JaxWsServerFactoryBean factory; }