You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2013/10/24 11:47:42 UTC

svn commit: r1535328 - in /ace/trunk/org.apache.ace.deployment: src/org/apache/ace/deployment/servlet/ test/org/apache/ace/deployment/servlet/

Author: jawi
Date: Thu Oct 24 09:47:41 2013
New Revision: 1535328

URL: http://svn.apache.org/r1535328
Log:
ACE-330 - limit DP-versions for a target:

- added some additional unit tests for the various situations;
- some small updates for the ContentRangeResponseWrapper.


Modified:
    ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/ContentRangeResponseWrapper.java
    ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/DefaultDeploymentProcessor.java
    ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java

Modified: ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/ContentRangeResponseWrapper.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/ContentRangeResponseWrapper.java?rev=1535328&r1=1535327&r2=1535328&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/ContentRangeResponseWrapper.java (original)
+++ ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/ContentRangeResponseWrapper.java Thu Oct 24 09:47:41 2013
@@ -18,13 +18,13 @@
  */
 package org.apache.ace.deployment.servlet;
 
-import java.io.BufferedInputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -44,6 +44,7 @@ public class ContentRangeResponseWrapper
      * Internal helper that Wraps a ServletOutputStream to add byte range support.
      */
     private static class ContentRangeOutputStreamWrapper extends ServletOutputStream {
+        private static final int BUFFER_SIZE = 32 * 1024; // kB
 
         private final HttpServletResponse m_response;
         private final long m_requestFirstBytePos;
@@ -52,7 +53,7 @@ public class ContentRangeResponseWrapper
         private final FileOutputStream m_os;
         private final File m_file;
 
-        private long m_instanceLen = 0l;
+        private final AtomicLong m_instanceLen = new AtomicLong(0);
 
         public ContentRangeOutputStreamWrapper(HttpServletResponse response, long firstBytePos, long lastBytePos) throws IOException {
 
@@ -72,45 +73,42 @@ public class ContentRangeResponseWrapper
 
         @Override
         public void write(int b) throws IOException {
-
             // We only need to buffer the relevant bytes since we keep track of the instance length in the counter.
-            if (m_instanceLen >= m_requestFirstBytePos
-                && m_instanceLen <= m_requestLastBytePos) {
+            long value = m_instanceLen.getAndIncrement();
+            if (value >= m_requestFirstBytePos && value <= m_requestLastBytePos) {
                 m_os.write(b);
             }
-            m_instanceLen++;
         }
 
         @Override
         public void close() throws IOException {
             closeQuietly(m_os);
 
-            long instanceLastBytePos = m_instanceLen - 1;
+            long instanceLength = m_instanceLen.get();
+            long instanceLastBytePos = instanceLength - 1L;
             InputStream is = null;
             ServletOutputStream os = null;
 
             try {
                 if (instanceLastBytePos < m_requestFirstBytePos) {
-
                     m_response.setStatus(SC_REQUESTED_RANGE_NOT_SATISFIABLE);
-                    m_response.setHeader("Content-Range", String.format("bytes */%d", m_instanceLen));
+                    m_response.setHeader("Content-Range", String.format("bytes */%d", instanceLength));
                 }
                 else {
-
                     long firstBytePos = m_requestFirstBytePos;
                     long lastBytePos = instanceLastBytePos < m_requestLastBytePos ? instanceLastBytePos : m_requestLastBytePos;
                     long contentLength = lastBytePos - firstBytePos + 1;
 
                     m_response.setStatus(SC_PARTIAL_CONTENT);
                     m_response.setHeader("Content-Length", String.valueOf(contentLength));
-                    m_response.setHeader("Content-Range", String.format("bytes %d-%d/%d", firstBytePos, lastBytePos, m_instanceLen));
+                    m_response.setHeader("Content-Range", String.format("bytes %d-%d/%d", firstBytePos, lastBytePos, instanceLength));
 
-                    is = new BufferedInputStream(new FileInputStream(m_file));
+                    byte[] buffer = new byte[BUFFER_SIZE];
+                    is = new FileInputStream(m_file);
                     os = m_response.getOutputStream();
 
-                    int b;
-                    while ((b = is.read()) != -1) {
-                        os.write(b);
+                    for (int bytesRead = is.read(buffer); bytesRead != -1; bytesRead = is.read(buffer)) {
+                        os.write(buffer, 0, bytesRead);
                     }
                 }
             }
@@ -173,7 +171,8 @@ public class ContentRangeResponseWrapper
      * Extracts and validates the Range header from a request. If the header is found but is syntactically invalid it
      * will be ignored as required by specification.
      * 
-     * @param request the request to use
+     * @param request
+     *            the request to use
      * @return a long array with two elements (firstBytePos and lastBytePos), or <code>null</code> if no valid Range
      *         header was found.
      */

Modified: ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/DefaultDeploymentProcessor.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/DefaultDeploymentProcessor.java?rev=1535328&r1=1535327&r2=1535328&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/DefaultDeploymentProcessor.java (original)
+++ ace/trunk/org.apache.ace.deployment/src/org/apache/ace/deployment/servlet/DefaultDeploymentProcessor.java Thu Oct 24 09:47:41 2013
@@ -33,13 +33,14 @@ import org.apache.ace.deployment.process
  * client.
  */
 public class DefaultDeploymentProcessor implements DeploymentProcessor {
+    private static final int BUFFER_SIZE = 32 * 1024; // kB
 
     @Override
     public void process(InputStream inputStream, HttpServletRequest request, HttpServletResponse response) throws IOException {
-        OutputStream output = response.getOutputStream();
+        byte[] buffer = new byte[BUFFER_SIZE];
 
+        OutputStream output = response.getOutputStream();
         try {
-            byte[] buffer = new byte[1024 * 32];
             for (int bytesRead = inputStream.read(buffer); bytesRead != -1; bytesRead = inputStream.read(buffer)) {
                 output.write(buffer, 0, bytesRead);
             }

Modified: ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java?rev=1535328&r1=1535327&r2=1535328&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java (original)
+++ ace/trunk/org.apache.ace.deployment/test/org/apache/ace/deployment/servlet/DeploymentServletTest.java Thu Oct 24 09:47:41 2013
@@ -109,30 +109,13 @@ public class DeploymentServletTest {
     }
 
     @Test(groups = { UNIT })
-    public void getFixPackageForExistingTargetWithNonExistingFromVersion() throws Exception {
+    public void getDowngradeFixPackageWithNonExistingToVersion() throws Exception {
         // try to request a version range with a non-existing from-version, should cause a complete (non-fix) package to
         // be returned...
-        m_requestPathInfo = "/existing/versions/2.0.0";
-        m_requestCurrentParameter = "1.0.0";
-        m_servlet.doGet(m_request, m_response);
-        assertResponseCode(HttpServletResponse.SC_OK);
-        assertResponseOutputSize(100);
-        assertGeneratorTargetId("existing");
-        assertGeneratorToVersion("2.0.0");
-        assertGeneratorFromVersion(null);
-    }
-
-    @Test(groups = { UNIT })
-    public void getFixPackageForExistingTargetWithExistingFromVersion() throws Exception {
-        // try to request a version range with an existing from-version, should cause a fix package to be returned...
-        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestPathInfo = "/existing/versions/1.0.0";
         m_requestCurrentParameter = "2.0.0";
         m_servlet.doGet(m_request, m_response);
-        assertResponseCode(HttpServletResponse.SC_OK);
-        assertResponseOutputSize(100);
-        assertGeneratorTargetId("existing");
-        assertGeneratorToVersion("2.0.0");
-        assertGeneratorFromVersion("2.0.0");
+        assertResponseCode(HttpServletResponse.SC_NOT_FOUND);
     }
 
     @Test
@@ -238,22 +221,22 @@ public class DeploymentServletTest {
     }
 
     @Test
-    public void getSizeForFixPackageExistingTargetWithKnownSize() throws Exception {
-        m_artifactSize = 10;
-        m_requestCurrentParameter = "2.0.0";
+    public void getSizeForExistingTargetWithUnknownSize() throws Exception {
+        m_artifactSize = -1;
         m_requestPathInfo = "/existing/versions/2.0.0";
         m_servlet.doHead(m_request, m_response);
         assertResponseCode(HttpServletResponse.SC_OK);
-        assertResponseHeaderValue("X-ACE-DPSize", "22"); // 20 + 10%
+        assertResponseHeaderNotPresent("X-ACE-DPSize");
     }
 
     @Test
-    public void getSizeForExistingTargetWithUnknownSize() throws Exception {
-        m_artifactSize = -1;
+    public void getSizeForFixPackageExistingTargetWithKnownSize() throws Exception {
+        m_artifactSize = 10;
+        m_requestCurrentParameter = "2.0.0";
         m_requestPathInfo = "/existing/versions/2.0.0";
         m_servlet.doHead(m_request, m_response);
         assertResponseCode(HttpServletResponse.SC_OK);
-        assertResponseHeaderNotPresent("X-ACE-DPSize");
+        assertResponseHeaderValue("X-ACE-DPSize", "22"); // 20 + 10%
     }
 
     @Test
@@ -266,6 +249,67 @@ public class DeploymentServletTest {
         assertResponseHeaderNotPresent("X-ACE-DPSize");
     }
 
+    @Test(groups = { UNIT })
+    public void getUpgradeFixPackageWithExistingFromVersion() throws Exception {
+        // try to request a version range with an existing from-version, should cause a fix package to be returned...
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestCurrentParameter = "2.0.0";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+        assertGeneratorTargetId("existing");
+        assertGeneratorToVersion("2.0.0");
+        assertGeneratorFromVersion("2.0.0");
+    }
+
+    @Test(groups = { UNIT })
+    public void getUpgradeFixPackageWithNonExistingFromVersion() throws Exception {
+        // try to request a version range with a non-existing from-version, should cause a complete (non-fix) package to
+        // be returned...
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestCurrentParameter = "1.0.0";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+        assertGeneratorTargetId("existing");
+        assertGeneratorToVersion("2.0.0");
+        assertGeneratorFromVersion(null);
+    }
+
+    @Test(groups = { UNIT })
+    public void getUpgradeFixPackageWithNonExistingToVersion() throws Exception {
+        // try to request a version range with a non-existing from-version, should cause a complete (non-fix) package to
+        // be returned...
+        m_requestPathInfo = "/existing/versions/3.0.0";
+        m_requestCurrentParameter = "2.0.0";
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_NOT_FOUND);
+    }
+
+    @Test(groups = { UNIT })
+    public void getUpgradeWithExistingToVersion() throws Exception {
+        // try to request a version range with a non-existing from-version, should cause a complete (non-fix) package to
+        // be returned...
+        m_requestPathInfo = "/existing/versions/2.0.0";
+        m_requestCurrentParameter = null;
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_OK);
+        assertResponseOutputSize(100);
+        assertGeneratorTargetId("existing");
+        assertGeneratorToVersion("2.0.0");
+        assertGeneratorFromVersion(null);
+    }
+
+    @Test(groups = { UNIT })
+    public void getUpgradeWithNonExistingToVersion() throws Exception {
+        // try to request a version range with a non-existing from-version, should cause a complete (non-fix) package to
+        // be returned...
+        m_requestPathInfo = "/existing/versions/3.0.0";
+        m_requestCurrentParameter = null;
+        m_servlet.doGet(m_request, m_response);
+        assertResponseCode(HttpServletResponse.SC_NOT_FOUND);
+    }
+
     @Test
     public void getVersionsExistingTarget() throws Exception {
         m_requestPathInfo = "/existing/versions";
@@ -422,6 +466,7 @@ public class DeploymentServletTest {
 
         m_responseStatus = HttpServletResponse.SC_OK;
         m_responseHeaders = new HashMap<String, String>();
+        m_requestRangeHeader = null;
         m_responseOutputStream = new ByteArrayOutputStream();
     }