You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2005/08/26 09:26:31 UTC

svn commit: r240176 - in /incubator/jackrabbit/trunk/contrib/jcr-server: ./ server/src/java/org/apache/jackrabbit/server/ server/src/java/org/apache/jackrabbit/server/io/ server/src/java/org/apache/jackrabbit/webdav/jcr/ server/src/java/org/apache/jack...

Author: tripod
Date: Fri Aug 26 00:26:01 2005
New Revision: 240176

URL: http://svn.apache.org/viewcvs?rev=240176&view=rev
Log:
[JCR-181] jcr-server should honor a webdav request's Content-Type and Content-Language headers
[JCR-200] move log4j initialization out of RepositoryStartupServlet

Added:
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java   (with props)
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd   (with props)
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml   (with props)
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java   (with props)
Removed:
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/ResourceType.java
Modified:
    incubator/jackrabbit/trunk/contrib/jcr-server/project.properties
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/AbstractWebdavServlet.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ExportContext.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ImportContext.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/SetContentTypeCommand.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/mimetypes.properties
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/RootCollection.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/version/VersionHistoryItemCollection.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java
    incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/repository/repository.xml
    incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavConstants.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavMethods.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/ResourceType.java
    incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/project.properties
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/project.properties?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/project.properties (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/project.properties Fri Aug 26 00:26:01 2005
@@ -4,4 +4,4 @@
 #-------------------------------------------------------
 jackrabbit.build.version.jcr=1.0
 jackrabbit.build.version.jackrabbit=1.0-SNAPSHOT
-jackrabbit.build.version.jcr.rmi=1.0-dev
+jackrabbit.build.version.jcr.rmi=1.0-SNAPSHOT

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/AbstractWebdavServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/AbstractWebdavServlet.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/AbstractWebdavServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/AbstractWebdavServlet.java Fri Aug 26 00:26:01 2005
@@ -28,6 +28,7 @@
 import org.apache.jackrabbit.webdav.WebdavRequestImpl;
 import org.apache.jackrabbit.webdav.WebdavResponse;
 import org.apache.jackrabbit.webdav.WebdavResponseImpl;
+import org.apache.jackrabbit.webdav.io.InputContext;
 import org.apache.jackrabbit.webdav.lock.ActiveLock;
 import org.apache.jackrabbit.webdav.lock.LockInfo;
 import org.apache.jackrabbit.webdav.observation.EventDiscovery;
@@ -37,7 +38,6 @@
 import org.apache.jackrabbit.webdav.ordering.OrderPatch;
 import org.apache.jackrabbit.webdav.ordering.OrderingResource;
 import org.apache.jackrabbit.webdav.property.DavProperty;
-import org.apache.jackrabbit.webdav.property.DavPropertyIterator;
 import org.apache.jackrabbit.webdav.property.DavPropertyName;
 import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
 import org.apache.jackrabbit.webdav.property.DavPropertySet;
@@ -381,17 +381,17 @@
 
         DavProperty lastMod = resource.getProperty(DavPropertyName.GETLASTMODIFIED);
         if (lastMod != null) {
-            response.setHeader("Last-Modified", String.valueOf(lastMod.getValue()));
+            response.setHeader(HEADER_LAST_MODIFIED, String.valueOf(lastMod.getValue()));
         }
 
         DavProperty etag = resource.getProperty(DavPropertyName.GETETAG);
         if (etag != null) {
-            response.setHeader("ETag", String.valueOf(etag.getValue()));
+            response.setHeader(HEADER_ETAG, String.valueOf(etag.getValue()));
         }
 
         DavProperty contentType = resource.getProperty(DavPropertyName.GETCONTENTTYPE);
         if (contentType != null) {
-            response.setHeader("Content-Type", String.valueOf(contentType.getValue()));
+            response.setHeader(HEADER_CONTENT_TYPE, String.valueOf(contentType.getValue()));
         }
 
         DavProperty contentLength = resource.getProperty(DavPropertyName.GETCONTENTLENGTH);
@@ -399,13 +399,18 @@
             try {
                 int length = Integer.parseInt(contentLength.getValue() + "");
                 if (length > 0) {
-                    response.setIntHeader("Content-Length", length);
+                    response.setIntHeader(HEADER_CONTENT_LENGTH, length);
                 }
             } catch (NumberFormatException e) {
                 log.error("Could not build content length from property value '" + contentLength.getValue() + "'");
             }
         }
 
+        DavProperty contentLanguage = resource.getProperty(DavPropertyName.GETCONTENTLANGUAGE);
+        if (contentLanguage != null) {
+            response.setHeader(HEADER_CONTENT_LANGUAGE, contentLanguage.getValue().toString());
+        }
+
         // spool content in case of 'GET' request
         InputStream in = resource.getStream();
         try {
@@ -531,7 +536,7 @@
             status = DavServletResponse.SC_CREATED;
         }
 
-        parentResource.addMember(resource, request.getInputStream());
+        parentResource.addMember(resource, getInputContext(request));
         response.setStatus(status);
     }
 
@@ -555,11 +560,26 @@
         }
 
         if (request.getContentLength() > 0 || request.getHeader("Transfer-Encoding") != null) {
-            parentResource.addMember(resource, request.getInputStream());
+            parentResource.addMember(resource, getInputContext(request));
         } else {
             parentResource.addMember(resource);
         }
         response.setStatus(DavServletResponse.SC_CREATED);
