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$ $Date$
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 this(null, null, null, null, null);
063 }
064
065 public JAXWSEJBModuleBuilderExtension(WebServiceBuilder wsBuilder,
066 Environment defaultEnvironment,
067 AbstractNameQuery listener,
068 Object dataLink,
069 Kernel kernel) throws Exception {
070 this.jaxwsBuilder = wsBuilder;
071 this.listener = listener;
072 this.defaultEnvironment = defaultEnvironment;
073 this.wsGBeanInfo = getGBeanInfo(kernel, dataLink);
074 }
075
076 private static GBeanInfo getGBeanInfo(Kernel kernel, Object webServiceLinkTemplate) throws Exception {
077 AbstractName webServiceLinkTemplateName = kernel.getAbstractNameFor(webServiceLinkTemplate);
078 return kernel.getGBeanInfo(webServiceLinkTemplateName);
079 }
080
081 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 {
082 if (this.defaultEnvironment != null) {
083 EnvironmentBuilder.mergeEnvironments(environment, this.defaultEnvironment);
084 }
085 }
086
087 public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repository) throws DeploymentException {
088 }
089
090 public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {
091 if (module.getType() != ConfigurationModuleType.EJB) {
092 return;
093 }
094
095 EjbModule ejbModule = (EjbModule) module;
096 Environment environment = module.getEnvironment();
097
098 //overridden web service locations
099 Map correctedPortLocations = new HashMap();
100 GeronimoEjbJarType geronimoEjbJarType =
101 (GeronimoEjbJarType) ejbModule.getEjbModule().getAltDDs().get("geronimo-openejb.xml");
102 if (geronimoEjbJarType != null) {
103 for (WebServiceBindingType bt : geronimoEjbJarType.getWebServiceBinding()) {
104 String location = bt.getWebServiceAddress();
105 if (location != null) {
106 location = location.trim();
107 if (!location.startsWith("/")) {
108 location = "/" + location;
109 }
110 correctedPortLocations.put(bt.getEjbName(), location);
111 }
112 }
113 }
114
115 jaxwsBuilder.findWebServices(module, true, correctedPortLocations, environment, ejbModule.getSharedContext());
116 }
117
118 public void addGBeans(EARContext earContext, Module module, ClassLoader cl, Collection repository) throws DeploymentException {
119 if (module.getType() != ConfigurationModuleType.EJB) {
120 return;
121 }
122
123 EjbModule ejbModule = (EjbModule) module;
124
125 Map<String, WebServiceBindingType> wsBindingMap =
126 createWebServiceBindingMap(ejbModule);
127
128 for (EnterpriseBeanInfo bean : ejbModule.getEjbJarInfo().enterpriseBeans) {
129 if (bean.type != EnterpriseBeanInfo.STATELESS) {
130 continue;
131 }
132
133 String ejbName = bean.ejbName;
134
135 AbstractName sessionName = earContext.getNaming().createChildName(module.getModuleName(), ejbName, NameFactory.STATELESS_SESSION_BEAN);
136
137 assert sessionName != null: "StatelesSessionBean object name is null";
138
139 AbstractName ejbWebServiceName = earContext.getNaming().createChildName(sessionName, ejbName, NameFactory.WEB_SERVICE_LINK);
140
141 GBeanData ejbWebServiceGBean = new GBeanData(ejbWebServiceName, this.wsGBeanInfo);
142
143 ejbWebServiceGBean.setAttribute("ejbName", ejbName);
144 ejbWebServiceGBean.setAttribute("ejbClass", bean.ejbClass);
145
146 WebServiceBindingType wsBinding = wsBindingMap.get(ejbName);
147 if (wsBinding != null) {
148 List<String> ddVirtualHosts = wsBinding.getWebServiceVirtualHost();
149 if (ddVirtualHosts != null) {
150 String[] virtualHosts = new String[ddVirtualHosts.size()];
151 for (int i=0; i<ddVirtualHosts.size(); i++) {
152 virtualHosts[i] = ddVirtualHosts.get(i).trim();
153 }
154 ejbWebServiceGBean.setAttribute("virtualHosts", virtualHosts);
155 }
156
157 WebServiceSecurityType wsSecurity = wsBinding.getWebServiceSecurity();
158 if (wsSecurity != null) {
159 ejbWebServiceGBean.setAttribute("securityRealmName", wsSecurity.getSecurityRealmName().trim());
160 ejbWebServiceGBean.setAttribute("transportGuarantee", wsSecurity.getTransportGuarantee().toString());
161 ejbWebServiceGBean.setAttribute("authMethod", wsSecurity.getAuthMethod().value());
162 if (wsSecurity.getRealmName() != null) {
163 ejbWebServiceGBean.setAttribute("realmName", wsSecurity.getRealmName().trim());
164 }
165 }
166 }
167
168 if (jaxwsBuilder.configureEJB(ejbWebServiceGBean, bean.ejbName, ejbModule,
169 ejbModule.getSharedContext(), cl)) {
170
171 try {
172 earContext.addGBean(ejbWebServiceGBean);
173 } catch (GBeanAlreadyExistsException e) {
174 throw new DeploymentException(
175 "Could not add ejb web service gbean to context",
176 e);
177 }
178
179 if (this.listener != null) {
180 ejbWebServiceGBean.setReferencePattern("WebServiceContainer", this.listener);
181 }
182
183 ejbWebServiceGBean.setReferencePattern("EjbDeployment", sessionName);
184 }
185
186 ejbWebServiceGBean.clearAttribute("ejbName");
187 ejbWebServiceGBean.clearAttribute("ejbClass");
188
189 }
190 }
191
192 private Map<String, WebServiceBindingType> createWebServiceBindingMap(EjbModule ejbModule) {
193 Map<String, WebServiceBindingType> wsBindingMap =
194 new HashMap<String, WebServiceBindingType>();
195 GeronimoEjbJarType geronimoEjbJarType =
196 (GeronimoEjbJarType) ejbModule.getEjbModule().getAltDDs().get("geronimo-openejb.xml");
197 if (geronimoEjbJarType != null) {
198 for (WebServiceBindingType bt : geronimoEjbJarType.getWebServiceBinding()) {
199 wsBindingMap.put(bt.getEjbName(), bt);
200 }
201 }
202 return wsBindingMap;
203 }
204
205 public static final GBeanInfo GBEAN_INFO;
206
207 static {
208 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JAXWSEJBModuleBuilderExtension.class, NameFactory.MODULE_BUILDER);
209 infoBuilder.addInterface(ModuleBuilderExtension.class);
210 infoBuilder.addReference("WebServiceBuilder", WebServiceBuilder.class, NameFactory.MODULE_BUILDER);
211 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true);
212 infoBuilder.addAttribute("listener", AbstractNameQuery.class, true);
213 infoBuilder.addReference("WebServiceLinkTemplate", Object.class, NameFactory.WEB_SERVICE_LINK);
214 infoBuilder.addAttribute("kernel", Kernel.class, false);
215
216 infoBuilder.setConstructor(new String[]{
217 "WebServiceBuilder",
218 "defaultEnvironment",
219 "listener",
220 "WebServiceLinkTemplate",
221 "kernel"
222 });
223
224 GBEAN_INFO = infoBuilder.getBeanInfo();
225 }
226
227 public static GBeanInfo getGBeanInfo() {
228 return GBEAN_INFO;
229 }
230
231 }