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();
+ 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.
*/