You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2009/02/10 10:23:18 UTC
svn commit: r742907 - in /incubator/sling/trunk:
commons/testing/src/main/java/org/apache/sling/commons/testing/integration/
launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/
servlets/post/src/main/java/org/apache/sling...
Author: fmeschbe
Date: Tue Feb 10 09:23:10 2009
New Revision: 742907
URL: http://svn.apache.org/viewvc?rev=742907&view=rev
Log:
SLING-854 Apply patch by Eric Norman (Thanks!)
Modified:
incubator/sling/trunk/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/SlingIntegrationTestClient.java
incubator/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/UploadFileTest.java
incubator/sling/trunk/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java
Modified: incubator/sling/trunk/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/SlingIntegrationTestClient.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/SlingIntegrationTestClient.java?rev=742907&r1=742906&r2=742907&view=diff
==============================================================================
--- incubator/sling/trunk/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/SlingIntegrationTestClient.java (original)
+++ incubator/sling/trunk/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/SlingIntegrationTestClient.java Tue Feb 10 09:23:10 2009
@@ -190,4 +190,29 @@
throw new HttpStatusCodeException(200, status, "POST", url);
}
}
+
+ /** Upload multiple files to file node structures */
+ public void uploadToFileNodes(String url, File[] localFiles, String[] fieldNames, String[] typeHints)
+ throws IOException {
+
+ List<Part> partsList = new ArrayList<Part>();
+ for (int i=0; i < localFiles.length; i++) {
+ Part filePart = new FilePart(fieldNames[i], localFiles[i]);
+ partsList.add(filePart);
+ if (typeHints != null) {
+ Part typeHintPart = new StringPart(fieldNames[i] + "@TypeHint", typeHints[i]);
+ partsList.add(typeHintPart);
+ }
+ }
+
+ final Part[] parts = partsList.toArray(new Part[partsList.size()]);
+ final PostMethod post = new PostMethod(url);
+ post.setFollowRedirects(false);
+ post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
+
+ final int status = httpClient.executeMethod(post);
+ if(status!=200) { // fmeschbe: The default sling status is 200, not 302
+ throw new HttpStatusCodeException(200, status, "POST", url);
+ }
+ }
}
Modified: incubator/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/UploadFileTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/UploadFileTest.java?rev=742907&r1=742906&r2=742907&view=diff
==============================================================================
--- incubator/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/UploadFileTest.java (original)
+++ incubator/sling/trunk/launchpad/testing/src/test/java/org/apache/sling/launchpad/webapp/integrationtest/UploadFileTest.java Tue Feb 10 09:23:10 2009
@@ -19,6 +19,7 @@
import java.io.File;
import java.io.IOException;
+import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.sling.commons.testing.integration.HttpTestBase;
@@ -147,4 +148,68 @@
assertTrue("checking primary type", json.contains("\"jcr:primaryType\":\"nt:file\""));
}
+
+ public void testMultiFileUpload() throws IOException {
+ String folderPath = "/UploadFileTest_1_" + System.currentTimeMillis();
+ final String url = HTTP_BASE_URL + folderPath;
+
+ // create new node
+ String urlOfNewNode = null;
+ try {
+ urlOfNewNode = testClient.createNode(url, null);
+ } catch(IOException ioe) {
+ fail("createNode failed: " + ioe);
+ }
+
+ // upload local file
+ File [] localFiles = new File[] {
+ new File(TEST_FILE),
+ new File(TEST_FILE),
+ new File(TEST_FILE)
+ };
+ String [] fieldNames = new String [] {
+ "./file1.txt",
+ "./file2.txt",
+ "./*"
+ };
+ testClient.uploadToFileNodes(urlOfNewNode, localFiles, fieldNames, null);
+
+ // get and check URL of created file1
+ String urlOfFileNode = urlOfNewNode + "/file1.txt";
+ checkUploadedFileState(urlOfFileNode);
+
+ // get and check URL of created file2
+ String urlOfFileNode2 = urlOfNewNode + "/file2.txt";
+ checkUploadedFileState(urlOfFileNode2);
+
+ // get and check URL of created file3
+ String urlOfFileNode3 = urlOfNewNode + "/file-to-upload.txt";
+ checkUploadedFileState(urlOfFileNode3);
+ }
+
+ private void checkUploadedFileState(String urlOfFileNode) throws IOException,
+ HttpException {
+ final GetMethod get = new GetMethod(urlOfFileNode);
+ final int status = httpClient.executeMethod(get);
+ assertEquals(urlOfFileNode + " must be accessible after createNode",200,status);
+
+ /*
+ We should check the data, but nt:resources are not handled yet
+ // compare data with local file (just length)
+ final byte[] data = get.getResponseBody();
+ assertEquals("size of file must be same", localFile.length(), data.length);
+ */
+ String data = get.getResponseBodyAsString();
+ assertTrue("checking for content", data.contains("http://www.apache.org/licenses/LICENSE-2.0"));
+
+ // download structure
+ String json = getContent(urlOfFileNode + ".json", CONTENT_TYPE_JSON);
+ // just check for some strings
+ assertTrue("checking primary type", json.contains("\"jcr:primaryType\":\"nt:file\""));
+
+ String content_json = getContent(urlOfFileNode + "/jcr:content.json", CONTENT_TYPE_JSON);
+ // just check for some strings
+ assertTrue("checking primary type", content_json.contains("\"jcr:primaryType\":\"nt:resource\""));
+ assertTrue("checking mime type", content_json.contains("\"jcr:mimeType\":\"text/plain\""));
+ }
}
\ No newline at end of file
Modified: incubator/sling/trunk/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java?rev=742907&r1=742906&r2=742907&view=diff
==============================================================================
--- incubator/sling/trunk/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java (original)
+++ incubator/sling/trunk/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java Tue Feb 10 09:23:10 2009
@@ -108,99 +108,104 @@
*/
public void setFile(Node parent, RequestProperty prop, List<Modification> changes)
throws RepositoryException {
- RequestParameter value = prop.getValues()[0];
- assert !value.isFormField();
+ RequestParameter[] values = prop.getValues();
+ for (RequestParameter requestParameter : values) {
+ RequestParameter value = requestParameter;
+
+ // ignore if a plain form field or empty
+ if (value.isFormField() || value.getSize() <= 0) {
+ continue;
+ }
- // ignore if empty
- if (value.getSize() <= 0) {
- return;
- }
-
- // get node name
- String name = prop.getName();
- if (name.equals("*")) {
- name = value.getFileName();
- // strip of possible path (some browsers include the entire path)
- name = name.substring(name.lastIndexOf('/') + 1);
- name = name.substring(name.lastIndexOf('\\') + 1);
- }
- name = Text.escapeIllegalJcrChars(name);
-
- // check type hint. if the type is ok and extends from nt:file,
- // create an nt:file with that type. if it's invalid, drop it and let
- // the parent node type decide.
- boolean createNtFile = parent.isNodeType(NT_FOLDER);
- String typeHint = prop.getTypeHint();
- if (typeHint != null) {
- try {
- NodeTypeManager ntMgr = parent.getSession().getWorkspace().getNodeTypeManager();
- NodeType nt = ntMgr.getNodeType(typeHint);
- createNtFile = nt.isNodeType(NT_FILE);
- } catch (RepositoryException e) {
- // assuming type not valid.
- typeHint = null;
- }
- }
-
- // also create an nt:file if the name contains an extension
- // the rationale is that if the file name is "important" we want
- // an nt:file, and an image name with an extension is probably "important"
- if(!createNtFile && name.indexOf('.') > 0) {
- createNtFile = true;
- }
-
- // set empty type
- if (typeHint == null) {
- typeHint = createNtFile ? NT_FILE : NT_RESOURCE;
- }
-
- // remove node
- if (parent.hasNode(name)) {
- parent.getNode(name).remove();
- }
-
- // create nt:file node if needed
- if (createNtFile) {
- // create nt:file
- parent = parent.addNode(name, typeHint);
- changes.add(Modification.onCreated(parent.getPath()));
- name = JCR_CONTENT;
- typeHint = NT_RESOURCE;
- }
-
- // create resource node
- Node res = parent.addNode(name, typeHint);
- changes.add(Modification.onCreated(res.getPath()));
-
- // get content type
- String contentType = value.getContentType();
- if (contentType != null) {
- int idx = contentType.indexOf(';');
- if (idx > 0) {
- contentType = contentType.substring(0, idx);
- }
- }
- if (contentType == null || contentType.equals("application/octet-stream")) {
- // try to find a better content type
- contentType = this.servletContext.getMimeType(value.getFileName());
+ // get node name
+ String name = prop.getName();
+ if (name.equals("*")) {
+ name = value.getFileName();
+ // strip of possible path (some browsers include the entire path)
+ name = name.substring(name.lastIndexOf('/') + 1);
+ name = name.substring(name.lastIndexOf('\\') + 1);
+ }
+ name = Text.escapeIllegalJcrChars(name);
+
+ // check type hint. if the type is ok and extends from nt:file,
+ // create an nt:file with that type. if it's invalid, drop it and let
+ // the parent node type decide.
+ boolean createNtFile = parent.isNodeType(NT_FOLDER);
+ String typeHint = prop.getTypeHint();
+ if (typeHint != null) {
+ try {
+ NodeTypeManager ntMgr = parent.getSession().getWorkspace().getNodeTypeManager();
+ NodeType nt = ntMgr.getNodeType(typeHint);
+ createNtFile = nt.isNodeType(NT_FILE);
+ } catch (RepositoryException e) {
+ // assuming type not valid.
+ typeHint = null;
+ }
+ }
+
+ // also create an nt:file if the name contains an extension
+ // the rationale is that if the file name is "important" we want
+ // an nt:file, and an image name with an extension is probably "important"
+ if(!createNtFile && name.indexOf('.') > 0) {
+ createNtFile = true;
+ }
+
+ // set empty type
+ if (typeHint == null) {
+ typeHint = createNtFile ? NT_FILE : NT_RESOURCE;
+ }
+
+ // remove node
+ if (parent.hasNode(name)) {
+ parent.getNode(name).remove();
+ }
+
+ // create nt:file node if needed
+ Node resParent;
+ if (createNtFile) {
+ // create nt:file
+ resParent = parent.addNode(name, typeHint);
+ changes.add(Modification.onCreated(resParent.getPath()));
+ name = JCR_CONTENT;
+ typeHint = NT_RESOURCE;
+ } else {
+ resParent = parent;
+ }
+
+ // create resource node
+ Node res = resParent.addNode(name, typeHint);
+ changes.add(Modification.onCreated(res.getPath()));
+
+ // get content type
+ String contentType = value.getContentType();
+ if (contentType != null) {
+ int idx = contentType.indexOf(';');
+ if (idx > 0) {
+ contentType = contentType.substring(0, idx);
+ }
+ }
if (contentType == null || contentType.equals("application/octet-stream")) {
- contentType = "application/octet-stream";
+ // try to find a better content type
+ contentType = this.servletContext.getMimeType(value.getFileName());
+ if (contentType == null || contentType.equals("application/octet-stream")) {
+ contentType = "application/octet-stream";
+ }
}
- }
- // set properties
- changes.add(Modification.onModified(
- res.setProperty(JCR_LASTMODIFIED, Calendar.getInstance()).getPath()
- ));
- changes.add(Modification.onModified(
- res.setProperty(JCR_MIMETYPE, contentType).getPath()
- ));
- try {
+ // set properties
changes.add(Modification.onModified(
- res.setProperty(JCR_DATA, value.getInputStream()).getPath()
+ res.setProperty(JCR_LASTMODIFIED, Calendar.getInstance()).getPath()
));
- } catch (IOException e) {
- throw new RepositoryException("Error while retrieving inputstream from parameter value.", e);
- }
+ changes.add(Modification.onModified(
+ res.setProperty(JCR_MIMETYPE, contentType).getPath()
+ ));
+ try {
+ changes.add(Modification.onModified(
+ res.setProperty(JCR_DATA, value.getInputStream()).getPath()
+ ));
+ } catch (IOException e) {
+ throw new RepositoryException("Error while retrieving inputstream from parameter value.", e);
+ }
+ }
}
}
\ No newline at end of file