+    }
+
+    /**
+     * Build an InputContext for the given request
+     * 
+     * @param request
+     * @return
+     * @throws IOException
+     */
+    protected InputContext getInputContext(WebdavRequest request) throws IOException {
+        InputContext cxt = new InputContext();
+        cxt.setContentType(request.getHeader(DavConstants.HEADER_CONTENT_TYPE));
+        cxt.setContentLanguage(request.getHeader(DavConstants.HEADER_CONTENT_LANGUAGE));
+        cxt.setInputStream(request.getInputStream());
+        return cxt;
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ExportContext.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ExportContext.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ExportContext.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ExportContext.java Fri Aug 26 00:26:01 2005
@@ -62,6 +62,11 @@
     private String contentType;
 
     /**
+     * The content language of the resource
+     */
+    private String contentLanguage;
+
+    /**
      * the ETag of the resource
      */
     private String etag;
@@ -200,6 +205,24 @@
      */
     public void setContentType(String contentType) {
         this.contentType = contentType;
+    }
+
+    /**
+     * Returns the content language or <code>null</code>
+     *
+     * @return contentLanguage
+     */
+    public String getContentLanguage() {
+        return contentLanguage;
+    }
+
+    /**
+     * Sets the content language.
+     *
+     * @param contentLanguage
+     */
+    public void setContentLanguage(String contentLanguage) {
+        this.contentLanguage = contentLanguage;
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ImportContext.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ImportContext.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ImportContext.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/ImportContext.java Fri Aug 26 00:26:01 2005
@@ -60,12 +60,18 @@
     private String contentType;
 
     /**
+     * The content language of the resource to be imported.
+     */
+    private String contentLanguage;
+
+    /**
      * The modification time of the resource, if known
      */
     private long modificationTime;
 
     /**
      * Creates a new import context with the given root node
+     *
      * @param importRoot the import root node
      */
     public ImportContext(Node importRoot) {
@@ -74,6 +80,7 @@
 
     /**
      * Creats a new import context with the given root node and property defaults.
+     *
      * @param base
      * @param importRoot
      */
@@ -87,6 +94,7 @@
 
     /**
      * Creates a new sub context which bases on this contexts properties
+     *
      * @param importRoot
      * @return
      */
@@ -96,6 +104,7 @@
 
     /**
      * Retruns the input stream of the resource to import.
+     *
      * @return the input stream.
      */
     public InputStream getInputStream() {
@@ -105,6 +114,7 @@
     /**
      * Sets the inpurt stream of the resource to import. A import command that
      * consumed the input stream should set this member to <code>null</code>.
+     *
      * @param inputStream the input stream
      */
     public void setInputStream(InputStream inputStream) {
@@ -113,6 +123,7 @@
 
     /**
      * Returns the import root of the resource to import.
+     *
      * @return the import root of the resource to import.
      */
     public Node getImportRoot() {
@@ -122,6 +133,7 @@
     /**
      * Returns the current parent node of the resource to import. If no current
      * parent node is defined, the import root is returned.
+     *
      * @return the parent node.
      */
     public Node getNode() {
@@ -131,6 +143,7 @@
     /**
      * Sets the current parent node of the resource to import. A command can
      * set this member in order to generate recursive structured.
+     *
      * @param node
      */
     public void setNode(Node node) {
@@ -141,6 +154,7 @@
      * Returns the system id of the resource to be imported. This id depends on
      * the system the resource is comming from. it can be a filename, a
      * display name of a webdav resource, an URI, etc.
+     *
      * @return the system id of the resource to import
      */
     public String getSystemId() {
@@ -149,6 +163,7 @@
 
     /**
      * sets the system id of this resource.
+     *
      * @param systemId
      */
     public void setSystemId(String systemId) {
@@ -158,6 +173,7 @@
     /**
      * Returns the content type of the resource to be imported or null, if
      * no contenttype was defined.
+     *
      * @return the content type of the resource
      */
     public String getContentType() {
@@ -166,6 +182,7 @@
 
     /**
      * Sets the content type of the resource.
+     *
      * @param contentType the content type.
      */
     public void setContentType(String contentType) {
@@ -173,7 +190,26 @@
     }
 
     /**
+     * Returns the content language or <code>null</code>
+     *
+     * @return contentLanguage
+     */
+    public String getContentLanguage() {
+        return contentLanguage;
+    }
+
+    /**
+     * Sets the content language.
+     *
+     * @param contentLanguage
+     */
+    public void setContentLanguage(String contentLanguage) {
+        this.contentLanguage = contentLanguage;
+    }
+
+    /**
      * Returns the modification time of the resource
+     *
      * @return the modification time.
      */
     public long getModificationTime() {
@@ -182,10 +218,10 @@
 
     /**
      * Sets the modification time of the resource
+     *
      * @param modificationTime the modification time
      */
     public void setModificationTime(long modificationTime) {
         this.modificationTime = modificationTime;
     }
-
 }

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/SetContentTypeCommand.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/SetContentTypeCommand.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/SetContentTypeCommand.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/SetContentTypeCommand.java Fri Aug 26 00:26:01 2005
@@ -47,7 +47,7 @@
 
     /**
      * Executes this command. It resolves the content type in the import context
-     * if it is not alerady set.
+     * if it is not already set.
      *
      * @param context the import context
      * @return false

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/mimetypes.properties
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/mimetypes.properties?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/mimetypes.properties (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/io/mimetypes.properties Fri Aug 26 00:26:01 2005
@@ -37,7 +37,9 @@
 htm=text/html
 html=text/html
 ice=x-conference/x-cooltalk
+ics=text/calendar
 ief=image/ief
+ifb=text/calendar
 iges=model/iges
 igs=model/iges
 jpe=image/jpeg

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java Fri Aug 26 00:26:01 2005
@@ -18,6 +18,7 @@
 import org.apache.log4j.Logger;
 import org.apache.jackrabbit.webdav.property.*;
 import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.io.InputContext;
 import org.apache.jackrabbit.webdav.jcr.nodetype.NodeTypeProperty;
 import org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock;
 import org.apache.jackrabbit.webdav.jcr.version.report.ExportViewReport;
@@ -250,13 +251,13 @@
      * changed/set to type {@link PropertyType#BINARY binary}.
      *
      * @param resource
-     * @param in
+     * @param inputCxt
      * @throws org.apache.jackrabbit.webdav.DavException
-     * @see org.apache.jackrabbit.webdav.DavResource#addMember(org.apache.jackrabbit.webdav.DavResource, java.io.InputStream)
+     * @see org.apache.jackrabbit.webdav.DavResource#addMember(org.apache.jackrabbit.webdav.DavResource, InputContext)
      * @see Node#addNode(String)
      * @see Node#setProperty(String, java.io.InputStream)
      */
-    public void addMember(DavResource resource, InputStream in)
+    public void addMember(DavResource resource, InputContext inputCxt)
             throws DavException {
 
         /* RFC 2815 states that all 'parents' must exist in order all addition of members */
@@ -266,6 +267,7 @@
 
         try {
             Node n = (Node) item;
+            InputStream in = (inputCxt != null) ? inputCxt.getInputStream() : null;
             if (resource.isCollection()) {
                 if (in == null) {
                     // MKCOL without a request body, try if a default-primary-type is defined.
@@ -308,7 +310,9 @@
      * @see org.apache.jackrabbit.webdav.DavResource#addMember(org.apache.jackrabbit.webdav.DavResource)
      */
     public void addMember(DavResource resource) throws DavException {
-        addMember(resource, resource.getStream());
+        InputContext ctx = new InputContext();
+        ctx.setInputStream(resource.getStream());
+        addMember(resource, ctx);
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java Fri Aug 26 00:26:01 2005
@@ -18,6 +18,7 @@
 import org.apache.log4j.Logger;
 import org.apache.jackrabbit.webdav.property.*;
 import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.io.InputContext;
 import org.apache.jackrabbit.webdav.jcr.property.ValuesProperty;
 import org.apache.jackrabbit.webdav.jcr.property.LengthsProperty;
 import org.apache.jackrabbit.webdav.lock.*;
@@ -184,7 +185,7 @@
      *
      * @see org.apache.jackrabbit.webdav.DavResource#addMember(org.apache.jackrabbit.webdav.DavResource, InputStream)
      */
-    public void addMember(DavResource resource, InputStream in) throws DavException {
+    public void addMember(DavResource resource, InputContext inputCxt) throws DavException {
         throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED, "Cannot add members to a non-collection resource");
     }
 

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/RootCollection.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/RootCollection.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/RootCollection.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/RootCollection.java Fri Aug 26 00:26:01 2005
@@ -17,6 +17,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.io.InputContext;
 import org.apache.jackrabbit.webdav.jcr.version.report.RegisteredNamespacesReport;
 import org.apache.jackrabbit.webdav.jcr.version.report.NodeTypesReport;
 import org.apache.jackrabbit.webdav.jcr.version.report.RepositoryDescriptorsReport;
@@ -121,7 +122,7 @@
      * Throws exception: 403 Forbidden.
      * @see DavResource#addMember(DavResource, InputStream)
      */
-    public void addMember(DavResource resource, InputStream in) throws DavException {
+    public void addMember(DavResource resource, InputContext inputCxt) throws DavException {
         throw new DavException(DavServletResponse.SC_FORBIDDEN);
     }
 

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/version/VersionHistoryItemCollection.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/version/VersionHistoryItemCollection.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/version/VersionHistoryItemCollection.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/jcr/version/VersionHistoryItemCollection.java Fri Aug 26 00:26:01 2005
@@ -19,6 +19,7 @@
 import org.apache.jackrabbit.webdav.version.*;
 import org.apache.jackrabbit.webdav.property.HrefProperty;
 import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
+import org.apache.jackrabbit.webdav.property.ResourceType;
 import org.apache.jackrabbit.webdav.jcr.ItemResourceConstants;
 import org.apache.jackrabbit.webdav.jcr.JcrDavException;
 import org.apache.jackrabbit.webdav.jcr.DefaultItemCollection;

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java Fri Aug 26 00:26:01 2005
@@ -16,11 +16,13 @@
 package org.apache.jackrabbit.webdav.simple;
 
 import javax.jcr.*;
+import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.lock.Lock;
 import java.util.*;
 import java.io.*;
 
 import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.io.InputContext;
 import org.apache.jackrabbit.webdav.transaction.TransactionConstants;
 import org.apache.jackrabbit.webdav.observation.ObservationConstants;
 import org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock;
@@ -56,7 +58,7 @@
     private Node node;
     private DavResourceLocator locator;
 
-    private DavPropertySet properties;
+    private DavPropertySet properties = new DavPropertySet();
     private boolean isCollection = true;
 
     /** is created on initProperties */
@@ -139,6 +141,16 @@
     }
 
     /**
+     * Package protected method that allows to define whether this resource
+     * represents a collection or not.
+     *
+     * @param isCollection
+     */
+    void setIsCollection(boolean isCollection) {
+        this.isCollection = isCollection;
+    }
+
+    /**
      * @see org.apache.jackrabbit.webdav.DavResource#getLocator()
      */
     public DavResourceLocator getLocator() {
@@ -220,17 +232,14 @@
      * Fill the set of properties
      */
     private void initProperties() {
-        if (properties == null && exists()) {
-            properties = new DavPropertySet();
+        if (exists()) {
             try {
                 nodeResource = new NodeResource(this, node);
                 properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, nodeResource.getContentLength()+""));
                 properties.add(new DefaultDavProperty(DavPropertyName.CREATIONDATE, nodeResource.getCreationDate()));
                 properties.add(new DefaultDavProperty(DavPropertyName.GETLASTMODIFIED, nodeResource.getLastModified()));
-                String contentType = nodeResource.getContentType();
-                if (contentType != null) {
-                    properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTTYPE, contentType));
-                }
+                setContentType(nodeResource.getContentType());
+                setContentLanguage(nodeResource.getContentLanguage());
                 properties.add(new DefaultDavProperty(DavPropertyName.GETETAG, nodeResource.getETag()));
             } catch (RepositoryException e) {
                 // should not occure....
@@ -258,20 +267,21 @@
             supportedLock.addEntry(Type.WRITE, Scope.EXCLUSIVE);
             properties.add(supportedLock);
 
-            // JCR properties defined on the underlaying jcr node
+            // non-protected JCR properties defined on the underlaying jcr node
             try {
                 // todo: should filter be respected for properties as well?
                 PropertyIterator it = node.getProperties();
                 while (it.hasNext()) {
                     Property p = it.nextProperty();
                     String pName = p.getName();
-                    DavPropertyName name = getDavName(pName, node.getSession());
-                    if (p.getDefinition().isMultiple()) {
-                        log.debug("Multivalued property '" + pName + "' not added to webdav property set.");
-                    } else {
-                        String value = p.getValue().getString();
-                        properties.add(new DefaultDavProperty(name, value));
+                    PropertyDefinition def = p.getDefinition();
+                    if (def.isMultiple()) {
+                        log.debug("Multivalue property '" +  pName + "' not added to webdav property set.");
+                        continue;
                     }
+                    DavPropertyName name = getDavName(pName, node.getSession());
+                    String value = p.getValue().getString();
+                    properties.add(new DefaultDavProperty(name, value, def.isProtected()));
                 }
             } catch (RepositoryException e) {
                 log.error("Unexpected error while retrieving properties: " + e.getMessage());
@@ -358,6 +368,27 @@
         }
     }
 
+    /**
+     * Set the content type.
+     *
+     * @param contentType
+     */
+    private void setContentType(String contentType) {
+        if (contentType != null) {
+            properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTTYPE, contentType));
+        }
+    }
+
+    /**
+     * Set the content language.
+     *
+     * @param contentLanguage
+     */
+    private void setContentLanguage(String contentLanguage) {
+        if (contentLanguage != null) {
+            properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLANGUAGE, contentLanguage));
+        }
+    }
 
     /**
      * @see DavResource#getCollection()
@@ -405,68 +436,47 @@
     }
 
     /**
-     * Adds a new non-collection member to this resource.
-     *
-     * @see DavResource#addMember(DavResource, InputStream)
-     */
-    public void addMember(DavResource member, InputStream in) throws DavException {
-        if (!exists() || in == null) {
-            throw new DavException(DavServletResponse.SC_BAD_REQUEST);
-        }
-	if (isLocked(this)) {
-            throw new DavException(DavServletResponse.SC_LOCKED);
-        }
-
-        try {
-            String fileName = member.getDisplayName();
-            // don't allow creation of nodes, that would be filtered out
-            if (isFilteredResource(member)) {
-                log.debug("Avoid creation of filtered resource: " + fileName);
-                throw new DavException(DavServletResponse.SC_FORBIDDEN);
-            }
-
-            ImportContext ctx = new ImportContext(node);
-            ctx.setInputStream(in);
-            ctx.setSystemId(fileName);
-            ImportResourceChain.getChain().execute(ctx);
-            session.getRepositorySession().save();
-        } catch (RepositoryException e) {
-            log.error("Error while executing import chain: " + e.toString());
-            throw new JcrDavException(e);
-        } catch (IOException e) {
-            log.error("Error while executing import chain: " + e.toString());
-            throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
-        } catch (Exception e) {
-            log.error("Error while executing import chain: " + e.toString());
-            throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
-        }
-    }
-
-    /**
-     * Creates a new collection as member of this resource.
+     * Adds a new member to this resource.
      *
-     * @see DavResource#addMember(DavResource)
+     * @see DavResource#addMember(DavResource, InputContext)
      */
-    public void addMember(DavResource member) throws DavException {
+    public void addMember(DavResource member, InputContext inputCxt) throws DavException {
         if (!exists()) {
             throw new DavException(DavServletResponse.SC_CONFLICT);
         }
-	if (isLocked(this)) {
+        if (isLocked(this)) {
             throw new DavException(DavServletResponse.SC_LOCKED);
         }
-
         // don't allow creation of nodes, that would be filtered out
         if (isFilteredResource(member)) {
             log.debug("Avoid creation of filtered resource: " + member.getDisplayName());
             throw new DavException(DavServletResponse.SC_FORBIDDEN);
         }
-
         try {
             ImportContext ctx = new ImportContext(node);
             ctx.setSystemId(member.getDisplayName());
-            ImportCollectionChain.getChain().execute(ctx);
+            boolean hasContent = inputCxt != null && inputCxt.getInputStream() != null;
+            if (hasContent) {
+                ctx.setInputStream(inputCxt.getInputStream());
+                ctx.setContentType(inputCxt.getContentType());
+                ctx.setContentLanguage(inputCxt.getContentLanguage());
+            }
+            if (member.isCollection()) {
+                ImportCollectionChain.getChain().execute(ctx);
+            } else {
+                ImportResourceChain.getChain().execute(ctx);
+            }
+            // if an input stream was present and was not consumed during the
+            // import the request must fail.
+            if (hasContent && ctx.getInputStream() != null) {
+                // undo all changes
+                node.refresh(false);
+                throw new DavException(DavServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+            }
+            // persist changes after successful import
             node.save();
         } catch (ItemExistsException e) {
+            // should only be thrown by the ImportCollectionChain
             log.error("Error while executing import chain: " + e.toString());
             throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);
         } catch (RepositoryException e) {
@@ -479,6 +489,15 @@
     }
 
     /**
+     * Creates a new member of this resource.
+     *
+     * @see DavResource#addMember(DavResource)
+     */
+    public void addMember(DavResource member) throws DavException {
+        addMember(member, null);
+    }
+
+    /**
      * @see DavResource#removeMember(DavResource)
      */
     public void removeMember(DavResource member) throws DavException {
@@ -787,7 +806,10 @@
     }
 
     /**
-     * Build jcr property name from dav property name
+     * Build jcr property name from dav property name. If the property name
+     * defines a namespace uri, that has not been registered yet, an attempt
+     * is made to register the uri with the prefix defined. Note, that no
+     * extra effort is made to generated a unique prefix. 
      *
      * @param propName
      * @return jcr name
@@ -796,9 +818,23 @@
     private String getJcrName(DavPropertyName propName) throws RepositoryException {
         String pName = propName.getName();
         String uri = propName.getNamespace().getURI();
-        String prefix = node.getSession().getNamespacePrefix(uri);
-        if (prefix != null && !"".equals(prefix)) {
-            pName = prefix + ":" + pName;
+
+        if (uri != null && !"".equals(uri)) {
+            Session s = session.getRepositorySession();
+            String prefix;
+            try {
+                // lookup 'prefix' in the session-ns-mappings / namespace-registry
+                prefix = s.getNamespacePrefix(uri);
+            } catch (NamespaceException e) {
+                // namespace uri has not been registered yet
+                NamespaceRegistry nsReg = s.getWorkspace().getNamespaceRegistry();
+                prefix = propName.getNamespace().getPrefix();
+                // NOTE: will fail if prefix is already in use in the namespace registry
+                nsReg.registerNamespace(prefix, uri);
+            }
+            if (prefix != null && !"".equals(prefix)) {
+                pName = prefix + ":" + pName;
+            }
         }
         return pName;
     }
@@ -817,7 +853,6 @@
     }
 
     /**
-     *
      * @param propertyName
      * @throws RepositoryException
      */

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java Fri Aug 26 00:26:01 2005
@@ -59,6 +59,7 @@
     private long modificationTime = new Date().getTime();
     private long contentLength = 0;
     private String contentType = null;
+    private String contentLanguage = null;
     private String etag = null;
     private InputStream in = null;
 
@@ -82,6 +83,7 @@
         }
         this.contentLength = ctx.getContentLength();
         this.contentType = ctx.getContentType();
+        this.contentLanguage = ctx.getContentLanguage();
         this.in = ctx.getInputStream();
         this.creationTime = ctx.getCreationTime();
         this.modificationTime = ctx.getModificationTime();
@@ -161,6 +163,15 @@
      */
     public String getContentType() {
 	return contentType;
+    }
+
+    /**
+     * Return the content language or <code>null</code> if it could not be determined.
+     *
+     * @return content language
+     */
+    public String getContentLanguage() {
+        return contentLanguage;
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java Fri Aug 26 00:26:01 2005
@@ -30,20 +30,61 @@
     private final LockManager lockMgr;
     private final ResourceFilter resourceFilter;
 
+    /**
+     * Create a new <code>ResourceFactory</code> that uses the given lock manager
+     * and the default {@link DefaultResourceFilter resource filter}.
+     *
+     * @param lockMgr
+     */
     public ResourceFactoryImpl(LockManager lockMgr) {
         this(lockMgr, new DefaultResourceFilter());
     }
 
+    /**
+     * Create a new <code>ResourceFactory</code> that uses the given lock manager
+     * and resource filter.
+     *
+     * @param lockMgr
+     * @param resourceFilter
+     */
     public ResourceFactoryImpl(LockManager lockMgr, ResourceFilter resourceFilter) {
         this.lockMgr = lockMgr;
         this.resourceFilter = resourceFilter;
     }
 
+    /**
+     * Create a new <code>DavResource</code> from the given locator and request.
+     *
+     * @param locator
+     * @param request
+     * @param response
+     * @return
+     * @throws DavException
+     * @see DavResourceFactory#createResource(DavResourceLocator, DavServletRequest, DavServletResponse)
+     */
     public DavResource createResource(DavResourceLocator locator, DavServletRequest request,
                                       DavServletResponse response) throws DavException {
-        return createResource(locator, request.getDavSession());
+        DavResourceImpl resource = (DavResourceImpl)createResource(locator, request.getDavSession());
+        int methodCode = DavMethods.getMethodCode(request.getMethod());
+        if (methodCode == DavMethods.DAV_MKCOL || methodCode == DavMethods.DAV_PUT || methodCode == DavMethods.DAV_POST) {
+            if (!resource.exists()) {
+                boolean isCollection = DavMethods.getMethodCode(request.getMethod()) == DavMethods.DAV_MKCOL;
+                resource.setIsCollection(isCollection);
+            }
+        }
+        return resource;
     }
 
+    /**
+     * Create a new <code>DavResource</code> from the given locator and webdav
+     * session.
+     *
+     * @param locator
+     * @param session
+     * @return
+     * @throws DavException
+     * @see DavResourceFactory#createResource(DavResourceLocator, DavSession)
+     */
     public DavResource createResource(DavResourceLocator locator, DavSession session) throws DavException {
         try {
             DavResource res = new DavResourceImpl(locator, this, session, resourceFilter);

Added: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java?rev=240176&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java Fri Aug 26 00:26:01 2005
@@ -0,0 +1,196 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 1997-2005 Day Management AG
+ * Barfuesserplatz 6, 4001 Basel, Switzerland
+ * All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of
+ * Day Management AG, ("Confidential Information"). You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Day.
+ */
+package org.apache.jackrabbit.j2ee;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.log4j.xml.DOMConfigurator;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.ServletException;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+
+import java.util.Properties;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * This Class implements a servlet that is used for initializing the log4j
+ * facitilies for the containing webapp. since all classes in a webapp share
+ * the same Log4J repository, this servlet offers a centralized mechanism to
+ * configure the different loggers.
+ * <p/>
+ * please note, that Log4J holds its logging repository in static class variables,
+ * so the configuration spans all classes using the same classloader hierarchy.
+ * in a typical j2ee 4 classloaders are provided by the appserver: a shared,
+ * a server, a container and an application classloader:
+ * <xmp>
+ *       Bootstrap
+ *          |
+ *        System
+ *          |
+ *        Shared
+ *       /      \
+ *  Server     Container
+ *                /   \
+ *           Webapp1  Webapp2 ...
+ *
+ * </xmp>
+ * Classes are searched in the classloader hierarchy by aksing the parent
+ * classloader first. so if you put the log4j.jar in the 'shared' classloader,
+ * all webapps will shared the same log4j logger repository. if every webapp
+ * should use it's own hierarchy, the log4j.jar must be put in the classpath
+ * of the webapp classloader, usually WEB-INF/lib.
+ * <p/>
+ * Please note further that the exact way how the classloader hierarchy is
+ * set-up depends on the appserver you are using.
+ */
+public class LoggingServlet extends HttpServlet {
+
+    /**
+     * The init param for the log4j configuration. this can either point to
+     * a resource inside the application or a filepath. if the filename ends with
+     * ".xml", the {@link DOMConfigurator} is used to configure Log4J, otherwise
+     * the {@link PropertyConfigurator} is used.
+     */
+    public final static String INIT_PARAM_LOG4J_CONFIG = "log4j-config";
+
+    /**
+     * {@inheritDoc}
+     */
+    public void init() throws ServletException {
+        configure();
+        Logger.getRootLogger().info("Logging initialized.");
+    }
+
+    /**
+     * Configures Log4J using the config specified by the
+     * {@link #INIT_PARAM_LOG4J_CONFIG} init parameter.
+     *
+     * @throws ServletException
+     */
+    private void configure() throws ServletException {
+        // setup log4j
+        String log4jConfig = getServletConfig().getInitParameter(INIT_PARAM_LOG4J_CONFIG);
+        InputStream in =getServletContext().getResourceAsStream(log4jConfig);
+        if (in==null) {
+            // try file access
+            try {
+                in = new FileInputStream(log4jConfig);
+            } catch (FileNotFoundException e) {
+                throw new ServletException("Unable to initialize log4j: " + e.toString());
+            }
+        } else {
+            // hack for entity resolver
+            log4jConfig = "ctx:" + log4jConfig;
+        }
+        try {
+            if (log4jConfig.endsWith(".xml")) {
+                InputSource ins = new InputSource(in);
+                ins.setSystemId(log4jConfig);
+                configureXML(ins);
+            } else {
+                configureProperties(in);
+            }
+        } catch (IOException e) {
+            throw new ServletException("Unable to initialize log4j: " + e.toString());
+        } finally {
+            try {
+                in.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+    }
+
+    /**
+     * Configures Log4J using the {@link DOMConfigurator}
+     *
+     * @param in
+     * @throws ServletException
+     * @throws IOException
+     */
+    private void configureXML(InputSource in)
+            throws ServletException, IOException {
+        try {
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            // only set resolver, if context resource
+            if (in.getSystemId().startsWith("ctx:")) {
+                builder.setEntityResolver(new ContextResolver());
+            }
+            Document document = builder.parse(in);
+            Element root =  document.getDocumentElement();
+            DOMConfigurator.configure(root);
+        } catch (ParserConfigurationException e) {
+            throw new ServletException(
+                    "Unable to create configuration XML parser", e);
+        } catch (SAXException e) {
+            throw new ServletException(
+                    "Configuration file syntax error.", e);
+        }
+    }
+
+    /**
+     * Configures Log4J using the {@link PropertyConfigurator}
+     *
+     * @param in
+     * @throws ServletException
+     * @throws IOException
+     */
+    private void configureProperties(InputStream in)
+            throws ServletException, IOException {
+        Properties log4jProperties = new Properties();
+        log4jProperties.load(in);
+        PropertyConfigurator.configure(log4jProperties);
+    }
+
+    /**
+     * own EntityResolver to resolve entities inside servlet context
+     */
+    private class ContextResolver implements EntityResolver {
+
+        public InputSource resolveEntity(String publicId, String systemId)
+                throws SAXException, IOException {
+
+            try {
+                URI uri = new URI(systemId);
+                if (uri.getScheme().equals("ctx")) {
+                    InputStream in = getServletContext().getResourceAsStream(uri.getPath());
+                    if (in != null) {
+                        InputSource ins = new InputSource(in);
+                        ins.setSystemId(systemId);
+                        return ins;
+                    }
+                }
+                log("Error while resolving entity. Unkwon systemid: " + systemId);
+            } catch (URISyntaxException e) {
+                log("Error while resolving entity: " + e.toString());
+            }
+            return null;
+        }
+    }
+
+}
\ No newline at end of file

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/LoggingServlet.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryAccessServlet.java Fri Aug 26 00:26:01 2005
@@ -16,27 +16,29 @@
  */
 package org.apache.jackrabbit.j2ee;
 
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
 import org.apache.jackrabbit.rmi.client.ClientRepositoryFactory;
 import org.apache.jackrabbit.util.Base64;
+import org.apache.log4j.Logger;
 
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.ServletException;
-import javax.servlet.ServletContext;
-import javax.jcr.*;
+import javax.jcr.Credentials;
+import javax.jcr.LoginException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-
-import java.util.Properties;
-import java.util.Enumeration;
-import java.io.IOException;
-import java.io.InputStream;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
 import java.io.ByteArrayOutputStream;
-import java.rmi.RemoteException;
-import java.rmi.NotBoundException;
+import java.io.IOException;
 import java.net.MalformedURLException;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+import java.util.Enumeration;
+import java.util.Properties;
 
 /**
  * This Class implements a servlet that is used as unified mechanism to retrieve
@@ -45,7 +47,7 @@
 public class RepositoryAccessServlet extends HttpServlet {
 
     /** default logger */
-    private static Logger log;
+    private static final Logger log = Logger.getLogger(RepositoryAccessServlet.class);
 
     // todo: implement correctly
     public final static String INIT_PARAM_LOG4J_CONFIG = "log4j-config";
@@ -72,7 +74,6 @@
      * @throws javax.servlet.ServletException
      */
     public void init() throws ServletException {
-	initLog4J();
 	log.info("RepositoryAccessServlet initializing...");
         repositoryName = getServletConfig().getInitParameter(INIT_PARAM_REPOSITORY_NAME);
         if (repositoryName==null) {
@@ -105,26 +106,6 @@
 	log.info("RepositoryAccessServlet initialized.");
     }
 
-    private void initLog4J() throws ServletException {
-	// setup log4j
-	String log4jConfig = getServletConfig().getInitParameter(INIT_PARAM_LOG4J_CONFIG);
-	InputStream in =getServletContext().getResourceAsStream(log4jConfig);
-	if (in==null) {
-	    // try normal init
-	    PropertyConfigurator.configure(log4jConfig);
-	} else {
-	    try {
-		Properties log4jProperties = new Properties();
-		log4jProperties.load(in);
-		in.close();
-		PropertyConfigurator.configure(log4jProperties);
-	    } catch (IOException e) {
-		throw new ServletException("Unable to load log4jProperties: " + e.toString());
-	    }
-	}
-	log = Logger.getLogger(RepositoryAccessServlet.class);
-    }
-
     private InitialContext getInitialContext() throws ServletException {
 	// retrieve JNDI Context environment
 	try {
@@ -170,7 +151,7 @@
     private Repository getRepositoryByRMI(String rmiURI) {
         // acquire via RMI
         log.info("  trying to retrieve repository using rmi. uri=" + rmiURI);
-        ClientFactoryDelegater cfd = null;
+        ClientFactoryDelegater cfd;
         try {
             Class clazz = Class.forName("org.apache.jackrabbit.j2ee.RMIClientFactoryDelegater");
             cfd = (ClientFactoryDelegater) clazz.newInstance();

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java Fri Aug 26 00:26:01 2005
@@ -15,28 +15,32 @@
  */
 package org.apache.jackrabbit.j2ee;
 
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.Logger;
-import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.core.RepositoryImpl;
+import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.rmi.server.ServerAdapterFactory;
+import org.apache.log4j.Logger;
 import org.xml.sax.InputSource;
 
-import javax.servlet.http.HttpServlet;
-import javax.servlet.ServletException;
-import javax.jcr.*;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import java.io.*;
-import java.util.Properties;
-import java.util.Enumeration;
-import java.rmi.registry.Registry;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.Naming;
-import java.rmi.RemoteException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.rmi.AlreadyBoundException;
+import java.rmi.Naming;
 import java.rmi.Remote;
-import java.net.MalformedURLException;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.util.Enumeration;
+import java.util.Properties;
 
 /**
  * The RepositoryStartupServlet starts a jackrabbit repository and registers it
@@ -45,7 +49,7 @@
 public class RepositoryStartupServlet extends HttpServlet {
 
     /** the default logger */
-    private static Logger log;
+    private static final Logger log = Logger.getLogger(RepositoryStartupServlet.class);
 
     /** initial param name for the repository config location */
     public final static String INIT_PARAM_REPOSITORY_CONFIG = "repository-config";
@@ -80,7 +84,6 @@
      */
     public void init() throws ServletException {
 	super.init();
-	initLog4J();
 	log.info("RepositoryStartupServlet initializing...");
 	initRepository();
 	registerJNDI();
@@ -106,30 +109,6 @@
         } else {
             log.info("RepositoryStartupServlet shut down.");
         }
-    }
-
-    /**
-     * Initializes Log4J
-     * @throws ServletException
-     */
-    private void initLog4J() throws ServletException {
-	// setup log4j
-	String log4jConfig = getServletConfig().getInitParameter(INIT_PARAM_LOG4J_CONFIG);
-	InputStream in = getServletContext().getResourceAsStream(log4jConfig);
-	if (in==null) {
-	    // try normal init
-	    PropertyConfigurator.configure(log4jConfig);
-	} else {
-	    try {
-		Properties log4jProperties = new Properties();
-		log4jProperties.load(in);
-		in.close();
-		PropertyConfigurator.configure(log4jProperties);
-	    } catch (IOException e) {
-		throw new ServletException("Unable to load log4jProperties: " + e.toString());
-	    }
-	}
-	log = Logger.getLogger(RepositoryStartupServlet.class);
     }
 
     /**

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/java/org/apache/jackrabbit/j2ee/SimpleWebdavServlet.java Fri Aug 26 00:26:01 2005
@@ -28,7 +28,6 @@
 import org.apache.jackrabbit.webdav.DavMethods;
 import org.apache.jackrabbit.webdav.DavResource;
 import org.apache.jackrabbit.webdav.DavResourceFactory;
-import org.apache.jackrabbit.webdav.DavServletResponse;
 import org.apache.jackrabbit.webdav.DavSessionProvider;
 import org.apache.jackrabbit.webdav.WebdavRequest;
 import org.apache.jackrabbit.webdav.WebdavResponse;
@@ -272,21 +271,6 @@
     protected boolean isPreconditionValid(WebdavRequest request,
                                           DavResource resource) {
         return !resource.exists() || request.matchesIfHeader(resource);
-    }
-
-    /**
-     * The MKCOL method
-     *
-     * @throws IOException
-     */
-    protected void doMkCol(WebdavRequest request, WebdavResponse response,
-                           DavResource resource) throws IOException, DavException {
-        // mkcol request with request.body is not supported.
-        if (request.getContentLength() > 0 || request.getHeader("Transfer-Encoding") != null) {
-            response.sendError(DavServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
-            return;
-        }
-        super.doMkCol(request, response, resource);
     }
 
     /**

Added: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd?rev=240176&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd Fri Aug 26 00:26:01 2005
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!-- Authors: Chris Taylor, Ceki Gulcu. -->
+
+<!-- Version: 1.2 -->
+
+<!-- A configuration element consists of optional renderer
+elements,appender elements, categories and an optional root
+element. -->
+
+<!ELEMENT log4j:configuration (renderer*, appender*, logger*, root?)>
+
+<!-- The "threshold" attribute takes a level value such that all -->
+<!-- logging statements with a level equal or below this value are -->
+<!-- disabled. -->
+
+<!-- Setting the "debug" enable the printing of internal log4j logging   -->
+<!-- statements.                                                         -->
+
+<!-- By default, debug attribute is "null", meaning that we not do touch -->
+<!-- internal log4j logging settings. The "null" value for the threshold -->
+<!-- attribute can be misleading. The threshold field of a repository	 -->
+<!-- cannot be set to null. The "null" value for the threshold attribute -->
+<!-- simply means don't touch the threshold field, the threshold field   --> 
+<!-- keeps its old value.                                                -->
+     
+<!ATTLIST log4j:configuration
+  xmlns:log4j              CDATA #FIXED "http://jakarta.apache.org/log4j/" 
+  threshold                (all|debug|info|warn|error|fatal|off|null) "null"
+  debug                    (true|false|null)  "null"
+>
+
+<!-- renderer elements allow the user to customize the conversion of  -->
+<!-- message objects to String.                                       -->
+
+<!ELEMENT renderer EMPTY>
+<!ATTLIST renderer
+  renderedClass  CDATA #REQUIRED
+  renderingClass CDATA #REQUIRED
+>
+
+<!-- Appenders must have a name and a class. -->
+<!-- Appenders may contain an error handler, a layout, optional parameters -->
+<!-- and filters. They may also reference (or include) other appenders. -->
+<!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)>
+<!ATTLIST appender
+  name 		ID 	#REQUIRED
+  class 	CDATA	#REQUIRED
+>
+
+<!ELEMENT layout (param*)>
+<!ATTLIST layout
+  class		CDATA	#REQUIRED
+>
+
+<!ELEMENT filter (param*)>
+<!ATTLIST filter
+  class		CDATA	#REQUIRED
+>
+
+<!-- ErrorHandlers can be of any class. They can admit any number of -->
+<!-- parameters. -->
+
+<!ELEMENT errorHandler (param*, root-ref?, logger-ref*,  appender-ref?)> 
+<!ATTLIST errorHandler
+   class        CDATA   #REQUIRED 
+>
+
+<!ELEMENT root-ref EMPTY>
+
+<!ELEMENT logger-ref EMPTY>
+<!ATTLIST logger-ref
+  ref IDREF #REQUIRED
+>
+
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+  name		CDATA   #REQUIRED
+  value		CDATA	#REQUIRED
+>
+
+
+<!-- The priority class is org.apache.log4j.Level by default -->
+<!--
+    DEPRECATED
+
+<!ELEMENT priority (param*)>
+<!ATTLIST priority
+  class   CDATA	#IMPLIED
+  value	  CDATA #REQUIRED
+>
+-->
+
+<!-- The level class is org.apache.log4j.Level by default -->
+<!ELEMENT level (param*)>
+<!ATTLIST level
+  class   CDATA	#IMPLIED
+  value	  CDATA #REQUIRED
+>
+
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named category. -->
+<!--
+    DEPRECATED
+
+<!ELEMENT category (param*,(priority|level)?,appender-ref*)>
+<!ATTLIST category
+  class         CDATA   #IMPLIED
+  name		CDATA	#REQUIRED
+  additivity	(true|false) "true"  
+>
+-->
+
+<!-- If no level element is specified, then the configurator MUST not -->
+<!-- touch the level of the named logger. -->
+<!ELEMENT logger (level?, appender-ref*)>
+<!ATTLIST logger
+  class         CDATA   #IMPLIED
+  name		ID	#REQUIRED
+  additivity	(true|false) "true"  
+>
+
+<!--
+    DEPRECATED
+
+<!ELEMENT categoryFactory (param*)>
+<!ATTLIST categoryFactory 
+   class        CDATA #REQUIRED>
+-->
+
+<!ELEMENT appender-ref EMPTY>
+<!ATTLIST appender-ref
+  ref IDREF #REQUIRED
+>
+
+<!-- If no priority element is specified, then the configurator MUST not -->
+<!-- touch the priority of root. -->
+<!-- The root category always exists and cannot be subclassed. -->
+<!ELEMENT root (param*, level?, appender-ref*)>
+
+
+<!-- ==================================================================== -->
+<!--                       A logging event                                -->
+<!-- ==================================================================== -->
+<!ELEMENT log4j:eventSet (log4j:event*)>
+<!ATTLIST log4j:eventSet
+  xmlns:log4j             CDATA #FIXED "http://jakarta.apache.org/log4j/" 
+  version                (1.1|1.2) "1.2" 
+  includesLocationInfo   (true|false) "true"
+>
+
+
+
+<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, 
+                       log4j:locationInfo?) >
+
+<!-- The timestamp format is application dependent. -->
+<!ATTLIST log4j:event
+    logger     CDATA #REQUIRED
+    level      CDATA #REQUIRED
+    thread     CDATA #REQUIRED
+    timestamp  CDATA #REQUIRED
+>
+
+<!ELEMENT log4j:message (#PCDATA)>
+<!ELEMENT log4j:NDC (#PCDATA)>
+
+<!ELEMENT log4j:throwable (#PCDATA)>
+
+<!ELEMENT log4j:locationInfo EMPTY>
+<!ATTLIST log4j:locationInfo
+  class  CDATA	#REQUIRED
+  method CDATA	#REQUIRED
+  file   CDATA	#REQUIRED
+  line   CDATA	#REQUIRED
+>

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.dtd
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml?rev=240176&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml Fri Aug 26 00:26:01 2005
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+    <!-- ====================================================================== -->
+    <!-- A P P E N D E R S                                                      -->
+    <!-- ====================================================================== -->
+
+    <!-- console -->
+    <appender name="console" class="org.apache.log4j.ConsoleAppender">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
+        </layout>
+    </appender>
+
+    <!-- error.log -->
+    <appender name="error" class="org.apache.log4j.FileAppender">
+        <param name="File" value="logs/jackrabbit.log"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d{dd.MM.yyyy HH:mm:ss} *%-5p* %c{1}: %m (%F, line %L)%n"/>
+        </layout>
+    </appender>
+
+    <!-- ====================================================================== -->
+    <!-- L O G G E R S                                                          -->
+    <!-- ====================================================================== -->
+
+    <root>
+        <level value="info" />
+        <appender-ref ref="console"/>
+        <!-- <appender-ref ref="error"/> -->
+    </root>
+
+</log4j:configuration>

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/repository/repository.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/repository/repository.xml?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/repository/repository.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/repository/repository.xml Fri Aug 26 00:26:01 2005
@@ -155,14 +155,7 @@
 	Search index and the file system it uses.
         -->
 	<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
-	    <param name="useCompoundFile" value="true"/>
-	    <param name="minMergeDocs" value="1000"/>
-	    <param name="maxMergeDocs" value="10000"/>
-	    <param name="mergeFactor" value="10"/>
-
-	    <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-		<param name="path" value="${wsp.home}/index"/>
-	    </FileSystem>
+  		<param name="path" value="${wsp.home}/index"/>
 	</SearchIndex>
     </Workspace>
 

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml Fri Aug 26 00:26:01 2005
@@ -5,6 +5,23 @@
     <display-name>Jackrabbit JCR Server</display-name>
 
     <!-- ====================================================================== -->
+    <!-- L O G G I N G   S E R V L E T                                          -->
+    <!-- ====================================================================== -->
+    <servlet>
+        <servlet-name>Logging</servlet-name>
+        <description>The logging servlet configures the Log4J logging facility.</description>
+        <servlet-class>org.apache.jackrabbit.j2ee.LoggingServlet</servlet-class>
+
+        <init-param>
+            <param-name>log4j-config</param-name>
+            <param-value>/WEB-INF/log4j.xml</param-value>
+            <description>initial log4j configuration</description>
+        </init-param>
+
+        <load-on-startup>0</load-on-startup>
+    </servlet>
+
+    <!-- ====================================================================== -->
     <!-- R E P O S I T O R Y   S T A R T U P  S E R V L E T                     -->
     <!-- ====================================================================== -->
     <servlet>
@@ -17,12 +34,6 @@
         <servlet-class>org.apache.jackrabbit.j2ee.RepositoryStartupServlet</servlet-class>
 
         <init-param>
-            <param-name>log4j-config</param-name>
-            <param-value>/WEB-INF/repository/log4j.properties</param-value>
-            <description>initial log4j configuration</description>
-        </init-param>
-
-        <init-param>
             <param-name>repository-config</param-name>
             <param-value>/WEB-INF/repository/repository.xml</param-value>
             <description>the repository config location</description>
@@ -80,12 +91,6 @@
         <servlet-class>org.apache.jackrabbit.j2ee.RepositoryAccessServlet</servlet-class>
 
         <init-param>
-            <param-name>log4j-config</param-name>
-            <param-value>/WEB-INF/repository/log4j.properties</param-value>
-            <description>initial log4j configuration</description>
-        </init-param>
-
-        <init-param>
             <param-name>repository-name</param-name>
             <param-value>jackrabbit.repository</param-value>
             <description>Repository Name that is used to retrieve it via JNDI</description>
@@ -173,7 +178,7 @@
                 the defines the commons-chain catalog for server tasks.
             </description>
         </init-param>
-        !--
+        <!--
             Optional parameter defining namespaces (or uri or prefixes) and/or
             nodetype names that mark hidden resources.
             If omitted not resources will be filtered out.

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavConstants.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavConstants.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavConstants.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavConstants.java Fri Aug 26 00:26:01 2005
@@ -35,6 +35,11 @@
     public static final String HEADER_DESTINATION = "Destination";
     public static final String HEADER_IF = "If";
     public static final String HEADER_AUTHORIZATION = "Authorization";
+    public static final String HEADER_CONTENT_TYPE = "Content-Type";
+    public static final String HEADER_CONTENT_LENGTH = "Content-Length";
+    public static final String HEADER_CONTENT_LANGUAGE = "Content-Language";
+    public static final String HEADER_ETAG = "ETag";
+    public static final String HEADER_LAST_MODIFIED = "Last-Modified";
 
     //---------------------------------------------------- Lock-Token header ---
     public static final String HEADER_LOCK_TOKEN = "Lock-Token";

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavMethods.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavMethods.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavMethods.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavMethods.java Fri Aug 26 00:26:01 2005
@@ -60,7 +60,7 @@
      * The webdav POST method and public constant
      */
     public static final int DAV_POST = DAV_HEAD + 1;
-    private static final String METHOD_POST = "POST";
+    public static final String METHOD_POST = "POST";
 
 
     /** The webdav DELETE method and public constant */

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/DavResource.java Fri Aug 26 00:26:01 2005
@@ -17,6 +17,7 @@
 
 import org.apache.jackrabbit.webdav.property.*;
 import org.apache.jackrabbit.webdav.lock.*;
+import org.apache.jackrabbit.webdav.io.InputContext;
 
 import java.io.InputStream;
 
@@ -184,12 +185,10 @@
      * Add the given resource as an internal member to this resource.
      *
      * @param resource {@link DavResource} to be added as internal member.
-     * @param in {@link java.io.InputStream} providing the content for the
-     * internal member.
+     * @param inputCxt Context providing the content for the internal member.
      * @throws DavException
      */
-    public void addMember(DavResource resource, InputStream in)
-            throws DavException;
+    public void addMember(DavResource resource, InputContext inputCxt) throws DavException;
 
     /**
      * Add the given resource as an internal member to this resource.

Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java?rev=240176&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java Fri Aug 26 00:26:01 2005
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.webdav.io;
+
+import java.io.InputStream;
+
+/**
+ * <code>InputContext</code> class encapsulates the <code>InputStream</code>
+ * and some header values as present in the POST, PUT or MKCOL request.
+ */
+public class InputContext {
+
+    private InputStream inputStream;
+    private String contentType;
+    private String contentLanguage;
+
+    /**
+     * Returns the input stream to be imported or <code>null</code> if no stream
+     * has been set or if the stream has been consumed.
+     *
+     * @return the input stream.
+     */
+    public InputStream getInputStream() {
+        return inputStream;
+    }
+
+    /**
+     * Sets the input stream to be imported. The input stream should be set to
+     * <code>null</code> if it has been consumed.
+     *
+     * @param inputStream the input stream
+     */
+    public void setInputStream(InputStream inputStream) {
+        this.inputStream = inputStream;
+    }
+
+    /**
+     * Returns the content type of the resource to be imported or null, if
+     * no has previously been set.
+     *
+     * @return the content type of the resource
+     */
+    public String getContentType() {
+        return contentType;
+    }
+
+    /**
+     * Sets the content type of the resource.
+     *
+     * @param contentType the content type.
+     */
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    /**
+     * Returns the content language or <code>null</code>.
+     *
+     * @return contentLanguage
+     */
+    public String getContentLanguage() {
+        return contentLanguage;
+    }
+
+    /**
+     * Sets the content language.
+     *
+     * @param contentLanguage
+     */
+    public void setContentLanguage(String contentLanguage) {
+        this.contentLanguage = contentLanguage;
+    }
+}

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/io/InputContext.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/ResourceType.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/ResourceType.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/ResourceType.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/property/ResourceType.java Fri Aug 26 00:26:01 2005
@@ -15,12 +15,26 @@
  */
 package org.apache.jackrabbit.webdav.property;
 
+import java.util.HashSet;
+import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.jdom.Element;
+import org.jdom.Namespace;
+import org.apache.jackrabbit.webdav.version.DeltaVConstants;
 
 /**
  * The <code>ResourceType</code> class represents the webdav resource
- * type property. Valid resource types are '{@link #COLLECTION collection}',
- * {@link #DEFAULT_RESOURCE}.
+ * type property. The property may contain multiple resource type
+ * values. Predefined resource types are those defined by RFC2518 and RFC3253:
+ * <ul>
+ * <li>{@link #DEFAULT_RESOURCE the empty default resource type},</li>
+ * <li>'{@link #COLLECTION DAV:collection}',</li>
+ * <li>'{@link #VERSION_HISTORY DAV:version-history}',</li>
+ * <li>'{@link #ACTIVITY DAV:activity}',</li>
+ * <li>'{@link #BASELINE DAV:baseline}',</li>
+ * </ul>
  */
 public class ResourceType extends AbstractDavProperty {
 
@@ -34,61 +48,176 @@
      */
     public static final int COLLECTION = DEFAULT_RESOURCE + 1;
 
-    private int resourceType = DEFAULT_RESOURCE;
+    /**
+     * The version-history resource type
+     */
+    public static final int VERSION_HISTORY = COLLECTION + 1;
+
+    /**
+     * The activity resource type
+     */
+    public static final int ACTIVITY = VERSION_HISTORY + 1;
+
+    /**
+     * The baseline resource type
+     */
+    public static final int BASELINE = ACTIVITY + 1;
+
+    /**
+     * Array containing all possible resourcetype elements
+     */
+    private static final List NAMES = new ArrayList();
+    static {
+        NAMES.add(null);
+        NAMES.add(new TypeName(XML_COLLECTION, NAMESPACE));
+        NAMES.add(new TypeName(DeltaVConstants.XML_VERSION_HISTORY, DeltaVConstants.NAMESPACE));
+        NAMES.add(new TypeName(DeltaVConstants.XML_ACTIVITY, DeltaVConstants.NAMESPACE));
+        NAMES.add(new TypeName(DeltaVConstants.XML_BASELINE, DeltaVConstants.NAMESPACE));
+    };
+
+    private final int[] resourceTypes;
 
     /**
-     * Create a resource type property
+     * Create a single-valued resource type property
      */
     public ResourceType(int resourceType) {
+        this(new int[] { resourceType });
+    }
+
+    /**
+     * Create a multi-valued resource type property
+     */
+    public ResourceType(int[] resourceTypes) {
         super(DavPropertyName.RESOURCETYPE, false);
-	if (!isValidResourceType(resourceType)) {
-           throw new IllegalArgumentException("Invalid resource type '"+ resourceType +"'.");
+        for (int i=0; i<resourceTypes.length; i++) {
+            if (!isValidResourceType(resourceTypes[i])) {
+                throw new IllegalArgumentException("Invalid resource type '"+ resourceTypes[i] +"'.");
+            }
         }
-	this.resourceType = resourceType;
+	this.resourceTypes = resourceTypes;
     }
 
     /**
-     * Return the JDOM element representation of this resource type
+     * Return the JDOM element representation of this property
      *
      * @return a JDOM element
      */
     public Element toXml() {
         Element elem = getName().toXml();
-        if (getValue() != null) {
-            elem.addContent((Element)getValue());
-        }
+        elem.addContent((Set)getValue());
         return elem;
     }
 
     /**
-     * Returns the Xml representation of this resource type.
+     * Returns the Xml representation of this property as a
+     * <code>Set</code> of <code>Element</code>s.
      *
-     * @return Xml representation of this resource type.
+     * @return a <code>Set</code> of <code>Element</code>s
+     * representing this property.
      * @see DavProperty#getValue()
      */
     public Object getValue() {
-        return (resourceType == COLLECTION) ? new Element(XML_COLLECTION, NAMESPACE) : null;
+        Set elements = new HashSet();
+        for (int i=0; i<resourceTypes.length; i++) {
+            Element elem = resourceTypeToXml(resourceTypes[i]);
+            if (elem != null) {
+                elements.add(elem);
+            }
+        }
+        return elements;
     }
 
     /**
-     * Returns the resource type specified with the constructor.
+     * Returns the resource types specified with the constructor.
      *
-     * @return resourceType
+     * @return resourceTypes
      */
-    public int getResourceType() {
-        return resourceType;
+    public int[] getResourceTypes() {
+        return resourceTypes;
     }
 
     /**
-     * Validates the specified resourceType.
+     * Returns the Xml representation of an individual resource type,
+     * or <code>null</code> if the resource type has no Xml
+     * representation (e.g. {@link #DEFAULT_RESOURCE}).<p/>{@link #getValue()} uses
+     * this method to build the full set of Xml elements for the property's resource
+     * types. Subclasses should override this method to add support for resource
+     * types they define.
      *
-     * @param resourceType
-     * @return true if the specified resourceType is valid.
+     * @return Xml element representing the internal type or <code>null</code>
+     * if the resource has no element name assigned (default resource type).
      */
-    public boolean isValidResourceType(int resourceType) {
-        if (resourceType < DEFAULT_RESOURCE || resourceType > COLLECTION) {
-	    return false;
-	}
+    private static Element resourceTypeToXml(int resourceType) {
+        TypeName name = (TypeName) NAMES.get(resourceType);
+        return (name != null) ? new Element(name.localName, name.namespace) : null;
+    }
+
+    /**
+     * Returns true if the given integer defines a valid resource type.
+     *
+     * @param resourceType to be validated.
+     * @return true if this is one of the predefined resource types
+     */
+    private static boolean isValidResourceType(int resourceType) {
+        if (resourceType < DEFAULT_RESOURCE || resourceType > NAMES.size()-1) {
+            return false;
+        }
         return true;
+    }
+
+    /**
+     * Register an additional resource type
+     *
+     * @param name
+     * @param namespace
+     * @return int to be used for creation of a new <code>ResourceType</code> property
+     * that contains this type.
+     * @throws IllegalArgumentException if the given element is <code>null</code> or
+     * if the registration fails for another reason.
+     */
+    public static int registerResourceType(String name, Namespace namespace) {
+        if (name == null || namespace == null) {
+            throw new IllegalArgumentException("Cannot register a <null> resourcetype");
+        }
+        TypeName tn = new TypeName(name, namespace);
+        // avoid duplicate registrations
+        if (NAMES.contains(tn)) {
+            return NAMES.indexOf(tn);
+        }
+        // register new type
+        if (NAMES.add(tn)) {
+            return NAMES.size() - 1;
+        } else {
+            throw new IllegalArgumentException("Could not register resourcetype " +  namespace.getPrefix() + name);
+        }
+    }
+
+    //--------------------------------------------------------< inner class >---
+    /**
+     * Private inner class used to register predefined and user defined resource
+     * types.
+     */
+    private static class TypeName {
+
+        private final String localName;
+        private final Namespace namespace;
+        private final int hashCode;
+
+        private TypeName(String localName, Namespace namespace) {
+            this.localName = localName;
+            this.namespace = namespace;
+            hashCode = ("{" + namespace.getURI() + "}" + localName).hashCode();
+        }
+
+        public int hashCode() {
+            return hashCode;
+        }
+
+        public boolean equals(Object o) {
+            if (o instanceof TypeName) {
+                return hashCode == ((TypeName)o).hashCode;
+            }
+            return false;
+        }
     }
 }

Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java?rev=240176&r1=240175&r2=240176&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/version/VersionHistoryResource.java Fri Aug 26 00:26:01 2005
@@ -16,6 +16,7 @@
 package org.apache.jackrabbit.webdav.version;
 
 import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.ResourceType;
 import org.apache.jackrabbit.webdav.DavException;
 
 /**



Re: svn commit: r240176 - in /incubator/jackrabbit/trunk/contrib/jcr-server: ./ server/src/java/org/apache/jackrabbit/server/ server/src/java/org/apache/jackrabbit/server/io/ server/src/java/org/apache/jackrabbit/webdav/jcr/ server/src/java/org/apache/jack...

Posted by Brian Moseley <bc...@osafoundation.org>.
tripod@apache.org wrote:
> Author: tripod
> Date: Fri Aug 26 00:26:01 2005
> New Revision: 240176
> 
> URL: http://svn.apache.org/viewcvs?rev=240176&view=rev
> Log:
> [JCR-181] jcr-server should honor a webdav request's Content-Type and Content-Language headers
> [JCR-200] move log4j initialization out of RepositoryStartupServlet

great patch angela, includes a lot of things i needed. thanks!