Author: pedro
Date: Mon May 16 02:11:31 2011
New Revision: 1103594

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

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

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java?rev=1103594&r1=1103593&r2=1103594&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
 Mon May 16 02:11:31 2011
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.wicket.IClusterable;
+import org.apache.wicket.RequestCycle;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.util.file.Files;
@@ -268,8 +269,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/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java?rev=1103594&r1=1103593&r2=1103594&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
 Mon May 16 02:11:31 2011
@@ -22,17 +22,13 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.HashSet;
-import java.util.Set;
 
-import org.apache.wicket.Page;
 import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.Component.IVisitor;
 import org.apache.wicket.util.file.File;
 import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.tester.ITestPageSource;
 import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
 
 
 /**
@@ -42,6 +38,7 @@ import org.apache.wicket.validation.IVal
  */
 public class FileUploadFieldTest extends WicketTestCase
 {
+       private static final String TEST_FILE_NAME = 
FileUploadFieldTest.class.getName();
 
        /**
         * Construct.
@@ -53,20 +50,13 @@ public class FileUploadFieldTest extends
 
        /**
         * Test that detach closes the streams
+        * 
+        * @throws IOException
+        *             '
         */
-       public void testInternalDetach() throws Exception
+       public void testInternalDetach() throws IOException
        {
-               final MockPageWithFormAndUploadField page = new 
MockPageWithFormAndUploadField();
-
-               tester.startPage(new ITestPageSource()
-               {
-                       private static final long serialVersionUID = 1L;
-
-                       public Page getTestPage()
-                       {
-                               return page;
-                       }
-               });
+               tester.startPage(MockPageWithFormAndUploadField.class);
 
                File tmp = null;
                try
@@ -87,6 +77,7 @@ public class FileUploadFieldTest extends
                        formtester.submit();
 
                        // Get the file upload
+                       MockPageWithFormAndUploadField page = 
(MockPageWithFormAndUploadField)tester.getLastRenderedPage();
                        FileUpload fileUpload = page.getFileUpload();
 
                        assertNotNull(fileUpload);
@@ -123,55 +114,78 @@ public class FileUploadFieldTest extends
                }
        }
 
+       /**
+        * @throws IOException
+        */
        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 testValidator = new IValidator()
+       /** */
+       public static class TestValidationPage extends 
MockPageWithFormAndUploadField
+       {
+               /** */
+               public TestValidationPage()
                {
-                       private static final long serialVersionUID = 1L;
+                       fileUploadField.add(new TestValidator());
+               }
+       }
+       private static class TestValidator implements IValidator<FileUpload>
+       {
+               /** */
+               private static final long serialVersionUID = 1L;
 
-                       public void validate(IValidatable validatable)
+               public void validate(IValidatable<FileUpload> validatable)
+               {
+                       if 
(!FileUpload.class.equals(validatable.getValue().getClass()))
                        {
-                               validatedComponents.add(validatable);
-                               assertEquals(FileUpload.class, 
validatable.getValue().getClass());
-                               FileUpload upload = 
(FileUpload)validatable.getValue();
-                               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>()
-               {
-                       public Object component(FileUploadField uploadField)
+                       FileUpload upload = validatable.getValue();
+                       if 
(!upload.getClientFileName().contains(TEST_FILE_NAME))
                        {
-                               uploadField.add(testValidator);
-                               return STOP_TRAVERSAL;
+                               validatable.error(new 
ValidationError().addMessageKey("uploaded file name not expected"));
                        }
-               });
-
-               tester.startPage(new ITestPageSource()
-               {
-                       private static final long serialVersionUID = 1L;
-
-                       public Page getTestPage()
+                       File tmpFile = null;
+                       try
                        {
-                               return page;
+                               tmpFile = writeTestFile(1);
+                               if (!new String(read(tmpFile)).equals(new 
String(upload.getBytes())))
+                               {
+                                       validatable.error(new 
ValidationError().addMessageKey("uploaded content not expected"));
+                               }
                        }
-               });
-
-               FormTester formtester = tester.newFormTester("form");
-               formtester.setFile("upload", tmpFile, "text/plain");
-               formtester.submit();
-               assertEquals(validatedComponents.size(), 1);
+                       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++)
                {
@@ -181,7 +195,7 @@ public class FileUploadFieldTest extends
                return tmp;
        }
 
-       private byte[] read(File file)
+       private static byte[] read(File file)
        {
                try
                {
@@ -193,7 +207,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/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java?rev=1103594&r1=1103593&r2=1103594&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
 Mon May 16 02:11:31 2011
@@ -16,11 +16,16 @@
  */
 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.util.file.File;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
+import org.apache.wicket.util.tester.WicketTester.DummyWebApplication;
 import org.apache.wicket.util.upload.DiskFileItemFactory;
 import org.apache.wicket.util.upload.FileItem;
 
@@ -41,6 +46,19 @@ public class FileUploadTest extends Wick
                super("Test of FileUpload");
        }
 
+       @Override
+       protected void setUp() throws Exception
+       {
+               tester = new WicketTester(new DummyWebApplication())
+               {
+                       @Override
+                       public boolean initializeHttpSessionAsTemporary()
+                       {
+                               return true;
+                       }
+               };
+       }
+
        /**
         * Test that when getting an input stream a new input stream is 
returned every time.
         * 
@@ -92,4 +110,44 @@ public class FileUploadTest extends Wick
                assertNull(inputStreams);
        }
 
+       /**
+        * @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
+       {
+               java.io.File testFile;
+
+               @Override
+               protected void handleFormSubmit() throws Exception
+               {
+                       super.handleFormSubmit();
+                       testFile = getFileUpload().writeToTempFile();
+               }
+       }
 }

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java?rev=1103594&r1=1103593&r2=1103594&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
 Mon May 16 02:11:31 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.Model;
 
 /**
@@ -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;
 
        /**
@@ -38,7 +39,7 @@ public class MockPageWithFormAndUploadFi
         */
        public MockPageWithFormAndUploadField()
        {
-               form = new Form("form")
+               form = new StatelessForm<Void>("form")
                {
                        /**
                         * 
@@ -48,7 +49,14 @@ public class MockPageWithFormAndUploadFi
                        @Override
                        protected void onSubmit()
                        {
-                               fileUpload = fileUploadField.getFileUpload();
+                               try
+                               {
+                                       handleFormSubmit();
+                               }
+                               catch (Exception e)
+                               {
+                                       throw new RuntimeException(e);
+                               }
                        }
                };
                fileUploadField = new FileUploadField("upload", new 
Model<FileUpload>());
@@ -56,6 +64,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