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.List;
022 import java.util.Map;
023
024 import org.apache.commons.logging.Log;
025 import org.apache.commons.logging.LogFactory;
026 import org.apache.geronimo.common.DeploymentException;
027 import org.apache.geronimo.j2ee.deployment.Module;
028 import org.apache.geronimo.j2ee.deployment.WebModule;
029 import org.apache.geronimo.jaxws.JAXWSUtils;
030 import org.apache.geronimo.jaxws.PortInfo;
031 import org.apache.geronimo.xbeans.javaee.ServletMappingType;
032 import org.apache.geronimo.xbeans.javaee.ServletType;
033 import org.apache.geronimo.xbeans.javaee.WebAppType;
034
035 public class SimpleWARWebServiceFinder implements WebServiceFinder {
036
037 private static final Log LOG = LogFactory.getLog(SimpleWARWebServiceFinder.class);
038
039 public Map<String, PortInfo> discoverWebServices(Module module,
040 boolean isEJB,
041 Map correctedPortLocations)
042 throws DeploymentException {
043 Map<String, PortInfo> map = new HashMap<String, PortInfo>();
044 discoverPOJOWebServices(module, correctedPortLocations, map);
045 return map;
046 }
047
048 private void discoverPOJOWebServices(Module module,
049 Map correctedPortLocations,
050 Map<String, PortInfo> map)
051 throws DeploymentException {
052 ClassLoader classLoader = module.getEarContext().getClassLoader();
053 WebAppType webApp = (WebAppType) module.getSpecDD();
054
055 // find web services
056 ServletType[] servletTypes = webApp.getServletArray();
057
058 if (webApp.getDomNode().getChildNodes().getLength() == 0) {
059 // web.xml not present (empty really), discover annotated
060 // classes and update DD
061 List<Class> services = WARWebServiceFinder.discoverWebServices(module.getModuleFile(), false, this.getClass().getClassLoader());
062 String contextRoot = ((WebModule) module).getContextRoot();
063 for (Class service : services) {
064 // skip interfaces and such
065 if (!JAXWSUtils.isWebService(service)) {
066 continue;
067 }
068
069 LOG.debug("Discovered POJO Web Service: " + service.getName());
070
071 // add new <servlet/> element
072 ServletType servlet = webApp.addNewServlet();
073 servlet.addNewServletName().setStringValue(service.getName());
074 servlet.addNewServletClass().setStringValue(service.getName());
075
076 // add new <servlet-mapping/> element
077 String location = "/" + JAXWSUtils.getServiceName(service);
078 ServletMappingType servletMapping = webApp.addNewServletMapping();
079 servletMapping.addNewServletName().setStringValue(service.getName());
080 servletMapping.addNewUrlPattern().setStringValue(location);
081
082 // map service
083 PortInfo portInfo = new PortInfo();
084 portInfo.setLocation(contextRoot + location);
085 map.put(service.getName(), portInfo);
086 }
087 } else {
088 // web.xml present, examine servlet classes and check for web
089 // services
090 for (ServletType servletType : servletTypes) {
091 String servletName = servletType.getServletName().getStringValue().trim();
092 if (servletType.isSetServletClass()) {
093 String servletClassName = servletType.getServletClass().getStringValue().trim();
094 try {
095 Class servletClass = classLoader.loadClass(servletClassName);
096 if (JAXWSUtils.isWebService(servletClass)) {
097 LOG.debug("Found POJO Web Service: " + servletName);
098 PortInfo portInfo = new PortInfo();
099 map.put(servletName, portInfo);
100 }
101 } catch (Exception e) {
102 throw new DeploymentException("Failed to load servlet class "
103 + servletClassName, e);
104 }
105 }
106 }
107
108 // update web service locations
109 for (Map.Entry entry : map.entrySet()) {
110 String servletName = (String) entry.getKey();
111 PortInfo portInfo = (PortInfo) entry.getValue();
112
113 String location = (String) correctedPortLocations.get(servletName);
114 if (location != null) {
115 portInfo.setLocation(location);
116 }
117 }
118 }
119 }
120
121 }