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


Reply via email to