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.jaxws.builder;
019    
020    import java.util.HashMap;
021    import java.util.Map;
022    
023    import org.apache.commons.logging.Log;
024    import org.apache.commons.logging.LogFactory;
025    import org.apache.geronimo.common.DeploymentException;
026    import org.apache.geronimo.j2ee.deployment.Module;
027    import org.apache.geronimo.jaxws.JAXWSUtils;
028    import org.apache.geronimo.jaxws.PortInfo;
029    import org.apache.geronimo.openejb.deployment.EjbModule;
030    import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
031    
032    public class EJBWebServiceFinder implements WebServiceFinder {
033    
034        private static final Log LOG = LogFactory.getLog(EJBWebServiceFinder.class);
035        
036        public Map<String, PortInfo> discoverWebServices(Module module, 
037                                                         boolean isEJB,
038                                                         Map correctedPortLocations)
039                throws DeploymentException {
040            Map<String, PortInfo> map = new HashMap<String, PortInfo>();
041            discoverEJBWebServices(module, correctedPortLocations, map);
042            return map;
043        }
044    
045        private void discoverEJBWebServices(Module module,
046                                            Map correctedPortLocations,
047                                            Map<String, PortInfo> map) 
048            throws DeploymentException {
049            ClassLoader classLoader = module.getEarContext().getClassLoader();
050            EjbModule ejbModule = (EjbModule) module;
051            for (EnterpriseBeanInfo bean : ejbModule.getEjbJarInfo().enterpriseBeans) {
052                if (bean.type != EnterpriseBeanInfo.STATELESS) {
053                    continue;
054                }            
055                try {
056                    Class ejbClass = classLoader.loadClass(bean.ejbClass);
057                    if (JAXWSUtils.isWebService(ejbClass)) {
058                        LOG.debug("Found EJB Web Service: " + bean.ejbName);
059                        PortInfo portInfo = new PortInfo();
060                        String location = (String) correctedPortLocations.get(bean.ejbName);
061                        if (location == null) {
062                            // set default location, i.e. /@WebService.serviceName/@WebService.name
063                            location = "/" + JAXWSUtils.getServiceName(ejbClass) + "/" + JAXWSUtils.getName(ejbClass);
064                        }
065                        portInfo.setLocation(location);
066                        map.put(bean.ejbName, portInfo);
067                    }
068                } catch (Exception e) {
069                    throw new DeploymentException("Failed to load ejb class "
070                                                  + bean.ejbName, e);
071                }
072            }
073        }
074    }