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$ $Date$
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    }