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 ServerImpl getServer() { 106 return (ServerImpl) server; 107 } 108 109 public Binding getBinding() { 110 return ((JaxWsEndpointImpl) getEndpoint()).getJaxwsBinding(); 111 } 112 113 public void setExecutor(Executor executor) { 114 service.setExecutor(executor); 115 } 116 117 public Executor getExecutor() { 118 return service.getExecutor(); 119 } 120 121 @Override 122 public Object getImplementor() { 123 return implementor; 124 } 125 126 @Override 127 public List<Source> getMetadata() { 128 // TODO Auto-generated method stub 129 return null; 130 } 131 132 @Override 133 public Map<String, Object> getProperties() { 134 // TODO Auto-generated method stub 135 return null; 136 } 137 138 @Override 139 public boolean isPublished() { 140 return server != null; 141 } 142 143 @Override 144 public void publish(Object arg0) { 145 // TODO Auto-generated method stub 146 } 147 148 @Override 149 public void publish(String address) { 150 doPublish(address); 151 } 152 153 public void setMetadata(List<Source> arg0) { 154 // TODO Auto-generated method stub 155 } 156 157 @Override 158 public void setProperties(Map<String, Object> arg0) { 159 // TODO Auto-generated method stub 160 } 161 162 private static class GeronimoJaxWsServerFactoryBean extends JaxWsServerFactoryBean { 163 public GeronimoJaxWsServerFactoryBean() { 164 // disable CXF resource injection 165 doInit = false; 166 } 167 } 168 169 protected void doPublish(String address) { 170 JaxWsServerFactoryBean svrFactory = new GeronimoJaxWsServerFactoryBean(); 171 svrFactory.setBus(bus); 172 svrFactory.setAddress(address); 173 svrFactory.setServiceFactory(serviceFactory); 174 svrFactory.setStart(false); 175 svrFactory.setServiceBean(implementor); 176 177 if (HTTPBinding.HTTP_BINDING.equals(implInfo.getBindingType())) { 178 svrFactory.setTransportId("http://cxf.apache.org/bindings/xformat"); 179 } 180 181 server = svrFactory.create(); 182 183 init(); 184 185 org.apache.cxf.endpoint.Endpoint endpoint = getEndpoint(); 186 187 if (getBinding() instanceof SOAPBinding) { 188 ((SOAPBinding)getBinding()).setMTOMEnabled(this.portInfo.isMTOMEnabled()); 189 } 190 191 /** 192 if (endpoint.getEnableSchemaValidation()) { 193 endpoint.ge 194 endpoint.put(Message.SCHEMA_VALIDATION_ENABLED, 195 endpoint.getEnableSchemaValidation()); 196 } 197 **/ 198 server.start(); 199 } 200 201 protected void init() { 202 } 203 204 /* 205 * Set appropriate handlers for the port/service/bindings. 206 */ 207 protected void initHandlers() throws Exception { 208 HandlerChainsType handlerChains = this.portInfo.getHandlers(HandlerChainsType.class); 209 CXFHandlerResolver handlerResolver = 210 new CXFHandlerResolver(getImplementorClass().getClassLoader(), 211 getImplementorClass(), 212 handlerChains, 213 null); 214 215 PortInfoImpl portInfo = new PortInfoImpl(implInfo.getBindingType(), 216 serviceFactory.getEndpointName(), 217 service.getName()); 218 219 List<Handler> chain = handlerResolver.getHandlerChain(portInfo); 220 221 getBinding().setHandlerChain(chain); 222 } 223 224 protected void injectResources(Object instance) throws AnnotationException { 225 this.annotationProcessor.processAnnotations(instance); 226 this.annotationProcessor.invokePostConstruct(instance); 227 } 228 229 protected void injectHandlers() { 230 List<Handler> handlers = getBinding().getHandlerChain(); 231 try { 232 for (Handler handler : handlers) { 233 injectResources(handler); 234 } 235 } catch (AnnotationException e) { 236 throw new WebServiceException("Handler annotation failed", e); 237 } 238 } 239 240 protected void destroyHandlers() { 241 if (this.annotationProcessor != null) { 242 // call handlers preDestroy 243 List<Handler> handlers = getBinding().getHandlerChain(); 244 for (Handler handler : handlers) { 245 this.annotationProcessor.invokePreDestroy(handler); 246 } 247 } 248 } 249 250 public void stop() { 251 // shutdown server 252 if (this.server != null) { 253 this.server.stop(); 254 } 255 } 256 }