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);
}
}