You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2007/09/27 19:46:32 UTC

svn commit: r580113 - in /geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder: WARWebServiceFinder.java WebServiceFinder.java

Author: gawor
Date: Thu Sep 27 10:46:30 2007
New Revision: 580113

URL: http://svn.apache.org/viewvc?rev=580113&view=rev
Log:
forgot to commit

Added:
    geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java   (with props)
    geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java   (with props)

Added: geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java?rev=580113&view=auto
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java (added)
+++ geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java Thu Sep 27 10:46:30 2007
@@ -0,0 +1,217 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.jaxws.builder;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import javax.jws.WebService;
+import javax.xml.ws.WebServiceProvider;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.util.DeploymentUtil;
+import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.j2ee.deployment.WebModule;
+import org.apache.geronimo.jaxws.JAXWSUtils;
+import org.apache.geronimo.jaxws.PortInfo;
+import org.apache.geronimo.kernel.classloader.JarFileClassLoader;
+import org.apache.geronimo.xbeans.javaee.ServletMappingType;
+import org.apache.geronimo.xbeans.javaee.ServletType;
+import org.apache.geronimo.xbeans.javaee.WebAppType;
+import org.apache.xbean.finder.ClassFinder;
+
+public class WARWebServiceFinder implements WebServiceFinder {
+
+    private static final Log LOG = LogFactory.getLog(WARWebServiceFinder.class);
+    
+    public Map<String, PortInfo> discoverWebServices(Module module, 
+                                                     boolean isEJB,
+                                                     Map correctedPortLocations)
+            throws DeploymentException {
+        Map<String, PortInfo> map = new HashMap<String, PortInfo>();
+        discoverPOJOWebServices(module, correctedPortLocations, map);
+        return map;
+    }
+
+    private void discoverPOJOWebServices(Module module,
+                                         Map correctedPortLocations,
+                                         Map<String, PortInfo> map) 
+        throws DeploymentException {
+        ClassLoader classLoader = module.getEarContext().getClassLoader();
+        WebAppType webApp = (WebAppType) module.getSpecDD();
+
+        // find web services
+        ServletType[] servletTypes = webApp.getServletArray();
+
+        if (webApp.getDomNode().getChildNodes().getLength() == 0) {
+            // web.xml not present (empty really), discover annotated
+            // classes and update DD
+            List<Class> services = discoverWebServices(module.getModuleFile(), false);
+            String contextRoot = ((WebModule) module).getContextRoot();
+            for (Class service : services) {
+                // skip interfaces and such
+                if (!JAXWSUtils.isWebService(service)) {
+                    continue;
+                }
+
+                LOG.debug("Discovered POJO Web Service: " + service.getName());
+                
+                // add new <servlet/> element
+                ServletType servlet = webApp.addNewServlet();
+                servlet.addNewServletName().setStringValue(service.getName());
+                servlet.addNewServletClass().setStringValue(service.getName());
+
+                // add new <servlet-mapping/> element
+                String location = "/" + JAXWSUtils.getServiceName(service);
+                ServletMappingType servletMapping = webApp.addNewServletMapping();
+                servletMapping.addNewServletName().setStringValue(service.getName());
+                servletMapping.addNewUrlPattern().setStringValue(location);
+
+                // map service
+                PortInfo portInfo = new PortInfo();
+                portInfo.setLocation(contextRoot + location);
+                map.put(service.getName(), portInfo);
+            }
+        } else {
+            // web.xml present, examine servlet classes and check for web
+            // services
+            for (ServletType servletType : servletTypes) {
+                String servletName = servletType.getServletName().getStringValue().trim();
+                if (servletType.isSetServletClass()) {
+                    String servletClassName = servletType.getServletClass().getStringValue().trim();
+                    try {
+                        Class servletClass = classLoader.loadClass(servletClassName);
+                        if (JAXWSUtils.isWebService(servletClass)) {
+                            LOG.debug("Found POJO Web Service: " + servletName);
+                            PortInfo portInfo = new PortInfo();
+                            map.put(servletName, portInfo);
+                        }
+                    } catch (Exception e) {
+                        throw new DeploymentException("Failed to load servlet class "
+                                                      + servletClassName, e);
+                    }
+                }
+            }
+
+            // update web service locations
+            for (Map.Entry entry : map.entrySet()) {
+                String servletName = (String) entry.getKey();
+                PortInfo portInfo = (PortInfo) entry.getValue();
+
+                String location = (String) correctedPortLocations.get(servletName);
+                if (location != null) {
+                    portInfo.setLocation(location);
+                }
+            }
+        }
+    } 
+    
+    /**
+     * Returns a list of any classes annotated with @WebService or
+     * @WebServiceProvider annotation.
+     */
+    private List<Class> discoverWebServices(JarFile moduleFile,
+                                            boolean isEJB)                                                      
+            throws DeploymentException {
+        LOG.debug("Discovering web service classes");
+
+        File tmpDir = null;
+        List<URL> urlList = new ArrayList<URL>();
+        if (isEJB) {
+            File jarFile = new File(moduleFile.getName());
+            try {
+                urlList.add(jarFile.toURL());
+            } catch (MalformedURLException e) {
+                // this should not happen
+                throw new DeploymentException(e);
+            }
+        } else {
+            /*
+             * Can't get ClassLoader to load nested Jar files, so
+             * unpack the module Jar file and discover all nested Jar files
+             * within it and the classes/ directory.
+             */
+            try {
+                tmpDir = DeploymentUtil.createTempDir();
+                /*
+                 * This is needed becuase DeploymentUtil.unzipToDirectory()
+                 * always closes the passed JarFile.
+                 */
+                JarFile module = new JarFile(moduleFile.getName());
+                DeploymentUtil.unzipToDirectory(module, tmpDir);
+            } catch (IOException e) {
+                if (tmpDir != null) {
+                    DeploymentUtil.recursiveDelete(tmpDir);
+                }
+                throw new DeploymentException("Failed to expand the module archive", e);
+            }
+
+            // create URL list
+            Enumeration<JarEntry> jarEnum = moduleFile.entries();
+            while (jarEnum.hasMoreElements()) {
+                JarEntry entry = jarEnum.nextElement();
+                String name = entry.getName();
+                if (name.equals("WEB-INF/classes/")) {
+                    // ensure it is first
+                    File classesDir = new File(tmpDir, "WEB-INF/classes/");
+                    try {
+                        urlList.add(0, classesDir.toURL());
+                    } catch (MalformedURLException e) {
+                        // this should not happen, ignore
+                    }
+                } else if (name.startsWith("WEB-INF/lib/")
+                        && name.endsWith(".jar")) {
+                    File jarFile = new File(tmpDir, name);
+                    try {
+                        urlList.add(jarFile.toURL());
+                    } catch (MalformedURLException e) {
+                        // this should not happen, ignore
+                    }
+                }
+            }
+        }
+        
+        URL[] urls = urlList.toArray(new URL[] {});
+        JarFileClassLoader tempClassLoader = new JarFileClassLoader(null, urls, this.getClass().getClassLoader());
+        ClassFinder classFinder = new ClassFinder(tempClassLoader, urlList);
+
+        List<Class> classes = new ArrayList<Class>();
+
+        classes.addAll(classFinder.findAnnotatedClasses(WebService.class));
+        classes.addAll(classFinder.findAnnotatedClasses(WebServiceProvider.class));       
+
+        tempClassLoader.destroy();
+
+        if (tmpDir != null) {
+            DeploymentUtil.recursiveDelete(tmpDir);
+        }
+
+        return classes;
+    }
+}

Propchange: geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WARWebServiceFinder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java?rev=580113&view=auto
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java (added)
+++ geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java Thu Sep 27 10:46:30 2007
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.jaxws.builder;
+
+import java.util.Map;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.j2ee.deployment.Module;
+import org.apache.geronimo.jaxws.PortInfo;
+
+public interface WebServiceFinder {
+
+    Map<String, PortInfo> discoverWebServices(Module module,
+                                              boolean isEJB,
+                                              Map correctedPortLocations)
+         throws DeploymentException;
+
+}

Propchange: geronimo/server/trunk/modules/geronimo-jaxws-builder/src/main/java/org/apache/geronimo/jaxws/builder/WebServiceFinder.java
------------------------------------------------------------------------------
    svn:eol-style = native