Author: wesw
Date: Mon Jun  8 18:55:21 2009
New Revision: 782726

URL: http://svn.apache.org/viewvc?rev=782726&view=rev
Log:
Should mostly be working now... Time to create an example app

Modified:
    struts/sandbox/trunk/struts2-fileupload-plugin/pom.xml
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/BasicProgressListener.java
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusAction.java
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusHolder.java
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/resources/struts-plugin.xml
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/BasicProgressListenerTest.java
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusActionTest.java
    
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusHolderTest.java

Modified: struts/sandbox/trunk/struts2-fileupload-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/pom.xml?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- struts/sandbox/trunk/struts2-fileupload-plugin/pom.xml (original)
+++ struts/sandbox/trunk/struts2-fileupload-plugin/pom.xml Mon Jun  8 18:55:21 
2009
@@ -28,7 +28,7 @@
         <artifactId>struts2-plugins</artifactId>
         <version>2.1.7-SNAPSHOT</version>
     </parent>
-    <groupId>struts2-fileupload-plugin</groupId>
+    <groupId>org.apache.struts</groupId>
     <artifactId>struts2-fileupload-plugin</artifactId>
     <version>1.0-SNAPSHOT</version>
     <name>Struts 2 Advanced File Upload Plugin</name>
@@ -46,6 +46,20 @@
             <version>2.1.7-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.thoughtworks.xstream</groupId>
+            <artifactId>xstream</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.jettison</groupId>
+            <artifactId>jettison</artifactId>
+            <version>1.1</version>
+            <!-- <scope>test</scope>  // testing jettison xstream driver -->
+        </dependency>
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -87,4 +101,4 @@
             </plugin>
         </plugins>
     </build>
-</project>
\ No newline at end of file
+</project>

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/BasicProgressListener.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/BasicProgressListener.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/BasicProgressListener.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/BasicProgressListener.java
 Mon Jun  8 18:55:21 2009
@@ -25,6 +25,9 @@
 import org.apache.struts2.ServletActionContext;
 import com.opensymphony.xwork2.inject.Inject;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Just a simple ProgressListener for Jakarta FileUpload. It will store
  * file progress in a HashMap that gets cleaned out once in a while.
@@ -38,7 +41,7 @@
 
     private int updateFrequency = 2048; // magic number for a default
     private UploadStatusTracker tracker;
