RED-9042: fix recategorization merge with legal-basis #386
@ -7,7 +7,7 @@ description = "redaction-service-api-v1"
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("org.springframework:spring-web:6.0.12")
|
implementation("org.springframework:spring-web:6.0.12")
|
||||||
implementation("com.iqser.red.service:persistence-service-internal-api-v1:2.338.0")
|
implementation("com.iqser.red.service:persistence-service-internal-api-v1:2.349.56")
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ val layoutParserVersion = "0.89.11"
|
|||||||
val jacksonVersion = "2.15.2"
|
val jacksonVersion = "2.15.2"
|
||||||
val droolsVersion = "9.44.0.Final"
|
val droolsVersion = "9.44.0.Final"
|
||||||
val pdfBoxVersion = "3.0.0"
|
val pdfBoxVersion = "3.0.0"
|
||||||
val persistenceServiceVersion = "2.349.26"
|
val persistenceServiceVersion = "2.349.56"
|
||||||
val springBootStarterVersion = "3.1.5"
|
val springBootStarterVersion = "3.1.5"
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualChangeFactory;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Rectangle;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
||||||
@ -34,7 +35,6 @@ import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntit
|
|||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Image;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Image;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.ImageType;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.DictionaryService;
|
import com.iqser.red.service.redaction.v1.server.service.DictionaryService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.ManualChangeFactory;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.service.ManualChangesApplicationService;
|
import com.iqser.red.service.redaction.v1.server.service.ManualChangesApplicationService;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -196,7 +196,7 @@ public final class MigrationEntity {
|
|||||||
throw new UnsupportedOperationException("Unknown subclass " + migratedEntity.getClass());
|
throw new UnsupportedOperationException("Unknown subclass " + migratedEntity.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
entityLogEntry.setManualChanges(ManualChangeFactory.toManualChangeList(migratedEntity.getManualOverwrite().getManualChangeLog(), redactionLogEntry.isHint()));
|
entityLogEntry.setManualChanges(ManualChangeFactory.toLocalManualChangeList(migratedEntity.getManualOverwrite().getManualChangeLog(), true));
|
||||||
entityLogEntry.setColor(redactionLogEntry.getColor());
|
entityLogEntry.setColor(redactionLogEntry.getColor());
|
||||||
entityLogEntry.setChanges(redactionLogEntry.getChanges()
|
entityLogEntry.setChanges(redactionLogEntry.getChanges()
|
||||||
.stream()
|
.stream()
|
||||||
|
|||||||
@ -132,10 +132,16 @@ public class ManualChangeOverwrite {
|
|||||||
// recategorization logic happens in ManualChangesApplicationService.
|
// recategorization logic happens in ManualChangesApplicationService.
|
||||||
recategorized = true;
|
recategorized = true;
|
||||||
// this is only relevant for ManualEntities. Image and TextEntity is recategorized in the ManualChangesApplicationService.
|
// this is only relevant for ManualEntities. Image and TextEntity is recategorized in the ManualChangesApplicationService.
|
||||||
|
if (recategorization.getType() != null) {
|
||||||
type = recategorization.getType();
|
type = recategorization.getType();
|
||||||
|
}
|
||||||
|
if (recategorization.getSection() != null) {
|
||||||
section = recategorization.getSection();
|
section = recategorization.getSection();
|
||||||
|
}
|
||||||
|
if (recategorization.getValue() != null) {
|
||||||
value = recategorization.getValue();
|
value = recategorization.getValue();
|
||||||
if (recategorization.getLegalBasis() != null && !recategorization.getLegalBasis().isEmpty()) {
|
}
|
||||||
|
if (recategorization.getLegalBasis() != null) {
|
||||||
legalBasis = recategorization.getLegalBasis();
|
legalBasis = recategorization.getLegalBasis();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.Position;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualChangeFactory;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis;
|
||||||
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
import com.iqser.red.service.redaction.v1.server.RedactionServiceSettings;
|
||||||
import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient;
|
import com.iqser.red.service.redaction.v1.server.client.LegalBasisClient;
|
||||||
@ -202,7 +203,7 @@ public class EntityLogCreatorService {
|
|||||||
.section(image.getManualOverwrite().getSection()
|
.section(image.getManualOverwrite().getSection()
|
||||||
.orElse(image.getParent().toString()))
|
.orElse(image.getParent().toString()))
|
||||||
.imageHasTransparency(image.isTransparent())
|
.imageHasTransparency(image.isTransparent())
|
||||||
.manualChanges(ManualChangeFactory.toManualChangeList(image.getManualOverwrite().getManualChangeLog(), isHint))
|
.manualChanges(ManualChangeFactory.toLocalManualChangeList(image.getManualOverwrite().getManualChangeLog(), true))
|
||||||
.state(buildEntryState(image))
|
.state(buildEntryState(image))
|
||||||
.entryType(isHint ? EntryType.IMAGE_HINT : EntryType.IMAGE)
|
.entryType(isHint ? EntryType.IMAGE_HINT : EntryType.IMAGE)
|
||||||
.engines(getEngines(null, image.getManualOverwrite()))
|
.engines(getEngines(null, image.getManualOverwrite()))
|
||||||
@ -245,7 +246,7 @@ public class EntityLogCreatorService {
|
|||||||
//(was .imported(precursorEntity.getEngines() != null && precursorEntity.getEngines().contains(Engine.IMPORTED)))
|
//(was .imported(precursorEntity.getEngines() != null && precursorEntity.getEngines().contains(Engine.IMPORTED)))
|
||||||
.imported(false)
|
.imported(false)
|
||||||
.reference(Collections.emptySet())
|
.reference(Collections.emptySet())
|
||||||
.manualChanges(ManualChangeFactory.toManualChangeList(precursorEntity.getManualOverwrite().getManualChangeLog(), isHint))
|
.manualChanges(ManualChangeFactory.toLocalManualChangeList(precursorEntity.getManualOverwrite().getManualChangeLog(), true))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +282,7 @@ public class EntityLogCreatorService {
|
|||||||
//(was .imported(entity.getEngines() != null && entity.getEngines().contains(Engine.IMPORTED)))
|
//(was .imported(entity.getEngines() != null && entity.getEngines().contains(Engine.IMPORTED)))
|
||||||
.imported(false)
|
.imported(false)
|
||||||
.reference(referenceIds)
|
.reference(referenceIds)
|
||||||
.manualChanges(ManualChangeFactory.toManualChangeList(entity.getManualOverwrite().getManualChangeLog(), isHint))
|
.manualChanges(ManualChangeFactory.toLocalManualChangeList(entity.getManualOverwrite().getManualChangeLog(), true))
|
||||||
.state(buildEntryState(entity))
|
.state(buildEntryState(entity))
|
||||||
.entryType(buildEntryType(entity))
|
.entryType(buildEntryType(entity))
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@ -1,59 +0,0 @@
|
|||||||
package com.iqser.red.service.redaction.v1.server.service;
|
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualChange;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.ManualRedactionType;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.BaseAnnotation;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.IdRemoval;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualForceRedaction;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualLegalBasisChange;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
|
||||||
|
|
||||||
import lombok.experimental.UtilityClass;
|
|
||||||
|
|
||||||
@UtilityClass
|
|
||||||
public class ManualChangeFactory {
|
|
||||||
|
|
||||||
public List<ManualChange> toManualChangeList(List<BaseAnnotation> manualChanges, boolean isHint) {
|
|
||||||
|
|
||||||
return manualChanges.stream()
|
|
||||||
.map(baseAnnotation -> toManualChange(baseAnnotation, isHint))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ManualChange toManualChange(BaseAnnotation baseAnnotation, boolean isHint) {
|
|
||||||
|
|
||||||
ManualChange manualChange = ManualChange.from(baseAnnotation);
|
|
||||||
if (baseAnnotation instanceof ManualRecategorization recategorization) {
|
|
||||||
manualChange.withManualRedactionType(ManualRedactionType.RECATEGORIZE)
|
|
||||||
.withChange("type", recategorization.getType())
|
|
||||||
.withChange("section", recategorization.getSection())
|
|
||||||
.withChange("legalBasis", recategorization.getLegalBasis())
|
|
||||||
.withChange("value", recategorization.getValue());
|
|
||||||
} else if (baseAnnotation instanceof IdRemoval manualRemoval) {
|
|
||||||
manualChange.withManualRedactionType(manualRemoval.isRemoveFromDictionary() ? ManualRedactionType.REMOVE_FROM_DICTIONARY : ManualRedactionType.REMOVE);
|
|
||||||
} else if (baseAnnotation instanceof ManualForceRedaction manualForceRedaction) {
|
|
||||||
manualChange.withManualRedactionType(ManualRedactionType.FORCE).withChange("legalBasis", manualForceRedaction.getLegalBasis());
|
|
||||||
} else if (baseAnnotation instanceof ManualResizeRedaction manualResizeRedact) {
|
|
||||||
manualChange.withManualRedactionType(manualResizeRedact.getUpdateDictionary() ? ManualRedactionType.RESIZE_IN_DICTIONARY : ManualRedactionType.RESIZE)
|
|
||||||
.withChange("value", manualResizeRedact.getValue());
|
|
||||||
} else if (baseAnnotation instanceof ManualRedactionEntry manualRedactionEntry) {
|
|
||||||
manualChange.withManualRedactionType(manualRedactionEntry.isAddToDictionary() ? ManualRedactionType.ADD_TO_DICTIONARY : ManualRedactionType.ADD)
|
|
||||||
.withChange("value", manualRedactionEntry.getValue());
|
|
||||||
} else if (baseAnnotation instanceof ManualLegalBasisChange manualLegalBasisChange) {
|
|
||||||
manualChange.withManualRedactionType(ManualRedactionType.LEGAL_BASIS_CHANGE)
|
|
||||||
.withChange("section", manualLegalBasisChange.getSection())
|
|
||||||
.withChange("value", manualLegalBasisChange.getValue())
|
|
||||||
.withChange("legalBasis", manualLegalBasisChange.getLegalBasis());
|
|
||||||
}
|
|
||||||
manualChange.setProcessedDate(OffsetDateTime.now());
|
|
||||||
return manualChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -47,6 +47,10 @@ public class ManualChangesApplicationService {
|
|||||||
entityToBeReCategorized.getMatchedRuleList().clear();
|
entityToBeReCategorized.getMatchedRuleList().clear();
|
||||||
entityToBeReCategorized.getManualOverwrite().addChange(manualRecategorization);
|
entityToBeReCategorized.getManualOverwrite().addChange(manualRecategorization);
|
||||||
|
|
||||||
|
if (manualRecategorization.getType() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (entityToBeReCategorized instanceof Image image) {
|
if (entityToBeReCategorized instanceof Image image) {
|
||||||
image.setImageType(ImageType.fromString(manualRecategorization.getType()));
|
image.setImageType(ImageType.fromString(manualRecategorization.getType()));
|
||||||
return;
|
return;
|
||||||
@ -90,11 +94,17 @@ public class ManualChangesApplicationService {
|
|||||||
|
|
||||||
if (closestEntity.isPresent()) {
|
if (closestEntity.isPresent()) {
|
||||||
copyValuesFromClosestEntity(entityToBeResized, manualResizeRedaction, closestEntity.get());
|
copyValuesFromClosestEntity(entityToBeResized, manualResizeRedaction, closestEntity.get());
|
||||||
possibleEntities.values().stream().flatMap(Collection::stream).forEach(TextEntity::removeFromGraph);
|
possibleEntities.values()
|
||||||
|
.stream()
|
||||||
|
.flatMap(Collection::stream)
|
||||||
|
.forEach(TextEntity::removeFromGraph);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
possibleEntities.values().stream().flatMap(Collection::stream).forEach(TextEntity::removeFromGraph);
|
possibleEntities.values()
|
||||||
|
.stream()
|
||||||
|
.flatMap(Collection::stream)
|
||||||
|
.forEach(TextEntity::removeFromGraph);
|
||||||
|
|
||||||
if (node.hasParent()) {
|
if (node.hasParent()) {
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
@ -110,14 +120,18 @@ public class ManualChangesApplicationService {
|
|||||||
Set<SemanticNode> currentIntersectingNodes = new HashSet<>(entityToBeResized.getIntersectingNodes());
|
Set<SemanticNode> currentIntersectingNodes = new HashSet<>(entityToBeResized.getIntersectingNodes());
|
||||||
Set<SemanticNode> newIntersectingNodes = new HashSet<>(closestEntity.getIntersectingNodes());
|
Set<SemanticNode> newIntersectingNodes = new HashSet<>(closestEntity.getIntersectingNodes());
|
||||||
|
|
||||||
Sets.difference(currentIntersectingNodes, newIntersectingNodes).forEach(removedNode -> removedNode.getEntities().remove(entityToBeResized));
|
Sets.difference(currentIntersectingNodes, newIntersectingNodes)
|
||||||
Sets.difference(newIntersectingNodes, currentIntersectingNodes).forEach(addedNode -> addedNode.getEntities().add(entityToBeResized));
|
.forEach(removedNode -> removedNode.getEntities().remove(entityToBeResized));
|
||||||
|
Sets.difference(newIntersectingNodes, currentIntersectingNodes)
|
||||||
|
.forEach(addedNode -> addedNode.getEntities().add(entityToBeResized));
|
||||||
|
|
||||||
Set<Page> currentIntersectingPages = new HashSet<>(entityToBeResized.getPages());
|
Set<Page> currentIntersectingPages = new HashSet<>(entityToBeResized.getPages());
|
||||||
Set<Page> newIntersectingPages = new HashSet<>(closestEntity.getPages());
|
Set<Page> newIntersectingPages = new HashSet<>(closestEntity.getPages());
|
||||||
|
|
||||||
Sets.difference(currentIntersectingPages, newIntersectingPages).forEach(removedPage -> removedPage.getEntities().remove(entityToBeResized));
|
Sets.difference(currentIntersectingPages, newIntersectingPages)
|
||||||
Sets.difference(newIntersectingPages, currentIntersectingPages).forEach(addedPage -> addedPage.getEntities().add(entityToBeResized));
|
.forEach(removedPage -> removedPage.getEntities().remove(entityToBeResized));
|
||||||
|
Sets.difference(newIntersectingPages, currentIntersectingPages)
|
||||||
|
.forEach(addedPage -> addedPage.getEntities().add(entityToBeResized));
|
||||||
|
|
||||||
entityToBeResized.setDeepestFullyContainingNode(closestEntity.getDeepestFullyContainingNode());
|
entityToBeResized.setDeepestFullyContainingNode(closestEntity.getDeepestFullyContainingNode());
|
||||||
entityToBeResized.setIntersectingNodes(new ArrayList<>(newIntersectingNodes));
|
entityToBeResized.setIntersectingNodes(new ArrayList<>(newIntersectingNodes));
|
||||||
@ -135,7 +149,10 @@ public class ManualChangesApplicationService {
|
|||||||
if (manualResizeRedaction.getPositions().isEmpty() || manualResizeRedaction.getPositions() == null) {
|
if (manualResizeRedaction.getPositions().isEmpty() || manualResizeRedaction.getPositions() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var bBox = RectangleTransformations.rectangle2DBBox(manualResizeRedaction.getPositions().stream().map(ManualChangesApplicationService::toRectangle2D).toList());
|
var bBox = RectangleTransformations.rectangle2DBBox(manualResizeRedaction.getPositions()
|
||||||
|
.stream()
|
||||||
|
.map(ManualChangesApplicationService::toRectangle2D)
|
||||||
|
.toList());
|
||||||
image.setPosition(bBox);
|
image.setPosition(bBox);
|
||||||
image.getManualOverwrite().addChange(manualResizeRedaction);
|
image.getManualOverwrite().addChange(manualResizeRedaction);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,8 +30,7 @@ public class KieContainerCreationService {
|
|||||||
private final RulesClient rulesClient;
|
private final RulesClient rulesClient;
|
||||||
|
|
||||||
|
|
||||||
@Observed(name = "KieContainerCreationService",
|
@Observed(name = "KieContainerCreationService", contextualName = "get-kie-container")
|
||||||
contextualName = "get-kie-container")
|
|
||||||
public KieWrapper getLatestKieContainer(String dossierTemplateId, RuleFileType ruleFileType) {
|
public KieWrapper getLatestKieContainer(String dossierTemplateId, RuleFileType ruleFileType) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -65,7 +64,6 @@ public class KieContainerCreationService {
|
|||||||
try {
|
try {
|
||||||
return kieServices.newKieContainer(getReleaseId(dossierTemplateId, version, ruleFileType));
|
return kieServices.newKieContainer(getReleaseId(dossierTemplateId, version, ruleFileType));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
registerNewKieContainerVersion(dossierTemplateId, version, ruleFileType);
|
registerNewKieContainerVersion(dossierTemplateId, version, ruleFileType);
|
||||||
return kieServices.newKieContainer(getReleaseId(dossierTemplateId, version, ruleFileType));
|
return kieServices.newKieContainer(getReleaseId(dossierTemplateId, version, ruleFileType));
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user