package org.apache.servicemix.ejb3.deployer; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.xml.ws.Endpoint; import org.apache.cxf.Bus; import org.apache.cxf.binding.BindingFactory; import org.apache.cxf.binding.BindingFactoryManager; import org.apache.cxf.bus.extension.ExtensionManagerBus; import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean; import org.apache.cxf.transport.DestinationFactoryManager; import org.apache.openejb.DeploymentInfo; import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.assembler.classic.DeploymentListener; import org.apache.openejb.assembler.classic.EjbJarInfo; import org.apache.openejb.assembler.classic.EnterpriseBeanInfo; import org.apache.openejb.assembler.classic.StatelessBeanInfo; import org.apache.openejb.core.CoreContainerSystem; import org.apache.openejb.core.webservices.PortData; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.server.SelfManaging; import org.apache.openejb.server.ServerService; import org.apache.openejb.server.ServiceException; import org.apache.openejb.spi.ContainerSystem; import org.apache.servicemix.cxf.binding.nmr.NMRBindingFactory; import org.apache.servicemix.cxf.binding.nmr.NMRConstants; import org.apache.servicemix.cxf.transport.nmr.NMRTransportFactory; import org.apache.servicemix.nmr.api.NMR; /** * Created by IntelliJ IDEA. * User: gnodet * Date: Jan 30, 2008 * Time: 9:49:07 PM * To change this template use File | Settings | File Templates. */ public class NmrService implements ServerService, SelfManaging, DeploymentListener { private Assembler assembler; private final Set<AppInfo> deployedApplications = new HashSet<AppInfo>(); private NMR nmr; private Map<StatelessBeanInfo, Endpoint> endpoints = new HashMap<StatelessBeanInfo, Endpoint>(); public void start() throws ServiceException { assembler = SystemInstance.get().getComponent(Assembler.class); if (assembler != null) { assembler.addDeploymentListener(this); for (AppInfo appInfo : assembler.getDeployedApplications()) { afterApplicationCreated(appInfo); } } } public void stop() throws ServiceException { if (assembler != null) { assembler.removeDeploymentListener(this); for (AppInfo appInfo : new ArrayList<AppInfo>(deployedApplications)) { beforeApplicationDestroyed(appInfo); } assembler = null; } } public void service(InputStream in, OutputStream out) throws ServiceException, IOException { throw new UnsupportedOperationException("NmrService can not be invoked directly"); } public void service(Socket socket) throws ServiceException, IOException { throw new UnsupportedOperationException("NmrService can not be invoked directly"); } public String getName() { return "nmr"; } public String getIP() { return "n/a"; } public int getPort() { return -1; } public NMR getNmr() { return nmr; } public void setNmr(NMR nmr) { this.nmr = nmr; } public void init(Properties props) throws Exception { } public void afterApplicationCreated(AppInfo appInfo) { if (deployedApplications.add(appInfo)) { System.out.println("Deploying new application to NMR"); for (EjbJarInfo ejbJar : appInfo.ejbJars) { for (EnterpriseBeanInfo bean : ejbJar.enterpriseBeans) { if (bean instanceof StatelessBeanInfo) { StatelessBeanInfo statelessBeanInfo = (StatelessBeanInfo) bean; Endpoint endpoint = createEndpoint(statelessBeanInfo); endpoint.publish("nmr://endpoint"); endpoints.put(statelessBeanInfo, endpoint); } } } } } public void beforeApplicationDestroyed(AppInfo appInfo) { if (deployedApplications.remove(appInfo)) { for (EjbJarInfo ejbJar : appInfo.ejbJars) { for (EnterpriseBeanInfo bean : ejbJar.enterpriseBeans) { if (bean instanceof StatelessBeanInfo) { StatelessBeanInfo statelessBeanInfo = (StatelessBeanInfo) bean; Endpoint endpoint = endpoints.remove(statelessBeanInfo); endpoint.stop(); } } } } } protected Endpoint createEndpoint(StatelessBeanInfo bean) { Bus bus = new ExtensionManagerBus(); NMRTransportFactory transportFactory = new NMRTransportFactory(); transportFactory.setBus(bus); transportFactory.setNmr(nmr); transportFactory.setTransportIds(Collections.singletonList(NMRTransportFactory.TRANSPORT_ID)); DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class); dfm.registerDestinationFactory(NMRTransportFactory.TRANSPORT_ID, transportFactory); NMRBindingFactory bindingFactory = new NMRBindingFactory(); bindingFactory.setBus(bus); BindingFactoryManager bfm = bus.getExtension(BindingFactoryManager.class); bfm.registerBindingFactory(NMRConstants.NS_NMR_BINDING, bindingFactory); CoreContainerSystem containerSystem = (CoreContainerSystem) SystemInstance.get().getComponent(ContainerSystem.class); DeploymentInfo deploymentInfo = containerSystem.getDeploymentInfo(bean.ejbDeploymentId); PortData port = new PortData(); NmrEndpoint ep = new NmrEndpoint(bus, port, deploymentInfo); return ep; } }