Hi Pedro, On Mon, May 16, 2011 at 4:11 AM, <[email protected]> wrote:
> 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(); > This call seems useless. > + 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. > */ > > > -- Martin Grigorov jWeekend Training, Consulting, Development http://jWeekend.com <http://jweekend.com/>
