Move transformEngine from TransformHandler to transformControl as that is a better fit

Also reduces the number of reads of the engine_config.json
This commit is contained in:
alandavis
2022-08-11 08:35:47 +01:00
parent bb015925a7
commit d1e811cef4
9 changed files with 69 additions and 78 deletions

View File

@@ -28,6 +28,7 @@ package org.alfresco.transform.base;
import org.alfresco.transform.base.html.OptionLister; import org.alfresco.transform.base.html.OptionLister;
import org.alfresco.transform.base.logging.LogEntry; import org.alfresco.transform.base.logging.LogEntry;
import org.alfresco.transform.base.probes.ProbeTransform;
import org.alfresco.transform.base.registry.TransformRegistry; import org.alfresco.transform.base.registry.TransformRegistry;
import org.alfresco.transform.base.transform.TransformHandler; import org.alfresco.transform.base.transform.TransformHandler;
import org.alfresco.transform.client.model.TransformReply; import org.alfresco.transform.client.model.TransformReply;
@@ -58,11 +59,13 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.jms.Destination;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -111,9 +114,28 @@ public class TransformController
TransformEngine transformEngine; TransformEngine transformEngine;
@PostConstruct @PostConstruct
private void init() private void initTransformEngine()
{ {
transformEngine = transformHandler.getTransformEngine(); if (transformEngines != null)
{
transformEngine = getTransformEngine();
logger.info("TransformEngine: " + transformEngine.getTransformEngineName());
transformEngines.stream()
.filter(te -> te != transformEngine)
.sorted(Comparator.comparing(TransformEngine::getTransformEngineName))
.map(transformEngine -> " "+transformEngine.getTransformEngineName()).forEach(logger::info);
}
}
private TransformEngine getTransformEngine()
{
// Normally there is just one TransformEngine per t-engine, but we also want to be able to amalgamate the
// CustomTransform code from many t-engines into a single t-engine. In this case, there should be a wrapper
// TransformEngine (it has no TransformConfig of its own).
return transformEngines.stream()
.filter(transformEngine -> transformEngine.getTransformConfig() == null)
.findFirst()
.orElse(transformEngines.get(0));
} }
@EventListener(ApplicationReadyEvent.class) @EventListener(ApplicationReadyEvent.class)
@@ -206,7 +228,7 @@ public class TransformController
@ResponseBody @ResponseBody
public String ready(HttpServletRequest request) public String ready(HttpServletRequest request)
{ {
return transformHandler.probe(request, false); return getProbeTransform().doTransformOrNothing(request, false, transformHandler);
} }
/** /**
@@ -216,7 +238,12 @@ public class TransformController
@ResponseBody @ResponseBody
public String live(HttpServletRequest request) public String live(HttpServletRequest request)
{ {
return transformHandler.probe(request, true); return getProbeTransform().doTransformOrNothing(request, true, transformHandler);
}
public ProbeTransform getProbeTransform()
{
return transformEngine.getProbeTransform();
} }
@GetMapping(value = ENDPOINT_TRANSFORM_CONFIG) @GetMapping(value = ENDPOINT_TRANSFORM_CONFIG)
@@ -234,9 +261,10 @@ public class TransformController
@PostMapping(value = ENDPOINT_TRANSFORM, produces = APPLICATION_JSON_VALUE) @PostMapping(value = ENDPOINT_TRANSFORM, produces = APPLICATION_JSON_VALUE)
@ResponseBody @ResponseBody
public ResponseEntity<TransformReply> transform(@RequestBody TransformRequest request, public ResponseEntity<TransformReply> transform(@RequestBody TransformRequest request,
@RequestParam(value = "timeout", required = false) Long timeout) @RequestParam(value = "timeout", required = false) Long timeout,
@RequestParam(value = "replyToQueue", required = false) Destination replyToQueue)
{ {
TransformReply reply = transformHandler.handleMessageRequest(request, timeout, null); TransformReply reply = transformHandler.handleMessageRequest(request, timeout, replyToQueue, getProbeTransform());
return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus())); return new ResponseEntity<>(reply, HttpStatus.valueOf(reply.getStatus()));
} }
@@ -249,7 +277,7 @@ public class TransformController
@RequestParam Map<String, String> requestParameters) @RequestParam Map<String, String> requestParameters)
{ {
return transformHandler.handleHttpRequest(request, sourceMultipartFile, sourceMimetype, return transformHandler.handleHttpRequest(request, sourceMultipartFile, sourceMimetype,
targetMimetype, requestParameters); targetMimetype, requestParameters, getProbeTransform());
} }
// Used the t-engine's simple html test UI. // Used the t-engine's simple html test UI.

View File

@@ -26,7 +26,7 @@
*/ */
package org.alfresco.transform.base.messaging; package org.alfresco.transform.base.messaging;
import org.alfresco.transform.base.transform.TransformHandler; import org.alfresco.transform.base.TransformController;
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.common.TransformException; import org.alfresco.transform.common.TransformException;
@@ -63,7 +63,7 @@ public class QueueTransformService
private static final Logger logger = LoggerFactory.getLogger(QueueTransformService.class); private static final Logger logger = LoggerFactory.getLogger(QueueTransformService.class);
@Autowired @Autowired
private TransformHandler transformHandler; private TransformController transformController;
@Autowired @Autowired
private TransformMessageConverter transformMessageConverter; private TransformMessageConverter transformMessageConverter;
@Autowired @Autowired
@@ -123,7 +123,7 @@ public class QueueTransformService
return; return;
} }
transformHandler.handleMessageRequest(transformRequest.get(), null, replyToQueue); transformController.transform(transformRequest.get(), null, replyToQueue);
} }
/** /**

View File

@@ -212,7 +212,7 @@ public class ProbeTransform
File sourceFile = getSourceFile(isLiveProbe); File sourceFile = getSourceFile(isLiveProbe);
File targetFile = getTargetFile(); File targetFile = getTargetFile();
transformHandler.handleProbRequest(sourceMimetype, targetMimetype, transformOptions, sourceFile, targetFile); transformHandler.handleProbRequest(sourceMimetype, targetMimetype, transformOptions, sourceFile, targetFile, this);
long time = System.currentTimeMillis() - start; long time = System.currentTimeMillis() - start;
String message = "Transform " + time + "ms"; String message = "Transform " + time + "ms";
checkTargetFile(targetFile, isLiveProbe, message); checkTargetFile(targetFile, isLiveProbe, message);

View File

@@ -59,10 +59,10 @@ import static org.springframework.http.HttpStatus.OK;
/** /**
* Provides the transform logic common to http (upload/download), message and probe requests. See * Provides the transform logic common to http (upload/download), message and probe requests. See
* {@link TransformHandler#handleHttpRequest(HttpServletRequest, MultipartFile, String, String, Map)}, * {@link TransformHandler#handleHttpRequest(HttpServletRequest, MultipartFile, String, String, Map, ProbeTransform)},
* {@link TransformHandler#handleMessageRequest(TransformRequest, Long, Destination)} and * {@link TransformHandler#handleMessageRequest(TransformRequest, Long, Destination, ProbeTransform)} and
* {@link TransformHandler#handleProbRequest(String, String, Map, File, File)}. Note the handing of transform requests * {@link TransformHandler#handleProbRequest(String, String, Map, File, File, ProbeTransform)}. Note the handing of transform requests
* via a message queue is the same as via the {@link TransformController#transform(TransformRequest, Long)}. * via a message queue is the same as via the {@link TransformController#transform(TransformRequest, Long, Destination)}.
*/ */
abstract class ProcessHandler extends FragmentHandler abstract class ProcessHandler extends FragmentHandler
{ {

View File

@@ -106,29 +106,9 @@ public class TransformHandler
private TransformerDebug transformerDebug; private TransformerDebug transformerDebug;
private final AtomicInteger httpRequestCount = new AtomicInteger(1); private final AtomicInteger httpRequestCount = new AtomicInteger(1);
private TransformEngine transformEngine;
private final Map<String, CustomTransformer> customTransformersByName = new HashMap<>(); private final Map<String, CustomTransformer> customTransformersByName = new HashMap<>();
@PostConstruct @PostConstruct
private void init()
{
initTransformEngine();
initCustomTransformersByName();
}
private void initTransformEngine()
{
if (transformEngines != null)
{
transformEngine = getTransformEngine();
logger.info("TransformEngine: " + transformEngine.getTransformEngineName());
transformEngines.stream()
.filter(te -> te != transformEngine)
.sorted(Comparator.comparing(TransformEngine::getTransformEngineName))
.map(transformEngine -> " "+transformEngine.getTransformEngineName()).forEach(logger::info);
}
}
private void initCustomTransformersByName() private void initCustomTransformersByName()
{ {
if (customTransformers != null) if (customTransformers != null)
@@ -143,31 +123,15 @@ public class TransformHandler
} }
} }
public TransformEngine getTransformEngine()
{
// Normally there is just one TransformEngine per t-engine, but we also want to be able to amalgamate the
// CustomTransform code from many t-engines into a single t-engine. In this case, there should be a wrapper
// TransformEngine (it has no TransformConfig of its own).
return transformEngines.stream()
.filter(transformEngine -> transformEngine.getTransformConfig() == null)
.findFirst()
.orElse(transformEngines.get(0));
}
public ProbeTransform getProbeTransform()
{
return transformEngine.getProbeTransform();
}
public ResponseEntity<Resource> handleHttpRequest(HttpServletRequest request, public ResponseEntity<Resource> handleHttpRequest(HttpServletRequest request,
MultipartFile sourceMultipartFile, String sourceMimetype, String targetMimetype, MultipartFile sourceMultipartFile, String sourceMimetype, String targetMimetype,
Map<String, String> requestParameters) Map<String, String> requestParameters, ProbeTransform probeTransform)
{ {
AtomicReference<ResponseEntity<Resource>> responseEntity = new AtomicReference<>(); AtomicReference<ResponseEntity<Resource>> responseEntity = new AtomicReference<>();
new ProcessHandler(sourceMimetype, targetMimetype, requestParameters, new ProcessHandler(sourceMimetype, targetMimetype, requestParameters,
"e" + httpRequestCount.getAndIncrement(), transformRegistry, "e" + httpRequestCount.getAndIncrement(), transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName) transformerDebug, probeTransform, customTransformersByName)
{ {
@Override @Override
protected void init() throws IOException protected void init() throws IOException
@@ -207,11 +171,11 @@ public class TransformHandler
} }
public void handleProbRequest(String sourceMimetype, String targetMimetype, Map<String, String> transformOptions, public void handleProbRequest(String sourceMimetype, String targetMimetype, Map<String, String> transformOptions,
File sourceFile, File targetFile) File sourceFile, File targetFile, ProbeTransform probeTransform)
{ {
new ProcessHandler(sourceMimetype, targetMimetype, transformOptions, new ProcessHandler(sourceMimetype, targetMimetype, transformOptions,
"p" + httpRequestCount.getAndIncrement(), transformRegistry, "p" + httpRequestCount.getAndIncrement(), transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName) transformerDebug, probeTransform, customTransformersByName)
{ {
@Override @Override
protected void init() throws IOException protected void init() throws IOException
@@ -242,12 +206,13 @@ public class TransformHandler
}.handleTransformRequest(); }.handleTransformRequest();
} }
public TransformReply handleMessageRequest(TransformRequest request, Long timeout, Destination replyToQueue) public TransformReply handleMessageRequest(TransformRequest request, Long timeout, Destination replyToQueue,
ProbeTransform probeTransform)
{ {
TransformReply reply = createBasicTransformReply(request); TransformReply reply = createBasicTransformReply(request);
new ProcessHandler(request.getSourceMediaType(), request.getTargetMediaType(), new ProcessHandler(request.getSourceMediaType(), request.getTargetMediaType(),
request.getTransformRequestOptions(),"unset", transformRegistry, request.getTransformRequestOptions(),"unset", transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName) transformerDebug, probeTransform, customTransformersByName)
{ {
@Override @Override
protected void init() throws IOException protected void init() throws IOException
@@ -304,11 +269,6 @@ public class TransformHandler
return reply; return reply;
} }
public String probe(HttpServletRequest request, boolean isLiveProbe)
{
return getProbeTransform().doTransformOrNothing(request, isLiveProbe, this);
}
private void sendSuccessfulResponse(Long timeout, TransformReply reply, Destination replyToQueue) private void sendSuccessfulResponse(Long timeout, TransformReply reply, Destination replyToQueue)
{ {
logger.trace("Sending successful {}, timeout {} ms", reply, timeout); logger.trace("Sending successful {}, timeout {} ms", reply, timeout);

View File

@@ -327,7 +327,7 @@ public abstract class AbstractBaseTest
@Test @Test
public void calculateMaxTime() throws Exception public void calculateMaxTime() throws Exception
{ {
ProbeTransform probeTransform = controller.transformHandler.getProbeTransform(); ProbeTransform probeTransform = controller.getProbeTransform();
probeTransform.resetForTesting(); probeTransform.resetForTesting();
probeTransform.setLivenessPercent(110); probeTransform.setLivenessPercent(110);

View File

@@ -131,7 +131,7 @@ public class TransformControllerTest
static void resetProbeForTesting(TransformController transformController) static void resetProbeForTesting(TransformController transformController)
{ {
transformController.transformHandler.getProbeTransform().resetForTesting(); transformController.getProbeTransform().resetForTesting();
} }
@Test @Test
@@ -446,7 +446,7 @@ public class TransformControllerTest
SOURCE_MIMETYPE, MIMETYPE_TEXT_PLAIN, SOURCE_MIMETYPE, MIMETYPE_TEXT_PLAIN,
TARGET_MIMETYPE, MIMETYPE_PDF, TARGET_MIMETYPE, MIMETYPE_PDF,
PAGE_REQUEST_PARAM, "1", PAGE_REQUEST_PARAM, "1",
SOURCE_ENCODING, "UTF-8"))); SOURCE_ENCODING, "UTF-8")), any());
} }
finally finally
{ {

View File

@@ -27,7 +27,7 @@
package org.alfresco.transform.base.messaging; package org.alfresco.transform.base.messaging;
import org.alfresco.transform.base.transform.TransformHandler; import org.alfresco.transform.base.TransformController;
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.apache.activemq.command.ActiveMQObjectMessage; import org.apache.activemq.command.ActiveMQObjectMessage;
@@ -56,7 +56,7 @@ import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
public class QueueTransformServiceTest public class QueueTransformServiceTest
{ {
@Mock @Mock
private TransformHandler transformHandler; private TransformController transformController;
@Mock @Mock
private TransformMessageConverter transformMessageConverter; private TransformMessageConverter transformMessageConverter;
@Mock @Mock
@@ -76,7 +76,7 @@ public class QueueTransformServiceTest
{ {
queueTransformService.receive(null); queueTransformService.receive(null);
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter); verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender); verifyNoMoreInteractions(transformReplySender);
} }
@@ -86,7 +86,7 @@ public class QueueTransformServiceTest
{ {
queueTransformService.receive(new ActiveMQObjectMessage()); queueTransformService.receive(new ActiveMQObjectMessage());
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter); verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender); verifyNoMoreInteractions(transformReplySender);
} }
@@ -114,7 +114,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg); verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId()); verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
} }
@Test @Test
@@ -141,7 +141,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg); verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId()); verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
} }
@Test @Test
@@ -168,7 +168,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg); verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId()); verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
} }
@Test @Test
@@ -186,12 +186,12 @@ public class QueueTransformServiceTest
doReturn(request).when(transformMessageConverter).fromMessage(msg); doReturn(request).when(transformMessageConverter).fromMessage(msg);
doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;}) doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;})
.when(transformHandler).handleMessageRequest(request, null, destination); .when(transformController).transform(request, null, destination);
queueTransformService.receive(msg); queueTransformService.receive(msg);
verify(transformMessageConverter).fromMessage(msg); verify(transformMessageConverter).fromMessage(msg);
verify(transformHandler).handleMessageRequest(request, null, destination); verify(transformController).transform(request, null, destination);
verify(transformReplySender).send(destination, reply); verify(transformReplySender).send(destination, reply);
} }
@@ -204,7 +204,7 @@ public class QueueTransformServiceTest
queueTransformService.receive(msg); queueTransformService.receive(msg);
verifyNoMoreInteractions(transformHandler); verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter); verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender); verifyNoMoreInteractions(transformReplySender);
} }
@@ -227,12 +227,12 @@ public class QueueTransformServiceTest
doReturn(request).when(transformMessageConverter).fromMessage(msg); doReturn(request).when(transformMessageConverter).fromMessage(msg);
doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;}) doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;})
.when(transformHandler).handleMessageRequest(request, null, destination); .when(transformController).transform(request, null, destination);
queueTransformService.receive(msg); queueTransformService.receive(msg);
verify(transformMessageConverter).fromMessage(msg); verify(transformMessageConverter).fromMessage(msg);
verify(transformHandler).handleMessageRequest(request, null, destination); verify(transformController).transform(request, null, destination);
verify(transformReplySender).send(destination, reply); verify(transformReplySender).send(destination, reply);
} }
} }

