RED-8481: Use visual layout parsing to detect signatures
integrated service
This commit is contained in:
parent
99944c9fef
commit
3664f6800a
@ -64,6 +64,9 @@ public class MessagingConfiguration {
|
|||||||
public static final String CV_ANALYSIS_RESPONSE_QUEUE = "cv_analysis_response_queue";
|
public static final String CV_ANALYSIS_RESPONSE_QUEUE = "cv_analysis_response_queue";
|
||||||
public static final String CV_ANALYSIS_DLQ = "cv_analysis_dead_letter_queue";
|
public static final String CV_ANALYSIS_DLQ = "cv_analysis_dead_letter_queue";
|
||||||
|
|
||||||
|
public static final String VISUAL_LAYOUT_PARSING_QUEUE = "visual_layout_parsing_service_queue";
|
||||||
|
public static final String VISUAL_LAYOUT_RESPONSE_QUEUE = "visual_layout_parsing_service_response_queue";
|
||||||
|
public static final String VISUAL_LAYOUT_DLQ = "visual_layout_parsing_service_dead_letter_queue";
|
||||||
public static final String ANALYSIS_FLAG_CALCULATION_QUEUE = "analysis_flag_calculation_queue";
|
public static final String ANALYSIS_FLAG_CALCULATION_QUEUE = "analysis_flag_calculation_queue";
|
||||||
|
|
||||||
public static final String OCR_STATUS_UPDATE_RESPONSE_QUEUE = "ocr_status_update_response_queue";
|
public static final String OCR_STATUS_UPDATE_RESPONSE_QUEUE = "ocr_status_update_response_queue";
|
||||||
@ -163,6 +166,28 @@ public class MessagingConfiguration {
|
|||||||
return QueueBuilder.durable(CV_ANALYSIS_DLQ).build();
|
return QueueBuilder.durable(CV_ANALYSIS_DLQ).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue visualLayoutParsingRequestQueue() {
|
||||||
|
|
||||||
|
return QueueBuilder.durable(VISUAL_LAYOUT_PARSING_QUEUE).withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", VISUAL_LAYOUT_DLQ).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue visualLayoutParsingResponseQueue() {
|
||||||
|
|
||||||
|
return QueueBuilder.durable(VISUAL_LAYOUT_RESPONSE_QUEUE)
|
||||||
|
.withArgument("x-dead-letter-exchange", "")
|
||||||
|
.withArgument("x-dead-letter-routing-key", VISUAL_LAYOUT_DLQ)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue visualLayoutParsingDLQ() {
|
||||||
|
|
||||||
|
return QueueBuilder.durable(VISUAL_LAYOUT_DLQ).build();
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public Queue ocrStatusUpdateResponseQueue() {
|
public Queue ocrStatusUpdateResponseQueue() {
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
package com.iqser.red.service.persistence.management.v1.processor.model;
|
||||||
|
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class VisualLayoutParsingServiceRequest {
|
||||||
|
public static final String VISUAL_LAYOUT_PARSING_FILE_EXTENSION= FileType.VISUAL_LAYOUT.name() + FileType.VISUAL_LAYOUT.getExtension() + ".gz";
|
||||||
|
|
||||||
|
public static final String TARGET_FILE_EXTENSION = "ORIGIN.pdf.gz";
|
||||||
|
|
||||||
|
private String dossierId;
|
||||||
|
private String fileId;
|
||||||
|
private String targetFileExtension;
|
||||||
|
private String responseFileExtension;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package com.iqser.red.service.persistence.management.v1.processor.model.image;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class VisualLayoutParsingServiceResponse {
|
||||||
|
|
||||||
|
private String dossierId;
|
||||||
|
private String fileId;
|
||||||
|
}
|
||||||
@ -24,6 +24,7 @@ import com.iqser.red.service.persistence.management.v1.processor.model.CvAnalysi
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.model.FileIdentifier;
|
import com.iqser.red.service.persistence.management.v1.processor.model.FileIdentifier;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.model.NerServiceRequest;
|
import com.iqser.red.service.persistence.management.v1.processor.model.NerServiceRequest;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse;
|
import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.model.VisualLayoutParsingServiceRequest;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.model.image.ImageServiceRequest;
|
import com.iqser.red.service.persistence.management.v1.processor.model.image.ImageServiceRequest;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.layoutparsing.LayoutParsingRequestFactory;
|
import com.iqser.red.service.persistence.management.v1.processor.service.layoutparsing.LayoutParsingRequestFactory;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionProviderService;
|
||||||
@ -176,6 +177,12 @@ public class FileStatusService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.isVisualLayoutParsingEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.VISUAL_LAYOUT)) {
|
||||||
|
log.info("Add file: {} from dossier {} to Visual Layout Parsing queue", fileId, dossierId);
|
||||||
|
addToVisualLayoutParsingQueue(dossierId, fileId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (settings.isFigureDetectionEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.FIGURE)) {
|
if (settings.isFigureDetectionEnabled() && !fileManagementStorageService.objectExists(dossierId, fileId, FileType.FIGURE)) {
|
||||||
log.debug("Add file: {} from dossier {} to Figure Detection queue", fileId, dossierId);
|
log.debug("Add file: {} from dossier {} to Figure Detection queue", fileId, dossierId);
|
||||||
addToFigureDetectionRequestQueue(dossierId, fileId);
|
addToFigureDetectionRequestQueue(dossierId, fileId);
|
||||||
@ -247,6 +254,21 @@ public class FileStatusService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addToVisualLayoutParsingQueue(String dossierId, String fileId) {
|
||||||
|
fileStatusPersistenceService.updateProcessingStatus(fileId, ProcessingStatus.VISUAL_LAYOUT_PARSING_ANALYZING);
|
||||||
|
rabbitTemplate.convertAndSend(MessagingConfiguration.VISUAL_LAYOUT_PARSING_QUEUE,
|
||||||
|
VisualLayoutParsingServiceRequest.builder()
|
||||||
|
.dossierId(dossierId)
|
||||||
|
.fileId(fileId)
|
||||||
|
.targetFileExtension(VisualLayoutParsingServiceRequest.TARGET_FILE_EXTENSION)
|
||||||
|
.responseFileExtension(VisualLayoutParsingServiceRequest.VISUAL_LAYOUT_PARSING_FILE_EXTENSION)
|
||||||
|
.build(),
|
||||||
|
message -> {
|
||||||
|
message.getMessageProperties().setPriority(1);
|
||||||
|
log.info("answer from visual layout parsing: "+message);
|
||||||
|
return message;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public void addToPreprocessingQueue(String dossierId, String fileId, String filename) {
|
public void addToPreprocessingQueue(String dossierId, String fileId, String filename) {
|
||||||
|
|||||||
@ -39,12 +39,16 @@ public class LayoutParsingRequestFactory {
|
|||||||
Optional<String> optionalTableFileId = fileManagementStorageService.objectExists(dossierId, fileId, FileType.TABLES) //
|
Optional<String> optionalTableFileId = fileManagementStorageService.objectExists(dossierId, fileId, FileType.TABLES) //
|
||||||
? Optional.of(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TABLES)) : Optional.empty();
|
? Optional.of(StorageIdUtils.getStorageId(dossierId, fileId, FileType.TABLES)) : Optional.empty();
|
||||||
|
|
||||||
|
Optional<String> optionalVisualLayoutParsingFileId = fileManagementStorageService.objectExists(dossierId, fileId, FileType.VISUAL_LAYOUT) //
|
||||||
|
? Optional.of(StorageIdUtils.getStorageId(dossierId, fileId, FileType.VISUAL_LAYOUT)) : Optional.empty();
|
||||||
|
|
||||||
return LayoutParsingRequest.builder()
|
return LayoutParsingRequest.builder()
|
||||||
.layoutParsingType(type)
|
.layoutParsingType(type)
|
||||||
.identifier(layoutParsingRequestIdentifierService.buildIdentifier(dossierId, fileId, priority))
|
.identifier(layoutParsingRequestIdentifierService.buildIdentifier(dossierId, fileId, priority))
|
||||||
.originFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.ORIGIN))
|
.originFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.ORIGIN))
|
||||||
.imagesFileStorageId(optionalImageFileId)
|
.imagesFileStorageId(optionalImageFileId)
|
||||||
.tablesFileStorageId(optionalTableFileId)
|
.tablesFileStorageId(optionalTableFileId)
|
||||||
|
.visualLayoutParsingFileId(optionalVisualLayoutParsingFileId)
|
||||||
.pageFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_PAGES))
|
.pageFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_PAGES))
|
||||||
.structureFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_STRUCTURE))
|
.structureFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_STRUCTURE))
|
||||||
.textBlockFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_TEXT))
|
.textBlockFileStorageId(StorageIdUtils.getStorageId(dossierId, fileId, FileType.DOCUMENT_TEXT))
|
||||||
|
|||||||
@ -0,0 +1,54 @@
|
|||||||
|
package com.iqser.red.service.persistence.management.v1.processor.service.queue;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Message;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.configuration.MessagingConfiguration;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.model.image.VisualLayoutParsingServiceResponse;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusProcessingUpdateService;
|
||||||
|
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class VisualLayoutParsingMessageReceiver {
|
||||||
|
|
||||||
|
private final ObjectMapper objectMapper;
|
||||||
|
private final FileStatusService fileStatusService;
|
||||||
|
private final FileStatusProcessingUpdateService fileStatusProcessingUpdateService;
|
||||||
|
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
@RabbitListener(queues = MessagingConfiguration.VISUAL_LAYOUT_RESPONSE_QUEUE)
|
||||||
|
public void receive(VisualLayoutParsingServiceResponse response) {
|
||||||
|
|
||||||
|
fileStatusService.setStatusAnalyse(response.getDossierId(), response.getFileId(), false);
|
||||||
|
|
||||||
|
log.info("Received message in {} for dossierId {} and fileId {}", MessagingConfiguration.VISUAL_LAYOUT_RESPONSE_QUEUE, response.getDossierId(), response.getFileId());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
@RabbitListener(queues = MessagingConfiguration.VISUAL_LAYOUT_DLQ)
|
||||||
|
public void handleDLQMessage(Message failedMessage) {
|
||||||
|
|
||||||
|
var response = objectMapper.readValue(failedMessage.getBody(), VisualLayoutParsingServiceResponse.class);
|
||||||
|
|
||||||
|
log.warn("Received message from {} for dossierId {} and fileId {}", MessagingConfiguration.VISUAL_LAYOUT_DLQ, response.getDossierId(), response.getFileId());
|
||||||
|
fileStatusProcessingUpdateService.analysisFailed(response.getDossierId(),
|
||||||
|
response.getFileId(),
|
||||||
|
new FileErrorInfo("table extractor failed", MessagingConfiguration.VISUAL_LAYOUT_DLQ, "table-extractor", OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -24,6 +24,7 @@ public class FileManagementServiceSettings {
|
|||||||
|
|
||||||
private boolean imageServiceEnabled = true;
|
private boolean imageServiceEnabled = true;
|
||||||
private boolean nerServiceEnabled = true;
|
private boolean nerServiceEnabled = true;
|
||||||
|
private boolean visualLayoutParsingEnabled = false;
|
||||||
|
|
||||||
private boolean storeImageFile = true;
|
private boolean storeImageFile = true;
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,7 @@ cors.enabled: true
|
|||||||
|
|
||||||
persistence-service:
|
persistence-service:
|
||||||
imageServiceEnabled: false
|
imageServiceEnabled: false
|
||||||
|
visualLayoutParsingEnabled: true
|
||||||
nerServiceEnabled: false
|
nerServiceEnabled: false
|
||||||
storeImageFile: false
|
storeImageFile: false
|
||||||
applicationName: RedactManager
|
applicationName: RedactManager
|
||||||
|
|||||||
@ -16,6 +16,8 @@ public enum FileType {
|
|||||||
TEXT_HIGHLIGHTS(".json"),
|
TEXT_HIGHLIGHTS(".json"),
|
||||||
FIGURE(".json"),
|
FIGURE(".json"),
|
||||||
TABLES(".json"),
|
TABLES(".json"),
|
||||||
|
|
||||||
|
VISUAL_LAYOUT(".json"),
|
||||||
COMPONENTS(".json"),
|
COMPONENTS(".json"),
|
||||||
// document is split into 4 files, all should be overridden/deleted at the same time
|
// document is split into 4 files, all should be overridden/deleted at the same time
|
||||||
DOCUMENT_TEXT(".json"),
|
DOCUMENT_TEXT(".json"),
|
||||||
|
|||||||
@ -18,5 +18,7 @@ public enum ProcessingStatus {
|
|||||||
PRE_PROCESSING,
|
PRE_PROCESSING,
|
||||||
PRE_PROCESSED,
|
PRE_PROCESSED,
|
||||||
FIGURE_DETECTION_ANALYZING,
|
FIGURE_DETECTION_ANALYZING,
|
||||||
TABLE_PARSING_ANALYZING
|
TABLE_PARSING_ANALYZING,
|
||||||
|
|
||||||
|
VISUAL_LAYOUT_PARSING_ANALYZING
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user