diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/AbstractTransformerController.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/AbstractTransformerController.java index c984202c..18d79646 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/AbstractTransformerController.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/AbstractTransformerController.java @@ -188,7 +188,7 @@ public abstract class AbstractTransformerController implements TransformControll { if (sourceMultipartFile == null) { - throw new TransformException(BAD_REQUEST.value(), "Required request part 'file' is not present"); + throw new TransformException(BAD_REQUEST, "Required request part 'file' is not present"); } sourceFile = createSourceFile(request, sourceMultipartFile); sourceFilename = sourceMultipartFile.getOriginalFilename(); @@ -236,11 +236,11 @@ public abstract class AbstractTransformerController implements TransformControll } catch (IllegalArgumentException e) { - throw new TransformException(BAD_REQUEST.value(), "Direct Access Url is invalid.", e); + throw new TransformException(BAD_REQUEST, "Direct Access Url is invalid.", e); } catch (IOException e) { - throw new TransformException(BAD_REQUEST.value(), "Direct Access Url not found.", e); + throw new TransformException(BAD_REQUEST, "Direct Access Url not found.", e); } return sourceFile; @@ -312,7 +312,7 @@ public abstract class AbstractTransformerController implements TransformControll } catch (TransformException e) { - reply.setStatus(e.getStatusCode()); + reply.setStatus(e.getStatusCode().value()); reply.setErrorDetails(messageWithCause("Failed at reading the source file", e)); transformerDebug.logFailure(reply); @@ -356,7 +356,7 @@ public abstract class AbstractTransformerController implements TransformControll } catch (TransformException e) { - reply.setStatus(e.getStatusCode()); + reply.setStatus(e.getStatusCode().value()); reply.setErrorDetails(messageWithCause("Failed at processing transformation", e)); transformerDebug.logFailure(reply); @@ -381,7 +381,7 @@ public abstract class AbstractTransformerController implements TransformControll } catch (TransformException e) { - reply.setStatus(e.getStatusCode()); + reply.setStatus(e.getStatusCode().value()); reply.setErrorDetails(messageWithCause("Failed at writing the transformed file", e)); transformerDebug.logFailure(reply); @@ -481,7 +481,7 @@ public abstract class AbstractTransformerController implements TransformControll String message = "Source file with reference: " + sourceReference + " is null or empty. " + "Transformation will fail and stop now as there is no content to be transformed."; logger.warn(message); - throw new TransformException(BAD_REQUEST.value(), message); + throw new TransformException(BAD_REQUEST, message); } final File file = createTempFile("source_", "." + extension); @@ -542,8 +542,7 @@ public abstract class AbstractTransformerController implements TransformControll sourceSizeInBytes, targetMimetype, transformOptions, null); if (transformerName == null) { - throw new TransformException(BAD_REQUEST.value(), - "No transforms were able to handle the request"); + throw new TransformException(BAD_REQUEST, "No transforms were able to handle the request"); } return transformerName; } diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/QueueTransformService.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/QueueTransformService.java index cc6b410d..754477ae 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/QueueTransformService.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/QueueTransformService.java @@ -116,7 +116,7 @@ public class QueueTransformService catch (TransformException e) { logger.error(e.getMessage(), e); - replyWithError(replyToDestinationQueue, HttpStatus.valueOf(e.getStatusCode()), + replyWithError(replyToDestinationQueue, HttpStatus.valueOf(e.getStatusCode().value()), e.getMessage(), correlationId); return; } @@ -155,23 +155,21 @@ public class QueueTransformService String message = "MessageConversionException during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(BAD_REQUEST.value(), message + e.getMessage()); + throw new TransformException(BAD_REQUEST, message + e.getMessage()); } catch (JMSException e) { String message = "JMSException during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - message + e.getMessage()); + throw new TransformException(INTERNAL_SERVER_ERROR, message + e.getMessage()); } catch (Exception e) { String message = "Exception during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - message + e.getMessage()); + throw new TransformException(INTERNAL_SERVER_ERROR, message + e.getMessage()); } } diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformController.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformController.java index e45b31d9..529905f3 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformController.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformController.java @@ -210,7 +210,7 @@ public interface TransformController TransformException e) throws IOException { final String message = e.getMessage(); - final int statusCode = e.getStatusCode(); + final int statusCode = e.getStatusCode().value(); logger.error(message, e); diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformRegistryImpl.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformRegistryImpl.java index a520c926..8a3f3024 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformRegistryImpl.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/TransformRegistryImpl.java @@ -92,8 +92,7 @@ public class TransformRegistryImpl extends AbstractTransformRegistry } catch (IOException e) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - "Could not read " + locationFromProperty, e); + throw new TransformException(INTERNAL_SERVER_ERROR, "Could not read " + locationFromProperty, e); } } diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/clients/AlfrescoSharedFileStoreClient.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/clients/AlfrescoSharedFileStoreClient.java index 71a6e1d6..6d03ceb2 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/clients/AlfrescoSharedFileStoreClient.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/clients/AlfrescoSharedFileStoreClient.java @@ -70,7 +70,7 @@ public class AlfrescoSharedFileStoreClient } catch (HttpClientErrorException e) { - throw new TransformException(e.getStatusCode().value(), e.getMessage(), e); + throw new TransformException(e.getStatusCode(), e.getMessage(), e); } } @@ -97,7 +97,7 @@ public class AlfrescoSharedFileStoreClient } catch (HttpClientErrorException e) { - throw new TransformException(e.getStatusCode().value(), e.getMessage(), e); + throw new TransformException(e.getStatusCode(), e.getMessage(), e); } } } diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/AbstractCommandExecutor.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/AbstractCommandExecutor.java index 5abc142a..a60fec06 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/AbstractCommandExecutor.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/AbstractCommandExecutor.java @@ -55,14 +55,12 @@ public abstract class AbstractCommandExecutor implements CommandExecutor if (result.getExitValue() != 0 && result.getStdErr() != null && result.getStdErr().length() > 0) { - throw new TransformException(BAD_REQUEST.value(), - "Transformer exit code was not 0: \n" + result.getStdErr()); + throw new TransformException(BAD_REQUEST, "Transformer exit code was not 0: \n" + result.getStdErr()); } if (!targetFile.exists() || targetFile.length() == 0) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - "Transformer failed to create an output file"); + throw new TransformException(INTERNAL_SERVER_ERROR, Transformer failed to create an output file"); } } @@ -74,14 +72,14 @@ public abstract class AbstractCommandExecutor implements CommandExecutor final ExecutionResult result = checkCommand.execute(); if (result.getExitValue() != 0 && result.getStdErr() != null && result.getStdErr().length() > 0) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - "Transformer version check exit code was not 0: \n" + result); + throw new TransformException(INTERNAL_SERVER_ERROR, + "Transformer version check exit code was not 0: \n" + result); } final String version = result.getStdOut().trim(); if (version.isEmpty()) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, "Transformer version check failed to create any output"); } return version; diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/Transformer.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/Transformer.java index 27ad1af8..3b7574c2 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/Transformer.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/executors/Transformer.java @@ -82,20 +82,20 @@ public interface Transformer } catch (IllegalArgumentException e) { - throw new TransformException(BAD_REQUEST.value(), getMessage(e), e); + throw new TransformException(BAD_REQUEST, getMessage(e), e); } catch (Exception e) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), getMessage(e), e); + throw new TransformException(INTERNAL_SERVER_ERROR, getMessage(e), e); } if (!targetFile.exists()) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, "Transformer failed to create an output file. Target file does not exist."); } if (sourceFile.length() > 0 && targetFile.length() == 0) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, "Transformer failed to create an output file. Target file is empty but source file was not empty."); } } diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/fs/FileManager.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/fs/FileManager.java index fbf78180..cc7e8147 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/fs/FileManager.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/fs/FileManager.java @@ -47,6 +47,7 @@ import org.alfresco.transformer.logging.LogEntry; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriUtils; @@ -104,9 +105,8 @@ public class FileManager if (filename == null || filename.isEmpty()) { String sourceOrTarget = source ? "source" : "target"; - int statusCode = source ? BAD_REQUEST.value() : INTERNAL_SERVER_ERROR.value(); - throw new TransformException(statusCode, - "The " + sourceOrTarget + " filename was not supplied"); + HttpStatus statusCode = source ? BAD_REQUEST : INTERNAL_SERVER_ERROR; + throw new TransformException(statusCode, "The " + sourceOrTarget + " filename was not supplied"); } return filename; } @@ -120,8 +120,7 @@ public class FileManager } catch (IOException e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), - "Failed to store the source file", e); + throw new TransformException(INSUFFICIENT_STORAGE, "Failed to store the source file", e); } } @@ -133,8 +132,7 @@ public class FileManager } catch (IOException e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), - "Failed to store the source file", e); + throw new TransformException(INSUFFICIENT_STORAGE, "Failed to store the source file", e); } } @@ -149,13 +147,13 @@ public class FileManager } else { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, "Could not read the target file: " + file.getPath()); } } catch (MalformedURLException e) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, "The target filename was malformed: " + file.getPath(), e); } } @@ -238,7 +236,7 @@ public class FileManager Resource targetResource = load(targetFile); targetFilename = UriUtils.encodePath(getFilename(targetFilename), "UTF-8"); return ResponseEntity.ok().header(CONTENT_DISPOSITION, - "attachment; filename*= UTF-8''" + targetFilename).body(targetResource); + "attachment; filename*=UTF-8''" + targetFilename).body(targetResource); } /** diff --git a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/probes/ProbeTestTransform.java b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/probes/ProbeTestTransform.java index 60869bf1..0834a00a 100644 --- a/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/probes/ProbeTestTransform.java +++ b/deprecated/alfresco-transformer-base/src/main/java/org/alfresco/transformer/probes/ProbeTestTransform.java @@ -229,7 +229,7 @@ public abstract class ProbeTestTransform if (time > maxTime) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, getMessagePrefix(isLiveProbe) + message + " which is more than " + livenessPercent + "% slower than the normal value of " + normalTime + "ms"); @@ -247,14 +247,14 @@ public abstract class ProbeTestTransform { if (die.get()) { - throw new TransformException(TOO_MANY_REQUESTS.value(), + throw new TransformException(TOO_MANY_REQUESTS, getMessagePrefix(isLiveProbe) + "Transformer requested to die. A transform took " + "longer than " + (maxTransformTime * 1000) + " seconds"); } if (maxTransformCount > 0 && transformCount.get() > maxTransformCount) { - throw new TransformException(TOO_MANY_REQUESTS.value(), + throw new TransformException(TOO_MANY_REQUESTS, getMessagePrefix(isLiveProbe) + "Transformer requested to die. It has performed " + "more than " + maxTransformCount + " transformations"); } @@ -271,8 +271,8 @@ public abstract class ProbeTestTransform } catch (IOException e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), - getMessagePrefix(isLiveProbe) + "Failed to store the source file", e); + throw new TransformException(INSUFFICIENT_STORAGE, + getMessagePrefix(isLiveProbe) + "Failed to store the source file", e); } long length = sourceFile.length(); LogEntry.setSource(sourceFilename, length); @@ -329,13 +329,13 @@ public abstract class ProbeTestTransform String probeMessage = getProbeMessage(isLiveProbe); if (!targetFile.exists() || !targetFile.isFile()) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, probeMessage + "Target File \"" + targetFile.getAbsolutePath() + "\" did not exist"); } long length = targetFile.length(); if (length < minExpectedLength || length > maxExpectedLength) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, probeMessage + "Target File \"" + targetFile.getAbsolutePath() + "\" was the wrong size (" + length + "). Needed to be between " + minExpectedLength + " and " + maxExpectedLength); diff --git a/deprecated/alfresco-transformer-base/src/test/java/org/alfresco/transformer/AbstractTransformerControllerTest.java b/deprecated/alfresco-transformer-base/src/test/java/org/alfresco/transformer/AbstractTransformerControllerTest.java index 575934d1..8b3c7cb3 100644 --- a/deprecated/alfresco-transformer-base/src/test/java/org/alfresco/transformer/AbstractTransformerControllerTest.java +++ b/deprecated/alfresco-transformer-base/src/test/java/org/alfresco/transformer/AbstractTransformerControllerTest.java @@ -26,41 +26,10 @@ */ package org.alfresco.transformer; -import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import static org.alfresco.transform.common.RequestParamMap.DIRECT_ACCESS_URL; -import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM; -import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM_CONFIG_LATEST; -import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM_CONFIG; -import static org.hamcrest.Matchers.containsString; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.springframework.http.HttpHeaders.ACCEPT; -import static org.springframework.http.HttpHeaders.CONTENT_TYPE; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.CREATED; -import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; -import static org.springframework.http.HttpStatus.OK; -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import org.alfresco.transform.client.model.InternalContext; import org.alfresco.transform.client.model.TransformReply; import org.alfresco.transform.client.model.TransformRequest; @@ -70,8 +39,8 @@ import org.alfresco.transform.config.TransformOption; import org.alfresco.transform.config.TransformOptionGroup; import org.alfresco.transform.config.TransformOptionValue; import org.alfresco.transform.config.Transformer; -import org.alfresco.transform.registry.TransformServiceRegistry; import org.alfresco.transform.messages.TransformStack; +import org.alfresco.transform.registry.TransformServiceRegistry; import org.alfresco.transformer.clients.AlfrescoSharedFileStoreClient; import org.alfresco.transformer.model.FileRefEntity; import org.alfresco.transformer.model.FileRefResponse; @@ -90,10 +59,40 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; +import static org.alfresco.transform.common.RequestParamMap.DIRECT_ACCESS_URL; +import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM; +import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM_CONFIG; +import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM_CONFIG_LATEST; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.http.HttpHeaders.ACCEPT; +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.CREATED; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Super class for testing controllers without a server. Includes tests for the AbstractTransformerController itself. diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOHttpRequestTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOHttpRequestTest.java index 5776d4f7..ea69c02c 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOHttpRequestTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOHttpRequestTest.java @@ -29,7 +29,7 @@ package org.alfresco.transform.aio; import org.alfresco.transform.base.AbstractHttpRequestTest; /** - * Tests All-In-One with a server test harness that talks to the TransformController using http. + * Tests All-In-One using http and a server test harness. */ public class AIOHttpRequestTest extends AbstractHttpRequestTest { diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerImageMagickTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOImageMagickTest.java similarity index 86% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerImageMagickTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOImageMagickTest.java index db42838a..1887e10f 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerImageMagickTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOImageMagickTest.java @@ -27,27 +27,21 @@ package org.alfresco.transform.aio; import org.alfresco.transform.base.TransformRegistryImpl; -import org.alfresco.transform.config.Transformer; -import org.alfresco.transform.imagemagick.ImageMagickControllerTest; -import org.alfresco.transform.registry.AbstractTransformRegistry; +import org.alfresco.transform.imagemagick.ImageMagickTest; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.io.IOException; -import java.util.Map; import static org.junit.jupiter.api.Assertions.assertTrue; /** - * Test the AIOController ImageMagick transforms without a server. - * Super class includes tests for the TransformController. + * Test ImageMagick functionality in All-In-One. */ -@WebMvcTest() -public class AIOControllerImageMagickTest extends ImageMagickControllerTest +public class AIOImageMagickTest extends ImageMagickTest { @Autowired TransformRegistryImpl transformRegistry; diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerLibreOfficeTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOLibreOfficeTest.java similarity index 86% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerLibreOfficeTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOLibreOfficeTest.java index 121008ae..82fa9369 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerLibreOfficeTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOLibreOfficeTest.java @@ -26,22 +26,16 @@ */ package org.alfresco.transform.aio; -import org.alfresco.transform.libreoffice.LibreOfficeControllerTest; +import org.alfresco.transform.libreoffice.LibreOfficeTest; //import org.alfresco.transform.libreoffice.transformers.LibreOfficeTransformer; -import org.alfresco.transform.registry.AbstractTransformRegistry; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import java.util.Map; - -@WebMvcTest() /** - * Test the AIOController without a server. - * Super class includes tests for the LibreOfficeController and TransformController. + * Test LibreOffice functionality in All-In-One. */ -public class AIOControllerLibreOfficeTest extends LibreOfficeControllerTest +public class AIOLibreOfficeTest extends LibreOfficeTest { // @Autowired AbstractTransformRegistry transformRegistry; // diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerMiscTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOMiscTest.java similarity index 88% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerMiscTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOMiscTest.java index 98f83b98..8b5664f2 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerMiscTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOMiscTest.java @@ -28,13 +28,13 @@ package org.alfresco.transform.aio; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.alfresco.transform.misc.MiscControllerTest; -import org.junit.jupiter.api.Test; +import org.alfresco.transform.misc.MiscTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.context.annotation.Import; -@WebMvcTest() -public class AIOControllerMiscTest extends MiscControllerTest +/** + * Test Misc functionality in All-In-One. + */ +public class AIOMiscTest extends MiscTest { // @Test // @Override diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerPdfRendererTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOPdfRendererTest.java similarity index 87% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerPdfRendererTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOPdfRendererTest.java index 1f0ca877..0f486d23 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerPdfRendererTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOPdfRendererTest.java @@ -26,22 +26,17 @@ */ package org.alfresco.transform.aio; -import org.alfresco.transform.pdfrenderer.AlfrescoPdfRendererControllerTest; +import org.alfresco.transform.pdfrenderer.PdfRendererTest; import org.alfresco.transform.registry.AbstractTransformRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import java.util.Map; - -@WebMvcTest() /** - * Test the AIOController PDF Renderer transforms without a server. - * Super class includes tests for the TransformController. + * Test PdfRenderer functionality in All-In-One. */ -public class AIOControllerPdfRendererTest extends AlfrescoPdfRendererControllerTest +public class AIOPdfRendererTest extends PdfRendererTest { @Autowired AbstractTransformRegistry transformRegistry; diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOTest.java similarity index 93% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOTest.java index 89067b98..488fe849 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOTest.java @@ -26,7 +26,7 @@ */ package org.alfresco.transform.aio; -import org.alfresco.transform.base.AbstractTransformControllerTest; +import org.alfresco.transform.base.AbstractBaseTest; import org.alfresco.transform.client.model.TransformRequest; import org.alfresco.transform.config.TransformConfig; import org.junit.jupiter.api.Test; @@ -41,8 +41,10 @@ import static org.alfresco.transform.common.RequestParamMap.CONFIG_VERSION_LATES import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -@WebMvcTest() -public class AIOControllerTest extends AbstractTransformControllerTest +/** + * Test All-In-One. + */ +public class AIOTest extends AbstractBaseTest { @Value("${transform.core.version}") private String coreVersion; diff --git a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTikaTest.java b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOTikaTest.java similarity index 87% rename from engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTikaTest.java rename to engines/aio/src/test/java/org/alfresco/transform/aio/AIOTikaTest.java index 4d1594e3..77682e58 100644 --- a/engines/aio/src/test/java/org/alfresco/transform/aio/AIOControllerTikaTest.java +++ b/engines/aio/src/test/java/org/alfresco/transform/aio/AIOTikaTest.java @@ -26,16 +26,13 @@ */ package org.alfresco.transform.aio; -import org.alfresco.transform.tika.TikaControllerTest; -import org.junit.jupiter.api.Test; +import org.alfresco.transform.tika.TikaTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -@WebMvcTest() /** - * Test the AIOController Tika transforms without a server. - * Super class includes tests for the TransformController. + * Test Tika functionality in All-In-One. */ -public class AIOControllerTikaTest extends TikaControllerTest +public class AIOTikaTest extends TikaTest { // @Test // @Override diff --git a/engines/base/src/main/java/org/alfresco/transform/base/Application.java b/engines/base/src/main/java/org/alfresco/transform/base/Application.java index 7d7035d6..3c2161f1 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/Application.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/Application.java @@ -29,21 +29,13 @@ package org.alfresco.transform.base; import io.micrometer.core.instrument.MeterRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.annotation.Bean; -import org.springframework.context.event.EventListener; - -import java.util.Arrays; -import java.util.List; - -import static org.alfresco.transform.base.logging.StandardMessages.COMMUNITY_LICENCE; @SpringBootApplication @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class}) diff --git a/engines/base/src/main/java/org/alfresco/transform/base/QueueTransformService.java b/engines/base/src/main/java/org/alfresco/transform/base/QueueTransformService.java index e6f06355..e5d06f40 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/QueueTransformService.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/QueueTransformService.java @@ -111,7 +111,7 @@ public class QueueTransformService catch (TransformException e) { logger.error(e.getMessage(), e); - replyWithError(replyToDestinationQueue, HttpStatus.valueOf(e.getStatusCode()), + replyWithError(replyToDestinationQueue, HttpStatus.valueOf(e.getStatusCode().value()), e.getMessage(), correlationId); return; } @@ -148,23 +148,21 @@ public class QueueTransformService String message = "MessageConversionException during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(BAD_REQUEST.value(), message + e.getMessage()); + throw new TransformException(BAD_REQUEST, message + e.getMessage()); } catch (JMSException e) { String message = "JMSException during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - message + e.getMessage()); + throw new TransformException(INTERNAL_SERVER_ERROR, message + e.getMessage()); } catch (Exception e) { String message = "Exception during T-Request deserialization of message with correlationID " + correlationId + ": "; - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - message + e.getMessage()); + throw new TransformException(INTERNAL_SERVER_ERROR, message + e.getMessage()); } } diff --git a/engines/base/src/main/java/org/alfresco/transform/base/TransformController.java b/engines/base/src/main/java/org/alfresco/transform/base/TransformController.java index fd20ecfe..11f58707 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/TransformController.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/TransformController.java @@ -195,7 +195,7 @@ public class TransformController } @PostMapping(value = ENDPOINT_TRANSFORM, consumes = MULTIPART_FORM_DATA_VALUE) - public StreamingResponseBody transform(HttpServletRequest request, + public ResponseEntity transform(HttpServletRequest request, @RequestParam(value = FILE, required = false) MultipartFile sourceMultipartFile, @RequestParam(value = SOURCE_MIMETYPE, required = false) String sourceMimetype, @RequestParam(value = TARGET_MIMETYPE, required = false) String targetMimetype, @@ -206,7 +206,7 @@ public class TransformController } @PostMapping(value = ENDPOINT_TEST, consumes = MULTIPART_FORM_DATA_VALUE) - public StreamingResponseBody testTransform(HttpServletRequest request, + public ResponseEntity testTransform(HttpServletRequest request, @RequestParam(value = FILE, required = false) MultipartFile sourceMultipartFile, @RequestParam(value = SOURCE_MIMETYPE, required = false) String sourceMimetype, @RequestParam(value = TARGET_MIMETYPE, required = false) String targetMimetype, @@ -274,7 +274,7 @@ public class TransformController throws IOException { final String message = e.getMessage(); - final int statusCode = e.getStatusCode(); + final int statusCode = e.getStatusCode().value(); logger.error(message); long time = LogEntry.setStatusCodeAndMessage(statusCode, message); diff --git a/engines/base/src/main/java/org/alfresco/transform/base/TransformHandler.java b/engines/base/src/main/java/org/alfresco/transform/base/TransformHandler.java index 47083a82..7ac116fb 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/TransformHandler.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/TransformHandler.java @@ -35,6 +35,7 @@ import org.alfresco.transform.base.util.OutputStreamLengthRecorder; import org.alfresco.transform.client.model.InternalContext; import org.alfresco.transform.client.model.TransformReply; import org.alfresco.transform.client.model.TransformRequest; +import org.alfresco.transform.common.ExtensionService; import org.alfresco.transform.common.TransformException; import org.alfresco.transform.common.TransformerDebug; import org.alfresco.transform.messages.TransformRequestValidator; @@ -43,9 +44,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; +import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.validation.DirectFieldBindingResult; @@ -62,6 +63,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; @@ -70,23 +72,18 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import static java.util.stream.Collectors.joining; -import static org.alfresco.transform.base.fs.FileManager.TempFileProvider.createTempFile; import static org.alfresco.transform.base.fs.FileManager.createTargetFile; import static org.alfresco.transform.base.fs.FileManager.deleteFile; import static org.alfresco.transform.base.fs.FileManager.getDirectAccessUrlInputStream; -import static org.alfresco.transform.base.fs.FileManager.getFilenameFromContentDisposition; -import static org.alfresco.transform.base.fs.FileManager.save; import static org.alfresco.transform.common.RequestParamMap.DIRECT_ACCESS_URL; import static org.alfresco.transform.common.RequestParamMap.SOURCE_ENCODING; import static org.alfresco.transform.common.RequestParamMap.SOURCE_EXTENSION; import static org.alfresco.transform.common.RequestParamMap.SOURCE_MIMETYPE; -import static org.alfresco.transform.common.RequestParamMap.TARGET_ENCODING; import static org.alfresco.transform.common.RequestParamMap.TARGET_MIMETYPE; import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.CREATED; import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; import static org.springframework.http.HttpStatus.OK; -import static org.springframework.util.StringUtils.getFilenameExtension; /** * Handles the transform requests from either http or a message. @@ -178,39 +175,44 @@ public class TransformHandler return probeTestTransform; } - public StreamingResponseBody handleHttpRequest(HttpServletRequest request, MultipartFile sourceMultipartFile, - String sourceMimetype, String targetMimetype, Map requestParameters) + public ResponseEntity handleHttpRequest(HttpServletRequest request, + MultipartFile sourceMultipartFile, String sourceMimetype, String targetMimetype, + Map requestParameters) { - if (logger.isDebugEnabled()) + return createResponseEntity(targetMimetype, os -> { - logger.debug("Processing request via HTTP endpoint. Params: sourceMimetype: '{}', targetMimetype: '{}', " - + "requestParameters: {}", sourceMimetype, targetMimetype, requestParameters); - } - probeTestTransform.incrementTransformerCount(); + TransformManagerImpl transformManager = null; + String reference = "e" + httpRequestCount.getAndIncrement(); - final String directUrl = requestParameters.getOrDefault(DIRECT_ACCESS_URL, ""); - InputStream inputStream = new BufferedInputStream(directUrl.isBlank() - ? FileManager.getMultipartFileInputStream(sourceMultipartFile) - : getDirectAccessUrlInputStream(directUrl)); - long sourceSizeInBytes = -1L; // TODO pass in t-options or just ignore for http request as the repo will have checked. - Map transformOptions = getTransformOptions(requestParameters); - String transformName = getTransformerName(sourceSizeInBytes, sourceMimetype, targetMimetype, transformOptions); - CustomTransformer customTransformer = getCustomTransformer(transformName); - String reference = "e"+httpRequestCount.getAndIncrement(); - transformerDebug.pushTransform(reference, sourceMimetype, targetMimetype, sourceSizeInBytes, transformName); - transformerDebug.logOptions(reference, requestParameters); - - return os -> { - OutputStreamLengthRecorder outputStream = new OutputStreamLengthRecorder(os); try { - TransformManagerImpl transformManager = TransformManagerImpl.builder() - .withRequest(request) - .withSourceMimetype(sourceMimetype) - .withTargetMimetype(targetMimetype) - .withInputStream(inputStream) - .withOutputStream(outputStream) - .build(); + if (logger.isDebugEnabled()) + { + logger.debug("Processing request via HTTP endpoint. Params: sourceMimetype: '{}', targetMimetype: '{}', " + + "requestParameters: {}", sourceMimetype, targetMimetype, requestParameters); + } + probeTestTransform.incrementTransformerCount(); + + final String directUrl = requestParameters.getOrDefault(DIRECT_ACCESS_URL, ""); + InputStream inputStream = new BufferedInputStream(directUrl.isBlank() ? + FileManager.getMultipartFileInputStream(sourceMultipartFile) : + getDirectAccessUrlInputStream(directUrl)); + long sourceSizeInBytes = -1L; // Ignore for http requests as the Alfresco repo will have checked. + Map transformOptions = getTransformOptions(requestParameters); + String transformName = getTransformerName(sourceSizeInBytes, sourceMimetype, targetMimetype, transformOptions); + CustomTransformer customTransformer = getCustomTransformer(transformName); + transformerDebug.pushTransform(reference, sourceMimetype, targetMimetype, sourceSizeInBytes, transformName); + transformerDebug.logOptions(reference, requestParameters); + + OutputStreamLengthRecorder outputStream = new OutputStreamLengthRecorder(os); + transformManager = TransformManagerImpl.builder() + .withRequest(request) + .withSourceMimetype(sourceMimetype) + .withTargetMimetype(targetMimetype) + .withInputStream(inputStream) + .withOutputStream(outputStream) + .build(); + transformManager.setOutputStream(outputStream); customTransformer.transform(sourceMimetype, inputStream, targetMimetype, outputStream, transformOptions, transformManager); @@ -220,127 +222,122 @@ public class TransformHandler LogEntry.setTargetSize(outputStream.getLength()); long time = LogEntry.setStatusCodeAndMessage(OK.value(), "Success"); - transformManager.deleteSourceFileIfExists(); - transformManager.deleteTargetFileIfExists(); - probeTestTransform.recordTransformTime(time); transformerDebug.popTransform(reference, time); } + catch (TransformException e) + { + transformerDebug.logFailure(reference, e.getMessage()); + throw e; + } catch (Exception e) { transformerDebug.logFailure(reference, e.getMessage()); throw new RuntimeException(e); } - }; + finally + { + deleteTmpFiles(transformManager); + } + }); } public ResponseEntity handleMessageRequest(TransformRequest request, Long timeout) { long start = System.currentTimeMillis(); - logger.trace("Received {}, timeout {} ms", request, timeout); - probeTestTransform.incrementTransformerCount(); - TransformReply reply = createBasicTransformReply(request); - - if (isTransformRequestValid(request, reply) == false) - { - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); - } - - InputStream inputStream = getInputStream(request, reply); - if (inputStream == null) - { - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); - } + InputStream inputStream = null; + TransformManagerImpl transformManager = null; + TransformReply reply = createBasicTransformReply(request);; try { + logger.trace("Received {}, timeout {} ms", request, timeout); + probeTestTransform.incrementTransformerCount(); + checkTransformRequestValid(request, reply); + inputStream = getInputStream(request, reply); String targetMimetype = request.getTargetMediaType(); String sourceMimetype = request.getSourceMediaType(); File targetFile = createTargetFile(null, sourceMimetype, targetMimetype); transformerDebug.pushTransform(request); + long sourceSizeInBytes = request.getSourceSize(); + Map transformOptions = getTransformOptions(request.getTransformRequestOptions()); + transformerDebug.logOptions(request); + String transformName = getTransformerName(sourceSizeInBytes, sourceMimetype, targetMimetype, transformOptions); + CustomTransformer customTransformer = getCustomTransformer(transformName); + try (OutputStreamLengthRecorder outputStream = new OutputStreamLengthRecorder(new BufferedOutputStream( new FileOutputStream(targetFile)))) { - long sourceSizeInBytes = request.getSourceSize(); - Map transformOptions = getTransformOptions(request.getTransformRequestOptions()); - transformerDebug.logOptions(request); - String transformName = getTransformerName(sourceSizeInBytes, sourceMimetype, targetMimetype, transformOptions); - CustomTransformer customTransformer = getCustomTransformer(transformName); + transformManager = TransformManagerImpl.builder() + .withSourceMimetype(sourceMimetype) + .withTargetMimetype(targetMimetype) + .withInputStream(inputStream) + .withOutputStream(outputStream) + .withTargetFile(targetFile) + .build(); - TransformManagerImpl transformManager = TransformManagerImpl.builder() - .withSourceMimetype(sourceMimetype) - .withTargetMimetype(targetMimetype) - .withInputStream(inputStream) - .withOutputStream(outputStream) - .withTargetFile(targetFile) - .build(); - - customTransformer.transform(sourceMimetype, inputStream, - targetMimetype, outputStream, transformOptions, transformManager); + customTransformer.transform(sourceMimetype, inputStream, targetMimetype, outputStream, transformOptions, + transformManager); transformManager.ifUsedCopyTargetFileToOutputStream(); reply.getInternalContext().setCurrentSourceSize(outputStream.getLength()); - if (saveTargetFileInSharedFileStore(targetFile, reply) == false) - { - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); - } - - transformManager.deleteSourceFileIfExists(); - transformManager.deleteTargetFileIfExists(); - - probeTestTransform.recordTransformTime(System.currentTimeMillis()-start); - transformerDebug.popTransform(reply); - - logger.trace("Sending successful {}, timeout {} ms", reply, timeout); - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); - } - catch (TransformException e) - { - reply.setStatus(e.getStatusCode()); - reply.setErrorDetails(messageWithCause("Failed at processing transformation", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to perform transform (TransformException), sending " + reply, e); - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); - } - catch (Exception e) - { - reply.setStatus(INTERNAL_SERVER_ERROR.value()); - reply.setErrorDetails(messageWithCause("Failed at processing transformation", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to perform transform (Exception), sending " + reply, e); - return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); + saveTargetFileInSharedFileStore(targetFile, reply); } } + catch (TransformException e) + { + return createFailedResponseEntity(reply, e, e.getStatusCode().value()); + } + catch (Exception e) + { + return createFailedResponseEntity(reply, e, INTERNAL_SERVER_ERROR.value()); + } finally { + deleteTmpFiles(transformManager); closeInputStreamWithoutException(inputStream); + + probeTestTransform.recordTransformTime(System.currentTimeMillis()-start); + transformerDebug.popTransform(reply); + + logger.trace("Sending successful {}, timeout {} ms", reply, timeout); + return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); } } - private boolean isTransformRequestValid(TransformRequest request, TransformReply reply) + private ResponseEntity createFailedResponseEntity(TransformReply reply, Exception e, + int status) { + reply.setStatus(status); + reply.setErrorDetails(messageWithCause("Transform failed", e)); + + transformerDebug.logFailure(reply); + logger.trace("Transform failed. Sending " + reply, e); + return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); + } + + private void deleteTmpFiles(TransformManagerImpl transformManager) + { + if (transformManager != null) + { + transformManager.deleteSourceFileIfExists(); + transformManager.deleteTargetFileIfExists(); + } + } + + private void checkTransformRequestValid(TransformRequest request, TransformReply reply) { final Errors errors = validateTransformRequest(request); validateInternalContext(request, errors); reply.setInternalContext(request.getInternalContext()); + if (!errors.getAllErrors().isEmpty()) { - reply.setStatus(BAD_REQUEST.value()); - reply.setErrorDetails(errors - .getAllErrors() - .stream() - .map(Object::toString) - .collect(joining(", "))); - - transformerDebug.logFailure(reply); - logger.trace("Invalid request, sending {}", reply); - return false; + String errorDetails = errors.getAllErrors().stream().map(Object::toString).collect(joining(", ")); + throw new TransformException(BAD_REQUEST, errorDetails); } - return true; } private TransformReply createBasicTransformReply(TransformRequest request) @@ -393,7 +390,7 @@ public class TransformHandler { String message = "Source file with reference: " + sourceReference + " is null or empty."; logger.warn(message); - throw new TransformException(BAD_REQUEST.value(), message); + throw new TransformException(BAD_REQUEST, message); } try @@ -404,40 +401,30 @@ public class TransformHandler { String message = "Shared File Store reference is invalid."; logger.warn(message); - throw new TransformException(BAD_REQUEST.value(), message, e); + throw new TransformException(BAD_REQUEST, message, e); } } private InputStream getInputStream(TransformRequest request, TransformReply reply) { final String directUrl = request.getTransformRequestOptions().getOrDefault(DIRECT_ACCESS_URL, ""); - InputStream inputStream = null; try { - inputStream = new BufferedInputStream(directUrl.isBlank() + return new BufferedInputStream(directUrl.isBlank() ? getSharedFileStoreInputStream(request.getSourceReference()) : getDirectAccessUrlInputStream(directUrl)); } catch (TransformException e) { - reply.setStatus(e.getStatusCode()); - reply.setErrorDetails(messageWithCause("Failed at reading the source file", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to load source file (TransformException), sending " + reply); + throw new TransformException(e.getStatusCode(), messageWithCause("Failed to read the source", e)); } catch (HttpClientErrorException e) { - reply.setStatus(e.getStatusCode().value()); - reply.setErrorDetails(messageWithCause("Failed at reading the source file", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to load source file (HttpClientErrorException), sending " + reply, e); + throw new TransformException(e.getStatusCode(), messageWithCause("Failed to read the source", e)); } - return inputStream; } - private boolean saveTargetFileInSharedFileStore(File targetFile, TransformReply reply) + private void saveTargetFileInSharedFileStore(File targetFile, TransformReply reply) { FileRefResponse targetRef; try @@ -446,81 +433,19 @@ public class TransformHandler } catch (TransformException e) { - reply.setStatus(e.getStatusCode()); - reply.setErrorDetails(messageWithCause("Failed at writing the transformed file", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to save target file (TransformException), sending " + reply, e); - return false; + throw new TransformException(e.getStatusCode(), messageWithCause("Failed writing to SFS", e)); } catch (HttpClientErrorException e) { - reply.setStatus(e.getStatusCode().value()); - reply.setErrorDetails(messageWithCause("Failed at writing the transformed file. ", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to save target file (HttpClientErrorException), sending " + reply, e); - return false; + throw new TransformException(e.getStatusCode(), messageWithCause("Failed writing to SFS", e)); } catch (Exception e) { - reply.setStatus(INTERNAL_SERVER_ERROR.value()); - reply.setErrorDetails(messageWithCause("Failed at writing the transformed file. ", e)); - - transformerDebug.logFailure(reply); - logger.trace("Failed to save target file (Exception), sending " + reply, e); - return false; - } - - try - { - deleteFile(targetFile); - } - catch (Exception e) - { - logger.error("Failed to delete local temp target file. Error will be ignored ", e); + throw new TransformException(INTERNAL_SERVER_ERROR, messageWithCause("Failed writing to SFS", e)); } reply.setTargetReference(targetRef.getEntry().getFileRef()); reply.setStatus(CREATED.value()); - - return true; - } - - /** - * Loads the file with the specified sourceReference from Alfresco Shared File Store - * - * @param sourceReference reference to the file in Alfresco Shared File Store - * @param sourceExtension default extension if the file in Alfresco Shared File Store has none - * @return the file containing the source content for the transformation - */ - private File loadSourceFile(final String sourceReference, final String sourceExtension) - { - ResponseEntity responseEntity = alfrescoSharedFileStoreClient.retrieveFile(sourceReference); - - HttpHeaders headers = responseEntity.getHeaders(); - String filename = getFilenameFromContentDisposition(headers); - - String extension = getFilenameExtension(filename) != null ? getFilenameExtension(filename) : sourceExtension; - MediaType contentType = headers.getContentType(); - long size = headers.getContentLength(); - - final Resource body = responseEntity.getBody(); - if (body == null) - { - String message = "Source file with reference: " + sourceReference + " is null or empty. " - + "Transformation will fail and stop now as there is no content to be transformed."; - logger.warn(message); - throw new TransformException(BAD_REQUEST.value(), message); - } - final File file = createTempFile("source_", "." + extension); - - logger.debug("Read source content {} length={} contentType={}", - sourceReference, size, contentType); - - save(body, file); - LogEntry.setSource(filename, size); - return file; } private static String messageWithCause(final String prefix, Throwable e) @@ -554,7 +479,7 @@ public class TransformHandler sourceSizeInBytes, targetMimetype, transformOptions, null); if (transformerName == null) { - throw new TransformException(BAD_REQUEST.value(), "No transforms were able to handle the request"); + throw new TransformException(BAD_REQUEST, "No transforms were able to handle the request"); } return transformerName; } @@ -572,19 +497,35 @@ public class TransformHandler CustomTransformer customTransformer = customTransformersByName.get(transformName); if (customTransformer == null) { - throw new TransformException(BAD_REQUEST.value(), "Custom Transformer "+customTransformer+" not found"); + throw new TransformException(INTERNAL_SERVER_ERROR, "Custom Transformer "+transformName+" not found"); } return customTransformer; } - private void closeInputStreamWithoutException(InputStream inputStream) { - try + private void closeInputStreamWithoutException(InputStream inputStream) + { + if (inputStream != null) { - inputStream.close(); - } - catch (IOException e) - { - throw new RuntimeException(e); + try + { + inputStream.close(); + } + catch (IOException e) + { + throw new RuntimeException(e); + } } } + + private ResponseEntity createResponseEntity(String targetMimetype, + StreamingResponseBody body) + { + String extension = ExtensionService.getExtensionForMimetype(targetMimetype); + HttpHeaders headers = new HttpHeaders(); + headers.setContentDisposition( + ContentDisposition.attachment() + .filename("transform."+ extension, StandardCharsets.UTF_8) + .build()); + return ResponseEntity.ok().headers(headers).body(body); + } } diff --git a/engines/base/src/main/java/org/alfresco/transform/base/clients/AlfrescoSharedFileStoreClient.java b/engines/base/src/main/java/org/alfresco/transform/base/clients/AlfrescoSharedFileStoreClient.java index bd608712..77b02989 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/clients/AlfrescoSharedFileStoreClient.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/clients/AlfrescoSharedFileStoreClient.java @@ -70,7 +70,7 @@ public class AlfrescoSharedFileStoreClient } catch (HttpClientErrorException e) { - throw new TransformException(e.getStatusCode().value(), e.getMessage(), e); + throw new TransformException(e.getStatusCode(), e.getMessage(), e); } } @@ -97,7 +97,7 @@ public class AlfrescoSharedFileStoreClient } catch (HttpClientErrorException e) { - throw new TransformException(e.getStatusCode().value(), e.getMessage(), e); + throw new TransformException(e.getStatusCode(), e.getMessage(), e); } } } diff --git a/engines/base/src/main/java/org/alfresco/transform/base/config/SpringAsyncConfig.java b/engines/base/src/main/java/org/alfresco/transform/base/config/SpringAsyncConfig.java new file mode 100644 index 00000000..3a8b9c12 --- /dev/null +++ b/engines/base/src/main/java/org/alfresco/transform/base/config/SpringAsyncConfig.java @@ -0,0 +1,85 @@ +/* + * #%L + * Alfresco Transform Core + * %% + * Copyright (C) 2022 - 2022 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * - + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * - + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.transform.base.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +@Configuration +@EnableAsync +public class SpringAsyncConfig implements AsyncConfigurer +{ + private static final Logger logger = LoggerFactory.getLogger(SpringAsyncConfig.class); + + @Value("${async-task-executor.core-pool-size:1}") + int corePoolSize; + + @Value("${async-task-executor.max-pool-size:"+Integer.MAX_VALUE+"}") + int maxPoolSize; + + @Value("${async-task-executor.keep-alive-seconds:60}") + int keepAliveSeconds; + + @Value("${async-task-executor.queue-capacity:"+Integer.MAX_VALUE+"}") + int queueCapacity; + + @Value("${async-task-executor.allow-core-thread-time-out:false}") + boolean allowCoreThreadTimeOut; + + @Value("${async-task-executor.prestart-all-core-threads:false}") + boolean prestartAllCoreThreads; + + @Override + @Bean(name = "taskExecutor") + public Executor getAsyncExecutor() + { + logger.debug("async-task-executor:"); + logger.debug(" corePoolSize="+corePoolSize); + logger.debug(" max-pool-size: "+maxPoolSize); + logger.debug(" keep-alive-seconds: "+keepAliveSeconds); + logger.debug(" queue-capacity: "+queueCapacity); + logger.debug(" allow-core-thread-time-out: "+allowCoreThreadTimeOut); + logger.debug(" prestart-all-core-threads: "+prestartAllCoreThreads); + + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setKeepAliveSeconds(keepAliveSeconds); + executor.setQueueCapacity(queueCapacity); + executor.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut); + executor.setPrestartAllCoreThreads(prestartAllCoreThreads); + return executor; + } +} diff --git a/engines/base/src/main/java/org/alfresco/transform/base/config/WebApplicationConfig.java b/engines/base/src/main/java/org/alfresco/transform/base/config/WebApplicationConfig.java index 59c2ac83..a39516f7 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/config/WebApplicationConfig.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/config/WebApplicationConfig.java @@ -35,6 +35,7 @@ import org.alfresco.transform.registry.TransformServiceRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -42,7 +43,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM; @Configuration -@ComponentScan(basePackages = {"org.alfresco.transform"}) +@ComponentScan( + basePackages = {"org.alfresco.transform"}, + excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Test.*")) public class WebApplicationConfig implements WebMvcConfigurer { @Override diff --git a/engines/base/src/main/java/org/alfresco/transform/base/executors/AbstractCommandExecutor.java b/engines/base/src/main/java/org/alfresco/transform/base/executors/AbstractCommandExecutor.java index 5d3ea3b5..ee000a46 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/executors/AbstractCommandExecutor.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/executors/AbstractCommandExecutor.java @@ -52,14 +52,12 @@ public abstract class AbstractCommandExecutor implements CommandExecutor if (result.getExitValue() != 0 && result.getStdErr() != null && result.getStdErr().length() > 0) { - throw new TransformException(BAD_REQUEST.value(), - "Transformer exit code was not 0: \n" + result.getStdErr()); + throw new TransformException(BAD_REQUEST, "Transformer exit code was not 0: \n" + result.getStdErr()); } if (!targetFile.exists() || targetFile.length() == 0) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), - "Transformer failed to create an output file"); + throw new TransformException(INTERNAL_SERVER_ERROR, "Transformer failed to create an output file"); } } } diff --git a/engines/base/src/main/java/org/alfresco/transform/base/fs/FileManager.java b/engines/base/src/main/java/org/alfresco/transform/base/fs/FileManager.java index eb8bdf85..b1433a7e 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/fs/FileManager.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/fs/FileManager.java @@ -30,8 +30,11 @@ import org.alfresco.transform.base.logging.LogEntry; import org.alfresco.transform.common.ExtensionService; import org.alfresco.transform.common.TransformException; import org.springframework.core.io.Resource; +import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; import javax.servlet.http.HttpServletRequest; import java.io.File; @@ -39,6 +42,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; @@ -71,7 +75,7 @@ public class FileManager } catch (Exception e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), "Failed to store the source file", e); + throw new TransformException(INSUFFICIENT_STORAGE, "Failed to store the source file", e); } } @@ -90,7 +94,7 @@ public class FileManager } catch (Exception e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), "Failed to create the target file", e); + throw new TransformException(INSUFFICIENT_STORAGE, "Failed to create the target file", e); } } @@ -110,8 +114,7 @@ public class FileManager } catch (IOException e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), - "Failed to store the source file", e); + throw new TransformException(INSUFFICIENT_STORAGE, "Failed to store the source file", e); } } @@ -136,7 +139,7 @@ public class FileManager InputStream inputStream; if (sourceMultipartFile == null) { - throw new TransformException(BAD_REQUEST.value(), "Required request part 'file' is not present"); + throw new TransformException(BAD_REQUEST, "Required request part 'file' is not present"); } try { @@ -144,7 +147,7 @@ public class FileManager } catch (IOException e) { - throw new TransformException(BAD_REQUEST.value(), "Unable to read the sourceMultipartFile.", e); + throw new TransformException(BAD_REQUEST, "Unable to read the sourceMultipartFile.", e); } return inputStream; } @@ -157,11 +160,11 @@ public class FileManager } catch (IllegalArgumentException e) { - throw new TransformException(BAD_REQUEST.value(), "Direct Access Url is invalid.", e); + throw new TransformException(BAD_REQUEST, "Direct Access Url is invalid.", e); } catch (IOException e) { - throw new TransformException(BAD_REQUEST.value(), "Direct Access Url not found.", e); + throw new TransformException(BAD_REQUEST, "Direct Access Url not found.", e); } } @@ -173,7 +176,7 @@ public class FileManager } catch (IOException e) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), "Failed to copy targetFile to outputStream.", e); + throw new TransformException(INTERNAL_SERVER_ERROR, "Failed to copy targetFile to outputStream.", e); } } diff --git a/engines/base/src/main/java/org/alfresco/transform/base/probes/ProbeTestTransform.java b/engines/base/src/main/java/org/alfresco/transform/base/probes/ProbeTestTransform.java index 11fbc36b..e3226db6 100644 --- a/engines/base/src/main/java/org/alfresco/transform/base/probes/ProbeTestTransform.java +++ b/engines/base/src/main/java/org/alfresco/transform/base/probes/ProbeTestTransform.java @@ -238,7 +238,7 @@ public class ProbeTestTransform if (time > maxTime) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, getMessagePrefix(isLiveProbe) + message + " which is more than " + livenessPercent + "% slower than the normal value of " + normalTime + "ms"); @@ -260,7 +260,7 @@ public class ProbeTestTransform sourceSizeInBytes, targetMimetype, transformOptions, null); if (transformerName == null) { - throw new TransformException(BAD_REQUEST.value(), "No transforms were able to handle the request"); + throw new TransformException(BAD_REQUEST, "No transforms were able to handle the request"); } return transformerName; } @@ -269,14 +269,14 @@ public class ProbeTestTransform { if (die.get()) { - throw new TransformException(TOO_MANY_REQUESTS.value(), + throw new TransformException(TOO_MANY_REQUESTS, getMessagePrefix(isLiveProbe) + "Transformer requested to die. A transform took " + "longer than " + (maxTransformTime * 1000) + " seconds"); } if (maxTransformCount > 0 && transformCount.get() > maxTransformCount) { - throw new TransformException(TOO_MANY_REQUESTS.value(), + throw new TransformException(TOO_MANY_REQUESTS, getMessagePrefix(isLiveProbe) + "Transformer requested to die. It has performed " + "more than " + maxTransformCount + " transformations"); } @@ -293,7 +293,7 @@ public class ProbeTestTransform } catch (IOException e) { - throw new TransformException(INSUFFICIENT_STORAGE.value(), + throw new TransformException(INSUFFICIENT_STORAGE, getMessagePrefix(isLiveProbe) + "Failed to store the source file", e); } long length = sourceFile.length(); @@ -349,13 +349,13 @@ public class ProbeTestTransform String probeMessage = getProbeMessage(isLiveProbe); if (!targetFile.exists() || !targetFile.isFile()) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, probeMessage + "Target File \"" + targetFile.getAbsolutePath() + "\" did not exist"); } long length = targetFile.length(); if (length < minExpectedLength || length > maxExpectedLength) { - throw new TransformException(INTERNAL_SERVER_ERROR.value(), + throw new TransformException(INTERNAL_SERVER_ERROR, probeMessage + "Target File \"" + targetFile.getAbsolutePath() + "\" was the wrong size (" + length + "). Needed to be between " + minExpectedLength + " and " + maxExpectedLength); diff --git a/engines/base/src/main/resources/application.yaml b/engines/base/src/main/resources/application.yaml index ea509310..37e771ef 100644 --- a/engines/base/src/main/resources/application.yaml +++ b/engines/base/src/main/resources/application.yaml @@ -59,3 +59,10 @@ management: container: name: ${HOSTNAME:t-engine} +async-task-executor: + core-pool-size: 1 + max-pool-size: 2147483647 + keep-alive-seconds: 60 + queue-capacity: 2147483647 + allow-core-thread-time-out: false + prestart-all-core-threads: false \ No newline at end of file diff --git a/engines/base/src/main/resources/templates/test.html b/engines/base/src/main/resources/templates/test.html index 0a810799..1d105b1e 100644 --- a/engines/base/src/main/resources/templates/test.html +++ b/engines/base/src/main/resources/templates/test.html @@ -6,27 +6,27 @@ - + - + + + +
file
Direct Url
sourceMimetype
sourceMimetype
targetMimetype
targetMimetype