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.logging.LogEntry;
import org.alfresco.transform.base.probes.ProbeTransform;
import org.alfresco.transform.base.registry.TransformRegistry;
import org.alfresco.transform.base.transform.TransformHandler;
import org.alfresco.transform.client.model.TransformReply;
@@ -58,11 +59,13 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.PostConstruct;
import javax.jms.Destination;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -111,9 +114,28 @@ public class TransformController
TransformEngine transformEngine;
@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)
@@ -206,7 +228,7 @@ public class TransformController
@ResponseBody
public String ready(HttpServletRequest request)
{
return transformHandler.probe(request, false);
return getProbeTransform().doTransformOrNothing(request, false, transformHandler);
}
/**
@@ -216,7 +238,12 @@ public class TransformController
@ResponseBody
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)
@@ -234,9 +261,10 @@ public class TransformController
@PostMapping(value = ENDPOINT_TRANSFORM, produces = APPLICATION_JSON_VALUE)
@ResponseBody
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()));
}
@@ -249,7 +277,7 @@ public class TransformController
@RequestParam Map<String, String> requestParameters)
{
return transformHandler.handleHttpRequest(request, sourceMultipartFile, sourceMimetype,
targetMimetype, requestParameters);
targetMimetype, requestParameters, getProbeTransform());
}
// Used the t-engine's simple html test UI.

View File

@@ -26,7 +26,7 @@
*/
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.TransformRequest;
import org.alfresco.transform.common.TransformException;
@@ -63,7 +63,7 @@ public class QueueTransformService
private static final Logger logger = LoggerFactory.getLogger(QueueTransformService.class);
@Autowired
private TransformHandler transformHandler;
private TransformController transformController;
@Autowired
private TransformMessageConverter transformMessageConverter;
@Autowired
@@ -123,7 +123,7 @@ public class QueueTransformService
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 targetFile = getTargetFile();
transformHandler.handleProbRequest(sourceMimetype, targetMimetype, transformOptions, sourceFile, targetFile);
transformHandler.handleProbRequest(sourceMimetype, targetMimetype, transformOptions, sourceFile, targetFile, this);
long time = System.currentTimeMillis() - start;
String message = "Transform " + time + "ms";
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
* {@link TransformHandler#handleHttpRequest(HttpServletRequest, MultipartFile, String, String, Map)},
* {@link TransformHandler#handleMessageRequest(TransformRequest, Long, Destination)} and
* {@link TransformHandler#handleProbRequest(String, String, Map, File, File)}. Note the handing of transform requests
* via a message queue is the same as via the {@link TransformController#transform(TransformRequest, Long)}.
* {@link TransformHandler#handleHttpRequest(HttpServletRequest, MultipartFile, String, String, Map, ProbeTransform)},
* {@link TransformHandler#handleMessageRequest(TransformRequest, Long, Destination, ProbeTransform)} and
* {@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, Destination)}.
*/
abstract class ProcessHandler extends FragmentHandler
{

View File

@@ -106,29 +106,9 @@ public class TransformHandler
private TransformerDebug transformerDebug;
private final AtomicInteger httpRequestCount = new AtomicInteger(1);
private TransformEngine transformEngine;
private final Map<String, CustomTransformer> customTransformersByName = new HashMap<>();
@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()
{
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,
MultipartFile sourceMultipartFile, String sourceMimetype, String targetMimetype,
Map<String, String> requestParameters)
Map<String, String> requestParameters, ProbeTransform probeTransform)
{
AtomicReference<ResponseEntity<Resource>> responseEntity = new AtomicReference<>();
new ProcessHandler(sourceMimetype, targetMimetype, requestParameters,
"e" + httpRequestCount.getAndIncrement(), transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName)
transformerDebug, probeTransform, customTransformersByName)
{
@Override
protected void init() throws IOException
@@ -207,11 +171,11 @@ public class TransformHandler
}
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,
"p" + httpRequestCount.getAndIncrement(), transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName)
transformerDebug, probeTransform, customTransformersByName)
{
@Override
protected void init() throws IOException
@@ -242,12 +206,13 @@ public class TransformHandler
}.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);
new ProcessHandler(request.getSourceMediaType(), request.getTargetMediaType(),
request.getTransformRequestOptions(),"unset", transformRegistry,
transformerDebug, getProbeTransform(), customTransformersByName)
transformerDebug, probeTransform, customTransformersByName)
{
@Override
protected void init() throws IOException
@@ -304,11 +269,6 @@ public class TransformHandler
return reply;
}
public String probe(HttpServletRequest request, boolean isLiveProbe)
{
return getProbeTransform().doTransformOrNothing(request, isLiveProbe, this);
}
private void sendSuccessfulResponse(Long timeout, TransformReply reply, Destination replyToQueue)
{
logger.trace("Sending successful {}, timeout {} ms", reply, timeout);

View File

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

View File

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

View File

@@ -27,7 +27,7 @@
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.TransformRequest;
import org.apache.activemq.command.ActiveMQObjectMessage;
@@ -56,7 +56,7 @@ import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
public class QueueTransformServiceTest
{
@Mock
private TransformHandler transformHandler;
private TransformController transformController;
@Mock
private TransformMessageConverter transformMessageConverter;
@Mock
@@ -76,7 +76,7 @@ public class QueueTransformServiceTest
{
queueTransformService.receive(null);
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender);
}
@@ -86,7 +86,7 @@ public class QueueTransformServiceTest
{
queueTransformService.receive(new ActiveMQObjectMessage());
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender);
}
@@ -114,7 +114,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
}
@Test
@@ -141,7 +141,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
}
@Test
@@ -168,7 +168,7 @@ public class QueueTransformServiceTest
verify(transformMessageConverter).fromMessage(msg);
verify(transformReplySender).send(destination, reply, msg.getCorrelationId());
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
}
@Test
@@ -186,12 +186,12 @@ public class QueueTransformServiceTest
doReturn(request).when(transformMessageConverter).fromMessage(msg);
doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;})
.when(transformHandler).handleMessageRequest(request, null, destination);
.when(transformController).transform(request, null, destination);
queueTransformService.receive(msg);
verify(transformMessageConverter).fromMessage(msg);
verify(transformHandler).handleMessageRequest(request, null, destination);
verify(transformController).transform(request, null, destination);
verify(transformReplySender).send(destination, reply);
}
@@ -204,7 +204,7 @@ public class QueueTransformServiceTest
queueTransformService.receive(msg);
verifyNoMoreInteractions(transformHandler);
verifyNoMoreInteractions(transformController);
verifyNoMoreInteractions(transformMessageConverter);
verifyNoMoreInteractions(transformReplySender);
}
@@ -227,12 +227,12 @@ public class QueueTransformServiceTest
doReturn(request).when(transformMessageConverter).fromMessage(msg);
doAnswer(invocation -> {transformReplySender.send(destination, reply); return null;})
.when(transformHandler).handleMessageRequest(request, null, destination);
.when(transformController).transform(request, null, destination);
queueTransformService.receive(msg);
verify(transformMessageConverter).fromMessage(msg);
verify(transformHandler).handleMessageRequest(request, null, destination);
verify(transformController).transform(request, null, destination);
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.model.FileRefEntity;
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.TransformRequest;
import org.apache.commons.lang3.tuple.Pair;
@@ -89,6 +90,8 @@ public class FragmentHandlerTest
protected AlfrescoSharedFileStoreClient fakeSfsClient;
@MockBean
private TransformReplySender transformReplySender;
@MockBean
private ProbeTransform probeTransform;
private void assertFragments(String sourceText, String expectedError, List<String> expectedLines)
{
@@ -127,7 +130,7 @@ public class FragmentHandlerTest
.withSourceSize(32L)
.withInternalContextForTransformEngineTests()
.build();
transformHandler.handleMessageRequest(request, Long.MAX_VALUE, null);
transformHandler.handleMessageRequest(request, Long.MAX_VALUE, null, probeTransform);
TransformReply lastReply = replies.get(replies.size() - 1).getRight();
String errorDetails = lastReply.getErrorDetails();