From e72240c94aa84f75b3feb4d26cddfa2e7bd22f65 Mon Sep 17 00:00:00 2001
From: Jukka Zitting <jukka@apache.org>
Date: Mon, 8 Aug 2011 18:27:44 +0200
Subject: [PATCH] JCR-3029: JcrRemotingServlet should interpolate system
 properties in the home init-param

Remove the configurable temporary file path for file uploads and always use the standard java.io.tmpdir instead. There should be little need for this configurability and we get to avoid the hardcoded "jackrabbit" path in the default setting.
---
 .../server/remoting/davex/JcrRemotingServlet.java  |   56 +++-----------------
 .../jackrabbit/server/util/HttpMultipartPost.java  |   20 ++------
 .../apache/jackrabbit/server/util/RequestData.java |    4 +-
 3 files changed, 14 insertions(+), 66 deletions(-)

diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
index 8b544e9..353af13 100644
--- a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/remoting/davex/JcrRemotingServlet.java
@@ -46,10 +46,8 @@ import javax.jcr.Workspace;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
-import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
@@ -191,21 +189,6 @@ public abstract class JcrRemotingServlet extends JCRWebdavServerServlet {
     private static Logger log = LoggerFactory.getLogger(JcrRemotingServlet.class);
 
     /**
-     * the home init parameter. other relative filesystem paths are
-     * relative to this location.
-     */
-    public static final String INIT_PARAM_HOME = "home";
-
-    /**
-     * the 'temp-directory' init parameter
-     */
-    public static final String INIT_PARAM_TMP_DIRECTORY = "temp-directory";
-    /**
-     * temp-dir attribute to be set to the servlet-context
-     */
-    public static final String ATTR_TMP_DIRECTORY = "remoting-servlet.tmpdir";
-
-    /**
      * the 'temp-directory' init parameter
      */
     public static final String INIT_PARAM_BATCHREAD_CONFIG = "batchread-config";
@@ -238,29 +221,15 @@ public abstract class JcrRemotingServlet extends JCRWebdavServerServlet {
             }
         }
 
-        // setup home directory
-        String paramHome = getServletConfig().getInitParameter(INIT_PARAM_HOME);
-        if (paramHome == null) {
-            log.debug("missing init-param " + INIT_PARAM_HOME + ". using default: 'jackrabbit'");
-            paramHome = "jackrabbit";
+        // Log warnings for deprecated configuration properties
+        String home = getServletConfig().getInitParameter("home");
+        if (home != null) {
+            log.warn("Ignoring deprecated parameter: home={}", home);
         }
-        File home;
-        try {
-            home = new File(paramHome).getCanonicalFile();
-        } catch (IOException e) {
-            throw new ServletException(INIT_PARAM_HOME + " invalid." + e.toString());
-        }
-        home.mkdirs();
-
-        String tmp = getServletConfig().getInitParameter(INIT_PARAM_TMP_DIRECTORY);
-        if (tmp == null) {
-            log.debug("No " + INIT_PARAM_TMP_DIRECTORY + " specified. using 'tmp'");
-            tmp = "tmp";
+        String tmp = getServletConfig().getInitParameter("temp-directory");
+        if (tmp != null) {
+            log.warn("Ignoring deprecated parameter: temp-directory={}", tmp);
         }
-        File tmpDirectory = new File(home, tmp);
-        tmpDirectory.mkdirs();
-        log.debug("  temp-directory = " + tmpDirectory.getPath());
-        getServletContext().setAttribute(ATTR_TMP_DIRECTORY, tmpDirectory);
 
         // force usage of custom locator factory.
         super.setLocatorFactory(new DavLocatorFactoryImpl(getInitParameter(INIT_PARAM_RESOURCE_PATH_PREFIX)));
@@ -310,7 +279,7 @@ public abstract class JcrRemotingServlet extends JCRWebdavServerServlet {
             // special remoting request: the defined parameters are exclusive
             // and cannot be combined.
             Session session = getRepositorySession(webdavRequest);
-            RequestData data = new RequestData(webdavRequest, getTempDirectory(getServletContext()));
+            RequestData data = new RequestData(webdavRequest);
             String loc = null;
             try {
                 String[] pValues;
@@ -530,15 +499,6 @@ public abstract class JcrRemotingServlet extends JCRWebdavServerServlet {
         return JcrDavSession.getRepositorySession(ds);
     }
 
-    /**
-     * Returns the temp directory
-     *
-     * @return the temp directory
-     */
-    private static File getTempDirectory(ServletContext servletCtx) {
-        return (File) servletCtx.getAttribute(ATTR_TMP_DIRECTORY);
-    }
-
     //--------------------------------------------------------------------------
     /**
      * Locator factory that specially deals with hrefs having a .json extension.
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/HttpMultipartPost.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/HttpMultipartPost.java
index f59aae6..71276ed 100644
--- a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/HttpMultipartPost.java
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/HttpMultipartPost.java
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.server.util;
 
 import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
@@ -25,7 +24,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.servlet.http.HttpServletRequest;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -50,35 +48,25 @@ class HttpMultipartPost {
 
     private boolean initialized;
 
-    HttpMultipartPost(HttpServletRequest request, File tmpDir) throws IOException {
-        extractMultipart(request, tmpDir);
+    HttpMultipartPost(HttpServletRequest request) throws IOException {
+        extractMultipart(request);
         initialized = true;
     }
 
     /**
-     *
-     * @param tmpDir
-     * @return
-     */
-    private static FileItemFactory getFileItemFactory(File tmpDir) {
-        DiskFileItemFactory fiFactory = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, tmpDir);
-        return fiFactory;
-    }
-
-    /**
      * 
      * @param request
      * @param tmpDir
      * @throws IOException
      */
-    private void extractMultipart(HttpServletRequest request, File tmpDir)
+    private void extractMultipart(HttpServletRequest request)
             throws IOException {
         if (!ServletFileUpload.isMultipartContent(request)) {
             log.debug("Request does not contain multipart content -> ignoring.");
             return;
         }
 
-        ServletFileUpload upload = new ServletFileUpload(getFileItemFactory(tmpDir));
+        ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
         // make sure the content disposition headers are read with the charset
         // specified in the request content type (or UTF-8 if no charset is specified).
         // see JCR
diff --git a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/RequestData.java b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/RequestData.java
index 0a99513..6a9525b 100644
--- a/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/RequestData.java
+++ b/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/util/RequestData.java
@@ -31,9 +31,9 @@ public class RequestData {
     private final HttpServletRequest request;
     private final HttpMultipartPost mpReq;
 
-    public RequestData(HttpServletRequest request, File tmpDir) throws IOException {
+    public RequestData(HttpServletRequest request) throws IOException {
         this.request = request;
-        this.mpReq = new HttpMultipartPost(request, tmpDir);
+        this.mpReq = new HttpMultipartPost(request);
     }
 
     /**
-- 
1.7.4.4

