DM-285: fix string NPE
This commit is contained in:
parent
636066e8e7
commit
39b754e5b1
@ -35,7 +35,7 @@ public interface IEntity {
|
|||||||
|
|
||||||
default String value() {
|
default String value() {
|
||||||
|
|
||||||
return getManualOverwrite().getValue().orElse(getValue());
|
return getManualOverwrite().getValue().orElse(getValue() == null ? "" : getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ public class DictionarySearchService {
|
|||||||
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService);
|
EntityCreationService entityCreationService = new EntityCreationService(entityEnrichmentService);
|
||||||
searchImplementation.getBoundaries(node.getTextBlock(), node.getTextRange())
|
searchImplementation.getBoundaries(node.getTextBlock(), node.getTextRange())
|
||||||
.stream().filter(boundary -> entityCreationService.isValidEntityTextRange(node.getTextBlock(), boundary))
|
.stream().filter(boundary -> entityCreationService.isValidEntityTextRange(node.getTextBlock(), boundary))
|
||||||
.map(bounds -> entityCreationService.forceByBoundary(bounds, type, entityType, node))
|
.map(bounds -> entityCreationService.forceByTextRange(bounds, type, entityType, node))
|
||||||
.peek(entity -> entity.setDictionaryEntry(true))
|
.peek(entity -> entity.setDictionaryEntry(true))
|
||||||
.peek(entity -> entity.setDossierDictionaryEntry(isDossierDictionaryEntry))
|
.peek(entity -> entity.setDossierDictionaryEntry(isDossierDictionaryEntry))
|
||||||
.forEach(entity -> entity.addEngine(Engine.DICTIONARY));
|
.forEach(entity -> entity.addEngine(Engine.DICTIONARY));
|
||||||
|
|||||||
@ -118,8 +118,7 @@ public class EntityLogCreatorService {
|
|||||||
.id(manualEntity.getId())
|
.id(manualEntity.getId())
|
||||||
.color(getColor(type, dossierTemplateId, manualEntity.applied()))
|
.color(getColor(type, dossierTemplateId, manualEntity.applied()))
|
||||||
.reason(manualEntity.buildReasonWithManualChangeDescriptions())
|
.reason(manualEntity.buildReasonWithManualChangeDescriptions())
|
||||||
.legalBasis(manualEntity.legalBasis())
|
.legalBasis(manualEntity.legalBasis()).value(manualEntity.value())
|
||||||
.value(manualEntity.getManualOverwrite().getValue().orElse(manualEntity.getValue()))
|
|
||||||
.type(type)
|
.type(type)
|
||||||
.state(buildEntryState(manualEntity))
|
.state(buildEntryState(manualEntity))
|
||||||
.entryType(buildEntryType(manualEntity, isHint))
|
.entryType(buildEntryType(manualEntity, isHint))
|
||||||
@ -145,7 +144,7 @@ public class EntityLogCreatorService {
|
|||||||
String imageType = image.getImageType().equals(ImageType.OTHER) ? "image" : image.getImageType().toString().toLowerCase(Locale.ENGLISH);
|
String imageType = image.getImageType().equals(ImageType.OTHER) ? "image" : image.getImageType().toString().toLowerCase(Locale.ENGLISH);
|
||||||
boolean isHint = dictionaryService.isHint(imageType, dossierTemplateId);
|
boolean isHint = dictionaryService.isHint(imageType, dossierTemplateId);
|
||||||
return EntityLogEntry.builder()
|
return EntityLogEntry.builder()
|
||||||
.id(image.getId())
|
.id(image.getId()).value(image.value())
|
||||||
.color(getColor(imageType, dossierTemplateId, image.applied()))
|
.color(getColor(imageType, dossierTemplateId, image.applied()))
|
||||||
.type(imageType)
|
.type(imageType)
|
||||||
.reason(image.buildReasonWithManualChangeDescriptions())
|
.reason(image.buildReasonWithManualChangeDescriptions())
|
||||||
|
|||||||
@ -529,7 +529,7 @@ public class EntityCreationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public TextEntity forceByBoundary(TextRange textRange, String type, EntityType entityType, SemanticNode node) {
|
public TextEntity forceByTextRange(TextRange textRange, String type, EntityType entityType, SemanticNode node) {
|
||||||
|
|
||||||
TextRange trimmedTextRange = textRange.trim(node.getTextBlock());
|
TextRange trimmedTextRange = textRange.trim(node.getTextBlock());
|
||||||
TextEntity entity = TextEntity.initialEntityNode(trimmedTextRange, type, entityType);
|
TextEntity entity = TextEntity.initialEntityNode(trimmedTextRange, type, entityType);
|
||||||
@ -598,7 +598,7 @@ public class EntityCreationService {
|
|||||||
|
|
||||||
public TextEntity byNerEntity(NerEntities.NerEntity nerEntity, EntityType entityType, SemanticNode semanticNode) {
|
public TextEntity byNerEntity(NerEntities.NerEntity nerEntity, EntityType entityType, SemanticNode semanticNode) {
|
||||||
|
|
||||||
var entity = forceByBoundary(nerEntity.textRange(), nerEntity.type(), entityType, semanticNode);
|
var entity = forceByTextRange(nerEntity.textRange(), nerEntity.type(), entityType, semanticNode);
|
||||||
entity.addEngine(Engine.NER);
|
entity.addEngine(Engine.NER);
|
||||||
insertToKieSession(entity);
|
insertToKieSession(entity);
|
||||||
return entity;
|
return entity;
|
||||||
@ -607,7 +607,7 @@ public class EntityCreationService {
|
|||||||
|
|
||||||
public TextEntity byNerEntity(NerEntities.NerEntity nerEntity, String type, EntityType entityType, SemanticNode semanticNode) {
|
public TextEntity byNerEntity(NerEntities.NerEntity nerEntity, String type, EntityType entityType, SemanticNode semanticNode) {
|
||||||
|
|
||||||
var entity = forceByBoundary(nerEntity.textRange(), type, entityType, semanticNode);
|
var entity = forceByTextRange(nerEntity.textRange(), type, entityType, semanticNode);
|
||||||
entity.addEngine(Engine.NER);
|
entity.addEngine(Engine.NER);
|
||||||
insertToKieSession(entity);
|
insertToKieSession(entity);
|
||||||
return entity;
|
return entity;
|
||||||
@ -616,8 +616,7 @@ public class EntityCreationService {
|
|||||||
|
|
||||||
public Stream<TextEntity> combineNerEntitiesToCbiAddressDefaults(NerEntities nerEntities, String type, EntityType entityType, SemanticNode semanticNode) {
|
public Stream<TextEntity> combineNerEntitiesToCbiAddressDefaults(NerEntities nerEntities, String type, EntityType entityType, SemanticNode semanticNode) {
|
||||||
|
|
||||||
return NerEntitiesAdapter.combineNerEntitiesToCbiAddressDefaults(nerEntities)
|
return NerEntitiesAdapter.combineNerEntitiesToCbiAddressDefaults(nerEntities).map(boundary -> forceByTextRange(boundary, type, entityType, semanticNode))
|
||||||
.map(boundary -> forceByBoundary(boundary, type, entityType, semanticNode))
|
|
||||||
.peek(entity -> entity.addEngine(Engine.NER))
|
.peek(entity -> entity.addEngine(Engine.NER))
|
||||||
.peek(this::insertToKieSession);
|
.peek(this::insertToKieSession);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -95,7 +95,7 @@ public class ManualEntityCreationService {
|
|||||||
*/
|
*/
|
||||||
private void createCorrectEntity(ManualEntity manualEntity, SemanticNode node, TextRange closestTextRange) {
|
private void createCorrectEntity(ManualEntity manualEntity, SemanticNode node, TextRange closestTextRange) {
|
||||||
|
|
||||||
TextEntity correctEntity = entityCreationService.forceByBoundary(closestTextRange, manualEntity.getType(), manualEntity.getEntityType(), node);
|
TextEntity correctEntity = entityCreationService.forceByTextRange(closestTextRange, manualEntity.getType(), manualEntity.getEntityType(), node);
|
||||||
|
|
||||||
if (manualEntity.isApplied()) {
|
if (manualEntity.isApplied()) {
|
||||||
correctEntity.apply(manualEntity.getRuleIdentifier(), manualEntity.getReason(), manualEntity.getLegalBasis());
|
correctEntity.apply(manualEntity.getRuleIdentifier(), manualEntity.getReason(), manualEntity.getLegalBasis());
|
||||||
@ -166,8 +166,7 @@ public class ManualEntityCreationService {
|
|||||||
SearchImplementation searchImplementation = new SearchImplementation(entryValues, true);
|
SearchImplementation searchImplementation = new SearchImplementation(entryValues, true);
|
||||||
|
|
||||||
return searchImplementation.getBoundaries(node.getTextBlock(), node.getTextRange())
|
return searchImplementation.getBoundaries(node.getTextBlock(), node.getTextRange())
|
||||||
.stream()
|
.stream().map(boundary -> entityCreationService.forceByTextRange(boundary, "temp", EntityType.ENTITY, node))
|
||||||
.map(boundary -> entityCreationService.forceByBoundary(boundary, "temp", EntityType.ENTITY, node))
|
|
||||||
.collect(groupingBy(entity -> entity.getValue().toLowerCase(Locale.ROOT)));
|
.collect(groupingBy(entity -> entity.getValue().toLowerCase(Locale.ROOT)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -104,7 +104,7 @@ public class DocumineFloraTest extends AbstractRedactionIntegrationTest {
|
|||||||
// Fix In BodyTextFrameService destroys header detection in files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf
|
// Fix In BodyTextFrameService destroys header detection in files/new/SYNGENTA_EFSA_sanitisation_GFL_v1_moreSections.pdf
|
||||||
// TODO unify logic
|
// TODO unify logic
|
||||||
|
|
||||||
AnalyzeRequest request = uploadFileToStorage("files/Documine/Flora/ProblemDocs/SOLICITA_VICTRATO-GOLD-II_Item 15_Toxicidade Oral Aguda.pdf");
|
AnalyzeRequest request = uploadFileToStorage("files/Documine/Flora/402Study.pdf");
|
||||||
|
|
||||||
System.out.println("Start Full integration test");
|
System.out.println("Start Full integration test");
|
||||||
analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request);
|
analyzeDocumentStructure(LayoutParsingType.DOCUMINE, request);
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.mockito.ArgumentMatchers.anyLong;
|
import static org.mockito.ArgumentMatchers.anyLong;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.Mockito.doThrow;
|
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -68,7 +67,6 @@ import com.iqser.red.service.redaction.v1.server.model.document.nodes.Section;
|
|||||||
import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils;
|
import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.DocumentGraphMapper;
|
import com.iqser.red.service.redaction.v1.server.service.document.DocumentGraphMapper;
|
||||||
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
import com.iqser.red.service.redaction.v1.server.storage.RedactionStorageService;
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.ExceptionProvider;
|
|
||||||
import com.iqser.red.storage.commons.StorageAutoConfiguration;
|
import com.iqser.red.storage.commons.StorageAutoConfiguration;
|
||||||
import com.iqser.red.storage.commons.service.StorageService;
|
import com.iqser.red.storage.commons.service.StorageService;
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
||||||
@ -215,7 +213,7 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest {
|
|||||||
@Test
|
@Test
|
||||||
public void titleExtraction() throws IOException {
|
public void titleExtraction() throws IOException {
|
||||||
|
|
||||||
AnalyzeRequest request = uploadFileToStorage("files/Metolachlor/S-Metolachlor_RAR_01_Volume_1_2018-09-06.pdf");
|
AnalyzeRequest request = uploadFileToStorage("files/new/crafted document.pdf");
|
||||||
System.out.println("Start Full integration test");
|
System.out.println("Start Full integration test");
|
||||||
analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request);
|
analyzeDocumentStructure(LayoutParsingType.REDACT_MANAGER, request);
|
||||||
System.out.println("Finished structure analysis");
|
System.out.println("Finished structure analysis");
|
||||||
@ -591,6 +589,11 @@ public class RedactionIntegrationTest extends AbstractRedactionIntegrationTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testRedactionLogAndEntityLogEquality() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRemovePublishedInformations() throws IOException {
|
public void testRemovePublishedInformations() throws IOException {
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package com.iqser.red.service.redaction.v1.server.manualchanges;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.mockito.Mockito.doThrow;
|
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.wildfly.common.Assert.assertTrue;
|
import static org.wildfly.common.Assert.assertTrue;
|
||||||
|
|
||||||
@ -16,6 +15,9 @@ import java.util.Comparator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -41,8 +43,8 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations
|
|||||||
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.IdRemoval;
|
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.ManualForceRedaction;
|
||||||
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.ManualLegalBasisChange;
|
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.ManualRedactionEntry;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive;
|
||||||
@ -55,14 +57,13 @@ import com.iqser.red.service.redaction.v1.server.Application;
|
|||||||
import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService;
|
import com.iqser.red.service.redaction.v1.server.FileSystemBackedStorageService;
|
||||||
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest;
|
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateRequest;
|
||||||
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse;
|
import com.iqser.red.service.redaction.v1.server.annotate.AnnotateResponse;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.DocumentGraphMapper;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.EntityType;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
import com.iqser.red.service.redaction.v1.server.model.document.entity.TextEntity;
|
||||||
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document;
|
import com.iqser.red.service.redaction.v1.server.model.document.nodes.Document;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils;
|
||||||
|
import com.iqser.red.service.redaction.v1.server.service.document.DocumentGraphMapper;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityCreationService;
|
||||||
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
import com.iqser.red.service.redaction.v1.server.service.document.EntityEnrichmentService;
|
||||||
import com.iqser.red.service.redaction.v1.server.redaction.utils.OsUtils;
|
|
||||||
import com.iqser.red.service.redaction.v1.server.utils.ExceptionProvider;
|
|
||||||
import com.iqser.red.storage.commons.StorageAutoConfiguration;
|
import com.iqser.red.storage.commons.StorageAutoConfiguration;
|
||||||
import com.iqser.red.storage.commons.service.StorageService;
|
import com.iqser.red.storage.commons.service.StorageService;
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
import com.knecon.fforesight.service.layoutparser.internal.api.queue.LayoutParsingType;
|
||||||
@ -114,7 +115,6 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
when(rulesClient.getRules(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.ENTITY)).thenReturn(JSONPrimitive.of(RULES));
|
when(rulesClient.getRules(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.ENTITY)).thenReturn(JSONPrimitive.of(RULES));
|
||||||
when(rulesClient.getVersion(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.COMPONENT)).thenReturn(-1L);
|
when(rulesClient.getVersion(TEST_DOSSIER_TEMPLATE_ID, RuleFileType.COMPONENT)).thenReturn(-1L);
|
||||||
|
|
||||||
|
|
||||||
loadDictionaryForTest();
|
loadDictionaryForTest();
|
||||||
loadTypeForTest();
|
loadTypeForTest();
|
||||||
loadNerForTest();
|
loadNerForTest();
|
||||||
@ -296,6 +296,18 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
.findFirst()
|
.findFirst()
|
||||||
.get();
|
.get();
|
||||||
|
|
||||||
|
var mouses = redactionLog.getRedactionLogEntry().stream().filter(entry -> entry.getType().equals("vertebrate")).filter(entry -> entry.getValue().equals("Mouse")).toList();
|
||||||
|
|
||||||
|
var recategorizations = mouses.stream()
|
||||||
|
.map(mouse -> ManualRecategorization.builder()
|
||||||
|
.requestDate(OffsetDateTime.now())
|
||||||
|
.status(AnnotationStatus.APPROVED)
|
||||||
|
.type("published_information")
|
||||||
|
.annotationId(mouse.getId())
|
||||||
|
.fileId(TEST_FILE_ID)
|
||||||
|
.build())
|
||||||
|
.toList();
|
||||||
|
|
||||||
assertEquals("CBI.3.2", asyaLyon.getMatchedRule());
|
assertEquals("CBI.3.2", asyaLyon.getMatchedRule());
|
||||||
assertEquals("No vertebrate found", asyaLyon.getReason());
|
assertEquals("No vertebrate found", asyaLyon.getReason());
|
||||||
|
|
||||||
@ -308,7 +320,8 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
request.setManualRedactions(new ManualRedactions());
|
request.setManualRedactions(new ManualRedactions());
|
||||||
request.getManualRedactions().setRecategorizations(Set.of(recategorization));
|
request.getManualRedactions()
|
||||||
|
.setRecategorizations(Stream.of(Stream.of(recategorization), recategorizations.stream()).flatMap(Function.identity()).collect(Collectors.toSet()));
|
||||||
|
|
||||||
analyzeService.reanalyze(request);
|
analyzeService.reanalyze(request);
|
||||||
RedactionLog redactionLog2 = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID);
|
RedactionLog redactionLog2 = redactionStorageService.getRedactionLog(TEST_DOSSIER_ID, TEST_FILE_ID);
|
||||||
@ -324,6 +337,10 @@ public class ManualChangesEnd2EndTest extends AbstractRedactionIntegrationTest {
|
|||||||
.findFirst()
|
.findFirst()
|
||||||
.get();
|
.get();
|
||||||
|
|
||||||
|
for (RedactionLogEntry mouse : mouses) {
|
||||||
|
assertEquals("published_information", redactionLog2.getRedactionLogEntry().stream().filter(entry -> entry.getId().equals(mouse.getId())).findFirst().get().getType());
|
||||||
|
}
|
||||||
|
|
||||||
assertEquals(1, oxfordUniversityPressRecategorized.getManualChanges().size());
|
assertEquals(1, oxfordUniversityPressRecategorized.getManualChanges().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user