View File

@@ -33,6 +33,7 @@ import org.alfresco.transform.base.fakes.FakeTransformerFragments;
import org.alfresco.transform.base.messaging.TransformReplySender; import org.alfresco.transform.base.messaging.TransformReplySender;
import org.alfresco.transform.base.model.FileRefEntity; import org.alfresco.transform.base.model.FileRefEntity;
import org.alfresco.transform.base.model.FileRefResponse; import org.alfresco.transform.base.model.FileRefResponse;
import org.alfresco.transform.base.probes.ProbeTransform;
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.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -89,6 +90,8 @@ public class FragmentHandlerTest
protected AlfrescoSharedFileStoreClient fakeSfsClient; protected AlfrescoSharedFileStoreClient fakeSfsClient;
@MockBean @MockBean
private TransformReplySender transformReplySender; private TransformReplySender transformReplySender;
@MockBean
private ProbeTransform probeTransform;
private void assertFragments(String sourceText, String expectedError, List<String> expectedLines) private void assertFragments(String sourceText, String expectedError, List<String> expectedLines)
{ {
@@ -127,7 +130,7 @@ public class FragmentHandlerTest
.withSourceSize(32L) .withSourceSize(32L)
.withInternalContextForTransformEngineTests() .withInternalContextForTransformEngineTests()
.build(); .build();
transformHandler.handleMessageRequest(request, Long.MAX_VALUE, null); transformHandler.handleMessageRequest(request, Long.MAX_VALUE, null, probeTransform);
TransformReply lastReply = replies.get(replies.size() - 1).getRight(); TransformReply lastReply = replies.get(replies.size() - 1).getRight();
String errorDetails = lastReply.getErrorDetails(); String errorDetails = lastReply.getErrorDetails();