Merge branch 'feature/ATS-68' into 'master'

ATS-68 : ATS-16: Fix error status code mapping for expected invalid requests

See merge request Repository/alfresco-docker-transformers!12
This commit is contained in:
Jan Vonka 2018-08-21 13:29:34 +01:00
commit 624fed06d5
8 changed files with 71 additions and 12 deletions

View File

@ -35,6 +35,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ -102,5 +103,7 @@ public class AlfrescoPdfRendererControllerTest extends AbstractTransformerContro
{ {
transformRequest.setSourceExtension("pdf"); transformRequest.setSourceExtension("pdf");
transformRequest.setTargetExtension("png"); transformRequest.setTargetExtension("png");
transformRequest.setSourceMediaType(MediaType.APPLICATION_PDF_VALUE);
transformRequest.setTargetMediaType(MediaType.IMAGE_PNG_VALUE);
} }
} }

View File

@ -37,6 +37,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ -176,5 +177,7 @@ public class ImageMagickControllerTest extends AbstractTransformerControllerTest
{ {
transformRequest.setSourceExtension("png"); transformRequest.setSourceExtension("png");
transformRequest.setTargetExtension("png"); transformRequest.setTargetExtension("png");
transformRequest.setSourceMediaType(MediaType.IMAGE_PNG_VALUE);
transformRequest.setTargetMediaType(MediaType.IMAGE_PNG_VALUE);
} }
} }

View File

@ -48,6 +48,7 @@ import org.junit.runner.RunWith;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@ -133,5 +134,7 @@ public class LibreOfficeControllerTest extends AbstractTransformerControllerTest
{ {
transformRequest.setSourceExtension("doc"); transformRequest.setSourceExtension("doc");
transformRequest.setTargetExtension("pdf"); transformRequest.setTargetExtension("pdf");
transformRequest.setSourceMediaType("application/msword");
transformRequest.setTargetMediaType(MediaType.IMAGE_PNG_VALUE);
} }
} }

View File

@ -67,6 +67,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.MvcResult;
@ -398,8 +399,10 @@ public class TikaControllerTest extends AbstractTransformerControllerTest
{ {
transformRequest.setSourceExtension(sourceExtension); transformRequest.setSourceExtension(sourceExtension);
transformRequest.setTargetExtension(targetExtension); transformRequest.setTargetExtension(targetExtension);
transformRequest.getTransformationRequestOptions().put("transform", "PdfBox"); transformRequest.setSourceMediaType(MediaType.APPLICATION_PDF_VALUE);
transformRequest.getTransformationRequestOptions().put("targetMimetype", "text/plain"); transformRequest.setTargetMediaType(MediaType.TEXT_PLAIN_VALUE);
transformRequest.getTransformationRequestOptions().put("targetEncoding", "UTF-8"); transformRequest.getTransformRequestOptions().put("transform", "PdfBox");
transformRequest.getTransformRequestOptions().put("targetMimetype", MediaType.TEXT_PLAIN_VALUE);
transformRequest.getTransformRequestOptions().put("targetEncoding", "UTF-8");
} }
} }

View File

@ -39,12 +39,14 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.alfresco.transform.client.model.TransformReply; import org.alfresco.transform.client.model.TransformReply;
import org.alfresco.transform.client.model.TransformRequest; import org.alfresco.transform.client.model.TransformRequest;
import org.alfresco.transform.client.model.TransformRequestValidator;
import org.alfresco.transformer.model.FileRefResponse; import org.alfresco.transformer.model.FileRefResponse;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
import org.alfresco.util.exec.RuntimeExec; import org.alfresco.util.exec.RuntimeExec;
@ -59,6 +61,8 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.validation.DirectFieldBindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -108,6 +112,9 @@ public abstract class AbstractTransformerController
@Autowired @Autowired
private AlfrescoSharedFileStoreClient alfrescoSharedFileStoreClient; private AlfrescoSharedFileStoreClient alfrescoSharedFileStoreClient;
@Autowired
private TransformRequestValidator transformRequestValidator;
protected static Log logger; protected static Log logger;
protected RuntimeExec transformCommand; protected RuntimeExec transformCommand;
@ -158,6 +165,17 @@ public abstract class AbstractTransformerController
transformReply.setSchema(transformRequest.getSchema()); transformReply.setSchema(transformRequest.getSchema());
transformReply.setClientData(transformRequest.getClientData()); transformReply.setClientData(transformRequest.getClientData());
Errors errors = validateTransformRequest(transformRequest);
if (!errors.getAllErrors().isEmpty())
{
transformReply.setStatus(HttpStatus.BAD_REQUEST.value());
transformReply.setErrorDetails(errors.getAllErrors().stream().map(Object::toString)
.collect(Collectors.joining(", ")));
return new ResponseEntity<>(transformReply,
HttpStatus.valueOf(transformReply.getStatus()));
}
// Load the source file // Load the source file
File sourceFile; File sourceFile;
try try
@ -197,7 +215,7 @@ public abstract class AbstractTransformerController
try try
{ {
processTransform(sourceFile, targetFile, processTransform(sourceFile, targetFile,
transformRequest.getTransformationRequestOptions(), timeout); transformRequest.getTransformRequestOptions(), timeout);
} }
catch (TransformException te) catch (TransformException te)
{ {
@ -253,6 +271,13 @@ public abstract class AbstractTransformerController
return new ResponseEntity<>(transformReply, HttpStatus.valueOf(transformReply.getStatus())); return new ResponseEntity<>(transformReply, HttpStatus.valueOf(transformReply.getStatus()));
} }
private Errors validateTransformRequest(TransformRequest transformRequest)
{
DirectFieldBindingResult errors = new DirectFieldBindingResult(transformRequest, "request");
transformRequestValidator.validate(transformRequest, errors);
return errors;
}
protected abstract void processTransform(File sourceFile, File targetFile, protected abstract void processTransform(File sourceFile, File targetFile,
Map<String, String> transformOptions, Long timeout); Map<String, String> transformOptions, Long timeout);

