A WebDAV service for Jetty?
Doesn't this belong in Jetty rather than Geronimo?
-- Jeremy
-------- Original Message -------- Subject: cvs commit: incubator-geronimo/modules/web project.xml Date: 20 Jan 2004 14:58:08 -0000 From: [EMAIL PROTECTED] Reply-To: [EMAIL PROTECTED] To: [EMAIL PROTECTED]
gdamour 2004/01/20 06:58:08
Modified: modules/web project.xml
Added: modules/web/src/java/org/apache/geronimo/webdav/jetty
JettyConnectorImpl.java JettyConnector.java
JettyDAVServer.java
modules/web/src/java/org/apache/geronimo/webdav
DAVRepository.java CatalinaDAVRepository.java
DAVServer.java AbstractConnector.java
Connector.java
Log:
Initiale check in of a WebDAV service using:
- Jetty as the underlying HTTP server; and
- Tomcat WebDAV servlet as the WebDAV implementation.The DAVServer and Connector classes are modelled after the Web layer implemented by Jan Bartel and Greg Wilkins.
Revision Changes Path
1.1 incubator-geronimo/modules/web/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.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/20 14:58:08 $
*/
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 doStart() throws WaitingException, Exception {
log.info("Starting Jetty Connector");
lifeCycleState.doStart();
} public void doStop() throws WaitingException {
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 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 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/modules/web/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/20 14:58:08 $
*/
public interface JettyConnector extends Connector {
public HttpListener getListener();
}
1.1 incubator-geronimo/modules/web/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.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/20 14:58:08 $
*/
public class JettyDAVServer
implements DAVServer, GBean
{private static final Log log = LogFactory.getLog(JettyDAVServer.class);
private final static GBeanInfo GBEAN_INFO;
/**
* 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((String) attribute);
}
} public Collection getRepositories() {
return repositories;
} public Collection getConnectors() {
return connectors;
} 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);
}
} 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;
}}
1.1 incubator-geronimo/modules/web/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/20 14:58:08 $
*/
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.
*/
public String getHost(); /**
* Gets the context of the WebDAV servlet.
* <BR>
*
* @return Context name.
*/
public String getContext(); /**
* Gets the WebDAV servlet Class.
*
* @return WebDAV servlet class.
*/
public Class getHandlingServlet(); /**
* Gets the servlet context attributes.
*
* @return Map of attribute name to value.
*/
public Map getServletContextAttr(); /**
* Gets the servlet initialization parameters.
*
* @return Map of parameter name to value.
*/
public Map getServletInitParam();}
1.1 incubator-geronimo/modules/web/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.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/20 14:58:08 $
*/
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 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/modules/web/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/20 14:58:08 $
*/
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/modules/web/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 java.util.Arrays;
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/20 14:58:08 $
*/
public abstract class AbstractConnector
implements Connector, GBean
{private final static GBeanInfo GBEAN_INFO;
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;
}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(
Arrays.asList(new Object[] {"Protocol", "Interface",
"Port", "MaxConnections", "MaxIdleTime"}),
Arrays.asList(new Object[] {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/modules/web/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/20 14:58:08 $
*/
public interface Connector { /**
* Listening port.
*
* @param aPort Listening port.
*/
public void setPort(int aPort);
public int getPort(); /**
* Protocol.
*
* @param aProtocol
*/
public void setProtocol(String aProtocol);
public String getProtocol(); /**
* Interface.
*
* @param aProtocol
*/
public void setInterface(String anInterface);
public String getInterface(); /**
* Maximum number of connections.
*
* @param aProtocol
*/
public void setMaxConnections(int aMaxConnects);
public int getMaxConnections(); /**
* Maximum idle time.
*
* @param aProtocol
*/
public void setMaxIdleTime(int aMaxIdleTime);
public int getMaxIdleTime();}
1.15 +91 -1 incubator-geronimo/modules/web/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/incubator-geronimo/modules/web/project.xml,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- project.xml 19 Jan 2004 06:28:05 -0000 1.14
+++ project.xml 20 Jan 2004 14:58:08 -0000 1.15
@@ -279,6 +279,96 @@
</properties>
</dependency> + <!-- WebDAV service using the Tomcat WebDAV servlet. -->
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>catalina</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>catalina-optional</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>naming-common</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>naming-resources</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>servlets-common</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>servlets-default</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>servlets-webdav</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+ <dependency>
+ <groupId>tomcat</groupId>
+ <artifactId>tomcat-util</artifactId>
+ <version>5.0.16</version>
+ <properties>
+ <runtime>true</runtime>
+ <destinations>
+ deploy/webdav/lib
+ </destinations>
+ </properties>
+ </dependency>
+
</dependencies>-- Jeremy
/************************* * Jeremy Boynes * Partner * Core Developers Network *************************/
