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 package org.apache.geronimo.jaxws.builder;
018
019 import java.net.URL;
020 import java.util.Collection;
021 import java.util.HashMap;
022 import java.util.List;
023 import java.util.Map;
024 import java.util.jar.JarFile;
025
026 import org.apache.geronimo.common.DeploymentException;
027 import org.apache.geronimo.deployment.ModuleIDBuilder;
028 import org.apache.geronimo.deployment.service.EnvironmentBuilder;
029 import org.apache.geronimo.gbean.AbstractName;
030 import org.apache.geronimo.gbean.AbstractNameQuery;
031 import org.apache.geronimo.gbean.GBeanData;
032 import org.apache.geronimo.gbean.GBeanInfo;
033 import org.apache.geronimo.gbean.GBeanInfoBuilder;
034 import org.apache.geronimo.j2ee.deployment.EARContext;
035 import org.apache.geronimo.j2ee.deployment.Module;
036 import org.apache.geronimo.j2ee.deployment.ModuleBuilderExtension;
037 import org.apache.geronimo.j2ee.deployment.WebServiceBuilder;
038 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
039 import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
040 import org.apache.geronimo.kernel.Kernel;
041 import org.apache.geronimo.kernel.Naming;
042 import org.apache.geronimo.kernel.config.ConfigurationModuleType;
043 import org.apache.geronimo.kernel.config.ConfigurationStore;
044 import org.apache.geronimo.kernel.repository.Environment;
045 import org.apache.geronimo.openejb.deployment.EjbModule;
046 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
047 import org.apache.openejb.jee.oejb2.GeronimoEjbJarType;
048 import org.apache.openejb.jee.oejb2.WebServiceBindingType;
049 import org.apache.openejb.jee.oejb2.WebServiceBindingType.WebServiceSecurityType;
050
051 /**
052 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
053 */
054 public class JAXWSEJBModuleBuilderExtension implements ModuleBuilderExtension {
055
056 protected WebServiceBuilder jaxwsBuilder;
057 protected AbstractNameQuery listener;
058 protected GBeanInfo wsGBeanInfo;
059 protected Environment defaultEnvironment;
060
061 public JAXWSEJBModuleBuilderExtension() throws Exception {
062 }
063
064 public JAXWSEJBModuleBuilderExtension(WebServiceBuilder wsBuilder,
065 Environment defaultEnvironment,
066 AbstractNameQuery listener,
067 Object dataLink,
068 Kernel kernel) throws Exception {
069 this.jaxwsBuilder = wsBuilder;
070 this.listener = listener;
071 this.defaultEnvironment = defaultEnvironment;
072 this.wsGBeanInfo = getGBeanInfo(kernel, dataLink);
073 }
074
075 private static GBeanInfo getGBeanInfo(Kernel kernel, Object webServiceLinkTemplate) throws Exception {
076 AbstractName webServiceLinkTemplateName = kernel.getAbstractNameFor(webServiceLinkTemplate);
077 return kernel.getGBeanInfo(webServiceLinkTemplateName);
078 }
079
080 public void createModule(Module module, Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
081 if (this.defaultEnvironment != null) {
082 EnvironmentBuilder.mergeEnvironments(environment, this.defaultEnvironment);
083 }
084 }
085
086 public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repository) throws DeploymentException {
087 }
088
089 public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {
090 if (module.getType() != ConfigurationModuleType.EJB) {
091 return;
092 }
093
094 EjbModule ejbModule = (EjbModule) module;
095 Environment environment = module.getEnvironment();
096
097 //overridden web service locations
098 Map correctedPortLocations = new HashMap();
099 GeronimoEjbJarType geronimoEjbJarType =
100 (GeronimoEjbJarType) ejbModule.getEjbModule().getAltDDs().get("geronimo-openejb.xml");
101 if (geronimoEjbJarType != null) {
102 for (WebServiceBindingType bt : geronimoEjbJarType.getWebServiceBinding()) {
103 String location = bt.getWebServiceAddress();
104 if (location != null) {
105 location = location.trim();
106 if (!location.startsWith("/")) {
107 location = "/" + location;
108 }
109 correctedPortLocations.put(bt.getEjbName(), location);
110 }
111 }
112 }
113
114 jaxwsBuilder.findWebServices(module, true, correctedPortLocations, environment, ejbModule.getSharedContext());
115 }
116
117 public void addGBeans(EARContext earContext, Module module, ClassLoader cl, Collection repository) throws DeploymentException {
118 if (module.getType() != ConfigurationModuleType.EJB) {
119 return;
120 }
121
122 EjbModule ejbModule = (EjbModule) module;
123
124 Map<String, WebServiceBindingType> wsBindingMap =
125 createWebServiceBindingMap(ejbModule);
126
127 for (EnterpriseBeanInfo bean : ejbModule.getEjbJarInfo().enterpriseBeans) {
128 if (bean.type != EnterpriseBeanInfo.STATELESS) {
129 continue;
130 }
131
132 String ejbName = bean.ejbName;
133
134 AbstractName sessionName = earContext.getNaming().createChildName(module.getModuleName(), ejbName, NameFactory.STATELESS_SESSION_BEAN);
135
136 assert sessionName != null: "StatelesSessionBean object name is null";
137
138 AbstractName ejbWebServiceName = earContext.getNaming().createChildName(sessionName, ejbName, NameFactory.WEB_SERVICE_LINK);
139
140 GBeanData ejbWebServiceGBean = new GBeanData(ejbWebServiceName, this.wsGBeanInfo);
141
142 ejbWebServiceGBean.setAttribute("ejbName", ejbName);
143 ejbWebServiceGBean.setAttribute("ejbClass", bean.ejbClass);
144
145 WebServiceBindingType wsBinding = wsBindingMap.get(ejbName);
146 if (wsBinding != null) {
147 List<String> ddVirtualHosts = wsBinding.getWebServiceVirtualHost();
148 if (ddVirtualHosts != null) {
149 String[] virtualHosts = new String[ddVirtualHosts.size()];
150 for (int i=0; i<ddVirtualHosts.size(); i++) {
151 virtualHosts[i] = ddVirtualHosts.get(i).trim();
152 }
153 ejbWebServiceGBean.setAttribute("virtualHosts", virtualHosts);
154 }
155
156 WebServiceSecurityType wsSecurity = wsBinding.getWebServiceSecurity();
157 if (wsSecurity != null) {
158 ejbWebServiceGBean.setAttribute("securityRealmName", wsSecurity.getSecurityRealmName().trim());
159 ejbWebServiceGBean.setAttribute("transportGuarantee", wsSecurity.getTransportGuarantee().toString());
160 ejbWebServiceGBean.setAttribute("authMethod", wsSecurity.getAuthMethod().value());
161 if (wsSecurity.getRealmName() != null) {
162 ejbWebServiceGBean.setAttribute("realmName", wsSecurity.getRealmName().trim());
163 }
164 }
165 }
166
167 if (jaxwsBuilder.configureEJB(ejbWebServiceGBean, bean.ejbName, ejbModule,
168 ejbModule.getSharedContext(), cl)) {
169
170 try {
171 earContext.addGBean(ejbWebServiceGBean);
172 } catch (GBeanAlreadyExistsException e) {
173 throw new DeploymentException(
174 "Could not add ejb web service gbean to context",
175 e);
176 }
177
178 if (this.listener != null) {
179 ejbWebServiceGBean.setReferencePattern("WebServiceContainer", this.listener);
180 }
181
182 ejbWebServiceGBean.setReferencePattern("EjbDeployment", sessionName);
183 }
184
185 ejbWebServiceGBean.clearAttribute("ejbName");
186 ejbWebServiceGBean.clearAttribute("ejbClass");
187
188 }
189 }
190
191 private Map<String, WebServiceBindingType> createWebServiceBindingMap(EjbModule ejbModule) {
192 Map<String, WebServiceBindingType> wsBindingMap =
193 new HashMap<String, WebServiceBindingType>();
194 GeronimoEjbJarType geronimoEjbJarType =
195 (GeronimoEjbJarType) ejbModule.getEjbModule().getAltDDs().get("geronimo-openejb.xml");
196 if (geronimoEjbJarType != null) {
197 for (WebServiceBindingType bt : geronimoEjbJarType.getWebServiceBinding()) {
198 wsBindingMap.put(bt.getEjbName(), bt);
199 }
200 }
201 return wsBindingMap;
202 }
203
204 public static final GBeanInfo GBEAN_INFO;
205
206 static {
207 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JAXWSEJBModuleBuilderExtension.class, NameFactory.MODULE_BUILDER);
208 infoBuilder.addInterface(ModuleBuilderExtension.class);
209 infoBuilder.addReference("WebServiceBuilder", WebServiceBuilder.class, NameFactory.MODULE_BUILDER);
210 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
211 infoBuilder.addAttribute("listener", AbstractNameQuery.class, true);
212 infoBuilder.addReference("WebServiceLinkTemplate", Object.class, NameFactory.WEB_SERVICE_LINK);
213 infoBuilder.addAttribute("kernel", Kernel.class, false);
214
215 infoBuilder.setConstructor(new String[]{
216 "WebServiceBuilder",
217 "defaultEnvironment",
218 "listener",
219 "WebServiceLinkTemplate",
220 "kernel"
221 });
222
223 GBEAN_INFO = infoBuilder.getBeanInfo();
224 }
225
226 public static GBeanInfo getGBeanInfo() {
227 return GBEAN_INFO;
228 }
229
230 }