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