Author: thrantal Date: Thu Jun 12 14:21:04 2008 New Revision: 667232 URL: http://svn.apache.org/viewvc?rev=667232&view=rev Log: WICKET-1684: Changed converting input to create the FileUpload object, the same way as MultiFileUploadField already does. Previously converted input was the filename, which can now be found from the FileUpload object. Now validators (that operate on converted input) can access the actual file contents in validation.
Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUploadField.java wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUploadField.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUploadField.java?rev=667232&r1=667231&r2=667232&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUploadField.java (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/form/upload/FileUploadField.java Thu Jun 12 14:21:04 2008 @@ -22,6 +22,7 @@ import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.model.IModel; import org.apache.wicket.protocol.http.IMultipartWebRequest; +import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.upload.FileItem; /** @@ -130,7 +131,18 @@ return null; } - /** + @Override + protected FileUpload convertValue(String[] value) throws ConversionException + { + final String[] filenames = getInputAsArray(); + if (filenames == null) + { + return null; + } + return getFileUpload(); + } + + /** * @see org.apache.wicket.markup.html.form.FormComponent#isMultiPart() */ @Override Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java?rev=667232&r1=667231&r2=667232&view=diff ============================================================================== --- wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java (original) +++ wicket/trunk/wicket/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java Thu Jun 12 14:21:04 2008 @@ -17,16 +17,22 @@ package org.apache.wicket.markup.html.form.upload; import java.io.BufferedOutputStream; +import java.io.FileInputStream; 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.Component.IVisitor; import org.apache.wicket.Page; 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.ITestPageSource; +import org.apache.wicket.validation.IValidatable; +import org.apache.wicket.validation.IValidator; /** @@ -75,13 +81,7 @@ // know the path of (e.g. the big DTD this test used previously). This enables // us to run the test out of a JAR file if need be, and also with an unknown // running directory (e.g. when run from wicket-parent). - tmp = new File(java.io.File.createTempFile(this.getClass().getName(), ".txt")); - OutputStream os = new BufferedOutputStream(new FileOutputStream(tmp)); - for (int i = 0; i < 1000; i++) - { - os.write("test test test test test\n".getBytes()); - } - os.close(); + tmp = writeTestFile(1000); // Let's upload the dtd file. It's large enough to avoid being in memory. FormTester formtester = tester.newFormTester("form"); @@ -124,4 +124,95 @@ } } } + + public void testFileUploadCanBeValidated() throws IOException + { + final Set<IValidatable> validatedComponents = new HashSet<IValidatable>(); + + final File tmpFile = writeTestFile(1); + tmpFile.deleteOnExit(); + + final IValidator testValidator = new IValidator() + { + public void validate(IValidatable validatable) + { + 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())); + } + }; + final MockPageWithFormAndUploadField page = new MockPageWithFormAndUploadField(); + page.getForm().visitChildren(FileUploadField.class, new IVisitor<FileUploadField>() + { + public Object component(FileUploadField uploadField) + { + uploadField.add(testValidator); + return STOP_TRAVERSAL; + } + }); + + tester.startPage(new ITestPageSource() + { + private static final long serialVersionUID = 1L; + + public Page<?> getTestPage() + { + return page; + } + }); + + FormTester formtester = tester.newFormTester("form"); + formtester.setFile("upload", tmpFile, "text/plain"); + formtester.submit(); + assertEquals(validatedComponents.size(), 1); + } + + private File writeTestFile(int numberOfowsToCreate) + throws IOException + { + File tmp = new File(java.io.File.createTempFile(getClass().getName(), ".txt")); + OutputStream os = new BufferedOutputStream(new FileOutputStream(tmp)); + for (int i = 0; i < numberOfowsToCreate; i++) + { + os.write("test test test test test\n".getBytes()); + } + os.close(); + return tmp; + } + + private byte[] read(File file) + { + try + { + return readFile(file); + } catch (IOException e) + { + throw new RuntimeException(e); + } + } + + private byte[] readFile(File file) throws IOException + { + InputStream stream = null; + byte[] bytes = new byte[0]; + try + { + stream = new FileInputStream(file); + int length = (int) file.length(); + bytes = new byte[length]; + int offset = 0; + int bytesRead; + + while (offset < bytes.length && (bytesRead = stream.read(bytes, offset, bytes.length - offset)) >= 0) + { + offset += bytesRead; + } + } finally + { + stream.close(); + } + return bytes; + } }