1 package org.objectweb.celtix.geronimo.container; 2 3 import java.net.MalformedURLException ; 4 import java.net.URL ; 5 import java.util.logging.Logger ; 6 7 import javax.xml.namespace.QName ; 8 9 import org.apache.geronimo.gbean.GBeanLifecycle; 10 import org.apache.geronimo.webservices.WebServiceContainer; 11 import org.objectweb.celtix.Bus; 12 import org.objectweb.celtix.BusException; 13 import org.objectweb.celtix.bus.jaxws.EndpointImpl; 14 import org.objectweb.celtix.geronimo.builder.PortInfo; 15 import org.objectweb.celtix.transports.TransportFactoryManager; 16 import org.objectweb.celtix.ws.addressing.EndpointReferenceType; 17 import org.objectweb.celtix.wsdl.EndpointReferenceUtils; 18 19 public class CeltixWebServiceContainer implements WebServiceContainer, GBeanLifecycle { 20 21 private static final Logger LOG = Logger.getLogger(CeltixWebServiceContainer.class.getName()); 22 23 private final PortInfo portInfo; 24 25 private transient GeronimoTransportFactory factory; 26 private transient GeronimoServerTransport serverTransport; 27 private transient EndpointImpl publishedEndpoint; 28 private transient Bus bus; 29 private transient boolean started; 30 31 32 public CeltixWebServiceContainer(PortInfo pi) { 33 portInfo = pi; 34 } 35 36 public void invoke(Request request, Response response) throws Exception { 37 38 Object target = request.getAttribute(WebServiceContainer.POJO_INSTANCE); 39 assert target != null : "target object not available in request"; 40 41 ClassLoader origLoader = Thread.currentThread().getContextClassLoader(); 42 43 try { 44 Thread.currentThread().setContextClassLoader(target.getClass().getClassLoader()); 45 if (!isEndpointPublished()) { 46 doStart(); 47 publishEndpoint(target); 48 } 49 serverTransport.invoke(request, response); 50 } finally { 51 Thread.currentThread().setContextClassLoader(origLoader); 52 } 53 } 54 55 56 public void getWsdl(Request request, Response response) throws Exception { 57 System.out.println(this + " getWsdl called " + request.getParameters()); 59 } 60 61 public void doStart() throws Exception { 62 63 if (started) { 64 return; 65 } 66 67 TransportFactoryManager tfm = getBus().getTransportFactoryManager(); 68 getTransportFactory().init(getBus()); 69 tfm.registerTransportFactory("http://schemas.xmlsoap.org/wsdl/soap/", 70 factory); 71 tfm.registerTransportFactory("http://schemas.xmlsoap.org/wsdl/soap/http", 72 factory); 73 tfm.registerTransportFactory("http://celtix.objectweb.org/transports/http/configuration", 74 factory); 75 started = true; 76 } 77 78 public void doStop() throws Exception { 79 } 80 81 public void doFail() { 82 } 84 85 86 void setServerTransport(GeronimoServerTransport st) { 87 serverTransport = st; 88 } 89 90 GeronimoServerTransport getServerTransport() { 91 return serverTransport; 92 } 93 94 private synchronized Bus getBus() throws BusException { 95 if (bus == null) { 96 bus = Bus.init(); 98 } 99 return bus; 100 } 101 102 void setBus(Bus b) { 104 bus = b; 105 } 106 107 private boolean isEndpointPublished() { 108 return publishedEndpoint != null; 109 } 110 111 private synchronized void publishEndpoint(Object target) throws BusException, MalformedURLException { 112 113 assert target != null : "null target received"; 114 115 URL url = resolveWSDL(portInfo.getWsdlFile(), target.getClass().getClassLoader()); 116 assert url != null; 117 118 EndpointReferenceType ref = EndpointReferenceUtils.getEndpointReference(url, 119 QName.valueOf(portInfo.getServiceName()), 120 portInfo.getPortName()); 121 122 GeronimoTransportFactory tfactory = getTransportFactory(); 123 assert tfactory != null : "failed to get transport factory"; 124 125 try { 126 tfactory.setCurrentContainer(this); 127 EndpointImpl ep = new EndpointImpl(getBus(), target, 128 "http://schemas.xmlsoap.org/wsdl/soap/http", ref); 129 LOG.fine("publishing endpoint " + ep); 130 ep.publish("http://localhost/"); 131 publishedEndpoint = ep; 132 133 assert serverTransport != null : "server transport not initialized"; 134 } finally { 135 tfactory.setCurrentContainer(null); 136 } 137 } 138 139 private URL resolveWSDL(String resource, ClassLoader loader) { 140 141 try { 142 return new URL (resource); 143 } catch (MalformedURLException ex) { 144 return loader.getResource(resource); 145 } 146 } 147 148 149 private synchronized GeronimoTransportFactory getTransportFactory() { 150 if (factory == null) { 151 factory = new GeronimoTransportFactory(); 152 } 153 return factory; 154 } 155 } 156 | Popular Tags |