Author: pedro
Date: Mon May 16 02:33:42 2011
New Revision: 1103596

URL: http://svn.apache.org/viewvc?rev=1103596&view=rev
Log:
Improving the FileUpload#writeToFile method to not rely on HTTP session 
existence
Issue: WICKET-3715

Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
 Mon May 16 02:33:42 2011
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.wicket.IClusterable;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.util.file.Files;
 import org.apache.wicket.util.io.IOUtils;
 import org.apache.wicket.util.lang.Args;
@@ -247,8 +248,10 @@ public class FileUpload implements IClus
         */
        public final File writeToTempFile() throws IOException
        {
-               File temp = File.createTempFile(Session.get().getId(),
-                       Files.cleanupFilename(item.getFieldName()));
+               Session.get();
+               String sessionId = Session.exists() ? Session.get().getId() : 
"";
+               String tempFileName = sessionId + "_" + 
RequestCycle.get().getStartTime();
+               File temp = File.createTempFile(tempFileName, 
Files.cleanupFilename(item.getFieldName()));
                writeTo(temp);
                return temp;
        }

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
 Mon May 16 02:33:42 2011
@@ -22,18 +22,14 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.wicket.WicketTestCase;
 import org.apache.wicket.util.file.File;
 import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
 
 
 /**
@@ -43,6 +39,7 @@ import org.apache.wicket.validation.IVal
  */
 public class FileUploadFieldTest extends WicketTestCase
 {
+       private static final String TEST_FILE_NAME = 
FileUploadFieldTest.class.getName();
 
        /**
         * Construct.
@@ -55,13 +52,12 @@ public class FileUploadFieldTest extends
        /**
         * Test that detach closes the streams
         * 
-        * @throws Exception
+        * @throws IOException
+        *             '
         */
-       public void testInternalDetach() throws Exception
+       public void testInternalDetach() throws IOException
        {
-               final MockPageWithFormAndUploadField page = new 
MockPageWithFormAndUploadField();
-
-               tester.startPage(page);
+               tester.startPage(MockPageWithFormAndUploadField.class);
 
                File tmp = null;
                try
@@ -82,6 +78,7 @@ public class FileUploadFieldTest extends
                        formtester.submit();
 
                        // Get the file upload
+                       MockPageWithFormAndUploadField page = 
(MockPageWithFormAndUploadField)tester.getLastRenderedPage();
                        FileUpload fileUpload = page.getFileUpload();
 
                        assertNotNull(fileUpload);
@@ -123,45 +120,76 @@ public class FileUploadFieldTest extends
         */
        public void testFileUploadCanBeValidated() throws IOException
        {
-               final Set<IValidatable<?>> validatedComponents = new 
HashSet<IValidatable<?>>();
-
-               final File tmpFile = writeTestFile(1);
+               tester.startPage(TestValidationPage.class);
+               // creating the file expected by form validators
+               File tmpFile = writeTestFile(1);
                tmpFile.deleteOnExit();
+               FormTester formtester = tester.newFormTester("form");
+               formtester.setFile("upload", tmpFile, "text/plain");
+               formtester.submit();
+               TestValidationPage page = 
(TestValidationPage)tester.getLastRenderedPage();
+               assertFalse(page.getForm().hasError());
+       }
 
-               final IValidator<List<FileUpload>> testValidator = new 
IValidator<List<FileUpload>>()
+       /** */
+       public static class TestValidationPage extends 
MockPageWithFormAndUploadField
+       {
+               /** */
+               private static final long serialVersionUID = 1L;
+
+               /** */
+               public TestValidationPage()
                {
-                       private static final long serialVersionUID = 1L;
+                       fileUploadField.add(new TestValidator());
+               }
+       }
+       private static class TestValidator implements 
IValidator<List<FileUpload>>
+       {
+               /** */
+               private static final long serialVersionUID = 1L;
 
-                       public void validate(IValidatable<List<FileUpload>> 
validatable)
+               public void validate(IValidatable<List<FileUpload>> validatable)
+               {
+                       if (validatable.getValue() instanceof List == false)
                        {
-                               validatedComponents.add(validatable);
-                               assertEquals(ArrayList.class, 
validatable.getValue().getClass());
-                               List<FileUpload> uploads = 
validatable.getValue();
-                               FileUpload upload = uploads.get(0);
-                               assertEquals(tmpFile.getName(), 
upload.getClientFileName());
-                               assertEquals(new String(read(tmpFile)), new 
String(upload.getBytes()));
+                               validatable.error(new 
ValidationError().addMessageKey("validatable value type not expected"));
                        }
-               };
-               final MockPageWithFormAndUploadField page = new 
MockPageWithFormAndUploadField();
-               page.getForm().visitChildren(FileUploadField.class, new 
IVisitor<FileUploadField, Void>()
-               {
-                       public void component(FileUploadField uploadField, 
IVisit<Void> visit)
+                       FileUpload upload = validatable.getValue().get(0);
+                       if 
(!upload.getClientFileName().contains(TEST_FILE_NAME))
                        {
-                               uploadField.add(testValidator);
-                               visit.stop();
+                               validatable.error(new 
ValidationError().addMessageKey("uploaded file name not expected"));
                        }
-               });
-
-               tester.startPage(page);
-               FormTester formtester = tester.newFormTester("form");
-               formtester.setFile("upload", tmpFile, "text/plain");
-               formtester.submit();
-               assertEquals(validatedComponents.size(), 1);
+                       File tmpFile = null;
+                       try
+                       {
+                               tmpFile = writeTestFile(1);
+                               if (!new String(read(tmpFile)).equals(new 
String(upload.getBytes())))
+                               {
+                                       validatable.error(new 
ValidationError().addMessageKey("uploaded content not expected"));
+                               }
+                       }
+                       catch (IOException e)
+                       {
+                               throw new RuntimeException(e);
+                       }
+                       finally
+                       {
+                               if (tmpFile != null && tmpFile.exists())
+                               {
+                                       tmpFile.delete();
+                               }
+                       }
+               }
        }
 
-       private File writeTestFile(int numberOfowsToCreate) throws IOException
+       /**
+        * @param numberOfowsToCreate
+        * @return test file
+        * @throws IOException
+        */
+       public static File writeTestFile(int numberOfowsToCreate) throws 
IOException
        {
-               File tmp = new 
File(java.io.File.createTempFile(getClass().getName(), ".txt"));
+               File tmp = new File(java.io.File.createTempFile(TEST_FILE_NAME, 
".txt"));
                OutputStream os = new BufferedOutputStream(new 
FileOutputStream(tmp));
                for (int i = 0; i < numberOfowsToCreate; i++)
                {
@@ -171,7 +199,7 @@ public class FileUploadFieldTest extends
                return tmp;
        }
 
-       private byte[] read(File file)
+       private static byte[] read(File file)
        {
                try
                {
@@ -183,7 +211,7 @@ public class FileUploadFieldTest extends
                }
        }
 
-       private byte[] readFile(File file) throws IOException
+       private static byte[] readFile(File file) throws IOException
        {
                InputStream stream = null;
                byte[] bytes = new byte[0];

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
 Mon May 16 02:33:42 2011
@@ -16,13 +16,18 @@
  */
 package org.apache.wicket.markup.html.form.upload;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.util.List;
 
 import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.util.file.File;
 import org.apache.wicket.util.file.FileUploadCleaner;
 import org.apache.wicket.util.file.IFileUploadCleaner;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
 import org.apache.wicket.util.upload.DiskFileItemFactory;
 import org.apache.wicket.util.upload.FileItem;
 
@@ -43,6 +48,14 @@ public class FileUploadTest extends Wick
                super("Test of FileUpload");
        }
 
+       @Override
+       protected void setUp() throws Exception
+       {
+               tester = new WicketTester(new MockApplication())
+               {
+               };
+       }
+
        /**
         * Test that when getting an input stream a new input stream is 
returned every time.
         * 
@@ -98,4 +111,46 @@ public class FileUploadTest extends Wick
                fileUploadCleaner.destroy();
        }
 
+       /**
+        * @see <a 
href="https://issues.apache.org/jira/browse/WICKET-3715";>WICKET-3715</a>
+        * @throws IOException
+        */
+       public void testWriteToTempFile() throws IOException
+       {
+               tester.startPage(TestPage.class);
+
+               File tmp = null;
+               try
+               {
+                       tmp = FileUploadFieldTest.writeTestFile(1);
+                       FormTester formtester = tester.newFormTester("form");
+                       formtester.setFile("upload", tmp, "text/plain");
+                       formtester.submit();
+
+                       TestPage page = (TestPage)tester.getLastRenderedPage();
+                       assertNotNull(page.testFile);
+               }
+               finally
+               {
+                       if (tmp != null && tmp.exists())
+                       {
+                               tmp.delete();
+                       }
+               }
+       }
+
+       /** */
+       public static class TestPage extends MockPageWithFormAndUploadField
+       {
+               /** */
+               private static final long serialVersionUID = 1L;
+               java.io.File testFile;
+
+               @Override
+               protected void handleFormSubmit() throws Exception
+               {
+                       super.handleFormSubmit();
+                       testFile = getFileUpload().writeToTempFile();
+               }
+       }
 }

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
 Mon May 16 02:33:42 2011
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.fo
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.StatelessForm;
 import org.apache.wicket.model.util.ListModel;
 
 /**
@@ -30,7 +31,7 @@ public class MockPageWithFormAndUploadFi
        private static final long serialVersionUID = 1L;
 
        private final Form<?> form;
-       private final FileUploadField fileUploadField;
+       protected final FileUploadField fileUploadField;
        private FileUpload fileUpload;
 
        /**
@@ -40,7 +41,7 @@ public class MockPageWithFormAndUploadFi
        {
                final ListModel<FileUpload> model = new ListModel<FileUpload>();
 
-               form = new Form<Void>("form")
+               form = new StatelessForm<Void>("form")
                {
                        /**
                         * 
@@ -50,7 +51,14 @@ public class MockPageWithFormAndUploadFi
                        @Override
                        protected void onSubmit()
                        {
-                               fileUpload = model.getObject().get(0);
+                               try
+                               {
+                                       handleFormSubmit();
+                               }
+                               catch (Exception e)
+                               {
+                                       throw new RuntimeException(e);
+                               }
                        }
                };
                fileUploadField = new FileUploadField("upload", model);
@@ -58,6 +66,11 @@ public class MockPageWithFormAndUploadFi
                add(form);
        }
 
+       protected void handleFormSubmit() throws Exception
+       {
+               fileUpload = fileUploadField.getFileUpload();
+       }
+
        /**
         * @return The form to attach the FileUploadField to.
         */


Reply via email to