001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.cxf.pojo; 019 020 import java.net.URL; 021 import java.util.Map; 022 023 import javax.naming.Context; 024 import javax.naming.NamingException; 025 import javax.transaction.TransactionManager; 026 027 import org.apache.commons.logging.Log; 028 import org.apache.commons.logging.LogFactory; 029 import org.apache.cxf.Bus; 030 import org.apache.cxf.jaxws.context.WebServiceContextImpl; 031 import org.apache.geronimo.cxf.CXFCatalogUtils; 032 import org.apache.geronimo.cxf.CXFWebServiceContainer; 033 import org.apache.geronimo.gbean.GBeanInfo; 034 import org.apache.geronimo.gbean.GBeanInfoBuilder; 035 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 036 import org.apache.geronimo.jaxws.JNDIResolver; 037 import org.apache.geronimo.jaxws.PortInfo; 038 import org.apache.geronimo.jaxws.ServerJNDIResolver; 039 import org.apache.geronimo.jaxws.annotations.AnnotationHolder; 040 import org.apache.geronimo.kernel.Kernel; 041 import org.apache.geronimo.naming.enc.EnterpriseNamingContext; 042 import org.apache.geronimo.naming.reference.SimpleReference; 043 import org.apache.geronimo.transaction.GeronimoUserTransaction; 044 import org.apache.geronimo.webservices.WebServiceContainer; 045 import org.apache.geronimo.webservices.WebServiceContainerFactory; 046 047 /** 048 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 049 */ 050 public class POJOWebServiceContainerFactoryGBean implements WebServiceContainerFactory { 051 052 private static final Log LOG = LogFactory.getLog(POJOWebServiceContainerFactoryGBean.class); 053 054 private final Bus bus; 055 private final Class servletClass; 056 private final URL configurationBaseUrl; 057 058 public POJOWebServiceContainerFactoryGBean(PortInfo portInfo, 059 String endpointClassName, 060 ClassLoader classLoader, 061 Map componentContext, 062 Kernel kernel, 063 TransactionManager transactionManager, 064 URL configurationBaseUrl, 065 AnnotationHolder holder, 066 String contextRoot) 067 throws ClassNotFoundException, 068 IllegalAccessException, 069 InstantiationException { 070 071 Context context = null; 072 073 if (componentContext != null) { 074 075 // The name should match WebServiceContextAnnotationHelper.RELATIVE_JNDI_NAME 076 componentContext.put("env/WebServiceContext", new WebServiceContextReference()); 077 078 GeronimoUserTransaction userTransaction = new GeronimoUserTransaction(transactionManager); 079 try { 080 context = EnterpriseNamingContext.createEnterpriseNamingContext(componentContext, 081 userTransaction, 082 kernel, 083 classLoader); 084 } catch (NamingException e) { 085 LOG.warn("Failed to create naming context", e); 086 } 087 } 088 089 this.bus = CXFWebServiceContainer.getBus(); 090 this.configurationBaseUrl = configurationBaseUrl; 091 092 this.servletClass = classLoader.loadClass(endpointClassName); 093 094 this.bus.setExtension(new ServerJNDIResolver(context), JNDIResolver.class); 095 this.bus.setExtension(portInfo, PortInfo.class); 096 this.bus.setExtension(context, Context.class); 097 this.bus.setExtension(holder, AnnotationHolder.class); 098 099 CXFCatalogUtils.loadOASISCatalog(this.bus, 100 this.configurationBaseUrl, 101 "WEB-INF/jax-ws-catalog.xml"); 102 } 103 104 public WebServiceContainer getWebServiceContainer() { 105 return new POJOWebServiceContainer(bus, configurationBaseUrl, servletClass); 106 } 107 108 private static class WebServiceContextReference extends SimpleReference { 109 public Object getContent() throws NamingException { 110 return new WebServiceContextImpl(); 111 } 112 } 113 114 public static final GBeanInfo GBEAN_INFO; 115 116 static { 117 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(POJOWebServiceContainerFactoryGBean.class, NameFactory.GERONIMO_SERVICE); 118 infoBuilder.addAttribute("portInfo", PortInfo.class, true, true); 119 infoBuilder.addAttribute("endpointClassName", String.class, true, true); 120 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 121 infoBuilder.addAttribute("componentContext", Map.class, true, true); 122 infoBuilder.addAttribute("kernel", Kernel.class, false); 123 infoBuilder.addReference("TransactionManager", TransactionManager.class, NameFactory.JTA_RESOURCE); 124 infoBuilder.addAttribute("configurationBaseUrl", URL.class, true); 125 infoBuilder.addAttribute("holder", AnnotationHolder.class, true); 126 infoBuilder.addAttribute("contextRoot", String.class, true, true); 127 128 infoBuilder.setConstructor(new String[]{ 129 "portInfo", 130 "endpointClassName", 131 "classLoader", 132 "componentContext", 133 "kernel", 134 "TransactionManager", 135 "configurationBaseUrl", 136 "holder", 137 "contextRoot" 138 }); 139 140 GBEAN_INFO = infoBuilder.getBeanInfo(); 141 } 142 143 public static GBeanInfo getGBeanInfo() { 144 return GBEAN_INFO; 145 } 146 }