dain 2004/01/22 18:25:52
Added: sandbox/webdav .cvsignore LICENSE.txt project.properties project.xml sandbox/webdav/src/deploy/jetty jetty-config.xml webdefault.xml sandbox/webdav/src/java/org/apache/geronimo/webdav AbstractConnector.java CatalinaDAVRepository.java Connector.java DAVRepository.java DAVServer.java sandbox/webdav/src/java/org/apache/geronimo/webdav/jetty JettyConnector.java JettyConnectorImpl.java JettyDAVServer.java Log: Moved from old web module Revision Changes Path 1.1 incubator-geronimo/sandbox/webdav/.cvsignore Index: .cvsignore =================================================================== target 1.1 incubator-geronimo/sandbox/webdav/LICENSE.txt Index: LICENSE.txt =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ 1.1 incubator-geronimo/sandbox/webdav/project.properties Index: project.properties =================================================================== ## ## $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ ## maven.repo.remote=http://www.apache.org/~dain/maven, http://www.ibiblio.org/maven, http://www.apache.org/~gdamour/maven 1.1 incubator-geronimo/sandbox/webdav/project.xml Index: project.xml =================================================================== <?xml version="1.0" encoding="ISO-8859-1"?> <!-- $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ --> <project> <pomVersion>3</pomVersion> <extend>${basedir}/../../etc/project.xml</extend> <!-- ===================== --> <!-- Module Identification --> <!-- ===================== --> <name>Geronimo :: Web</name> <id>geronimo-web</id> <shortDescription>Geronimo Web Container</shortDescription> <description>Geronimo Web Container</description> <url>http://incubator.apache.org/projects/geronimo/web/</url> <siteDirectory>/www/incubator.apache.org/projects/geronimo/web</siteDirectory> <distributionDirectory>/www/incubator.apache.org/projects/geronimo/builds/web</distributionDirectory> <currentVersion>DEV</currentVersion> <!-- ============ --> <!-- Dependencies --> <!-- ============ --> <dependencies> <dependency> <groupId>geronimo</groupId> <artifactId>geronimo-kernel</artifactId> <version>DEV</version> <properties> <module>true</module> </properties> </dependency> <dependency> <id>commons-logging</id> <version>1.0.3</version> <url>http://jakarta.apache.org/commons/logging/</url> <properties> <runtime>false</runtime> </properties> </dependency> <dependency> <id>jetty</id> <version>SNAPSHOT</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>catalina</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>catalina-optional</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>naming-common</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>naming-resources</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>servlets-common</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>servlets-default</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>servlets-webdav</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> <dependency> <groupId>tomcat</groupId> <artifactId>tomcat-util</artifactId> <version>5.0.16</version> <properties> <runtime>true</runtime> </properties> </dependency> </dependencies> <!-- =================== --> <!-- Build Specification --> <!-- =================== --> <build> <resources> <resource> <directory>${basedir}/src/conf</directory> <includes> <include>*.properties</include> </includes> </resource> </resources> </build> </project> 1.1 incubator-geronimo/sandbox/webdav/src/deploy/jetty/jetty-config.xml Index: jetty-config.xml =================================================================== <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure 1.2//EN" "http://jetty.mortbay.org/configure_1_2.dtd"> <Configure class="org.mortbay.jetty.Server"> <!-- =============================================================== --> <!-- Configure the Request Listeners --> <!-- =============================================================== --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- Add and configure a HTTP listener to port 8080 --> <!-- The default port can be changed using: java -Djetty.port=80 --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <Call name="addListener"> <Arg> <New class="org.mortbay.http.SocketListener"> <Set name="Port"> <SystemProperty name="jetty.port" default="8080"/> </Set> <Set name="MinThreads">10</Set> <Set name="MaxThreads">100</Set> <Set name="MaxIdleTimeMs">30000</Set> <Set name="LowResourcePersistTimeMs">5000</Set> </New> </Arg> </Call> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- Add a HTTPS SSL listener on port 8843 --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- UNCOMMENT TO ACTIVATE <Call name="addListener"> <Arg> <New class="org.mortbay.http.SunJsseListener"> <Set name="Port">8443</Set> <Set name="MinThreads">5</Set> <Set name="MaxThreads">100</Set> <Set name="MaxIdleTimeMs">30000</Set> <Set name="LowResourcePersistTimeMs">2000</Set> <Set name="Keystore"><SystemProperty name="jetty.home.dir"/>/conf/demokeystore</Set> <Set name="Password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set> <Set name="KeyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set> </New> </Arg> </Call> --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- Add a AJP13 listener on port 8009 --> <!-- This protocol can be used with mod_jk in apache, IIS etc. --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- <Call name="addListener"> <Arg> <New class="org.mortbay.http.ajp.AJP13Listener"> <Set name="Port">8009</Set> <Set name="MinThreads">5</Set> <Set name="MaxThreads">20</Set> <Set name="MaxIdleTimeMs">0</Set> <Set name="confidentialPort">443</Set> </New> </Arg> </Call> --> <!-- =============================================================== --> <!-- Configure the Request Log --> <!-- =============================================================== --> <Set name="RequestLog"> <New class="org.mortbay.http.NCSARequestLog"> <Arg> <SystemProperty name="jetty.home.dir"/>/yyyy_mm_dd.request.log </Arg> <Set name="retainDays">90</Set> <Set name="append">true</Set> <Set name="extended">true</Set> <Set name="buffered">false</Set> <Set name="LogTimeZone">GMT</Set> </New> </Set> <Call name="addWebApplication"> <Arg></Arg> <Arg>console</Arg> <Arg> <SystemProperty name="jetty.home.dir"/>/geronimo-web-console.war </Arg> <Call name="setDefaultsDescriptor"> <Arg> <SystemProperty name="jetty.home.dir"/>/webdefault.xml </Arg> </Call> <Call name="setExtractWAR"> <Arg type="boolean">true</Arg> </Call> </Call> </Configure> 1.1 incubator-geronimo/sandbox/webdav/src/deploy/jetty/webdefault.xml Index: webdefault.xml =================================================================== <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <!-- ===================================================================== --> <!-- This file contains the default descriptor for web applications. --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- The original of this file is included as a resource in the --> <!-- org.mortbay.jetty.jar file and is loaded by default for all web --> <!-- applications before there own WEB-INF/web.xml file is loaded --> <!-- --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- THE COPY OF THIS FILE in $JETTY_HOME/etc IS NOT USED BY DEFAULT! --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- If the version in $JETTY_HOME/etc/ is to be used, then the --> <!-- setDefaultsDescriptor method must be called on each context, --> <!-- giving the location of the default web.xml file to use. --> <!-- eg of setting the defaultsDescriptor in jetty.xml: <Call name="addWebApplication"> <Arg>/mycontext</Arg> <Arg><SystemProperty name="jetty.home" default=".">/webapps/mywebapp</Arg> <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set> </Call> --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- ===================================================================== --> <web-app> <description> Default web.xml file. This file is applied to a Web application before it's own WEB_INF/web.xml file </description> <!-- ==================================================================== --> <!-- Context params to control Session Cookies --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- UNCOMMENT TO ACTIVATE <context-param> <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name> <param-value>127.0.0.1</param-value> </context-param> <context-param> <param-name>org.mortbay.jetty.servlet.SessionPath</param-name> <param-value>/</param-value> </context-param> <context-param> <param-name>org.mortbay.jetty.servlet.MaxAge</param-name> <param-value>-1</param-value> </context-param> --> <!-- ==================================================================== --> <!-- The default servlet. --> <!-- This servlet, normally mapped to /, provides the handling for static --> <!-- content, OPTION and TRACE methods for the context. --> <!-- The following initParameters are supported: --> <!-- --> <!-- acceptRanges If true, range requests and responses are --> <!-- supported --> <!-- --> <!-- dirAllowed If true, directory listings are returned if no --> <!-- welcome file is found. Else 403 Forbidden. --> <!-- --> <!-- putAllowed If true, the PUT method is allowed --> <!-- --> <!-- delAllowed If true, the DELETE method is allowed --> <!-- --> <!-- redirectWelcome If true, redirect welcome file requests --> <!-- else use request dispatcher forwards --> <!-- --> <!-- minGzipLength If set to a positive integer, then static content --> <!-- larger than this will be served as gzip content --> <!-- encoded if a matching resource is found ending --> <!-- with ".gz" --> <!-- --> <!-- resoureBase Can be set to replace the context resource base --> <!-- --> <!-- The MOVE method is allowed if PUT and DELETE are allowed --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <servlet> <servlet-name>default</servlet-name> <servlet-class>org.mortbay.jetty.servlet.Default</servlet-class> <init-param> <param-name>acceptRanges</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>dirAllowed</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>putAllowed</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>delAllowed</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>redirectWelcome</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>minGzipLength</param-name> <param-value>8192</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <!-- ==================================================================== --> <!-- JSP Servlet --> <!-- This is the jasper JSP servlet from the jakarta project --> <!-- The following initParameters are supported: --> <!-- --> <!-- classpath What class path should I use while compiling --> <!-- generated servlets? [Created dynamically --> <!-- based on the current web application] --> <!-- --> <!-- classdebuginfo Should the class file be compiled with --> <!-- debugging information? [false] --> <!-- --> <!-- ieClassId The class-id value to be sent to Internet --> <!-- Explorer when using <jsp:plugin> tags. --> <!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] --> <!-- --> <!-- jspCompilerPlugin The fully qualified class name of the JSP --> <!-- compiler plug-in to be used. See below for --> <!-- more information. --> <!-- [Use internal JDK compiler] --> <!-- --> <!-- keepgenerated Should we keep the generated Java source code --> <!-- for each page instead of deleting it? [true] --> <!-- --> <!-- largefile Should we store the static content of JSP --> <!-- pages in external data files, to reduce the --> <!-- size of the generated servlets? [false] --> <!-- --> <!-- logVerbosityLevel The level of detailed messages to be produced --> <!-- by this servlet. Increasing levels cause the --> <!-- generation of more messages. Valid values are --> <!-- FATAL, ERROR, WARNING, INFORMATION, and DEBUG. --> <!-- [WARNING] --> <!-- --> <!-- mappedfile Should we generate static content with one --> <!-- print statement per input line, to ease --> <!-- debugging? [false] --> <!-- --> <!-- scratchdir What scratch directory should we use when --> <!-- compiling JSP pages? [default work directory --> <!-- for the current web application] --> <!-- --> <!-- If you wish to use Jikes to compile JSP pages: --> <!-- * Set the "classpath" initialization parameter appropriately --> <!-- for this web application. --> <!-- * Set the "jspCompilerPlugin" initialization parameter to --> <!-- "org.apache.jasper.compiler.JikesJavaCompiler". --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <!-- ==================================================================== --> <!-- Dynamic Servlet Invoker. --> <!-- This servlet invokes anonymous servlets that have not been defined --> <!-- in the web.xml or by other means. The first element of the pathInfo --> <!-- of a request passed to the envoker is treated as a servlet name for --> <!-- an existing servlet, or as a class name of a new servlet. --> <!-- This servlet is normally mapped to /servlet/* --> <!-- This servlet support the following initParams: --> <!-- --> <!-- nonContextServlets If false, the invoker can only load --> <!-- servlets from the contexts classloader. --> <!-- This is false by default and setting this --> <!-- to true may have security implications. --> <!-- --> <!-- verbose If true, log dynamic loads --> <!-- --> <!-- * All other parameters are copied to the --> <!-- each dynamic servlet as init parameters --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <servlet> <servlet-name>invoker</servlet-name> <servlet-class>org.mortbay.jetty.servlet.Invoker</servlet-class> <init-param> <param-name>verbose</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>nonContextServlets</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>dynamicParam</param-name> <param-value>anyValue</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <!-- ==================================================================== --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- ==================================================================== --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <!-- ==================================================================== --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jspf</url-pattern> </servlet-mapping> <!-- ==================================================================== --> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> <!-- ==================================================================== --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- ==================================================================== --> <!-- Default MIME mappings --> <!-- The default MIME mappings are provided by the mime.properties --> <!-- resource in the org.mortbay.jetty.jar file. Additional or modified --> <!-- mappings may be specified here --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- UNCOMMENT TO ACTIVATE <mime-mapping> <extension>mysuffix</extension> <mime-type>mymime/type</mime-type> </mime-mapping> --> <!-- ==================================================================== --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/AbstractConnector.java Index: AbstractConnector.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav; import java.net.InetAddress; import java.net.UnknownHostException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.geronimo.gbean.GAttributeInfo; import org.apache.geronimo.gbean.GBean; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoFactory; import org.apache.geronimo.gbean.GConstructorInfo; /** * Base implementation for the Connector contracts. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public abstract class AbstractConnector implements Connector, GBean { protected final Log log = LogFactory.getLog(getClass()); /** * Port. */ protected int port; /** * Protocol. */ protected String protocol; /** * Host. */ private String host; /** * Maximum number of connections. */ protected int maxCon; /** * Maximum idle time. */ protected int maxIdle; /** * Creates a connector having the specified specificities. * * @param aProtocol Protocol. * @param anHost Host. * @param aPort Port. * @param aMaxCon Maximum number of connections. * @param aMaxIdle Maximum idle time. */ public AbstractConnector(String aProtocol, String anHost, int aPort, int aMaxCon, int aMaxIdle) { protocol = aProtocol; host = anHost; port = aPort; maxCon = aMaxCon; maxIdle = aMaxIdle; } public void setPort(int aPort) { port = aPort; } public int getPort() { return port; } public void setProtocol(String aProtocol) { protocol = aProtocol; } public String getProtocol() { return protocol; } public void setInterface(String anInterface) { host = anInterface; } /** * Gets the interface/host of this Connector. * <BR> * If it has not been set explicitely, then the host name of the localhost * is set and returned. * * @return Interface. */ public synchronized String getInterface() { if (null != host) { return host; } try { host = InetAddress.getLocalHost().getHostName(); return host; } catch (UnknownHostException e) { // Should not happen. log.error(e); throw new RuntimeException(e); } } public void setMaxConnections(int aMaxConnects) { maxCon = aMaxConnects; } public int getMaxConnections() { return maxCon; } public void setMaxIdleTime(int aMaxIdleTime) { maxIdle = aMaxIdleTime; } public int getMaxIdleTime() { return maxIdle; } private final static GBeanInfo GBEAN_INFO; static { GBeanInfoFactory infoFactory = new GBeanInfoFactory("Abstract Connector", AbstractConnector.class.getName()); infoFactory.addAttribute(new GAttributeInfo("Port", true)); infoFactory.addAttribute(new GAttributeInfo("Protocol", true)); infoFactory.addAttribute(new GAttributeInfo("Interface", true)); infoFactory.addAttribute(new GAttributeInfo("MaxConnections", true)); infoFactory.addAttribute(new GAttributeInfo("MaxIdleTime", true)); infoFactory.setConstructor(new GConstructorInfo( new String[]{"Protocol", "Interface", "Port", "MaxConnections", "MaxIdleTime"}, new Class[]{String.class, String.class, Integer.TYPE, Integer.TYPE, Integer.TYPE})); GBEAN_INFO = infoFactory.getBeanInfo(); } public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; } } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/CatalinaDAVRepository.java Index: CatalinaDAVRepository.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav; import java.io.File; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.naming.directory.DirContext; import org.apache.catalina.Globals; import org.apache.catalina.servlets.WebdavServlet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.geronimo.gbean.GAttributeInfo; import org.apache.geronimo.gbean.GBean; import org.apache.geronimo.gbean.GBeanContext; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoFactory; import org.apache.geronimo.gbean.GConstructorInfo; import org.apache.geronimo.gbean.WaitingException; import org.apache.naming.resources.FileDirContext; /** * DAVRepository implementation using the Tomcat WebDAV servlet as the * processing servlet. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public class CatalinaDAVRepository implements DAVRepository, GBean { private static final Log log = LogFactory.getLog(CatalinaDAVRepository.class); private static final Class HANDLING_SERVLET = WebdavServlet.class; private final static GBeanInfo GBEAN_INFO; /** * DirContext abstracting the repository exposed by this repository. */ private final DirContext dirContext; /** * Root of the repository. */ private final File root; /** * Host filter. */ private final String host; /** * Servlet context. */ private final String context; /** * Servlet context attribute name to value. */ private final Map servletContextAttr; /** * Servlet init parameter name to value. */ private final Map servletInitParam; /** * Builds a DAVRepository relying on Tomcat WebDAV servlet in order to * process the WebDAV request. * * @param aRoot Root of the directory/DirContext exposed by this repository. * @param aContext Context within which the servlet should be mounted. * @param anHost Host filter, if any. */ public CatalinaDAVRepository(File aRoot, String aContext, String anHost) { if (null == aRoot) { throw new IllegalArgumentException("Root MUST be specified."); } else if (null == aContext) { throw new IllegalArgumentException("Context MUST be specified."); } context = aContext; host = anHost; if (!aRoot.isDirectory()) { throw new IllegalArgumentException(aRoot.getAbsolutePath() + " does not exist."); } root = aRoot; dirContext = new FileDirContext(); ((FileDirContext) dirContext).setDocBase(root.getAbsolutePath()); servletContextAttr = new HashMap(); servletContextAttr.put(Globals.RESOURCES_ATTR, dirContext); servletInitParam = new HashMap(); servletInitParam.put("readonly", "false"); servletInitParam.put("listings", "true"); } public Class getHandlingServlet() { return HANDLING_SERVLET; } public String getHost() { return host; } public String getContext() { return context; } /** * Gets the root of the directory exposed by this repository. * * @return Root of the exposed directory. */ public File getRoot() { return root; } public DirContext getDirContext() { return dirContext; } public Map getServletContextAttr() { return Collections.unmodifiableMap(servletContextAttr); } public Map getServletInitParam() { return Collections.unmodifiableMap(servletInitParam); } public void setGBeanContext(GBeanContext context) { } public void doStart() throws WaitingException, Exception { log.info("Starting Catalina DAV Repository"); } public void doStop() throws WaitingException { log.info("Stopping Catalina DAV Repository"); } public void doFail() { log.info("Failing Catalina DAV Repository"); } static { GBeanInfoFactory infoFactory = new GBeanInfoFactory("DAV Repository - Catalina WebDAV Servlet", CatalinaDAVRepository.class.getName()); infoFactory.addAttribute(new GAttributeInfo("Root", true)); infoFactory.addAttribute(new GAttributeInfo("Context", true)); infoFactory.addAttribute(new GAttributeInfo("Host", true)); infoFactory.addAttribute(new GAttributeInfo("HandlingServlet")); infoFactory.addAttribute(new GAttributeInfo("ServletContextAttr")); infoFactory.addAttribute(new GAttributeInfo("ServletInitParam")); infoFactory.setConstructor(new GConstructorInfo( Arrays.asList(new Object[]{"Root", "Context", "Host"}), Arrays.asList(new Object[]{File.class, String.class, String.class}))); GBEAN_INFO = infoFactory.getBeanInfo(); } public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; } } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/Connector.java Index: Connector.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav; /** * A Connector is a request listener and response broker. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public interface Connector { /** * Gets listening port number. */ int getPort(); /** * Sets listening port number. */ void setPort(int ort); /** * Gets the protocol name. */ String getProtocol(); /** * Sets the protocol name. */ void setProtocol(String protocol); /** * Gets the network interface name. */ String getInterface(); /** * Sets the network interface name. */ void setInterface(String networkInterface); /** * Gets the maximum number of connections. */ int getMaxConnections(); /** * Sets the maximum number of connections. */ void setMaxConnections(int maxConnects); /** * Sets the maximum idle time. */ int getMaxIdleTime(); /** * Gets the maximum idle time. */ void setMaxIdleTime(int maxIdleTime); } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/DAVRepository.java Index: DAVRepository.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav; import java.util.Map; /** * A DAVRepository defines a WebDAV servlet along with its execution context. * <BR> * A WebDAV servlet is a servlet, which implements the WebDAV specific methods * , e.g. PROPFIND. This servlet is deployed and managed by the DAVServer, * which has mounted this repository. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public interface DAVRepository { /** * Gets the host name filter. * <BR> * If defined, only the requests for this host are forwarded to this * repository. * * @return Host name filter. */ String getHost(); /** * Gets the context of the WebDAV servlet. * <BR> * * @return Context name. */ String getContext(); /** * Gets the WebDAV servlet Class. * * @return WebDAV servlet class. */ Class getHandlingServlet(); /** * Gets the servlet context attributes. * * @return Map of attribute name to value. */ Map getServletContextAttr(); /** * Gets the servlet initialization parameters. * * @return Map of parameter name to value. */ Map getServletInitParam(); } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/DAVServer.java Index: DAVServer.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav; import java.util.Collection; /** * A DAVServer is an HTTP server providing WebDAV capabilities. It allows to * expose, edit and manage a set of repositories remotely via a WebDAV client. * <BR> * The WebDAV protocol could "potentially" be the preferred transport to * distribute a component as its base protocol, HTTP, can usually * traverse firewalls. * <BR> * It is a composition of connectors and repositories. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public interface DAVServer { /** * Gets the connectors of this server. * * @return Collection of Connector instances associated to this server. */ public Collection getConnectors(); /** * Gets the repositories of this server. * * @return Collection of DAVRepository instances associated to this server. */ public Collection getRepositories(); } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/jetty/JettyConnector.java Index: JettyConnector.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav.jetty; import org.apache.geronimo.webdav.Connector; import org.mortbay.http.HttpListener; /** * This interface is required by the IoC framework: JettyConnector is an * endpoint, whose implementation JettyConnectorImpl does not define a * constructor without parameters. * <BR> * This interface captures the operations and attributes, which are exposed * as GBean operations and attributes. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public interface JettyConnector extends Connector { HttpListener getListener(); } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/jetty/JettyConnectorImpl.java Index: JettyConnectorImpl.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav.jetty; import java.lang.reflect.Constructor; import org.apache.geronimo.gbean.GAttributeInfo; import org.apache.geronimo.gbean.GBean; import org.apache.geronimo.gbean.GBeanContext; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoFactory; import org.apache.geronimo.gbean.WaitingException; import org.apache.geronimo.webdav.AbstractConnector; import org.mortbay.http.HttpListener; import org.mortbay.http.SocketListener; import org.mortbay.http.SunJsseListener; import org.mortbay.http.ajp.AJP13Listener; import org.mortbay.util.ThreadedServer; /** * Connector using under the cover a Jetty HttpListener. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public class JettyConnectorImpl extends AbstractConnector implements GBean, JettyConnector { private static final String HTTP_PROTOCOL = "http"; private static final String HTTPS_PROTOCOL = "https"; private static final String AJP13_PROTOCOL = "ajp13"; private final static GBeanInfo GBEAN_INFO; private final static Class[] EMPTY_FORMAL_PARAM = new Class[]{}; private final static Object[] EMPTY_ARGS = new Object[]{}; /** * When the underlying listener is undefined, the GBean operations are * delegated to this state. */ private final GBean undefinedListenerState; /** * When the underlying listener is defined, the GBean operations are * delegated to this state. */ private final GBean definedListenerState; private HttpListener listener; private GBean lifeCycleState; public JettyConnectorImpl(String aProtocol, String anHost, int aPort, int aMaxCon, int aMaxIdle) { super(aProtocol, anHost, aPort, aMaxCon, aMaxIdle); undefinedListenerState = new UndefinedListenerState(); definedListenerState = new DefinedListenerState(); setListener(null); } public HttpListener getListener() { return listener; } private void setListener(HttpListener aListener) { listener = aListener; if (null == listener) { lifeCycleState = undefinedListenerState; } else { lifeCycleState = definedListenerState; } } public void setGBeanContext(GBeanContext context) { } public void doStart() throws WaitingException, Exception { log.info("Starting Jetty Connector"); lifeCycleState.doStart(); } public void doStop() throws WaitingException, Exception { log.info("Stopping Jetty Connector"); lifeCycleState.doStop(); } public void doFail() { log.info("Failing Jetty Connector"); lifeCycleState.doFail(); } static { GBeanInfoFactory infoFactory = new GBeanInfoFactory("Connector - Jetty", JettyConnectorImpl.class.getName(), AbstractConnector.getGBeanInfo()); infoFactory.addAttribute(new GAttributeInfo("Listener")); GBEAN_INFO = infoFactory.getBeanInfo(); } public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; } private class DefinedListenerState implements GBean { public void setGBeanContext(GBeanContext context) { } public void doStart() throws WaitingException, Exception { if (listener.isStarted()) { return; } listener.start(); } public void doStop() throws WaitingException { try { listener.stop(); } catch (Exception e) { log.error("Problem stopping Jetty Connector", e); setListener(null); } } public void doFail() { try { if (listener.isStarted()) { listener.stop(); } } catch (Exception e) { log.error("Can not fail Jetty Connector", e); } setListener(null); } } private class UndefinedListenerState implements GBean { public void setGBeanContext(GBeanContext context) { } public void doStart() throws WaitingException, Exception { HttpListener tmpListener; try { if (null == protocol || protocol.equalsIgnoreCase(HTTP_PROTOCOL)) { tmpListener = new SocketListener(); } else if (protocol.equalsIgnoreCase(AJP13_PROTOCOL)) { tmpListener = new AJP13Listener(); } else if (protocol.equalsIgnoreCase(HTTPS_PROTOCOL)) { tmpListener = new SunJsseListener(); } else { Class listenerClass = Thread.currentThread().getContextClassLoader().loadClass( protocol); Constructor constructor = listenerClass.getConstructor(EMPTY_FORMAL_PARAM); tmpListener = (HttpListener) constructor.newInstance(EMPTY_ARGS); } tmpListener.setPort(getPort()); if (getInterface() != null) { tmpListener.setHost(getInterface()); } if (getMaxConnections() > 0) { ((ThreadedServer) tmpListener).setMaxThreads(getMaxConnections()); } if (getMaxIdleTime() > 0) { ((ThreadedServer) tmpListener).setMaxIdleTimeMs(getMaxIdleTime()); } ((ThreadedServer) tmpListener).open(); tmpListener.start(); } catch (Exception e) { log.error("Problem starting Connector", e); throw e; } setListener(tmpListener); } public void doStop() throws WaitingException { } public void doFail() { } } } 1.1 incubator-geronimo/sandbox/webdav/src/java/org/apache/geronimo/webdav/jetty/JettyDAVServer.java Index: JettyDAVServer.java =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache Geronimo" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * "Apache Geronimo", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * ==================================================================== */ package org.apache.geronimo.webdav.jetty; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.geronimo.gbean.EndpointCollection; import org.apache.geronimo.gbean.EndpointCollectionEvent; import org.apache.geronimo.gbean.EndpointCollectionListener; import org.apache.geronimo.gbean.GBean; import org.apache.geronimo.gbean.GBeanContext; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoFactory; import org.apache.geronimo.gbean.GEndpointInfo; import org.apache.geronimo.gbean.WaitingException; import org.apache.geronimo.webdav.DAVRepository; import org.apache.geronimo.webdav.DAVServer; import org.mortbay.http.HttpListener; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.servlet.ServletHttpContext; /** * DAVServer using under the cover a light Jetty servlet container. * * @version $Revision: 1.1 $ $Date: 2004/01/23 02:25:51 $ */ public class JettyDAVServer implements DAVServer, GBean { private static final Log log = LogFactory.getLog(JettyDAVServer.class); /** * Jetty Server doing the actual work. */ private final Server server; /** * DAVRepository to ServletHolder map. */ private final Map repToServletHolder; /** * Connector to HttpListener map. */ private final Map conToListener; /** * Repositories served by this server. */ private EndpointCollection repositories; private final EndpointCollectionListener repositoryListener = new EndpointCollectionListener() { public void memberAdded(EndpointCollectionEvent event) { addRepository((DAVRepository) event.getMember()); } public void memberRemoved(EndpointCollectionEvent event) { removeRepository((DAVRepository) event.getMember()); } }; /** * Connectors injecting requests to this server. */ private EndpointCollection connectors; private final EndpointCollectionListener connectorListener = new EndpointCollectionListener() { public void memberAdded(EndpointCollectionEvent event) { addConnector((JettyConnector) event.getMember()); } public void memberRemoved(EndpointCollectionEvent event) { removeConnector((JettyConnector) event.getMember()); } }; public JettyDAVServer() throws Exception { server = new Server(); repToServletHolder = new HashMap(); conToListener = new HashMap(); } public void setConnectors(Collection aCollOfConnectors) { if (null == aCollOfConnectors) { connectors.removeEndpointCollectionListener(connectorListener); for (Iterator iter = connectors.iterator(); iter.hasNext();) { removeConnector((JettyConnector) iter.next()); } } connectors = (EndpointCollection) aCollOfConnectors; if (null != connectors) { connectors.addEndpointCollectionListener(connectorListener); for (Iterator iter = connectors.iterator(); iter.hasNext();) { addConnector((JettyConnector) iter.next()); } } } public void addConnector(JettyConnector aConnector) { // The Connector MUST be running at this stage, otherwise a null // listener is returned. This is enforced by the endpoint mechanism, // which publishes only running endpoints. if (null == aConnector.getListener()) { throw new IllegalStateException("No defined listener."); } server.addListener(aConnector.getListener()); synchronized (conToListener) { conToListener.put(aConnector, aConnector.getListener()); } } public void removeConnector(JettyConnector aConnector) { // At this stage, the connector could be failed. In this later case // the underlying listener is undefined. Hence the conToListener Map. HttpListener httpListener; synchronized (conToListener) { httpListener = (HttpListener) conToListener.remove(aConnector); } if (null == httpListener) { throw new IllegalStateException("Connector not registered."); } server.removeListener(httpListener); } public void setRepositories(Collection aCollOfRepositories) { if (null == aCollOfRepositories) { repositories.removeEndpointCollectionListener(repositoryListener); for (Iterator iter = repositories.iterator(); iter.hasNext();) { removeRepository((DAVRepository) iter.next()); } } repositories = (EndpointCollection) aCollOfRepositories; if (null != repositories) { repositories.addEndpointCollectionListener(repositoryListener); for (Iterator iter = repositories.iterator(); iter.hasNext();) { addRepository((DAVRepository) iter.next()); } } } /** * Adds a DAVRepository to this server. * * @param aRepository DAVRepository to be served by this server. */ public void addRepository(DAVRepository aRepository) { // Gets the context associated to this repository. ServletHttpContext context = (ServletHttpContext) server.getContext(aRepository.getHost(), aRepository.getContext()); // Defines the servlet context attributes. Map attributes = aRepository.getServletContextAttr(); for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) { Map.Entry attribute = (Map.Entry) iter.next(); context.setAttribute((String) attribute.getKey(), attribute.getValue()); } ServletHolder holder = null; try { // Defines the WebDAV servlet. holder = context.addServlet("DAVRepository", "/*", aRepository.getHandlingServlet().getName()); // Defines the servlet init parameters. attributes = aRepository.getServletInitParam(); for (Iterator iter = attributes.entrySet().iterator(); iter.hasNext();) { Map.Entry attribute = (Map.Entry) iter.next(); holder.setInitParameter((String) attribute.getKey(), (String) attribute.getValue()); } context.start(); } catch (Exception e) { log.error(e); throw new RuntimeException(e); } synchronized (repToServletHolder) { repToServletHolder.put(aRepository, holder); } } public void removeRepository(DAVRepository aRepository) { ServletHolder holder; synchronized (repToServletHolder) { holder = (ServletHolder) repToServletHolder.remove(aRepository); if (null == holder) { throw new IllegalArgumentException(aRepository + " is not contained by " + this); } } holder.getHttpHandler().getHttpContext().removeHandler(holder.getHttpHandler()); // Undefined the servlet context attributes. Map attributes = aRepository.getServletContextAttr(); for (Iterator iter = attributes.keySet().iterator(); iter.hasNext();) { String attribute = (String) iter.next(); holder.getHttpHandler().getHttpContext().removeAttribute(attribute); } } public Collection getRepositories() { return repositories; } public Collection getConnectors() { return connectors; } public void setGBeanContext(GBeanContext context) { } public void doStart() throws WaitingException, Exception { log.info("Starting Jetty DAV Server"); try { server.start(); } catch (Exception e) { log.error("Can not start Jetty DAV Server", e); throw e; } } public void doStop() throws WaitingException { log.info("Stopping Jetty DAV Server"); try { server.stop(); } catch (Exception e) { log.error("Can not start Jetty DAV server", e); } } public void doFail() { log.info("Failing Jetty DAV Server"); try { if (server.isStarted()) { server.stop(); } } catch (Exception e) { log.error("Can not start Jetty DAV server", e); } } private final static GBeanInfo GBEAN_INFO; static { GBeanInfoFactory infoFactory = new GBeanInfoFactory("DAV Server - Jetty", JettyDAVServer.class.getName()); infoFactory.addEndpoint(new GEndpointInfo("Connectors", JettyConnector.class.getName())); infoFactory.addEndpoint(new GEndpointInfo("Repositories", DAVRepository.class.getName())); GBEAN_INFO = infoFactory.getBeanInfo(); } public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; } }