-    private long lastUpdate = -1L; //
+    private static Map<UploadFile,Long> lastUpdates = new 
HashMap<UploadFile,Long>(); //
 
     /**
      *
@@ -71,14 +74,20 @@
      * @param item
      */
     public void update(long bytesRead, long contentLength, int item) {
-        if ( bytesRead / updateFrequency > lastUpdate) {
+        String sessionId = 
ServletActionContext.getRequest().getSession(true).getId();
+        UploadFile curKey = new UploadFile(sessionId,item);
+        Long lastUpdateValue = lastUpdates.get(curKey);
+        long lastUpdate = 0;
+        if (lastUpdateValue != null ) {
+            lastUpdate = lastUpdateValue.longValue();
+        }
+        if ( bytesRead / updateFrequency >= lastUpdate) {
             lastUpdate = bytesRead / updateFrequency;
             if (lastUpdate == 0 ) {
-                // we could get stuck here if we leave it
-                lastUpdate = 1L;
+                lastUpdate = 1;
             }
-            // I wonder if this will ever NPE
-            String sessionId = 
ServletActionContext.getRequest().getSession(true).getId();
+            lastUpdates.remove(curKey);
+            lastUpdates.put(curKey, lastUpdate);
             UploadStatus status = new UploadStatus();
             status.setBytesRead(bytesRead);
             status.setContentLength(contentLength);

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusAction.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusAction.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusAction.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusAction.java
 Mon Jun  8 18:55:21 2009
@@ -21,8 +21,13 @@
 package org.apache.struts2.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
+import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
+import com.thoughtworks.xstream.XStream;
 
 import java.util.List;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
 
 import org.apache.struts2.ServletActionContext;
 
@@ -35,9 +40,17 @@
  */
 public class UploadStatusAction extends ActionSupport {
 
-    public List<UploadStatus> getUploadStatus() {
+
+    public InputStream getJsonStream() {
         UploadStatusHolder holder = new UploadStatusHolder();
-        return holder.getAllStatusesInSession(
+        List<UploadStatus> statuses = holder.getAllStatusesInSession(
                 ServletActionContext.getRequest().getSession(true).getId() );
+
+        XStream xstream = new XStream(new JettisonMappedXmlDriver());
+        // xstream.omitField(UploadStatus.class, "lastAccess");
+        xstream.setMode(XStream.NO_REFERENCES);
+        xstream.alias("status", UploadStatus.class);
+        ByteArrayInputStream stream = new 
ByteArrayInputStream(xstream.toXML(statuses).getBytes());
+        return stream;
     }
 }

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusHolder.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusHolder.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusHolder.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/java/org/apache/struts2/fileupload/UploadStatusHolder.java
 Mon Jun  8 18:55:21 2009
@@ -38,9 +38,9 @@
 public class UploadStatusHolder implements UploadStatusTracker {
 
     private int secondsToKeep = 600 ; //default to ten minutes
-    public static Map<UploadFile,UploadStatus> statuses = new 
HashMap<UploadFile,UploadStatus>();
+    private static Map<UploadFile,UploadStatus> statuses = new 
HashMap<UploadFile,UploadStatus>();
 
-    private long lastRun = 0; // keep track so we aren't cleaning up all the 
time
+    private static long lastRun = 0; // keep track so we aren't cleaning up 
all the time
 
     /**
      *
@@ -72,9 +72,12 @@
      * @return
      */
     public UploadStatus getUploadStatus(String key, int fileItemId) {
-        cleanUp();
         UploadFile mapKey = new UploadFile(key, fileItemId);
-        return statuses.get(mapKey);
+        UploadStatus status = statuses.get(mapKey);
+
+        cleanUp();
+        // dumpMap();
+        return status;
     }
 
     /**
@@ -89,11 +92,13 @@
                 statusesInSession.add(statuses.get(candidate));
             }
         }
+        cleanUp();
+        // dumpMap();
         return statusesInSession;
     }
 
     private void cleanUp() {
-        long now = Calendar.getInstance().getTimeInMillis() / 1000 ;
+        long now = Calendar.getInstance().getTimeInMillis() / 1000L ;
         if ( now - lastRun > secondsToKeep) {
             // time to clean up
             List<UploadFile> keys2del = new ArrayList<UploadFile>();
@@ -106,5 +111,16 @@
                 statuses.remove(key2del);
             }
         }
+        lastRun = now;
+    }
+
+    // TODO - implement proper logging
+    private void dumpMap() {
+        System.err.println("lastRun = " + lastRun) ;
+        for (UploadFile dumpKey : statuses.keySet()) {
+            System.err.println("key: sessionId - " + dumpKey.getSessionId() + 
" itemId - " + dumpKey.getFileItemId() +
+                ", entry: lastAccess - " + 
statuses.get(dumpKey).getLastAccess() + " itemId - " + 
statuses.get(dumpKey).getItemId() +
+                " contentLength - " + statuses.get(dumpKey).getContentLength() 
+ " bytesRead - " + statuses.get(dumpKey).getBytesRead());
+        }
     }
 }

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/resources/struts-plugin.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/main/resources/struts-plugin.xml?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/resources/struts-plugin.xml
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/main/resources/struts-plugin.xml
 Mon Jun  8 18:55:21 2009
@@ -35,9 +35,7 @@
     <bean type="org.apache.struts2.fileupload.UploadStatusTracker" 
name="struts.fileuploadplugin.holder"
           class="org.apache.struts2.fileupload.UploadStatusHolder" />
 
-    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" 
name="struts"
-          
class="org.apache.struts2.fileupload.EnhancedJakartaMultiPartRequest"/>
-    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" 
name="jakarta"
+    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" 
name="upload-plugin"
           
class="org.apache.struts2.fileupload.EnhancedJakartaMultiPartRequest"/>
 
 
@@ -47,10 +45,12 @@
     <constant name="struts.fileuploadplugin.isportletupload" value="false"/>
     <constant name="struts.fileuploadplugin.timetokeepstatus" value="600" />
 
-    <package name="uploadStatus" namespace="/upload">
+    <package name="uploadStatus" namespace="/upload" extends="struts-default">
         <action name="status" 
class="org.apache.struts2.fileupload.UploadStatusAction">
-            <result name="success" type="xslt">
-                <param name="exposedValue">uploadStatus</param>
+            <result name="success" type="stream">
+                <param name="contentType">application/json</param>
+                <param name="inputName">jsonStream</param>
+                <param name="allowCaching">false</param>
             </result>
         </action>
     </package>

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/BasicProgressListenerTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/BasicProgressListenerTest.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/BasicProgressListenerTest.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/BasicProgressListenerTest.java
 Mon Jun  8 18:55:21 2009
@@ -49,6 +49,7 @@
     private MockServletContext servletContext;
     private HttpServletRequest request;
     private HttpServletResponse response;
+    private UploadStatusHolder tracker;
 
     /**
      *
@@ -75,6 +76,10 @@
 
         actionContext = new ActionContext(extraContext);
         ServletActionContext.setContext(actionContext);
+
+        tracker = new UploadStatusHolder();
+        tracker.setSecondsToKeep("600");
+
     }
 
     /**
@@ -84,15 +89,12 @@
     public void testUpdate() {
         BasicProgressListener listener = new BasicProgressListener();
         listener.setUpdateFrequency("1");
-        UploadStatusTracker tracker = new UploadStatusHolder();
         listener.setTracker(tracker);
         listener.update(10L,10L,1);
 
         UploadStatusTracker tracker2 = new UploadStatusHolder();
 
         String key = request.getSession().getId();
-        // System.err.println("key - " + key);
-
         UploadStatus status = tracker2.getUploadStatus(key , 1);
 
         assertTrue(status.getBytesRead() == 10L);
@@ -106,19 +108,17 @@
     @Test
     public void testDontUpdate() {
         BasicProgressListener listener = new BasicProgressListener();
-        // listener.setUpdateFrequency("1000"); // let default of 2048 take 
over
-        UploadStatusTracker tracker = new UploadStatusHolder();
+
         listener.setTracker(tracker);
+        listener.setUpdateFrequency("512");
+
         listener.update(10L,10L,1);
         listener.update(100L,100L,1);
 
-        UploadStatusTracker tracker2 = new UploadStatusHolder();
-
-        String key = request.getSession().getId();
-        // System.err.println("key - " + key);
-
-        UploadStatus status = tracker2.getUploadStatus(key, 1 );
+        String key = ServletActionContext.getRequest().getSession().getId();
 
+        UploadStatus status = tracker.getUploadStatus(key, 1 );
+        assertTrue(status != null);
         assertTrue(status.getBytesRead() == 10L);
         assertTrue(status.getContentLength() == 10L);
         assertTrue(status.getItemId() == 1);
@@ -130,16 +130,16 @@
      */
     @Test
     public void testMultipleFileUploadProgress() {
+
         BasicProgressListener listener = new BasicProgressListener();
-        UploadStatusTracker tracker = new UploadStatusHolder();
         listener.setTracker(tracker);
-        listener.setUpdateFrequency("10");
+        listener.setUpdateFrequency("512");
+
         listener.update(10L, 10L, 1);
         listener.update(100L, 100L, 2);
 
         UploadStatusTracker tracker2 = new UploadStatusHolder();
         String key = request.getSession().getId();
-        // System.err.println("key - " + key);
 
         UploadStatus status = tracker2.getUploadStatus(key, 1 );
 

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusActionTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusActionTest.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusActionTest.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusActionTest.java
 Mon Jun  8 18:55:21 2009
@@ -12,8 +12,13 @@
 import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
+import java.io.InputStream;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 
 import com.opensymphony.xwork2.ActionContext;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -64,16 +69,31 @@
      *
      */
     @Test
-    public void testUploadStatusActionGetUploadStatus() {
+    public void testUploadStatusActionGetUploadStatus() throws Exception {
         BasicProgressListener listener = new BasicProgressListener();
-        UploadStatusTracker tracker = new UploadStatusHolder();
+        UploadStatusHolder tracker = new UploadStatusHolder();
+        tracker.setSecondsToKeep("600");
         listener.setTracker(tracker);
         listener.setUpdateFrequency("10");
         listener.update(10L, 10L, 1);
         listener.update(100L, 100L, 2);
 
         UploadStatusAction action = new UploadStatusAction();
-        List<UploadStatus> statuses = action.getUploadStatus();
+        InputStream in = action.getJsonStream();
+
+        StringBuilder builder = new StringBuilder();
+        BufferedReader br =
+                new BufferedReader(new InputStreamReader(in));
+
+        String inputLine;
+        while ((inputLine = br.readLine()) != null) {
+            builder.append(inputLine);
+        }
+        in.close();
+        System.err.println(builder.toString());
+        XStream xstream = new XStream(new JettisonMappedXmlDriver());
+        xstream.alias("status", UploadStatus.class);
+        List<UploadStatus> statuses = (List<UploadStatus>) 
xstream.fromXML(builder.toString()) ;
 
         for (UploadStatus status : statuses) {
             if (status.getItemId() == 1) {

Modified: 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusHolderTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusHolderTest.java?rev=782726&r1=782725&r2=782726&view=diff
==============================================================================
--- 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusHolderTest.java
 (original)
+++ 
struts/sandbox/trunk/struts2-fileupload-plugin/src/test/java/org/apache/struts2/fileupload/UploadStatusHolderTest.java
 Mon Jun  8 18:55:21 2009
@@ -35,7 +35,8 @@
      */
     @Test
     public void testStatusHolding() {
-        UploadStatusTracker holder1 = new UploadStatusHolder();
+        UploadStatusHolder holder1 = new UploadStatusHolder();
+        holder1.setSecondsToKeep("600");
         UploadStatus status1 = new UploadStatus();
         status1.setBytesRead(1L);
         status1.setContentLength(1L);
@@ -58,13 +59,19 @@
     public void testStatusHoldingGetsRemoved() throws Exception {
         UploadStatusHolder holder1 = new UploadStatusHolder();
         holder1.setSecondsToKeep("1");
+
         UploadStatus status1 = new UploadStatus();
         status1.setBytesRead(1L);
         status1.setContentLength(1L);
         status1.setItemId(1);
+
         holder1.addUploadStatus("status1",status1);
         Thread.sleep(5000L);
+
         UploadStatus status2 = holder1.getUploadStatus("status1", 1);
-        assertTrue(status2 == null);
+        assertTrue(status2 != null);
+        // cleanup happens after retrieval, so it will most likely take at 
least one retrieval for objects to disappear
+        UploadStatus status3 = holder1.getUploadStatus("status1", 1);
+        assertTrue(status3 == null);
     }
 }


Reply via email to