Author: pedro
Date: Mon May 16 02:33:42 2011
New Revision: 1103596
URL: http://svn.apache.org/viewvc?rev=1103596&view=rev
Log:
Improving the FileUpload#writeToFile method to not rely on HTTP session
existence
Issue: WICKET-3715
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/FileUpload.java
Mon May 16 02:33:42 2011
@@ -27,6 +27,7 @@ import java.util.List;
import org.apache.wicket.IClusterable;
import org.apache.wicket.Session;
import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.util.file.Files;
import org.apache.wicket.util.io.IOUtils;
import org.apache.wicket.util.lang.Args;
@@ -247,8 +248,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/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadFieldTest.java
Mon May 16 02:33:42 2011
@@ -22,18 +22,14 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import org.apache.wicket.WicketTestCase;
import org.apache.wicket.util.file.File;
import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
/**
@@ -43,6 +39,7 @@ import org.apache.wicket.validation.IVal
*/
public class FileUploadFieldTest extends WicketTestCase
{
+ private static final String TEST_FILE_NAME =
FileUploadFieldTest.class.getName();
/**
* Construct.
@@ -55,13 +52,12 @@ public class FileUploadFieldTest extends
/**
* Test that detach closes the streams
*
- * @throws Exception
+ * @throws IOException
+ * '
*/
- public void testInternalDetach() throws Exception
+ public void testInternalDetach() throws IOException
{
- final MockPageWithFormAndUploadField page = new
MockPageWithFormAndUploadField();
-
- tester.startPage(page);
+ tester.startPage(MockPageWithFormAndUploadField.class);
File tmp = null;
try
@@ -82,6 +78,7 @@ public class FileUploadFieldTest extends
formtester.submit();
// Get the file upload
+ MockPageWithFormAndUploadField page =
(MockPageWithFormAndUploadField)tester.getLastRenderedPage();
FileUpload fileUpload = page.getFileUpload();
assertNotNull(fileUpload);
@@ -123,45 +120,76 @@ public class FileUploadFieldTest extends
*/
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<List<FileUpload>> testValidator = new
IValidator<List<FileUpload>>()
+ /** */
+ public static class TestValidationPage extends
MockPageWithFormAndUploadField
+ {
+ /** */
+ private static final long serialVersionUID = 1L;
+
+ /** */
+ public TestValidationPage()
{
- private static final long serialVersionUID = 1L;
+ fileUploadField.add(new TestValidator());
+ }
+ }
+ private static class TestValidator implements
IValidator<List<FileUpload>>
+ {
+ /** */
+ private static final long serialVersionUID = 1L;
- public void validate(IValidatable<List<FileUpload>>
validatable)
+ public void validate(IValidatable<List<FileUpload>> validatable)
+ {
+ if (validatable.getValue() instanceof List == false)
{
- validatedComponents.add(validatable);
- assertEquals(ArrayList.class,
validatable.getValue().getClass());
- List<FileUpload> uploads =
validatable.getValue();
- FileUpload upload = uploads.get(0);
- 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, Void>()
- {
- public void component(FileUploadField uploadField,
IVisit<Void> visit)
+ FileUpload upload = validatable.getValue().get(0);
+ if
(!upload.getClientFileName().contains(TEST_FILE_NAME))
{
- uploadField.add(testValidator);
- visit.stop();
+ validatable.error(new
ValidationError().addMessageKey("uploaded file name not expected"));
}
- });
-
- tester.startPage(page);
- FormTester formtester = tester.newFormTester("form");
- formtester.setFile("upload", tmpFile, "text/plain");
- formtester.submit();
- assertEquals(validatedComponents.size(), 1);
+ File tmpFile = null;
+ try
+ {
+ tmpFile = writeTestFile(1);
+ if (!new String(read(tmpFile)).equals(new
String(upload.getBytes())))
+ {
+ validatable.error(new
ValidationError().addMessageKey("uploaded content not expected"));
+ }
+ }
+ 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++)
{
@@ -171,7 +199,7 @@ public class FileUploadFieldTest extends
return tmp;
}
- private byte[] read(File file)
+ private static byte[] read(File file)
{
try
{
@@ -183,7 +211,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/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/FileUploadTest.java
Mon May 16 02:33:42 2011
@@ -16,13 +16,18 @@
*/
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.mock.MockApplication;
+import org.apache.wicket.util.file.File;
import org.apache.wicket.util.file.FileUploadCleaner;
import org.apache.wicket.util.file.IFileUploadCleaner;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
import org.apache.wicket.util.upload.DiskFileItemFactory;
import org.apache.wicket.util.upload.FileItem;
@@ -43,6 +48,14 @@ public class FileUploadTest extends Wick
super("Test of FileUpload");
}
+ @Override
+ protected void setUp() throws Exception
+ {
+ tester = new WicketTester(new MockApplication())
+ {
+ };
+ }
+
/**
* Test that when getting an input stream a new input stream is
returned every time.
*
@@ -98,4 +111,46 @@ public class FileUploadTest extends Wick
fileUploadCleaner.destroy();
}
+ /**
+ * @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
+ {
+ /** */
+ private static final long serialVersionUID = 1L;
+ java.io.File testFile;
+
+ @Override
+ protected void handleFormSubmit() throws Exception
+ {
+ super.handleFormSubmit();
+ testFile = getFileUpload().writeToTempFile();
+ }
+ }
}
Modified:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java?rev=1103596&r1=1103595&r2=1103596&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MockPageWithFormAndUploadField.java
Mon May 16 02:33:42 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.util.ListModel;
/**
@@ -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;
/**
@@ -40,7 +41,7 @@ public class MockPageWithFormAndUploadFi
{
final ListModel<FileUpload> model = new ListModel<FileUpload>();
- form = new Form<Void>("form")
+ form = new StatelessForm<Void>("form")
{
/**
*
@@ -50,7 +51,14 @@ public class MockPageWithFormAndUploadFi
@Override
protected void onSubmit()
{
- fileUpload = model.getObject().get(0);
+ try
+ {
+ handleFormSubmit();
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
}
};
fileUploadField = new FileUploadField("upload", model);
@@ -58,6 +66,11 @@ public class MockPageWithFormAndUploadFi
add(form);
}
+ protected void handleFormSubmit() throws Exception
+ {
+ fileUpload = fileUploadField.getFileUpload();
+ }
+
/**
* @return The form to attach the FileUploadField to.
*/