View File

@ -30,13 +30,14 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.alfresco.transform.client.model.TransformRequestValidator;
@Configuration @Configuration
public class WebApplicationConfig extends WebMvcConfigurerAdapter { public class WebApplicationConfig extends WebMvcConfigurerAdapter {
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(transformInterceptor()).addPathPatterns("/transform", "/live", "/ready");; registry.addInterceptor(transformInterceptor()).addPathPatterns("/transform", "/live", "/ready");
} }
@Bean @Bean
@ -55,4 +56,10 @@ public class WebApplicationConfig extends WebMvcConfigurerAdapter {
public AlfrescoSharedFileStoreClient alfrescoSharedFileStoreClient(){ public AlfrescoSharedFileStoreClient alfrescoSharedFileStoreClient(){
return new AlfrescoSharedFileStoreClient(); return new AlfrescoSharedFileStoreClient();
} }
@Bean
public TransformRequestValidator transformRequestValidator()
{
return new TransformRequestValidator();
}
} }

View File

@ -407,16 +407,11 @@ public abstract class AbstractTransformerControllerTest
transformRequest.setRequestId("1"); transformRequest.setRequestId("1");
transformRequest.setSchema(1); transformRequest.setSchema(1);
transformRequest.setClientData("Alfresco Digital Business Platform"); transformRequest.setClientData("Alfresco Digital Business Platform");
transformRequest.setTransformationRequestOptions(new HashMap<>()); transformRequest.setTransformRequestOptions(new HashMap<>());
transformRequest.setSourceReference(sourceFileRef); transformRequest.setSourceReference(sourceFileRef);
transformRequest.setSourceExtension(sourceExtension); transformRequest.setSourceExtension(sourceExtension);
// TODO: ATS-53
transformRequest.setSourceMediaType("TODO");
transformRequest.setSourceSize(sourceFile.length()); transformRequest.setSourceSize(sourceFile.length());
transformRequest.setTargetExtension(targetExtension); transformRequest.setTargetExtension(targetExtension);
transformRequest.setTargetMediaType("TODO");
// HTTP Request // HTTP Request
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
@ -447,5 +442,25 @@ public abstract class AbstractTransformerControllerTest
assertEquals(transformRequest.getSchema(), transformReply.getSchema()); assertEquals(transformRequest.getSchema(), transformReply.getSchema());
} }
@Test
public void testEmptyPojoTransform() throws Exception
{
// Transformation Request POJO
TransformRequest transformRequest = new TransformRequest();
// Serialize and call the transformer
String tr = objectMapper.writeValueAsString(transformRequest);
String transformationReplyAsString = mockMvc.perform(MockMvcRequestBuilders.post("/transform")
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).content(tr))
.andExpect(status().is(HttpStatus.BAD_REQUEST.value()))
.andReturn().getResponse().getContentAsString();
TransformReply transformReply = objectMapper.readValue(transformationReplyAsString, TransformReply.class);
// Assert the reply
assertEquals(HttpStatus.BAD_REQUEST.value(), transformReply.getStatus());
}
protected abstract void updateTransformRequestWithSpecificOptions(TransformRequest transformRequest); protected abstract void updateTransformRequestWithSpecificOptions(TransformRequest transformRequest);
} }

View File

@ -24,7 +24,7 @@
<dependency.alfresco-jodconverter-core.version>3.0.1.1</dependency.alfresco-jodconverter-core.version> <dependency.alfresco-jodconverter-core.version>3.0.1.1</dependency.alfresco-jodconverter-core.version>
<dependency.ch-qos-logback.version>1.2.3</dependency.ch-qos-logback.version> <dependency.ch-qos-logback.version>1.2.3</dependency.ch-qos-logback.version>
<env.project_version>${project.version}</env.project_version> <env.project_version>${project.version}</env.project_version>
<alfresco-transform-data-model.version>0.0.4</alfresco-transform-data-model.version> <alfresco-transform-data-model.version>0.0.7</alfresco-transform-data-model.version>
</properties> </properties>
<modules> <modules>