001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.geronimo.cxf;
020
021 import java.net.MalformedURLException;
022 import java.net.URL;
023 import java.util.List;
024 import java.util.Map;
025 import java.util.concurrent.Executor;
026
027 import javax.xml.transform.Source;
028 import javax.xml.ws.Binding;
029 import javax.xml.ws.Endpoint;
030 import javax.xml.ws.WebServiceException;
031 import javax.xml.ws.handler.Handler;
032 import javax.xml.ws.http.HTTPBinding;
033 import javax.xml.ws.soap.SOAPBinding;
034
035 import org.apache.cxf.Bus;
036 import org.apache.cxf.endpoint.Server;
037 import org.apache.cxf.endpoint.ServerImpl;
038 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
039 import org.apache.cxf.jaxws.handler.PortInfoImpl;
040 import org.apache.cxf.jaxws.javaee.HandlerChainsType;
041 import org.apache.cxf.jaxws.support.JaxWsEndpointImpl;
042 import org.apache.cxf.jaxws.support.JaxWsImplementorInfo;
043 import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean;
044 import org.apache.cxf.service.Service;
045 import org.apache.geronimo.jaxws.PortInfo;
046 import org.apache.geronimo.jaxws.annotations.AnnotationException;
047 import org.apache.geronimo.jaxws.annotations.AnnotationProcessor;
048
049 public abstract class CXFEndpoint extends Endpoint {
050
051 protected Bus bus;
052
053 protected Object implementor;
054
055 protected Server server;
056
057 protected Service service;
058
059 protected JaxWsImplementorInfo implInfo;
060
061 protected JaxWsServiceFactoryBean serviceFactory;
062
063 protected PortInfo portInfo;
064
065 protected AnnotationProcessor annotationProcessor;
066
067 public CXFEndpoint(Bus bus, Object implementor) {
068 this.bus = bus;
069 this.implementor = implementor;
070 this.portInfo = (PortInfo) bus.getExtension(PortInfo.class);
071 }
072
073 protected URL getWsdlURL(URL configurationBaseUrl, String wsdlFile) {
074 URL wsdlURL = null;
075 if (wsdlFile != null && wsdlFile.trim().length() > 0) {
076 wsdlFile = wsdlFile.trim();
077 try {
078 wsdlURL = new URL(wsdlFile);
079 } catch (MalformedURLException e) {
080 // Not a URL, try as a resource
081 wsdlURL = getImplementorClass().getResource("/" + wsdlFile);
082
083 if (wsdlURL == null && configurationBaseUrl != null) {
084 // Cannot get it as a resource, try with
085 // configurationBaseUrl
086 try {
087 wsdlURL = new URL(configurationBaseUrl, wsdlFile);
088 } catch (MalformedURLException ee) {
089 // ignore
090 }
091 }
092 }
093 }
094 return wsdlURL;
095 }
096
097 protected Class getImplementorClass() {
098 return this.implementor.getClass();
099 }
100
101 protected org.apache.cxf.endpoint.Endpoint getEndpoint() {
102 return ((ServerImpl) getServer()).getEndpoint();
103 }
104
105 public boolean isSOAP11() {
106 return SOAPBinding.SOAP11HTTP_BINDING.equals(implInfo.getBindingType()) ||
107 SOAPBinding.SOAP11HTTP_MTOM_BINDING.equals(implInfo.getBindingType());
108 }
109
110 public boolean isHTTP() {
111 return HTTPBinding.HTTP_BINDING.equals(implInfo.getBindingType());
112 }
113
114 public ServerImpl getServer() {
115 return (ServerImpl) server;
116 }
117
118 public Binding getBinding() {
119 return ((JaxWsEndpointImpl) getEndpoint()).getJaxwsBinding();
120 }
121
122 public void setExecutor(Executor executor) {
123 service.setExecutor(executor);
124 }
125
126 public Executor getExecutor() {
127 return service.getExecutor();
128 }
129
130 @Override
131 public Object getImplementor() {
132 return implementor;
133 }
134
135 @Override
136 public List<Source> getMetadata() {
137 // TODO Auto-generated method stub
138 return null;
139 }
140
141 @Override
142 public Map<String, Object> getProperties() {
143 // TODO Auto-generated method stub
144 return null;
145 }
146
147 @Override
148 public boolean isPublished() {
149 return server != null;
150 }
151
152 @Override
153 public void publish(Object arg0) {
154 // TODO Auto-generated method stub
155 }
156
157 @Override
158 public void publish(String address) {
159 doPublish(address);
160 }
161
162 public void setMetadata(List<Source> arg0) {
163 // TODO Auto-generated method stub
164 }
165
166 @Override
167 public void setProperties(Map<String, Object> arg0) {
168 // TODO Auto-generated method stub
169 }
170
171 private static class GeronimoJaxWsServerFactoryBean extends JaxWsServerFactoryBean {
172 public GeronimoJaxWsServerFactoryBean() {
173 // disable CXF resource injection
174 doInit = false;
175 }
176 }
177
178 protected void doPublish(String address) {
179 JaxWsServerFactoryBean svrFactory = new GeronimoJaxWsServerFactoryBean();
180 svrFactory.setBus(bus);
181 svrFactory.setAddress(address);
182 svrFactory.setServiceFactory(serviceFactory);
183 svrFactory.setStart(false);
184 svrFactory.setServiceBean(implementor);
185
186 if (HTTPBinding.HTTP_BINDING.equals(implInfo.getBindingType())) {
187 svrFactory.setTransportId("http://cxf.apache.org/bindings/xformat");
188 }
189
190 server = svrFactory.create();
191
192 init();
193
194 org.apache.cxf.endpoint.Endpoint endpoint = getEndpoint();
195
196 if (getBinding() instanceof SOAPBinding) {
197 ((SOAPBinding)getBinding()).setMTOMEnabled(this.portInfo.isMTOMEnabled());
198 }
199
200 /**
201 if (endpoint.getEnableSchemaValidation()) {
202 endpoint.ge
203 endpoint.put(Message.SCHEMA_VALIDATION_ENABLED,
204 endpoint.getEnableSchemaValidation());
205 }
206 **/
207 server.start();
208 }
209
210 protected void init() {
211 }
212
213 /*
214 * Set appropriate handlers for the port/service/bindings.
215 */
216 protected void initHandlers() throws Exception {
217 HandlerChainsType handlerChains = this.portInfo.getHandlers(HandlerChainsType.class);
218 CXFHandlerResolver handlerResolver =
219 new CXFHandlerResolver(getImplementorClass().getClassLoader(),
220 getImplementorClass(),
221 handlerChains,
222 null);
223
224 PortInfoImpl portInfo = new PortInfoImpl(implInfo.getBindingType(),
225 serviceFactory.getEndpointName(),
226 service.getName());
227
228 List<Handler> chain = handlerResolver.getHandlerChain(portInfo);
229
230 getBinding().setHandlerChain(chain);
231 }
232
233 protected void injectResources(Object instance) throws AnnotationException {
234 this.annotationProcessor.processAnnotations(instance);
235 this.annotationProcessor.invokePostConstruct(instance);
236 }
237
238 protected void injectHandlers() {
239 List<Handler> handlers = getBinding().getHandlerChain();
240 try {
241 for (Handler handler : handlers) {
242 injectResources(handler);
243 }
244 } catch (AnnotationException e) {
245 throw new WebServiceException("Handler annotation failed", e);
246 }
247 }
248
249 protected void destroyHandlers() {
250 if (this.annotationProcessor != null) {
251 // call handlers preDestroy
252 List<Handler> handlers = getBinding().getHandlerChain();
253 for (Handler handler : handlers) {
254 this.annotationProcessor.invokePreDestroy(handler);
255 }
256 }
257 }
258
259 public void stop() {
260 // shutdown server
261 if (this.server != null) {
262 this.server.stop();
263 }
264 }
265 }