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.ejb; 020 021 import java.net.URL; 022 import java.util.List; 023 024 import javax.naming.InitialContext; 025 import javax.naming.NamingException; 026 import javax.xml.ws.WebServiceContext; 027 import javax.xml.ws.WebServiceException; 028 029 import org.apache.cxf.Bus; 030 import org.apache.cxf.binding.soap.SoapBinding; 031 import org.apache.cxf.binding.soap.interceptor.MustUnderstandInterceptor; 032 import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; 033 import org.apache.cxf.endpoint.Endpoint; 034 import org.apache.cxf.interceptor.Interceptor; 035 import org.apache.cxf.jaxws.handler.logical.LogicalHandlerInInterceptor; 036 import org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor; 037 import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean; 038 import org.apache.geronimo.cxf.CXFEndpoint; 039 import org.apache.geronimo.cxf.CXFServiceConfiguration; 040 import org.apache.geronimo.cxf.GeronimoJaxWsImplementorInfo; 041 import org.apache.geronimo.jaxws.JAXWSAnnotationProcessor; 042 import org.apache.geronimo.jaxws.JAXWSUtils; 043 import org.apache.geronimo.jaxws.JNDIResolver; 044 import org.apache.openejb.DeploymentInfo; 045 046 public class EJBEndpoint extends CXFEndpoint { 047 048 public EJBEndpoint(Bus bus, 049 URL configurationBaseUrl, 050 Class instance) { 051 super(bus, instance); 052 053 String bindingURI = null; 054 if (this.portInfo.getProtocolBinding() != null) { 055 bindingURI = JAXWSUtils.getBindingURI(this.portInfo.getProtocolBinding()); 056 } 057 implInfo = new GeronimoJaxWsImplementorInfo((Class)implementor, bindingURI); 058 059 serviceFactory = new JaxWsServiceFactoryBean(implInfo); 060 serviceFactory.setBus(bus); 061 062 String wsdlLocation = null; 063 if (this.portInfo.getWsdlFile() != null) { 064 wsdlLocation = this.portInfo.getWsdlFile(); 065 } else { 066 wsdlLocation = implInfo.getWsdlLocation(); 067 } 068 URL wsdlURL = getWsdlURL(configurationBaseUrl, wsdlLocation); 069 070 // install as first to overwrite annotations (wsdl-file, wsdl-port, wsdl-service) 071 CXFServiceConfiguration configuration = 072 new CXFServiceConfiguration(this.portInfo, wsdlURL); 073 serviceFactory.getConfigurations().add(0, configuration); 074 075 service = serviceFactory.create(); 076 } 077 078 protected Class getImplementorClass() { 079 return (Class)this.implementor; 080 } 081 082 protected void init() { 083 // configure handlers 084 try { 085 initHandlers(); 086 } catch (Exception e) { 087 throw new WebServiceException("Error configuring handlers", e); 088 } 089 090 DeploymentInfo deploymentInfo = 091 (DeploymentInfo)bus.getExtension(DeploymentInfo.class); 092 093 service.setInvoker(new EJBMethodInvoker(this, this.bus, deploymentInfo)); 094 095 Endpoint endpoint = getEndpoint(); 096 097 /* 098 * Remove interceptors that perform handler processing since 099 * handler processing must happen within the EJB container. 100 */ 101 removeHandlerInterceptors(bus.getInInterceptors()); 102 removeHandlerInterceptors(endpoint.getInInterceptors()); 103 removeHandlerInterceptors(endpoint.getBinding().getInInterceptors()); 104 removeHandlerInterceptors(endpoint.getService().getInInterceptors()); 105 106 // install SAAJ interceptor 107 if (endpoint.getBinding() instanceof SoapBinding && 108 !this.implInfo.isWebServiceProvider()) { 109 endpoint.getService().getInInterceptors().add(new SAAJInInterceptor()); 110 } 111 } 112 113 private static void removeHandlerInterceptors(List<Interceptor> interceptors) { 114 for (Interceptor interceptor : interceptors) { 115 if (interceptor instanceof MustUnderstandInterceptor || 116 interceptor instanceof LogicalHandlerInInterceptor || 117 interceptor instanceof SOAPHandlerInterceptor) { 118 interceptors.remove(interceptor); 119 } 120 } 121 } 122 123 public synchronized void injectHandlers() { 124 if (this.annotationProcessor != null) { 125 // assume injection was already done 126 return; 127 } 128 129 WebServiceContext wsContext = null; 130 try { 131 InitialContext ctx = new InitialContext(); 132 wsContext = (WebServiceContext) ctx.lookup("java:comp/WebServiceContext"); 133 } catch (NamingException e) { 134 throw new WebServiceException("Failed to lookup WebServiceContext", e); 135 } 136 137 this.annotationProcessor = new JAXWSAnnotationProcessor(new JNDIResolver(), wsContext); 138 super.injectHandlers(); 139 } 140 141 public void stop() { 142 // call handler preDestroy 143 destroyHandlers(); 144 145 // shutdown server 146 super.stop(); 147 } 148 149 }