KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > geronimo > container > CeltixWebServiceContainer


1 package org.objectweb.celtix.geronimo.container;
2
3 import java.net.MalformedURLException JavaDoc;
4 import java.net.URL JavaDoc;
5 import java.util.logging.Logger JavaDoc;
6
7 import javax.xml.namespace.QName JavaDoc;
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 JavaDoc 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 JavaDoc {
37
38         Object JavaDoc target = request.getAttribute(WebServiceContainer.POJO_INSTANCE);
39         assert target != null : "target object not available in request";
40         
41         ClassLoader JavaDoc 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 JavaDoc {
57         // TODO Auto-generated method stub
58
System.out.println(this + " getWsdl called " + request.getParameters());
59     }
60
61     public void doStart() throws Exception JavaDoc {
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 JavaDoc {
79     }
80
81     public void doFail() {
82         // TODO Auto-generated method stub
83
}
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             // TODO: have the option of getting init values here
97
bus = Bus.init();
98         }
99         return bus;
100     }
101     
102     // setter for bus for unit testing purposes
103
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 JavaDoc target) throws BusException, MalformedURLException JavaDoc {
112
113         assert target != null : "null target received";
114         
115         URL JavaDoc 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 JavaDoc resolveWSDL(String JavaDoc resource, ClassLoader JavaDoc loader) {
140         
141         try {
142             return new URL JavaDoc(resource);
143         } catch (MalformedURLException JavaDoc 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