From a0dd60d6a6b930e30862f18ed714bdc6c886e891 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Mon, 9 Apr 2018 06:57:53 +0100 Subject: [PATCH] REPO-3422 Startup check for LibreOffice Also included the transformer name on the log and error pages. --- .../AlfrescoPdfRendererController.java | 6 ++ .../resources/templates/transformForm.html | 4 -- .../transformer/ImageMagickController.java | 6 ++ .../resources/templates/transformForm.html | 4 -- .../transformer/LibreOfficeController.java | 18 ++++++ .../resources/templates/transformForm.html | 4 -- .../base/AbstractTransformerController.java | 43 +++++++++++-- .../alfresco/transformer/base/LogEntry.java | 37 ++++++++++- .../src/main/resources/templates/error.html | 17 +++++ .../src/main/resources/templates/log.html | 63 +++++++++---------- 10 files changed, 152 insertions(+), 50 deletions(-) create mode 100644 alfresco-transformer-base/src/main/resources/templates/error.html diff --git a/alfresco-docker-alfresco-pdf-renderer/src/main/java/org/alfresco/transformer/AlfrescoPdfRendererController.java b/alfresco-docker-alfresco-pdf-renderer/src/main/java/org/alfresco/transformer/AlfrescoPdfRendererController.java index cedddfd7..cbf1815f 100644 --- a/alfresco-docker-alfresco-pdf-renderer/src/main/java/org/alfresco/transformer/AlfrescoPdfRendererController.java +++ b/alfresco-docker-alfresco-pdf-renderer/src/main/java/org/alfresco/transformer/AlfrescoPdfRendererController.java @@ -66,6 +66,12 @@ public class AlfrescoPdfRendererController extends AbstractTransformerController setCheckCommand(createCheckCommand()); } + @Override + protected String getTransformerName() + { + return "Alfresco PDF Renderer"; + } + private static RuntimeExec createTransformCommand() { RuntimeExec runtimeExec = new RuntimeExec(); diff --git a/alfresco-docker-alfresco-pdf-renderer/src/main/resources/templates/transformForm.html b/alfresco-docker-alfresco-pdf-renderer/src/main/resources/templates/transformForm.html index 5f6b20ea..f142aeee 100644 --- a/alfresco-docker-alfresco-pdf-renderer/src/main/resources/templates/transformForm.html +++ b/alfresco-docker-alfresco-pdf-renderer/src/main/resources/templates/transformForm.html @@ -1,10 +1,6 @@ -
-

-

-

Alfresco PDF Renderer Test Transformation

diff --git a/alfresco-docker-imagemagick/src/main/java/org/alfresco/transformer/ImageMagickController.java b/alfresco-docker-imagemagick/src/main/java/org/alfresco/transformer/ImageMagickController.java index 2b1c0285..837b77ff 100644 --- a/alfresco-docker-imagemagick/src/main/java/org/alfresco/transformer/ImageMagickController.java +++ b/alfresco-docker-imagemagick/src/main/java/org/alfresco/transformer/ImageMagickController.java @@ -71,6 +71,12 @@ public class ImageMagickController extends AbstractTransformerController setCheckCommand(createCheckCommand()); } + @Override + protected String getTransformerName() + { + return "ImageMagick"; + } + private static RuntimeExec createTransformCommand() { RuntimeExec runtimeExec = new RuntimeExec(); diff --git a/alfresco-docker-imagemagick/src/main/resources/templates/transformForm.html b/alfresco-docker-imagemagick/src/main/resources/templates/transformForm.html index b849eee4..a33c40d9 100644 --- a/alfresco-docker-imagemagick/src/main/resources/templates/transformForm.html +++ b/alfresco-docker-imagemagick/src/main/resources/templates/transformForm.html @@ -1,10 +1,6 @@ -
-

-

-

ImageMagick Test Transformation

diff --git a/alfresco-docker-libreoffice/src/main/java/org/alfresco/transformer/LibreOfficeController.java b/alfresco-docker-libreoffice/src/main/java/org/alfresco/transformer/LibreOfficeController.java index 0cdc3b3d..5378a56a 100644 --- a/alfresco-docker-libreoffice/src/main/java/org/alfresco/transformer/LibreOfficeController.java +++ b/alfresco-docker-libreoffice/src/main/java/org/alfresco/transformer/LibreOfficeController.java @@ -96,6 +96,24 @@ public class LibreOfficeController extends AbstractTransformerController this.jodconverter = jodconverter; } + @Override + protected String getTransformerName() + { + return "LibreOffice"; + } + + @Override + protected String version() + { + // This method is simply used to check the availability in the case of LibreOffice. + if (!jodconverter.isAvailable()) + { + throw new TransformException(500, "LibreOffice is not yet available"); + } + + return "LibreOffice available"; + } + @PostMapping("/transform") public ResponseEntity transform(HttpServletRequest request, @RequestParam("file") MultipartFile sourceMultipartFile, diff --git a/alfresco-docker-libreoffice/src/main/resources/templates/transformForm.html b/alfresco-docker-libreoffice/src/main/resources/templates/transformForm.html index 7353bc5b..40667bf7 100644 --- a/alfresco-docker-libreoffice/src/main/resources/templates/transformForm.html +++ b/alfresco-docker-libreoffice/src/main/resources/templates/transformForm.html @@ -1,10 +1,6 @@ -
-

-

-

LibreOffice Test Transformation

diff --git a/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/AbstractTransformerController.java b/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/AbstractTransformerController.java index 4a917733..8b0dfef0 100644 --- a/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/AbstractTransformerController.java +++ b/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/AbstractTransformerController.java @@ -108,9 +108,11 @@ public abstract class AbstractTransformerController logger.info(""); } + protected abstract String getTransformerName(); + @RequestMapping("/version") @ResponseBody - String version() + protected String version() { String version = "Version not checked"; if (checkCommand != null) @@ -140,6 +142,7 @@ public abstract class AbstractTransformerController @GetMapping("/log") public String log(Model model) { + model.addAttribute("title", getTransformerName() + " Log Entries"); Collection log = LogEntry.getLog(); if (!log.isEmpty()) { @@ -148,9 +151,16 @@ public abstract class AbstractTransformerController return "log"; // the name of the template } + @GetMapping("/error") + public String error() + { + return "error"; // the name of the template + } + @ExceptionHandler(TypeMismatchException.class) public void handleParamsTypeMismatch(HttpServletResponse response, MissingServletRequestParameterException e) throws IOException { + String transformerName = getTransformerName(); String name = e.getParameterName(); String message = "Request parameter " + name + " is of the wrong type"; int statusCode = 400; @@ -162,12 +172,13 @@ public abstract class AbstractTransformerController LogEntry.setStatusCodeAndMessage(statusCode, message); - response.sendError(statusCode, message); + response.sendError(statusCode, transformerName+" - "+message); } @ExceptionHandler(MissingServletRequestParameterException.class) public void handleMissingParams(HttpServletResponse response, MissingServletRequestParameterException e) throws IOException { + String transformerName = getTransformerName(); String name = e.getParameterName(); String message = "Request parameter " + name + " is missing"; int statusCode = 400; @@ -179,12 +190,13 @@ public abstract class AbstractTransformerController LogEntry.setStatusCodeAndMessage(statusCode, message); - response.sendError(statusCode, message); + response.sendError(statusCode, transformerName+" - "+message); } @ExceptionHandler(TransformException.class) public void transformExceptionWithMessage(HttpServletResponse response, TransformException e) throws IOException { + String transformerName = getTransformerName(); String message = e.getMessage(); int statusCode = e.getStatusCode(); @@ -195,9 +207,32 @@ public abstract class AbstractTransformerController LogEntry.setStatusCodeAndMessage(statusCode, message); - response.sendError(statusCode, message); + // Forced to include the transformer name in the message (see commented out version of this method) + response.sendError(statusCode, transformerName+" - "+message); } + // Results in HTML rather than json but there is an error in the log about "template might not exist or might + // not be accessible by any of the configured Template Resolvers" for the transformer.html (which is correct + // because that failed). Looks like Spring only supports returning json or XML when returning an Object or even + // a ResponseEntity without this logged exception, which is a shame as it would have been nicer to have just + // added the transformerName to the Object. +// @ExceptionHandler(TransformException.class) +// public final Map transformExceptionWithMessage(HttpServletResponse response, TransformException e, WebRequest request) +// { +// String transformerName = getTransformerName(); +// String message = e.getMessage(); +// int statusCode = e.getStatusCode(); +// +// LogEntry.setStatusCodeAndMessage(statusCode, message); +// +// Map errorAttributes = new HashMap<>(); +// errorAttributes.put("title", transformerName); +// errorAttributes.put("message", message); +// errorAttributes.put("status", Integer.toString(statusCode)); +// errorAttributes.put("error", HttpStatus.valueOf(statusCode).getReasonPhrase()); +// return errorAttributes; +// } + protected String createTargetFileName(MultipartFile sourceMultipartFile, String targetExtension) { String targetFilename = null; diff --git a/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/LogEntry.java b/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/LogEntry.java index 49358340..d8600320 100644 --- a/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/LogEntry.java +++ b/alfresco-transformer-base/src/main/java/org/alfresco/transformer/base/LogEntry.java @@ -25,7 +25,10 @@ */ package org.alfresco.transformer.base; -import java.util.*; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicInteger; @@ -40,6 +43,7 @@ public class LogEntry private static final AtomicInteger count = new AtomicInteger(0); private static final Deque log = new ConcurrentLinkedDeque<>(); private static final int MAX_LOG_SIZE = 10; + private static final SimpleDateFormat HH_MM_SS = new SimpleDateFormat("HH:mm:ss"); private static ThreadLocal currentLogEntry = new ThreadLocal() { @@ -71,6 +75,32 @@ public class LogEntry private String options; private String message; + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append(getId()); + sb.append(' '); + sb.append(HH_MM_SS.format(getDate())); + sb.append(' '); + sb.append(getStatusCode()); + sb.append(' '); + sb.append(getDuration()); + sb.append(' '); + sb.append(getSource()); + sb.append(' '); + sb.append(getSourceSize()); + sb.append(' '); + sb.append(getTarget()); + sb.append(' '); + sb.append(getTargetSize()); + sb.append(' '); + sb.append(getOptions()); + sb.append(' '); + sb.append(getMessage()); + return sb.toString(); + } + public static Collection getLog() { return log; @@ -127,6 +157,11 @@ public class LogEntry LogEntry logEntry = currentLogEntry.get(); logEntry.durationStreamOut = System.currentTimeMillis() - logEntry.start - logEntry.durationStreamIn - logEntry.durationTransform; currentLogEntry.remove(); + + if (AbstractTransformerController.logger != null && AbstractTransformerController.logger.isDebugEnabled()) + { + AbstractTransformerController.logger.debug(logEntry.toString()); + } } public int getId() diff --git a/alfresco-transformer-base/src/main/resources/templates/error.html b/alfresco-transformer-base/src/main/resources/templates/error.html new file mode 100644 index 00000000..b6cd4be7 --- /dev/null +++ b/alfresco-transformer-base/src/main/resources/templates/error.html @@ -0,0 +1,17 @@ + + + +
+

+

+

+
+ + + + + diff --git a/alfresco-transformer-base/src/main/resources/templates/log.html b/alfresco-transformer-base/src/main/resources/templates/log.html index 5c9a1a2b..856c5dd1 100644 --- a/alfresco-transformer-base/src/main/resources/templates/log.html +++ b/alfresco-transformer-base/src/main/resources/templates/log.html @@ -1,41 +1,38 @@ -
-

+
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IdTimeStatus CodeDuration (ms)SourceTargetOptionsMessage
+
-

Log entries

-
- - - - - - - - - - - - - - - - - - - - - - - - - -
IdTimeStatus CodeDuration (ms)SourceTargetOptionsMessage
-
- -