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