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