mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-21 18:09:20 +00:00
ACE-4469: Merged BRANCHES/DEV/HEAD-SFS (cherry picked) to HEAD
113520: SFS-179: Added multipart upload support into Public API framework. 114561: SFS-179: Added tests for upload API, as well as minor fixes. 114732: SFS-179: Changed the assert import from 3.X to 4.X. 114734: SFS-179: Added unit tests for Public API framework multiPart support. 114735: SFS-179: Fixed unit test failure. - Also removed mergeinfo added in r112639 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@114736 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
|
||||
package org.alfresco.rest.framework.tests.api.mocks;
|
||||
|
||||
import org.alfresco.rest.framework.resource.EntityResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.MultiPartResourceAction;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.springframework.extensions.webscripts.servlet.FormData;
|
||||
|
||||
/**
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
@EntityResource(name = "multiparttest", title = "multi-part upload test")
|
||||
public class MultiPartTestEntityResource
|
||||
implements MultiPartResourceAction.Create<MultiPartTestResponse>
|
||||
{
|
||||
|
||||
@Override
|
||||
public MultiPartTestResponse create(FormData formData, Parameters parameters)
|
||||
{
|
||||
return new MultiPartTestResponse(formData.getParameters().get("filename")[0]);
|
||||
}
|
||||
}
|
@@ -0,0 +1,24 @@
|
||||
|
||||
package org.alfresco.rest.framework.tests.api.mocks;
|
||||
|
||||
import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.MultiPartRelationshipResourceAction;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.springframework.extensions.webscripts.servlet.FormData;
|
||||
|
||||
/**
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
@RelationshipResource(name = "sheepUpload", entityResource = SheepEntityResource.class, title = "Sheep mulitpart upload")
|
||||
public class MultiPartTestRelationshipResource
|
||||
implements MultiPartRelationshipResourceAction.Create<MultiPartTestResponse>
|
||||
{
|
||||
|
||||
@Override
|
||||
public MultiPartTestResponse create(String entityResourceId, FormData formData,
|
||||
Parameters parameters)
|
||||
{
|
||||
return new MultiPartTestResponse(formData.getParameters().get("filename")[0]);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,23 @@
|
||||
|
||||
package org.alfresco.rest.framework.tests.api.mocks;
|
||||
|
||||
/**
|
||||
* Simple mock pojo for MultiPart response.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public class MultiPartTestResponse
|
||||
{
|
||||
|
||||
private String fileName;
|
||||
|
||||
public MultiPartTestResponse(String fileName)
|
||||
{
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
public String getFileName()
|
||||
{
|
||||
return this.fileName;
|
||||
}
|
||||
}
|
@@ -26,6 +26,9 @@ import org.alfresco.rest.framework.tests.api.mocks.Farmer;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.GoatEntityResource;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.Grass;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.GrassEntityResource;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.MultiPartTestEntityResource;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.MultiPartTestRelationshipResource;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.MultiPartTestResponse;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.Sheep;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.SheepBlackSheepResource;
|
||||
import org.alfresco.rest.framework.tests.api.mocks.SheepEntityResource;
|
||||
@@ -83,7 +86,17 @@ public class InspectorTests
|
||||
assertTrue("FlockEntityResource supports PUT", metaData.supports(HttpMethod.PUT));
|
||||
assertTrue("FlockEntityResource supports DELETE", metaData.supports(HttpMethod.DELETE));
|
||||
assertTrue("FlockEntityResource does not support POST", !metaData.supports(HttpMethod.POST));
|
||||
|
||||
|
||||
metainfo = ResourceInspector.inspect(MultiPartTestEntityResource.class);
|
||||
assertTrue("Must be one ResourceMetadata",metainfo.size()==1);
|
||||
metaData = metainfo.get(0);
|
||||
assertNotNull(metaData);
|
||||
assertTrue("MultiPartTestEntityResource support POST", metaData.supports(HttpMethod.POST));
|
||||
assertFalse("MultiPartTestEntityResource does not supports GET", metaData.supports(HttpMethod.GET));
|
||||
assertFalse("MultiPartTestEntityResource does not supports PUT", metaData.supports(HttpMethod.PUT));
|
||||
assertFalse("MultiPartTestEntityResource does not supports DELETE", metaData.supports(HttpMethod.DELETE));
|
||||
assertTrue("MultiPartTestEntityResource must support MultiPartTestResponse", MultiPartTestResponse.class.equals(metaData.getObjectType(HttpMethod.POST)));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -114,9 +127,18 @@ public class InspectorTests
|
||||
assertTrue("SheepBlackSheepResource supports DELETE", metaData.supports(HttpMethod.DELETE));
|
||||
params = metaData.getParameters(HttpMethod.DELETE);
|
||||
assertTrue("DELETE method on a relations should have 2 url params.", params.size() == 2);
|
||||
|
||||
|
||||
metainfo = ResourceInspector.inspect(MultiPartTestRelationshipResource.class);
|
||||
assertTrue("Must be one ResourceMetadata",metainfo.size()==1);
|
||||
metaData = metainfo.get(0);
|
||||
assertNotNull(metaData);
|
||||
assertTrue("MultiPartTestRelationshipResource support POST", metaData.supports(HttpMethod.POST));
|
||||
assertFalse("MultiPartTestRelationshipResource does not supports GET", metaData.supports(HttpMethod.GET));
|
||||
assertFalse("MultiPartTestRelationshipResource does not supports PUT", metaData.supports(HttpMethod.PUT));
|
||||
assertFalse("MultiPartTestRelationshipResource does not supports DELETE", metaData.supports(HttpMethod.DELETE));
|
||||
assertTrue("MultiPartTestRelationshipResource must support MultiPartTestResponse", MultiPartTestResponse.class.equals(metaData.getObjectType(HttpMethod.POST)));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testInspectApi()
|
||||
{
|
||||
|
@@ -9,13 +9,18 @@ import static org.junit.Assert.fail;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringReader;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest;
|
||||
import org.alfresco.rest.framework.core.ResourceLocator;
|
||||
import org.alfresco.rest.framework.core.ResourceMetadata;
|
||||
import org.alfresco.rest.framework.core.exceptions.UnsupportedResourceOperationException;
|
||||
@@ -30,12 +35,16 @@ import org.alfresco.rest.framework.webscripts.ResourceWebScriptDelete;
|
||||
import org.alfresco.rest.framework.webscripts.ResourceWebScriptGet;
|
||||
import org.alfresco.rest.framework.webscripts.ResourceWebScriptPost;
|
||||
import org.alfresco.rest.framework.webscripts.ResourceWebScriptPut;
|
||||
import org.alfresco.util.TempFileProvider;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import org.springframework.extensions.surf.util.Content;
|
||||
import org.springframework.extensions.webscripts.Match;
|
||||
import org.springframework.extensions.webscripts.WebScriptRequest;
|
||||
import org.springframework.extensions.webscripts.servlet.FormData;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
|
||||
|
||||
/**
|
||||
* Tests extracting of params from req
|
||||
@@ -119,7 +128,7 @@ public class ParamsExtractorTests
|
||||
|
||||
assertNotNull(params.getFilter());
|
||||
assertTrue("Default filter is BeanPropertiesFilter.AllProperties", BeanPropertiesFilter.AllProperties.class.equals(params.getFilter().getClass()));
|
||||
|
||||
|
||||
Object passed = params.getPassedIn();
|
||||
assertNotNull(passed);
|
||||
|
||||
@@ -178,6 +187,65 @@ public class ParamsExtractorTests
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiPartPostExtractor() throws Exception
|
||||
{
|
||||
ResourceWebScriptPost extractor = new ResourceWebScriptPost();
|
||||
extractor.setJsonHelper(jsonHelper);
|
||||
Map<String, String> templateVars = new HashMap<String, String>();
|
||||
|
||||
WebScriptRequest request = mock(WebScriptRequest.class);
|
||||
when(request.getServiceMatch()).thenReturn(new Match(null, templateVars, null));
|
||||
|
||||
File file = TempFileProvider.createTempFile("ParamsExtractorTests-", ".txt");
|
||||
PrintWriter writer = new PrintWriter(file);
|
||||
writer.println("Multipart Mock test.");
|
||||
writer.close();
|
||||
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(file.getName(), file, MimetypeMap.MIMETYPE_TEXT_PLAIN))
|
||||
.build();
|
||||
|
||||
MockHttpServletRequest mockRequest = new MockHttpServletRequest("POST", "");
|
||||
mockRequest.setContent(reqBody.getBody());
|
||||
mockRequest.setContentType(reqBody.getContentType());
|
||||
|
||||
when(request.getContentType()).thenReturn("multipart/form-data");
|
||||
when(request.parseContent()).thenReturn(new FormData(mockRequest));
|
||||
|
||||
Params params = extractor.extractParams(mockEntity(), request);
|
||||
assertNotNull(params);
|
||||
Object passed = params.getPassedIn();
|
||||
assertNotNull(passed);
|
||||
assertTrue(FormData.class.isAssignableFrom(passed.getClass()));
|
||||
FormData formData = (FormData) passed;
|
||||
assertTrue(formData.getIsMultiPart());
|
||||
|
||||
assertNotNull(params.getStatus());
|
||||
assertFalse(params.getStatus().getRedirect());
|
||||
|
||||
// No entity id for POST
|
||||
templateVars.put(ResourceLocator.ENTITY_ID, "1234");
|
||||
try
|
||||
{
|
||||
params = extractor.extractParams(mockEntity(), request);
|
||||
fail("Should not get here. No entity id for POST");
|
||||
}
|
||||
catch (UnsupportedResourceOperationException uoe)
|
||||
{
|
||||
assertNotNull(uoe);
|
||||
}
|
||||
|
||||
params = extractor.extractParams(mockRelationship(), request);
|
||||
assertNotNull(params);
|
||||
assertEquals("1234", params.getEntityId());
|
||||
passed = params.getPassedIn();
|
||||
assertNotNull(passed);
|
||||
assertTrue(FormData.class.isAssignableFrom(passed.getClass()));
|
||||
formData = (FormData) passed;
|
||||
assertTrue(formData.getIsMultiPart());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPutExtractor() throws IOException
|
||||
{
|
||||
|
@@ -11,7 +11,9 @@ import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -19,8 +21,12 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest;
|
||||
import org.alfresco.rest.framework.Api;
|
||||
import org.alfresco.rest.framework.core.ResourceDictionaryBuilder;
|
||||
import org.alfresco.rest.framework.core.ResourceLookupDictionary;
|
||||
@@ -34,6 +40,7 @@ import org.alfresco.rest.framework.resource.EntityResource;
|
||||
import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.ActionExecutor.ExecutionCallback;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.MultiPartResourceAction;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.Read;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction.ReadById;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
|
||||
@@ -52,6 +59,7 @@ import org.alfresco.rest.framework.tests.api.mocks3.SlimGoat;
|
||||
import org.alfresco.rest.framework.webscripts.AbstractResourceWebScript;
|
||||
import org.alfresco.rest.framework.webscripts.ResourceWebScriptHelper;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.alfresco.util.TempFileProvider;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.codehaus.jackson.JsonGenerationException;
|
||||
import org.codehaus.jackson.JsonGenerator;
|
||||
@@ -69,7 +77,9 @@ import org.mockito.stubbing.Answer;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.extensions.webscripts.Format;
|
||||
import org.springframework.extensions.webscripts.servlet.FormData;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
@@ -133,6 +143,31 @@ public class SerializeTests
|
||||
out = writeResponse(helper.postProcessResponse(api,null, Params.valueOf("notUsed", null), resources));
|
||||
assertTrue("There must be json output as List", StringUtils.startsWith(out, "{\"list\":"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvokeMultiPartEntity() throws IOException
|
||||
{
|
||||
ResourceWithMetadata entityResource = locator.locateEntityResource(api,"multiparttest", HttpMethod.POST);
|
||||
assertNotNull(entityResource);
|
||||
MultiPartResourceAction.Create<?> resource = (MultiPartResourceAction.Create<?>) entityResource.getResource();
|
||||
|
||||
File file = TempFileProvider.createTempFile("ParamsExtractorTests-", ".txt");
|
||||
PrintWriter writer = new PrintWriter(file);
|
||||
writer.println("Multipart Mock test2.");
|
||||
writer.close();
|
||||
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(file.getName(), file, MimetypeMap.MIMETYPE_TEXT_PLAIN))
|
||||
.build();
|
||||
|
||||
MockHttpServletRequest mockRequest = new MockHttpServletRequest("POST", "");
|
||||
mockRequest.setContent(reqBody.getBody());
|
||||
mockRequest.setContentType(reqBody.getContentType());
|
||||
|
||||
String out = writeResponse(helper.postProcessResponse(api,null, NOT_USED, resource.create(new FormData(mockRequest), NOT_USED)));
|
||||
assertTrue("There must be json output", StringUtils.startsWith(out, "{\"entry\":"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSerializeResponse() throws IOException
|
||||
{
|
||||
|
@@ -59,7 +59,7 @@ public class WriterTests
|
||||
ResourceDictionary resourceDic = locator.getDictionary();
|
||||
Map<String, ResourceWithMetadata> apiResources = resourceDic.getAllResources().get(api);
|
||||
String writtenOut = testWriter(defaultMetaWriter, apiResources.get("/sheep"), apiResources);
|
||||
assertTrue(writtenOut.startsWith("{\"list\":{\"pagination\":{\"count\":4"));
|
||||
assertTrue(writtenOut.startsWith("{\"list\":{\"pagination\":{\"count\":5"));
|
||||
|
||||
// ResourceMetaDataWriter wadlWriter = new WebScriptOptionsMetaData();
|
||||
// writtenOut = testWriter(wadlWriter, apiResources.get("/sheep"), apiResources);
|
||||
|
Reference in New Issue
Block a user