From ee883c2d5a45445b94768d5ceb34b9023dde7d2c Mon Sep 17 00:00:00 2001 From: nomikosi <42890529+nomikosi@users.noreply.github.com> Date: Wed, 1 Jul 2020 16:15:42 +0300 Subject: [PATCH 01/17] [UNIONVMS-4660] Activating rules for movement messages and adding creationDate rules --- LIQUIBASE/changelog/db-changelog-master.xml | 2 +- .../v3.4/db-changelog-UNIONVMS-4660.xml | 103 ++++++++++++++++++ .../src/main/resources/contract/Template.xsd | 2 + .../rules/service/bean/ContainerType.java | 5 +- .../rules/service/bean/RulesEngineBean.java | 37 ++++++- .../bean/RulesKieContainerInitializer.java | 18 +++ .../movement/MovementsRulesValidator.java | 5 +- .../fact/MovementReportDocumentFact.java | 31 ++++++ .../generator/MovementFactGenerator.java | 72 ++++++++++++ .../business/helper/DrtPathHelper.java | 1 + .../service/config/BusinessObjectType.java | 3 +- .../service/constants/XPathConstants.java | 1 + .../MovementReportDocumentFactMapper.java | 102 +++++++++++++++++ .../templates/MovementReportDocument.drt | 34 ++++++ .../generator/MovementFactGeneratorTest.java | 29 +++++ .../MovementReportDocumentFactMapperTest.java | 50 +++++++++ 16 files changed, 487 insertions(+), 8 deletions(-) create mode 100644 LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java create mode 100644 service/src/main/resources/templates/MovementReportDocument.drt create mode 100644 service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGeneratorTest.java create mode 100644 service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapperTest.java diff --git a/LIQUIBASE/changelog/db-changelog-master.xml b/LIQUIBASE/changelog/db-changelog-master.xml index 9374cabc2..8a3a3fd31 100644 --- a/LIQUIBASE/changelog/db-changelog-master.xml +++ b/LIQUIBASE/changelog/db-changelog-master.xml @@ -96,5 +96,5 @@ + - diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml new file mode 100644 index 000000000..7a8724037 --- /dev/null +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + template_id = 2000 + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20001 + + + br_id = 'MO-R01-00-0001' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20002 + + + br_id = 'MO-R01-00-0002' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20003 + + + br_id = 'MO-R01-00-0003' + + + + diff --git a/model/src/main/resources/contract/Template.xsd b/model/src/main/resources/contract/Template.xsd index 61604e8d6..e99548f72 100755 --- a/model/src/main/resources/contract/Template.xsd +++ b/model/src/main/resources/contract/Template.xsd @@ -86,6 +86,8 @@ + + \ No newline at end of file diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java index 38b2da827..84fa3c640 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java @@ -45,7 +45,10 @@ public enum ContainerType { FactType.SALES_FISHING_TRIP, FactType.SALES_FLUX_LOCATION, FactType.SALES_FLUX_GEOGRAPHICAL_COORDINATE, FactType.SALES_STRUCTURED_ADDRESS, FactType.SALES_QUERY, FactType.SALES_FLUX_RESPONSE_DOCUMENT, FactType.SALES_VALIDATION_RESULT_DOCUMENT, FactType.SALES_VALIDATION_QUALITY_ANALYSIS,FactType.SALES_REPORT_WRAPPER, - FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE); + FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE), + + MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT + ); private final String packageName; private final String containerName; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesEngineBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesEngineBean.java index ea9d3ba8a..1470c24e4 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesEngineBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesEngineBean.java @@ -17,7 +17,14 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import eu.europa.ec.fisheries.uvms.rules.service.business.MessageType; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.IdType; -import eu.europa.ec.fisheries.uvms.rules.service.business.generator.*; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.AbstractGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.ActivityFaReportFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.ActivityQueryFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.ActivityResponseFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.MovementFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.SalesQueryFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.SalesReportFactGenerator; +import eu.europa.ec.fisheries.uvms.rules.service.business.generator.SalesResponseFactGenerator; import eu.europa.ec.fisheries.uvms.rules.service.business.helper.RuleApplicabilityChecker; import eu.europa.ec.fisheries.uvms.rules.service.config.BusinessObjectType; import eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType; @@ -36,12 +43,19 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import static eu.europa.ec.fisheries.uvms.rules.service.business.MessageType.PULL; import static eu.europa.ec.fisheries.uvms.rules.service.business.MessageType.PUSH; -import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.*; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.RESPONSE_IDS; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.SENDER_RECEIVER; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.XML; @Stateless @Slf4j @@ -67,6 +81,7 @@ public class RulesEngineBean { private SalesResponseFactGenerator salesResponseFactGenerator; + private FaResponseFactMapper faResponseFactMapper; @EJB @@ -181,6 +196,22 @@ public Collection evaluate(BusinessObjectType businessObjectType, return validateFacts(facts, initializer.getContainerByType(ContainerType.SALES), globals, extraValues); } + else if (businessObjectType == BusinessObjectType.RECEIVING_MOVEMENT_MSG){ + StopWatch stopWatch = StopWatch.createStarted(); + AbstractGenerator generator = new MovementFactGenerator(PUSH); + generator.setBusinessObjectMessage(businessObject); + generator.setExtraValueMap(extraValues); + + List facts = generator.generateAllFacts(); + log.info("Flow Report, Generating the facts took: {} ms", stopWatch.getTime()); + stopWatch.reset(); + stopWatch.start(); + + Map globals = new HashMap<>(); + globals.put("mdrService", mdrCacheRuleService); + globals.put("appliChecker", appliChecker); + return validateFacts(facts, initializer.getContainerByType(ContainerType.MOVEMENTS), globals, extraValues); + } log.info(String.format("It took %s to evaluate the message.", stopwatch)); log.debug(String.format("%s fact instances holding in memory.", AbstractFact.getNumOfInstances())); diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesKieContainerInitializer.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesKieContainerInitializer.java index 5dae11646..eef73df83 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesKieContainerInitializer.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulesKieContainerInitializer.java @@ -60,6 +60,7 @@ public void init() { List faTemplatesAndRules = getFaMessageRules(allTemplates); List salesTemplatesAndRules = getSalesRules(allTemplates); List faQueryTemplatesAndRules = getFaQueryRules(allTemplates); + List movementTemplatesAndRules = getMovementRules(allTemplates); log.info("Initializing templates and rules for FA-Report facts. Nr. of Rules : {}", countRuleExpressions(faTemplatesAndRules)); KieContainer faReportContainer = createContainer(faTemplatesAndRules); @@ -73,11 +74,16 @@ public void init() { log.info("Initializing templates and rules for Sales facts. Nr. of Rules : {}", countRuleExpressions(salesTemplatesAndRules)); KieContainer salesContainer = createContainer(salesTemplatesAndRules); + log.info("Initializing templates and rules for Movement facts. Nr. of Rules : {}", countRuleExpressions(movementTemplatesAndRules)); + KieContainer movementContainer = createContainer(movementTemplatesAndRules); + + containers = new EnumMap<>(ContainerType.class); containers.put(ContainerType.FA_REPORT, faReportContainer); containers.put(ContainerType.FA_RESPONSE, faRespContainer); containers.put(ContainerType.FA_QUERY, faQueryContainer); containers.put(ContainerType.SALES, salesContainer); + containers.put(ContainerType.MOVEMENTS, movementContainer); // To make sure that we have deployed all the templates! if (!allTemplates.isEmpty()) { @@ -214,6 +220,18 @@ private List getFaQueryRules(List allTem return faQueryTemplates; } + private List getMovementRules(List allTemplates) { + List movementTemplates = new ArrayList<>(); + List factTypesList = ContainerType.MOVEMENTS.getFactTypesList(); + for (TemplateRuleMapDto actualTemplate : allTemplates) { + if (factTypesList.contains(actualTemplate.getTemplateType().getType())) { + movementTemplates.add(actualTemplate); + } + } + allTemplates.removeAll(movementTemplates); + return movementTemplates; + } + public KieContainer getContainerByType(ContainerType containerType) { return containers.get(containerType); } diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/MovementsRulesValidator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/MovementsRulesValidator.java index ea19f6ec3..9b1d45089 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/MovementsRulesValidator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/MovementsRulesValidator.java @@ -23,6 +23,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.business.CustomRuleDto; import eu.europa.ec.fisheries.uvms.rules.service.business.MovementFact; import eu.europa.ec.fisheries.uvms.rules.service.business.RawMovementFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; import eu.europa.ec.fisheries.uvms.rules.service.exception.RulesServiceException; import eu.europa.ec.fisheries.uvms.rules.service.mapper.CustomRuleParser; import org.drools.template.parser.DefaultTemplateContainer; @@ -172,7 +173,7 @@ public void evaluate(MovementFact fact) { } @Lock(LockType.READ) - public void evaluate(List factList, boolean justToAvoidErasure) { + public void evaluate(List factList) { log.info("Verifying user defined rules"); KieSession ksession = getKieSession(); // TODO : decomment as soon as the "Unexpected global [validationService]" is resolved @@ -186,7 +187,7 @@ public void evaluate(List factList, boolean justToAvoidErasure) { @Lock(LockType.READ) - public void evaluate(List facts) { + public void evaluateRawList(List facts) { KieSession ksession = getKieSession(); ksession.setGlobal(LOGGER_STR, log); for (RawMovementFact fact : facts) { diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java new file mode 100644 index 000000000..4c4d8fab9 --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -0,0 +1,31 @@ +/* +Developed by the European Commission - Directorate General for Maritime Affairs and Fisheries @ European Union, 2015-2016. + +This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The IFDM Suite is free software: you can redistribute it +and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of +the License, or any later version. The IFDM Suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. You should have received a copy of the GNU General Public License along with the IFDM Suite. If not, see . + +*/ + +package eu.europa.ec.fisheries.uvms.rules.service.business.fact; + +import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import lombok.Data; + +import java.util.Date; + +@Data +public class MovementReportDocumentFact extends AbstractFact { + + private boolean ok = true; + private Date creationDateTime; + private String creationDateTimeString; + + @Override + public void setFactType() { + this.factType = FactType.MOVEMENT_REPORT_DOCUMENT; + } +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java new file mode 100644 index 000000000..80d22f9d6 --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -0,0 +1,72 @@ +/* +Developed by the European Commission - Directorate General for Maritime Affairs and Fisheries @ European Union, 2015-2016. + +This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The IFDM Suite is free software: you can redistribute it +and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of +the License, or any later version. The IFDM Suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. You should have received a copy of the GNU General Public License along with the IFDM Suite. If not, see . + +*/ + +package eu.europa.ec.fisheries.uvms.rules.service.business.generator; + +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.MessageType; +import eu.europa.ec.fisheries.uvms.rules.service.exception.RulesValidationException; +import eu.europa.ec.fisheries.uvms.rules.service.mapper.fact.MovementReportDocumentFactMapper; +import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; +import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXReportDocumentType; + +import java.util.ArrayList; +import java.util.List; + +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.DATA_FLOW; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; + +public class MovementFactGenerator extends AbstractGenerator { + + private MovementReportDocumentFactMapper movementReportDocumentFactMapper; + private XPathStringWrapper xPathUtil; + private FLUXVesselPositionMessage vesselPositionMessage; + + public MovementFactGenerator(MessageType messageType) { + super(messageType); + xPathUtil = new XPathStringWrapper(); + movementReportDocumentFactMapper = new MovementReportDocumentFactMapper(xPathUtil); + } + + public MovementFactGenerator(MessageType messageType,XPathStringWrapper xPathUtil, MovementReportDocumentFactMapper movementReportDocumentFactMapper) { + super(messageType); + this.xPathUtil = xPathUtil; + this.movementReportDocumentFactMapper = movementReportDocumentFactMapper; + } + + public MovementFactGenerator() { + super(MessageType.PUSH); + } + + @Override + public List generateAllFacts() { + List facts = new ArrayList<>(); + FLUXReportDocumentType fluxReportDocument = vesselPositionMessage.getFLUXReportDocument(); + + if (fluxReportDocument != null) { + facts.add(movementReportDocumentFactMapper.generateFactForMovementReportDocument(vesselPositionMessage)); + } + + String df = (String) extraValueMap.get(DATA_FLOW); + facts.forEach(fact -> fact.setMessageDataFlow(df)); + return facts; + } + + @Override + public void setBusinessObjectMessage(Object businessObject) throws RulesValidationException { + + if (!(businessObject instanceof FLUXVesselPositionMessage)) { + throw new RulesValidationException("Business object does not match required type"); + } + this.vesselPositionMessage = (FLUXVesselPositionMessage) businessObject; + } +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java index 4c9697add..b8da4fea9 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java @@ -34,6 +34,7 @@ public enum DrtPathHelper { FISHING_ACTIVITY("/templates/FishingActivity.drt"), FA_QUERY("/templates/FaQuery.drt"), FA_QUERY_PARAMETER("/templates/FaQueryParameter.drt"), + MOVEMENT_REPORT_DOCUMENT("/templates/MovementReportDocument.drt"), FA_RELOCATION("/templates/FaRelocation.drt"), FA_RESPONSE("/templates/FaResponse.drt"), FA_TRANSHIPMENT("/templates/FaTranshipment.drt"), diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/config/BusinessObjectType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/config/BusinessObjectType.java index 3aba6f994..e87807e7f 100755 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/config/BusinessObjectType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/config/BusinessObjectType.java @@ -26,5 +26,6 @@ public enum BusinessObjectType { RECEIVING_FA_RESPONSE_MSG, FLUX_SALES_REPORT_MSG, FLUX_SALES_RESPONSE_MSG, - FLUX_SALES_QUERY_MSG + FLUX_SALES_QUERY_MSG, + RECEIVING_MOVEMENT_MSG } diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java index e614b8c36..c7f972fb1 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java @@ -21,6 +21,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The public class XPathConstants { public static final String FLUXFA_REPORT_MESSAGE = "FLUXFAReportMessage"; + public static final String MOVEMENT_REPORT_DOCUMENT = "FLUXVesselPositionMessage"; public static final String FLUXFA_QUERY_MESSAGE = "FLUXFAQueryMessage"; public static final String FA_REPORT_DOCUMENT = "FAReportDocument"; public static final String SPECIFIED_FISHING_ACTIVITY = "SpecifiedFishingActivity"; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java new file mode 100644 index 000000000..e42e8987b --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -0,0 +1,102 @@ +/* +Developed by the European Commission - Directorate General for Maritime Affairs and Fisheries @ European Union, 2015-2016. + +This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The IFDM Suite is free software: you can redistribute it +and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of +the License, or any later version. The IFDM Suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. You should have received a copy of the GNU General Public License along with the IFDM Suite. If not, see . + +*/ + +package eu.europa.ec.fisheries.uvms.rules.service.mapper.fact; + +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; +import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; +import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; +import lombok.extern.slf4j.Slf4j; +import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.DateTimeType; + +import java.util.Date; + +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; + +@Slf4j +public class MovementReportDocumentFactMapper { + + private XPathStringWrapper xPathUtil; + + public MovementReportDocumentFactMapper() { + xPathUtil = new XPathStringWrapper(); + } + public MovementReportDocumentFactMapper(XPathStringWrapper strUtil1) { + this.xPathUtil = strUtil1; + } + + public AbstractFact generateFactForMovementReportDocument(FLUXVesselPositionMessage vesselPositionMessage){ + + if(vesselPositionMessage == null){ + return null; + } + + MovementReportDocumentFact fact = new MovementReportDocumentFact(); + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).getValue(); + + DateTimeType creationDateTime = vesselPositionMessage.getFLUXReportDocument().getCreationDateTime(); + fact.setCreationDateTimeString(dateTimeAsString(creationDateTime)); + fact.setCreationDateTime(getDate(creationDateTime)); + xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, XPathConstants.CREATION_DATE_TIME).storeInRepo(fact, CREATION_DATE_TIME); + + return fact; + } + + public static MovementReportDocumentFact mapToMovementReportDocumentFact(FLUXVesselPositionMessage vesselPositionMessage){ + + if(vesselPositionMessage == null || vesselPositionMessage.getFLUXReportDocument() == null){ + throw new IllegalArgumentException("FLUXVesselPositionMessage and FLUXReportDocument cannot be null"); + } + + MovementReportDocumentFact fact = new MovementReportDocumentFact(); + DateTimeType creationDateTime = vesselPositionMessage.getFLUXReportDocument().getCreationDateTime(); + fact.setCreationDateTime(getDate(creationDateTime)); + fact.setCreationDateTimeString(dateTimeAsString(creationDateTime)); + return fact; + } + + private static String dateTimeAsString(DateTimeType dateTimeType) { + String dateAsString = null; + + if (dateTimeType != null) { + try { + if (dateTimeType.getDateTime() != null) { + dateAsString = dateTimeType.getDateTime().toString(); + } + } catch (Exception e) { + log.debug("Error while trying to parse dateTimeType", e); + } + } + return dateAsString; + } + + private static Date getDate(DateTimeType dateTimeType) { + Date date = null; + if (dateTimeType != null) { + try { + if (dateTimeType.getDateTime() != null) { + date = dateTimeType.getDateTime().toGregorianCalendar().getTime(); + } + } catch (Exception e) { + log.debug("Error while trying to parse dateTimeType", e); + } + } + + return date; + } + + + +} diff --git a/service/src/main/resources/templates/MovementReportDocument.drt b/service/src/main/resources/templates/MovementReportDocument.drt new file mode 100644 index 000000000..fe104b816 --- /dev/null +++ b/service/src/main/resources/templates/MovementReportDocument.drt @@ -0,0 +1,34 @@ +template header + +tname +expression +brid +rulemsg +type +level +propertyNames +context + +package eu.europa.ec.fisheries.uvms.rules.service.business.activity; + +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; +import java.util.Arrays; +global eu.europa.ec.fisheries.uvms.rules.service.business.helper.RuleApplicabilityChecker appliChecker; +global eu.europa.ec.fisheries.uvms.rules.service.MDRCacheRuleService mdrService; + + +template "@{tname}" + +rule "Movement Report Document @{tname} - @{brid} - Context : @{context}" + +when + + $fact : MovementReportDocumentFact((appliChecker.isApplicable("@{brid}", "@{context}", getMessageDataFlow(), getCreationDateOfMessage(), mdrService)) && (@{expression})) + +then + $fact.setOk(false); + $fact.addWarningOrError(mdrService.getErrorTypeStrForForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), mdrService.getErrorMessageForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), "@{brid}", "@{level}", "@{propertyNames}"); + +end + +end template \ No newline at end of file diff --git a/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGeneratorTest.java b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGeneratorTest.java new file mode 100644 index 000000000..e9848a9de --- /dev/null +++ b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGeneratorTest.java @@ -0,0 +1,29 @@ +package eu.europa.ec.fisheries.uvms.rules.service.business.generator; + +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import eu.europa.ec.fisheries.uvms.rules.service.config.BusinessObjectType; +import eu.europa.ec.fisheries.uvms.rules.service.exception.RulesValidationException; +import org.junit.Test; +import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXReportDocumentType; + +import java.util.HashMap; +import java.util.List; + +import static eu.europa.ec.fisheries.uvms.rules.service.business.MessageType.PUSH; +import static org.junit.Assert.*; + +public class MovementFactGeneratorTest { + + @Test + public void testGenerateAllFacts() throws RulesValidationException { + + MovementFactGenerator generator = new MovementFactGenerator(PUSH); + FLUXVesselPositionMessage vesselPositionMessage = new FLUXVesselPositionMessage(); + vesselPositionMessage.setFLUXReportDocument(new FLUXReportDocumentType()); + generator.setBusinessObjectMessage(vesselPositionMessage); + generator.setExtraValueMap(new HashMap<>()); + List abstractFacts = generator.generateAllFacts(); + assertEquals(abstractFacts.isEmpty(),false); + } +} \ No newline at end of file diff --git a/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapperTest.java b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapperTest.java new file mode 100644 index 000000000..0208f9a8d --- /dev/null +++ b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapperTest.java @@ -0,0 +1,50 @@ +package eu.europa.ec.fisheries.uvms.rules.service.mapper.fact; + +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; +import org.joda.time.DateTime; +import org.junit.Test; +import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXReportDocumentType; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselTransportMeansType; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.DateTimeType; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; + +import java.util.Date; +import java.util.GregorianCalendar; + +import static org.junit.Assert.*; + +public class MovementReportDocumentFactMapperTest { + + @Test + public void testGenerateFactForMovementReportDocumentNULLDates() { + + MovementReportDocumentFactMapper factMapper = new MovementReportDocumentFactMapper(); + FLUXVesselPositionMessage vesselPositionMessage =new FLUXVesselPositionMessage(); + vesselPositionMessage.setVesselTransportMeans(new VesselTransportMeansType()); + vesselPositionMessage.setFLUXReportDocument(new FLUXReportDocumentType()); + AbstractFact movementReportDocumentFact = factMapper.generateFactForMovementReportDocument(vesselPositionMessage); + } + + @Test + public void testGenerateFactForMovementReportDocumentNormalDates() throws DatatypeConfigurationException { + + MovementReportDocumentFactMapper factMapper = new MovementReportDocumentFactMapper(); + FLUXVesselPositionMessage vesselPositionMessage =new FLUXVesselPositionMessage(); + vesselPositionMessage.setVesselTransportMeans(new VesselTransportMeansType()); + FLUXReportDocumentType reportDocumentType = new FLUXReportDocumentType(); + GregorianCalendar calendar = new GregorianCalendar(); + Date d = new Date(); + calendar.setTime(d); + DateTimeType dateTimeType = new DateTimeType(); + dateTimeType.setDateTime(DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)); + reportDocumentType.setCreationDateTime(dateTimeType); + vesselPositionMessage.setFLUXReportDocument(reportDocumentType); + MovementReportDocumentFact abstractFact = (MovementReportDocumentFact)factMapper.generateFactForMovementReportDocument(vesselPositionMessage); + Date creationDateOfMessage = abstractFact.getCreationDateTime(); + assertEquals(d,creationDateOfMessage); + } +} \ No newline at end of file From 34907c9b49b1b55385dadc1f90d4f6069588e21a Mon Sep 17 00:00:00 2001 From: Nikos Paraskevopoulos Date: Sat, 5 Dec 2020 01:49:29 +0200 Subject: [PATCH 02/17] WIP 1 - It compiles [UNIONVMS-4933] Integrating the movement rules infrastructure with the subscriptions authorisation for movements --- .../service/bean/movement/RulesMovementProcessorBean.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index f4b81f220..1be29b3b1 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -306,12 +306,12 @@ private void processReceivedMovementsAsBatch(List rawMovements, EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements); List rawMovementFactList = RawMovementFactMapper.mapRawMovementFacts(rawMovements, enrichedWrapper.getMobileTerminalList(), enrichedWrapper.getAssetList(), pluginType); - movementValidator.evaluate(rawMovementFactList); + movementValidator.evaluateRawList(rawMovementFactList); if (allFactsAreOk(rawMovementFactList)) { // For now it is always OK // The collectMovementData actually is the method that sends the movements list to Movements module to be saved! List movementFactList = collectBatchMovementData(enrichedWrapper.getMobileTerminalList(), enrichedWrapper.getAssetList(), rawMovements, username); log.info(" Validating movement from Movement Module"); - movementValidator.evaluate(movementFactList, true); + movementValidator.evaluate(movementFactList); // Tell Exchange that a movement Batch was persisted in Movement ExchangeLogStatusTypeType status; if (CollectionUtils.isNotEmpty(movementFactList)) { From 56a74d4ca8cd012958066abcc8fb16d628b202e5 Mon Sep 17 00:00:00 2001 From: Nikos Paraskevopoulos Date: Sat, 5 Dec 2020 02:38:25 +0200 Subject: [PATCH 03/17] WIP 2 - First attempt --- .../movement/RulesMovementProcessorBean.java | 70 ++++++++++++++----- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index 1be29b3b1..db8868c24 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -12,6 +12,13 @@ package eu.europa.ec.fisheries.uvms.rules.service.bean.movement; +import static eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType.MOVEMENT; +import static eu.europa.ec.fisheries.uvms.movement.model.exception.ErrorCode.MOVEMENT_DUPLICATE_ERROR; +import static eu.europa.ec.fisheries.uvms.rules.service.config.BusinessObjectType.RECEIVING_MOVEMENT_MSG; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.DATA_FLOW; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.SENDER_RECEIVER; +import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.XML; + import eu.europa.ec.fisheries.remote.RulesDomainModel; import eu.europa.ec.fisheries.schema.config.module.v1.SettingsListResponse; import eu.europa.ec.fisheries.schema.config.types.v1.SettingType; @@ -49,6 +56,7 @@ import eu.europa.ec.fisheries.schema.rules.movement.v1.MovementSourceType; import eu.europa.ec.fisheries.schema.rules.movement.v1.RawMovementType; import eu.europa.ec.fisheries.schema.rules.previous.v1.PreviousReportType; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmListCriteria; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmQuery; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmSearchKey; @@ -89,9 +97,13 @@ import eu.europa.ec.fisheries.uvms.rules.model.exception.RulesModelMarshallException; import eu.europa.ec.fisheries.uvms.rules.model.mapper.JAXBMarshaller; import eu.europa.ec.fisheries.uvms.rules.service.bean.RulePostProcessBean; +import eu.europa.ec.fisheries.uvms.rules.service.bean.RulesConfigurationCache; +import eu.europa.ec.fisheries.uvms.rules.service.bean.RulesEngineBean; +import eu.europa.ec.fisheries.uvms.rules.service.bean.RulesExchangeServiceBean; import eu.europa.ec.fisheries.uvms.rules.service.bean.asset.client.impl.AssetClientBean; import eu.europa.ec.fisheries.uvms.rules.service.bean.mdr.MDRCache; import eu.europa.ec.fisheries.uvms.rules.service.business.*; +import eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType; import eu.europa.ec.fisheries.uvms.rules.service.constants.MDRAcronymType; import eu.europa.ec.fisheries.uvms.rules.service.constants.Rule9998Or9999ErrorType; import eu.europa.ec.fisheries.uvms.rules.service.constants.ServiceConstants; @@ -101,6 +113,7 @@ import eu.europa.ec.fisheries.uvms.rules.service.event.TicketUpdateEvent; import eu.europa.ec.fisheries.uvms.rules.service.exception.InputArgumentException; import eu.europa.ec.fisheries.uvms.rules.service.exception.RulesServiceException; +import eu.europa.ec.fisheries.uvms.rules.service.exception.RulesValidationException; import eu.europa.ec.fisheries.uvms.rules.service.mapper.*; import eu.europa.ec.fisheries.uvms.user.model.mapper.UserModuleRequestMapper; import eu.europa.ec.fisheries.wsdl.asset.group.AssetGroup; @@ -116,7 +129,9 @@ import org.apache.commons.lang3.StringUtils; import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; import un.unece.uncefact.data.standard.mdr.communication.ObjectRepresentation; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; +import javax.annotation.PostConstruct; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; @@ -130,9 +145,6 @@ import java.util.concurrent.*; import java.util.stream.Collectors; -import static eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType.MOVEMENT; -import static eu.europa.ec.fisheries.uvms.movement.model.exception.ErrorCode.MOVEMENT_DUPLICATE_ERROR; - @Stateless @LocalBean @@ -175,9 +187,18 @@ public class RulesMovementProcessorBean { @EJB private RulesAuditProducerBean auditProducer; + @EJB + private RulesEngineBean rulesEngine; + @EJB private RulePostProcessBean rulePostProcessBean; + @EJB + private RulesExchangeServiceBean exchangeServiceBean; + + @EJB + private RulesConfigurationCache ruleModuleCache; + @Inject private AssetClientBean assetClientBean; @@ -199,6 +220,8 @@ public class RulesMovementProcessorBean { private Map mapToMovementType; + private RulesFLUXMessageHelper fluxMessageHelper; + @Inject void setMdrCache(MDRCache mdrCache) { mapToMovementType = new HashMap<>(); @@ -227,6 +250,11 @@ void setMdrCache(MDRCache mdrCache) { })); } + @PostConstruct + public void init() { + fluxMessageHelper = new RulesFLUXMessageHelper(ruleModuleCache); + } + public void sendMovementReport(SendFLUXMovementReportRequest request, String messageGuid) throws RulesServiceException { log.info("Sending Movement Report to exchange"); try { @@ -252,16 +280,34 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri sendBatchBackToExchange(request.getLogGuid(), movementReportsList, MovementRefTypeType.ALARM, userName); return; } + + Map extraValues = new EnumMap<>(ExtraValueType.class); + extraValues.put(SENDER_RECEIVER, request.getSenderOrReceiver()); + extraValues.put(XML, request.getRequest()); + extraValues.put(DATA_FLOW, request.getFluxDataFlow()); + Collection factsResults = rulesEngine.evaluate(RECEIVING_MOVEMENT_MSG,fluxVesselPositionMessage,extraValues,null); + + final String reportId = fluxVesselPositionMessage.getFLUXReportDocument().getIDS().stream() + .filter(id -> "UUID".equals(id.getSchemeID())) + .map(IDType::getValue) + .findFirst() + .get(); + ValidationResult validationResult = rulePostProcessBean.checkAndUpdateValidationResult(factsResults, request.getRequest(), reportId, RawMsgType.MOVEMENT); + + if(validationResult.isError()){ + exchangeServiceBean.updateExchangeMessage(request.getLogGuid(), fluxMessageHelper.calculateMessageValidationStatus(validationResult)); + return; + } // Decomment this one and comment the other when validation is working! Still work needs to be done after this! // processReceivedMovementsAsBatch(movementReportsList, pluginType, userName, request.getLogGuid()); - enrichAndSenMovementsAsBatch(movementReportsList, userName, request.getLogGuid(), request); + enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request); // Send some response to Movement, if it originated from there (manual movement) if (MovementSourceType.MANUAL.equals(movementReportsList.get(0).getSource())) {// A person has created a position ProcessedMovementAck response = MovementModuleResponseMapper.mapProcessedMovementAck(eu.europa.ec.fisheries.schema.movement.common.v1.AcknowledgeTypeType.OK, messageGuid, "Movement successfully processed"); movOutQueueProducer.sendMessageWithSpecificIds(JAXBMarshaller.marshallJaxBObjectToString(response), movOutQueueProducer.getDestination(), null, messageGuid, messageGuid); } - } catch (JAXBException | RulesModelMarshallException | MessageException e) { + } catch (JAXBException | RulesModelMarshallException | MessageException | RulesValidationException e) { log.error("Error while processing received movement", e); } } @@ -276,7 +322,7 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri * @param exchangeLogGuid * @throws RulesServiceException */ - private void enrichAndSenMovementsAsBatch(List rawMovements, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request) throws RulesServiceException { + private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, List rawMovements, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request) throws RulesServiceException { try { // Enrich with MobilTerminal and Assets data. Get Mobile Terminal if it exists. EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements); @@ -284,8 +330,7 @@ private void enrichAndSenMovementsAsBatch(List rawMovements, St ExchangeLogStatusTypeType status; if (movementBatchResponse != null && SimpleResponse.OK.equals(movementBatchResponse.getPermitted())) { if (SimpleResponse.OK.equals(movementBatchResponse.getResponse())) { - // Here when ready needs to happen the validation with the list returned from movements! movementBatchResponse.getMovements(); - status = ExchangeLogStatusTypeType.SUCCESSFUL; + status = ExchangeLogStatusTypeType.fromValue(fluxMessageHelper.calculateMessageValidationStatus(validationResult).value()); } else { status = ExchangeLogStatusTypeType.FAILED; } @@ -387,14 +432,7 @@ private List collectConnectIds(List mobileTerminals) } private boolean allFactsAreOk(List rawMovementFactList) { - boolean areAllOk = true; - for (RawMovementFact movementFact : rawMovementFactList) { - if (movementFact == null || !movementFact.isOk()) { - areAllOk = false; - break; - } - } - return areAllOk; + return rawMovementFactList.stream().allMatch(movementFact -> movementFact != null && movementFact.isOk()); } private List getMobileTerminalByRawMovementsBatch(List rawMovements) throws MessageException, MobileTerminalModelMapperException, MobileTerminalUnmarshallException, JMSException { From acbfbdd3c1d868c47724f94b45921936d4b28078 Mon Sep 17 00:00:00 2001 From: Nikos Paraskevopoulos Date: Sun, 6 Dec 2020 22:27:16 +0200 Subject: [PATCH 04/17] WIP 3 [UNIONVMS-4933] Integrating the movement rules infrastructure with the subscriptions authorisation for movements --- .../service/bean/RulePostProcessBean.java | 7 ++++++- .../movement/RulesMovementProcessorBean.java | 20 +++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java index 153f40bd5..22c4455a8 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java @@ -112,9 +112,14 @@ private void saveValidationResult(List validationMessageT } } + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public void updateValidationResult(String rawMsgGuid, RawMsgType type, RuleError ruleError) throws RulesModelException { + final ValidationMessageType validationMessage = createValidationMessageFromParams(ruleError.getRuleId(), ErrorType.ERROR, ruleError.getMessage(), ruleError.getLevel(), Collections.emptyList(), Collections.emptyList(), new Date()); + rulesDomainModel.updateValidationMessagesWithPermission(validationMessage, rawMsgGuid, type.value()); + } + private void updateValidationResult(String rawMsgGuid, String type, ValidationMessageType validationMessage) throws RulesModelException { rulesDomainModel.updateValidationMessagesWithPermission(validationMessage, rawMsgGuid, type); - } private ValidationResult createValidationResultDtoFromParams(boolean isError, boolean isWarning, boolean isOk, List validationMessages) { diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index db8868c24..99b4b5860 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -300,7 +300,7 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri } // Decomment this one and comment the other when validation is working! Still work needs to be done after this! // processReceivedMovementsAsBatch(movementReportsList, pluginType, userName, request.getLogGuid()); - enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request); + enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request, reportId); // Send some response to Movement, if it originated from there (manual movement) if (MovementSourceType.MANUAL.equals(movementReportsList.get(0).getSource())) {// A person has created a position ProcessedMovementAck response = MovementModuleResponseMapper.mapProcessedMovementAck(eu.europa.ec.fisheries.schema.movement.common.v1.AcknowledgeTypeType.OK, @@ -322,7 +322,7 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri * @param exchangeLogGuid * @throws RulesServiceException */ - private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, List rawMovements, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request) throws RulesServiceException { + private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, List rawMovements, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request, String reportId) throws RulesServiceException { try { // Enrich with MobilTerminal and Assets data. Get Mobile Terminal if it exists. EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements); @@ -336,11 +336,11 @@ private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, Lis } } else { status = ExchangeLogStatusTypeType.FAILED; - updateValidationResultOnPermissionDenied(JAXBUtils.marshallJaxBObjectToString(movementBatchResponse), request, Rule9998Or9999ErrorType.PERMISSION_DENIED); + updateValidationResultOnPermissionDenied(reportId, request, Rule9998Or9999ErrorType.PERMISSION_DENIED); } sendBatchBackToExchange(exchangeLogGuid, rawMovements, MovementRefTypeType.MOVEMENT, username); updateRequestMessageStatusInExchange(exchangeLogGuid, status); - } catch (MessageException | MobileTerminalModelMapperException | MobileTerminalUnmarshallException | JMSException | AssetModelMapperException | JAXBException e) { + } catch (MessageException | MobileTerminalModelMapperException | MobileTerminalUnmarshallException | JMSException | AssetModelMapperException | RulesModelException e) { throw new RulesServiceException(e.getMessage(), e); } } @@ -1648,20 +1648,18 @@ private void updateRequestMessageStatusInExchange(String logGuid, ExchangeLogSta } } - private void updateValidationResultOnPermissionDenied(String rawMessage, RulesBaseRequest request, Rule9998Or9999ErrorType type) { + private void updateValidationResultOnPermissionDenied(String reportId, RulesBaseRequest request, Rule9998Or9999ErrorType type) throws RulesModelException { if (request == null || type == null) { log.error("Could not send FLUXResponseMessage. Request is null or Rule9998Or9999ErrorType not provided."); return; } - RuleError ruleWarning; + RuleError ruleError; if (Rule9998Or9999ErrorType.EMPTY_REPORT.equals(type)) { - ruleWarning = new RuleError(ServiceConstants.EMPTY_REPORT_RULE, ServiceConstants.EMPTY_REPORT_RULE_MESSAGE, "L03", Collections.singletonList(null)); + ruleError = new RuleError(ServiceConstants.EMPTY_REPORT_RULE, ServiceConstants.EMPTY_REPORT_RULE_MESSAGE, "L03", Collections.singletonList(null)); } else { - ruleWarning = new RuleError(ServiceConstants.PERMISSION_DENIED_RULE, ServiceConstants.PERMISSION_DENIED_RULE_MESSAGE, "L00", Collections.singletonList(null)); + ruleError = new RuleError(ServiceConstants.PERMISSION_DENIED_RULE, ServiceConstants.PERMISSION_DENIED_RULE_MESSAGE, "L00", Collections.singletonList(null)); } - ValidationResult validationResultDto = rulePostProcessBean.checkAndUpdateValidationResultForGeneralBusinessRules(ruleWarning, rawMessage, request.getLogGuid(), MOVEMENT, request.getDate()); - validationResultDto.setError(true); - validationResultDto.setOk(false); + rulePostProcessBean.updateValidationResult(reportId, MOVEMENT, ruleError); } } From d8549c23d4613f9116719a06323e5e69e8d1a36c Mon Sep 17 00:00:00 2001 From: Nikos Paraskevopoulos Date: Wed, 16 Sep 2020 22:27:36 +0300 Subject: [PATCH 05/17] [DO NOT COMMIT] temp patch --- .../service/business/helper/RuleApplicabilityChecker.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java index 000afefe1..35afec083 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java @@ -76,6 +76,9 @@ && isDateInRange(messageCreationDate, faBrForBrIdAndContext.getStartDate(), faBr * @return */ public boolean isApplicable(String thisRulesBrId, String ruleContext, String messageDataFlow, DateTime messageCreationDate, MDRCacheRuleService mdrService) { + if (thisRulesBrId != null && thisRulesBrId.startsWith("MO-")) { + return true; + } String msgContext = mdrService.findContextForDf(messageDataFlow); if (StringUtils.isEmpty(msgContext)) { return false; From 29d00c82c98c496d1fe6151b41ed4fc314153bbe Mon Sep 17 00:00:00 2001 From: Nikos Paraskevopoulos Date: Tue, 8 Dec 2020 03:11:46 +0200 Subject: [PATCH 06/17] WIP 4 - [UNIONVMS-4933] --- .../uvms/rules/bean/RulesDomainModelBean.java | 10 +++++++ .../ec/fisheries/uvms/rules/dao/RulesDao.java | 3 +++ .../uvms/rules/dao/bean/RulesDaoBean.java | 27 ++++++++++++++++++- .../ec/fisheries/remote/RulesDomainModel.java | 5 +++- .../service/bean/RulePostProcessBean.java | 7 +++-- .../movement/RulesMovementProcessorBean.java | 5 ++-- 6 files changed, 49 insertions(+), 8 deletions(-) diff --git a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/bean/RulesDomainModelBean.java b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/bean/RulesDomainModelBean.java index 6d084d7be..658f77334 100644 --- a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/bean/RulesDomainModelBean.java +++ b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/bean/RulesDomainModelBean.java @@ -16,6 +16,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.customrule.v1.*; import eu.europa.ec.fisheries.schema.rules.previous.v1.PreviousReportType; import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMessageType; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.schema.rules.rule.v1.RuleType; import eu.europa.ec.fisheries.schema.rules.rule.v1.ValidationMessageType; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmQuery; @@ -125,6 +126,15 @@ public void updateValidationMessagesWithPermission(ValidationMessageType validat } } + @Override + public void createOrUpdateValidationMessagesWithPermission(ValidationMessageType validationMessage, String rawMsgGuid, String rawMessage, RawMsgType type) throws RulesModelException { + try { + rulesDao.createOrUpdateValidationMessagesWithPermission(rawMsgGuid, rawMessage, type, RawMessageMapper.INSTANCE.mapToValidationMessageEntity(validationMessage)); + } catch (DaoException e) { + throw new RulesModelException(e.getMessage(), e); + } + } + @Override public CustomRuleType createCustomRule(CustomRuleType customRule) throws RulesModelException { LOG.debug("Create in Rules"); diff --git a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/RulesDao.java b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/RulesDao.java index 05ffc0649..be2c80216 100644 --- a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/RulesDao.java +++ b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/RulesDao.java @@ -15,6 +15,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import java.util.List; import java.util.Set; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.uvms.commons.service.exception.ServiceException; import eu.europa.ec.fisheries.uvms.rules.entity.AlarmReport; import eu.europa.ec.fisheries.uvms.rules.entity.CustomRule; @@ -160,6 +161,8 @@ List getTicketListPaginated(Integer page, Integer listSize, String sql, void updateValidationMessagesWith(String rawMessageGuid, String type, ValidationMessage validationMessage) throws DaoException; + void createOrUpdateValidationMessagesWithPermission(String rawMessageGuid, String rawMessage, RawMsgType type, ValidationMessage validationMessage) throws DaoException; + List getValidationMessagesById(List ids) throws DaoException; List getValidationMessagesByRawMsgGuid(String rawMsgGuid, String type) throws DaoException; diff --git a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/bean/RulesDaoBean.java b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/bean/RulesDaoBean.java index b783f6e37..05888df01 100644 --- a/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/bean/RulesDaoBean.java +++ b/domain/src/main/java/eu/europa/ec/fisheries/uvms/rules/dao/bean/RulesDaoBean.java @@ -22,10 +22,12 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import javax.persistence.TransactionRequiredException; import javax.persistence.TypedQuery; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.uvms.commons.service.exception.ServiceException; import eu.europa.ec.fisheries.uvms.rules.constant.UvmsConstants; import eu.europa.ec.fisheries.uvms.rules.dao.FADocumentIDDAO; @@ -559,7 +561,7 @@ public void saveValidationMessages(List rawMessages) throws DaoExcep @Override public void updateValidationMessagesWith(String rawMessageGuid, String type, ValidationMessage validationMessage) throws DaoException { try { - List rawMessageByGuid = rawMessageDao.getRawMessageByGuid(rawMessageGuid, type); + List rawMessageByGuid = rawMessageDao.getRawMessageByGuid(rawMessageGuid, type); rawMessageByGuid.forEach(r -> { r.getValidationMessages().add(validationMessage); validationMessage.setRawMessage(r); @@ -569,6 +571,29 @@ public void updateValidationMessagesWith(String rawMessageGuid, String type, Val } } + @Override + public void createOrUpdateValidationMessagesWithPermission(String rawMessageGuid, String rawMessageContent, RawMsgType type, ValidationMessage validationMessage) throws DaoException { + try { + List rawMessageByGuid = rawMessageDao.getRawMessageByGuid(rawMessageGuid, type.value()); + if (rawMessageByGuid.isEmpty()) { + RawMessage rawMessage = new RawMessage(); + rawMessage.setGuid(rawMessageGuid); + rawMessage.setRawMessage(rawMessageContent); + rawMessage.setRawMsgType(type); + validationMessage.setRawMessage(rawMessage); + rawMessage.setValidationMessages(Collections.singleton(validationMessage)); + rawMessageDao.saveRawMessages(Collections.singletonList(rawMessage)); + } else { + rawMessageByGuid.forEach(r -> { + r.getValidationMessages().add(validationMessage); + validationMessage.setRawMessage(r); + }); + } + } catch (ServiceException e) { + throw new DaoException(e.getMessage(), e); + } + } + @Override public List getValidationMessagesById(List ids) throws DaoException { try { diff --git a/model/src/main/java/eu/europa/ec/fisheries/remote/RulesDomainModel.java b/model/src/main/java/eu/europa/ec/fisheries/remote/RulesDomainModel.java index 7a367a87f..165cbc10a 100755 --- a/model/src/main/java/eu/europa/ec/fisheries/remote/RulesDomainModel.java +++ b/model/src/main/java/eu/europa/ec/fisheries/remote/RulesDomainModel.java @@ -20,6 +20,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.customrule.v1.UpdateSubscriptionType; import eu.europa.ec.fisheries.schema.rules.previous.v1.PreviousReportType; import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMessageType; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.schema.rules.rule.v1.ValidationMessageType; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmQuery; import eu.europa.ec.fisheries.schema.rules.search.v1.CustomRuleQuery; @@ -115,4 +116,6 @@ public interface RulesDomainModel { List getValidationMessagesByRawMsgGuid(String rawMsgGuid, String type) throws RulesModelException; void updateValidationMessagesWithPermission(ValidationMessageType validationMessage, String rawMsgGuid, String type) throws RulesModelException; -} \ No newline at end of file + + void createOrUpdateValidationMessagesWithPermission(ValidationMessageType validationMessage, String rawMsgGuid, String rawMessage, RawMsgType type) throws RulesModelException; +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java index 22c4455a8..5463948e1 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/RulePostProcessBean.java @@ -112,10 +112,9 @@ private void saveValidationResult(List validationMessageT } } - @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void updateValidationResult(String rawMsgGuid, RawMsgType type, RuleError ruleError) throws RulesModelException { - final ValidationMessageType validationMessage = createValidationMessageFromParams(ruleError.getRuleId(), ErrorType.ERROR, ruleError.getMessage(), ruleError.getLevel(), Collections.emptyList(), Collections.emptyList(), new Date()); - rulesDomainModel.updateValidationMessagesWithPermission(validationMessage, rawMsgGuid, type.value()); + public void createOrUpdateValidationResult(String rawMsgGuid, String rawMessage, RawMsgType type, RuleError ruleError) throws RulesModelException { + final ValidationMessageType validationMessage = createValidationMessageFromParams(ruleError.getRuleId(), ErrorType.ERROR, ruleError.getMessage(), ruleError.getLevel(), Collections.emptyList(), ruleError.getXpaths(), new Date()); + rulesDomainModel.createOrUpdateValidationMessagesWithPermission(validationMessage, rawMsgGuid, rawMessage, type); } private void updateValidationResult(String rawMsgGuid, String type, ValidationMessageType validationMessage) throws RulesModelException { diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index 99b4b5860..470e33752 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -1648,7 +1648,7 @@ private void updateRequestMessageStatusInExchange(String logGuid, ExchangeLogSta } } - private void updateValidationResultOnPermissionDenied(String reportId, RulesBaseRequest request, Rule9998Or9999ErrorType type) throws RulesModelException { + private void updateValidationResultOnPermissionDenied(String reportId, SetFLUXMovementReportRequest request, Rule9998Or9999ErrorType type) throws RulesModelException { if (request == null || type == null) { log.error("Could not send FLUXResponseMessage. Request is null or Rule9998Or9999ErrorType not provided."); return; @@ -1659,7 +1659,8 @@ private void updateValidationResultOnPermissionDenied(String reportId, RulesBase } else { ruleError = new RuleError(ServiceConstants.PERMISSION_DENIED_RULE, ServiceConstants.PERMISSION_DENIED_RULE_MESSAGE, "L00", Collections.singletonList(null)); } + ruleError.setXpaths(Collections.singletonList("(//*[local-name()='FLUXVesselPositionMessage']//*[local-name()='FLUXReportDocument'])[1]//*[local-name()='ID']")); - rulePostProcessBean.updateValidationResult(reportId, MOVEMENT, ruleError); + rulePostProcessBean.createOrUpdateValidationResult(reportId, request.getRequest(), MOVEMENT, ruleError); } } From a85a0e78d4097260641e781d255813adf5fb60dc Mon Sep 17 00:00:00 2001 From: nomikosi <42890529+nomikosi@users.noreply.github.com> Date: Wed, 9 Dec 2020 19:20:57 +0200 Subject: [PATCH 07/17] [MOVEMENT-RULES] added the three first rules --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 43 +++++++++++-------- .../src/main/resources/contract/Template.xsd | 2 + .../rules/service/bean/ContainerType.java | 3 +- .../uvms/rules/service/bean/mdr/MDRCache.java | 5 +++ .../fact/MovementReportDocumentFact.java | 17 ++++++++ .../fact/MovementReportDocumentIdFact.java | 33 ++++++++++++++ .../generator/MovementFactGenerator.java | 3 +- .../business/helper/DrtPathHelper.java | 1 + .../helper/RuleApplicabilityChecker.java | 4 +- .../service/constants/MDRAcronymType.java | 4 +- .../mapper/fact/ActivityFactMapper.java | 2 +- .../MovementReportDocumentFactMapper.java | 32 ++++++++++++++ .../templates/MovementReportDocumentId.drt | 34 +++++++++++++++ 13 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentIdFact.java create mode 100644 service/src/main/resources/templates/MovementReportDocumentId.drt diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 7a8724037..dd9f59a78 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -1,32 +1,41 @@ + + + + + + template_id = 2000 + + template_id = 2001 + - + - + - + - + @@ -38,24 +47,24 @@ rule_id = 20001 - br_id = 'MO-R01-00-0001' + br_id = 'VP-L01-00-0001' - + - + - + - + @@ -67,24 +76,24 @@ rule_id = 20002 - br_id = 'MO-R01-00-0002' + br_id = 'VP-L01-00-0002' - + - - + + - + - + - + @@ -96,7 +105,7 @@ rule_id = 20003 - br_id = 'MO-R01-00-0003' + br_id = 'VP-L01-00-0003' diff --git a/model/src/main/resources/contract/Template.xsd b/model/src/main/resources/contract/Template.xsd index e99548f72..84a6c35d4 100755 --- a/model/src/main/resources/contract/Template.xsd +++ b/model/src/main/resources/contract/Template.xsd @@ -88,6 +88,8 @@ + + \ No newline at end of file diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java index 84fa3c640..92dd691e1 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java @@ -47,7 +47,8 @@ public enum ContainerType { FactType.SALES_VALIDATION_RESULT_DOCUMENT, FactType.SALES_VALIDATION_QUALITY_ANALYSIS,FactType.SALES_REPORT_WRAPPER, FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE), - MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT + MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID + ); private final String packageName; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/mdr/MDRCache.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/mdr/MDRCache.java index c6271067c..80ee56388 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/mdr/MDRCache.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/mdr/MDRCache.java @@ -282,6 +282,7 @@ private void overrideBRMessages() { final List objRapprList = new ArrayList<>(); List brDef = getEntry(MDRAcronymType.FA_BR); List saleBrDef = getEntry(MDRAcronymType.SALE_BR); + List movementDef = getEntry(MDRAcronymType.VP_BR); // For start up non reachable MDR purposes :) if (CollectionUtils.isNotEmpty(brDef)) { objRapprList.addAll(brDef); @@ -289,6 +290,10 @@ private void overrideBRMessages() { if (CollectionUtils.isNotEmpty(saleBrDef)) { objRapprList.addAll(saleBrDef); } + if (CollectionUtils.isNotEmpty(movementDef)) { + objRapprList.addAll(movementDef); + } + objRapprList.removeAll(Collections.singleton(null)); if (CollectionUtils.isEmpty(objRapprList)) { return; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index 4c4d8fab9..3e150e24f 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -14,8 +14,10 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import lombok.Data; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; import java.util.Date; +import java.util.List; @Data public class MovementReportDocumentFact extends AbstractFact { @@ -23,6 +25,21 @@ public class MovementReportDocumentFact extends AbstractFact { private boolean ok = true; private Date creationDateTime; private String creationDateTimeString; + private List ids; + + + public boolean containsTypesOfIdXTimes(List ids,String schemaType,int count){ + + int counter = 0; + for(IDType idType:ids){ + + if(schemaType.equals(idType.getSchemeID())){ + counter ++; + } + } + + return counter == count; + } @Override public void setFactType() { diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentIdFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentIdFact.java new file mode 100644 index 000000000..e8bd26f3f --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentIdFact.java @@ -0,0 +1,33 @@ +package eu.europa.ec.fisheries.uvms.rules.service.business.fact; + +import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import lombok.Data; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; + + +@Data +public class MovementReportDocumentIdFact extends AbstractFact { + + private IDType id; + + public boolean uuidValidateRegex(IDType id){ + if(id == null){ + return true; + } + + String UUID_PATTERN = "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$"; + + if("UUID".equals(id.getSchemeID()) && id.getValue() != null){ + return id.getValue().matches(UUID_PATTERN); + } + + + return true; + } + + @Override + public void setFactType() { + this.factType = FactType.MOVEMENT_REPORT_DOCUMENT_ID; + } +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java index 80d22f9d6..ac0512f79 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -23,7 +23,6 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import java.util.List; import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.DATA_FLOW; -import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; public class MovementFactGenerator extends AbstractGenerator { @@ -54,10 +53,12 @@ public List generateAllFacts() { if (fluxReportDocument != null) { facts.add(movementReportDocumentFactMapper.generateFactForMovementReportDocument(vesselPositionMessage)); + facts.addAll(movementReportDocumentFactMapper.generateFactForMovementReportDocumentId(vesselPositionMessage)); } String df = (String) extraValueMap.get(DATA_FLOW); facts.forEach(fact -> fact.setMessageDataFlow(df)); + xPathUtil.clear(); return facts; } diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java index b8da4fea9..6f2b63444 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java @@ -35,6 +35,7 @@ public enum DrtPathHelper { FA_QUERY("/templates/FaQuery.drt"), FA_QUERY_PARAMETER("/templates/FaQueryParameter.drt"), MOVEMENT_REPORT_DOCUMENT("/templates/MovementReportDocument.drt"), + MOVEMENT_REPORT_DOCUMENT_ID("/templates/MovementReportDocumentId.drt"), FA_RELOCATION("/templates/FaRelocation.drt"), FA_RESPONSE("/templates/FaResponse.drt"), FA_TRANSHIPMENT("/templates/FaTranshipment.drt"), diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java index 35afec083..4485fb37d 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/RuleApplicabilityChecker.java @@ -76,9 +76,7 @@ && isDateInRange(messageCreationDate, faBrForBrIdAndContext.getStartDate(), faBr * @return */ public boolean isApplicable(String thisRulesBrId, String ruleContext, String messageDataFlow, DateTime messageCreationDate, MDRCacheRuleService mdrService) { - if (thisRulesBrId != null && thisRulesBrId.startsWith("MO-")) { - return true; - } + String msgContext = mdrService.findContextForDf(messageDataFlow); if (StringUtils.isEmpty(msgContext)) { return false; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/MDRAcronymType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/MDRAcronymType.java index ee4a476b1..e4ddb86aa 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/MDRAcronymType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/MDRAcronymType.java @@ -87,7 +87,9 @@ public enum MDRAcronymType { TARGET_SPECIES_GROUP("TARGET_SPECIES_GROUP"), GENDER("GENDER"), FA_BR_DEF("FA_BR_DEF"), - SALE_BR_DEF("SALE_BR_DEF"); + SALE_BR_DEF("SALE_BR_DEF"), + VP_BR("VP_BR"), + VP_BR_DEF("VP_BR_DEF"); private final String value; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/ActivityFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/ActivityFactMapper.java index 9f9dfd6e1..ff9207454 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/ActivityFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/ActivityFactMapper.java @@ -324,7 +324,7 @@ public FishingActivityFact generateFishingActivityFact(FishingActivity fishingAc fishingActivityFact.setFaReportDocumentTypeCode(mapToCodeType(faReportDocument != null ? faReportDocument.getTypeCode() : null)); fishingActivityFact.setFaReportDocuments(fluxfaReportMessage.getFAReportDocuments()); fishingActivityFact.setFaReportDocument(faReportDocument); - fishingActivityFact.setPurposeCode(mapToCodeType(faReportDocument.getRelatedFLUXReportDocument() == null ? null:faReportDocument.getRelatedFLUXReportDocument().getPurposeCode())); + fishingActivityFact.setPurposeCode(mapToCodeType(faReportDocument.getRelatedFLUXReportDocument() == null ? null : faReportDocument.getRelatedFLUXReportDocument().getPurposeCode())); String partialXpath = xPathUtil.getValue(); diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index e42e8987b..117e5953f 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -13,13 +13,17 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentIdFact; import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; import lombok.extern.slf4j.Slf4j; import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; import un.unece.uncefact.data.standard.unqualifieddatatype._18.DateTimeType; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; @@ -30,6 +34,8 @@ public class MovementReportDocumentFactMapper { private XPathStringWrapper xPathUtil; + public static final String ID = "id"; + public MovementReportDocumentFactMapper() { xPathUtil = new XPathStringWrapper(); } @@ -40,6 +46,7 @@ public MovementReportDocumentFactMapper(XPathStringWrapper strUtil1) { public AbstractFact generateFactForMovementReportDocument(FLUXVesselPositionMessage vesselPositionMessage){ if(vesselPositionMessage == null){ + xPathUtil.clear(); return null; } @@ -50,10 +57,35 @@ public AbstractFact generateFactForMovementReportDocument(FLUXVesselPositionMess fact.setCreationDateTimeString(dateTimeAsString(creationDateTime)); fact.setCreationDateTime(getDate(creationDateTime)); xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, XPathConstants.CREATION_DATE_TIME).storeInRepo(fact, CREATION_DATE_TIME); + fact.setIds(vesselPositionMessage.getFLUXReportDocument().getIDS()); + xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, XPathConstants.ID).storeInRepo(fact, "id"); return fact; } + public List generateFactForMovementReportDocumentId(FLUXVesselPositionMessage vesselPositionMessage){ + + List factList = new ArrayList<>(); + + if(vesselPositionMessage == null || vesselPositionMessage.getFLUXReportDocument() == null || vesselPositionMessage.getFLUXReportDocument().getIDS() == null || vesselPositionMessage.getFLUXReportDocument().getIDS().isEmpty()){ + xPathUtil.clear(); + return factList; + } + + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).getValue(); + + List ids = vesselPositionMessage.getFLUXReportDocument().getIDS(); + int index = 1; + for(IDType idType: ids){ + MovementReportDocumentIdFact fact = new MovementReportDocumentIdFact(); + fact.setId(idType); + xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT).appendWithIndex(XPathConstants.ID,index).storeInRepo(fact, "id"); + factList.add(fact); + index ++; + } + return factList; + } + public static MovementReportDocumentFact mapToMovementReportDocumentFact(FLUXVesselPositionMessage vesselPositionMessage){ if(vesselPositionMessage == null || vesselPositionMessage.getFLUXReportDocument() == null){ diff --git a/service/src/main/resources/templates/MovementReportDocumentId.drt b/service/src/main/resources/templates/MovementReportDocumentId.drt new file mode 100644 index 000000000..7c37c4d1b --- /dev/null +++ b/service/src/main/resources/templates/MovementReportDocumentId.drt @@ -0,0 +1,34 @@ +template header + +tname +expression +brid +rulemsg +type +level +propertyNames +context + +package eu.europa.ec.fisheries.uvms.rules.service.business.activity; + +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentIdFact; +import java.util.Arrays; +global eu.europa.ec.fisheries.uvms.rules.service.business.helper.RuleApplicabilityChecker appliChecker; +global eu.europa.ec.fisheries.uvms.rules.service.MDRCacheRuleService mdrService; + + +template "@{tname}" + +rule "Movement Report Document Id @{tname} - @{brid} - Context : @{context}" + +when + + $fact : MovementReportDocumentIdFact((appliChecker.isApplicable("@{brid}", "@{context}", getMessageDataFlow(), getCreationDateOfMessage(), mdrService)) && (@{expression})) + +then + $fact.setOk(false); + $fact.addWarningOrError(mdrService.getErrorTypeStrForForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), mdrService.getErrorMessageForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), "@{brid}", "@{level}", "@{propertyNames}"); + +end + +end template \ No newline at end of file From 2df507c68eeddb419368f7c50564ba1cb2679c5e Mon Sep 17 00:00:00 2001 From: nomikosi <42890529+nomikosi@users.noreply.github.com> Date: Mon, 14 Dec 2020 12:08:49 +0200 Subject: [PATCH 08/17] [UNIONVMS-MOVEMENT-RULES] used logid instead of message id --- .../service/bean/movement/RulesMovementProcessorBean.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index 470e33752..6e270d52a 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -292,7 +292,7 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri .map(IDType::getValue) .findFirst() .get(); - ValidationResult validationResult = rulePostProcessBean.checkAndUpdateValidationResult(factsResults, request.getRequest(), reportId, RawMsgType.MOVEMENT); + ValidationResult validationResult = rulePostProcessBean.checkAndUpdateValidationResult(factsResults, request.getRequest(), request.getLogGuid(), RawMsgType.MOVEMENT); if(validationResult.isError()){ exchangeServiceBean.updateExchangeMessage(request.getLogGuid(), fluxMessageHelper.calculateMessageValidationStatus(validationResult)); @@ -300,7 +300,7 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri } // Decomment this one and comment the other when validation is working! Still work needs to be done after this! // processReceivedMovementsAsBatch(movementReportsList, pluginType, userName, request.getLogGuid()); - enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request, reportId); + enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request, request.getLogGuid()); // Send some response to Movement, if it originated from there (manual movement) if (MovementSourceType.MANUAL.equals(movementReportsList.get(0).getSource())) {// A person has created a position ProcessedMovementAck response = MovementModuleResponseMapper.mapProcessedMovementAck(eu.europa.ec.fisheries.schema.movement.common.v1.AcknowledgeTypeType.OK, From 25fc987617e7afd4e60398ed637fa81f779003a0 Mon Sep 17 00:00:00 2001 From: nomikosi <42890529+nomikosi@users.noreply.github.com> Date: Mon, 1 Feb 2021 15:07:59 +0200 Subject: [PATCH 09/17] [UNIONVMS-MOVEMENT-RULES] added rule 007 --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 36 +++++++++++++++++-- .../src/main/resources/contract/Template.xsd | 1 - .../rules/service/bean/ContainerType.java | 4 +-- .../movement/RulesMovementProcessorBean.java | 10 ++++-- .../fact/MovementReportDocumentFact.java | 11 ++++++ .../generator/MovementFactGenerator.java | 1 + .../MovementReportDocumentFactMapper.java | 6 ++-- .../RulesMovementProcessorBeanTest.java | 20 +++++++++++ 8 files changed, 77 insertions(+), 12 deletions(-) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index dd9f59a78..302475b3b 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -85,16 +85,16 @@ - + - + - + @@ -109,4 +109,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20007 + + + br_id = 'VP-L01-00-0007' + + + diff --git a/model/src/main/resources/contract/Template.xsd b/model/src/main/resources/contract/Template.xsd index 84a6c35d4..851aa2614 100755 --- a/model/src/main/resources/contract/Template.xsd +++ b/model/src/main/resources/contract/Template.xsd @@ -89,7 +89,6 @@ - \ No newline at end of file diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java index 92dd691e1..0d956967c 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java @@ -47,9 +47,7 @@ public enum ContainerType { FactType.SALES_VALIDATION_RESULT_DOCUMENT, FactType.SALES_VALIDATION_QUALITY_ANALYSIS,FactType.SALES_REPORT_WRAPPER, FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE), - MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID - - ); + MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID); private final String packageName; private final String containerName; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java index 6e270d52a..c343b9b5c 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java @@ -878,15 +878,19 @@ public List call() { } // Todo ; When possible remove loop! - private List collectBatchMovementData(List mobileTerminal, List asset, List rawMovement, String username) { + private List collectBatchMovementData(List mobileTerminal, List asset, List rawMovement, String username) throws MessageException { List movFactList = new ArrayList<>(); int index = 0; for (RawMovementType rawMovementType : rawMovement) { try { movFactList.add(collectMovementData(mobileTerminal.get(index), asset.get(index), rawMovementType, username)); - } catch (ExecutionException | InterruptedException | RulesServiceException e) { - movFactList.add(null); + } + catch (InterruptedException e) { Thread.currentThread().interrupt(); + throw new MessageException("Thread interrupted...",e); + } + catch (ExecutionException | RulesServiceException e) { + movFactList.add(null); } } return movFactList; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index 3e150e24f..6a1c8edf6 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -16,6 +16,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import lombok.Data; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; +import java.util.Calendar; import java.util.Date; import java.util.List; @@ -41,6 +42,16 @@ public boolean containsTypesOfIdXTimes(List ids,String schemaType,int co return counter == count; } + public boolean isDateInThePast(Date creationDateTime){ + + Calendar serverDate = Calendar.getInstance(); + long t= serverDate.getTimeInMillis(); + Date startDate = new Date(t - 10 * 60000); + new Date(); + + return creationDateTime.after(startDate) && creationDateTime.before(serverDate.getTime()); + } + @Override public void setFactType() { this.factType = FactType.MOVEMENT_REPORT_DOCUMENT; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java index ac0512f79..557982027 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -23,6 +23,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import java.util.List; import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.DATA_FLOW; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; public class MovementFactGenerator extends AbstractGenerator { diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index 117e5953f..3da1027fc 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -25,6 +25,8 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import java.util.Date; import java.util.List; +import java.util.Date; + import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; @@ -33,9 +35,9 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The public class MovementReportDocumentFactMapper { private XPathStringWrapper xPathUtil; - public static final String ID = "id"; + public MovementReportDocumentFactMapper() { xPathUtil = new XPathStringWrapper(); } @@ -43,7 +45,7 @@ public MovementReportDocumentFactMapper(XPathStringWrapper strUtil1) { this.xPathUtil = strUtil1; } - public AbstractFact generateFactForMovementReportDocument(FLUXVesselPositionMessage vesselPositionMessage){ + public MovementReportDocumentFact generateFactForMovementReportDocument(FLUXVesselPositionMessage vesselPositionMessage){ if(vesselPositionMessage == null){ xPathUtil.clear(); diff --git a/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBeanTest.java b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBeanTest.java index 17c7007d7..7b5300d69 100644 --- a/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBeanTest.java +++ b/service/src/test/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBeanTest.java @@ -22,6 +22,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.exchange.v1.PluginType; import eu.europa.ec.fisheries.schema.rules.module.v1.SetFLUXMovementReportRequest; import eu.europa.ec.fisheries.schema.rules.previous.v1.PreviousReportType; +import eu.europa.ec.fisheries.schema.rules.rule.v1.RawMsgType; import eu.europa.ec.fisheries.schema.rules.search.v1.AlarmQuery; import eu.europa.ec.fisheries.schema.rules.search.v1.TicketQuery; import eu.europa.ec.fisheries.schema.rules.source.v1.GetAlarmListByQueryResponse; @@ -42,8 +43,11 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.model.dto.TicketListResponseDto; import eu.europa.ec.fisheries.uvms.rules.model.mapper.RulesDataSourceRequestMapper; import eu.europa.ec.fisheries.uvms.rules.model.mapper.RulesDataSourceResponseMapper; +import eu.europa.ec.fisheries.uvms.rules.service.bean.RulePostProcessBean; +import eu.europa.ec.fisheries.uvms.rules.service.bean.RulesEngineBean; import eu.europa.ec.fisheries.uvms.rules.service.bean.mdr.MDRCache; import eu.europa.ec.fisheries.uvms.rules.service.business.PreviousReportFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.ValidationResult; import eu.europa.ec.fisheries.uvms.rules.service.constants.MDRAcronymType; import eu.europa.ec.fisheries.uvms.rules.service.constants.ServiceConstants; import org.junit.Before; @@ -60,9 +64,11 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; import un.unece.uncefact.data.standard.mdr.communication.ColumnDataType; import un.unece.uncefact.data.standard.mdr.communication.ObjectRepresentation; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXReportDocumentType; import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselPositionEventType; import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselTransportMeansType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; import javax.enterprise.event.Event; import javax.jms.JMSException; @@ -89,6 +95,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The public class RulesMovementProcessorBeanTest { private static final String USERNAME = "USERNAME"; + private static final String FLUX_REPORT_DOC_UUID = UUID.randomUUID().toString(); @Mock RulesMessageProducer mockProducer; @@ -112,6 +119,10 @@ public class RulesMovementProcessorBeanTest { MDRCache mdrCache; @Mock RulesExchangeProducerBean exchangeProducer; + @Mock + RulesEngineBean rulesEngine; + @Mock + RulePostProcessBean rulePostProcessBean; @InjectMocks RulesMovementProcessorBean rulesMovementProcessorBean; @@ -546,6 +557,9 @@ public void testSetMovementReportReceived() throws Exception { setupMobileTerminalConversation(); setupMovementModuleConversation(); String messageGuid = UUID.randomUUID().toString(); + ValidationResult validationResult = new ValidationResult(); + validationResult.setError(false); + when(rulePostProcessBean.checkAndUpdateValidationResult(any(), anyString(), anyString(), eq(RawMsgType.MOVEMENT))).thenReturn(validationResult); rulesMovementProcessorBean.setMovementReportReceived(request, messageGuid); @@ -577,6 +591,12 @@ private void setupFluxVesselPositionMessage(SetFLUXMovementReportRequest request vesselPositionEvent.setTypeCode(new CodeType()); vesselPositionEvent.getTypeCode().setValue("MANUAL"); vesselTransportMeans.getSpecifiedVesselPositionEvents().add(vesselPositionEvent); + FLUXReportDocumentType fluxReportDoc = new FLUXReportDocumentType(); + final IDType id = new IDType(); + id.setSchemeID("UUID"); + id.setValue(FLUX_REPORT_DOC_UUID); + fluxReportDoc.getIDS().add(id); + fluxVesselPositionMessage.setFLUXReportDocument(fluxReportDoc); request.setRequest(JAXBUtils.marshallJaxBObjectToString(fluxVesselPositionMessage, "UTF-8", true)); } From 07dbc749844db458cc1e96adb82650dc0e075bbf Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Mon, 1 Feb 2021 15:22:22 +0200 Subject: [PATCH 10/17] [UNIONVMS-MOVEMENT-RULES] added rule 006 --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 29 +++++++++++++++++++ .../fact/MovementReportDocumentFact.java | 29 ++++++++++++++++--- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 302475b3b..3e7e1d294 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -108,6 +108,35 @@ br_id = 'VP-L01-00-0003' + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20006 + + + br_id = 'VP-L01-00-0006' + + diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index 6a1c8edf6..e5caefd5f 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -11,15 +11,19 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The package eu.europa.ec.fisheries.uvms.rules.service.business.fact; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import lombok.Data; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; -import java.util.Calendar; -import java.util.Date; -import java.util.List; - @Data public class MovementReportDocumentFact extends AbstractFact { @@ -41,6 +45,23 @@ public boolean containsTypesOfIdXTimes(List ids,String schemaType,int co return counter == count; } + + public boolean hasValidCreationDateTime(String creationDateTimeString) { + DateTimeFormatter formatter = new DateTimeFormatterBuilder() + .parseStrict() + .appendPattern("yyyy-MM-dd'T'HH:mm:ss") + .optionalStart() + .appendFraction(ChronoField.MICRO_OF_SECOND, 1, 6, true) + .optionalEnd() + .appendLiteral('Z')//timezone must always be utc, thus the literal Z + .parseStrict().toFormatter(); + try { + formatter.parse(creationDateTimeString); + } catch (DateTimeParseException e) { + return false; + } + return true; + } public boolean isDateInThePast(Date creationDateTime){ From b2ea374ac0dbfa026be65da67303a5f8ea136584 Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Tue, 2 Feb 2021 14:56:11 +0200 Subject: [PATCH 11/17] [UNIONVMS-MOVEMENT-RULES] Implement rules VP-L00-00-0006, VP-L01-00-0009. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 62 ++++++++++++++++++- .../fact/MovementReportDocumentFact.java | 7 +++ .../MovementReportDocumentFactMapper.java | 24 +++---- 3 files changed, 80 insertions(+), 13 deletions(-) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 3e7e1d294..0f73b7863 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -47,7 +47,7 @@ rule_id = 20001 - br_id = 'VP-L01-00-0001' + br_id = 'VP-L00-00-0001' @@ -164,7 +164,65 @@ rule_id = 20007 - br_id = 'VP-L01-00-0007' + br_id = 'VP-L03-00-0007' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 30006 + + + br_id = 'VP-L00-00-0006' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20009 + + + br_id = 'VP-L01-00-0009' diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index e5caefd5f..ddf2f8e97 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -21,7 +21,9 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import eu.europa.ec.fisheries.uvms.rules.service.constants.MDRAcronymType; import lombok.Data; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; @Data @@ -31,6 +33,7 @@ public class MovementReportDocumentFact extends AbstractFact { private Date creationDateTime; private String creationDateTimeString; private List ids; + private CodeType purposeCode; public boolean containsTypesOfIdXTimes(List ids,String schemaType,int count){ @@ -73,6 +76,10 @@ public boolean isDateInThePast(Date creationDateTime){ return creationDateTime.after(startDate) && creationDateTime.before(serverDate.getTime()); } + public boolean hasValidPurposeCodeListId(CodeType purposeCode) { + return MDRAcronymType.FLUX_GP_PURPOSE.name().equals(purposeCode.getListID()); + } + @Override public void setFactType() { this.factType = FactType.MOVEMENT_REPORT_DOCUMENT; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index 3da1027fc..36a36f7f4 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -11,26 +11,25 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The package eu.europa.ec.fisheries.uvms.rules.service.mapper.fact; -import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.PURPOSE_CODE; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentIdFact; import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; import lombok.extern.slf4j.Slf4j; import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.DateTimeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import java.util.Date; - -import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; -import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; -import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; - @Slf4j public class MovementReportDocumentFactMapper { @@ -61,6 +60,9 @@ public MovementReportDocumentFact generateFactForMovementReportDocument(FLUXVess xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, XPathConstants.CREATION_DATE_TIME).storeInRepo(fact, CREATION_DATE_TIME); fact.setIds(vesselPositionMessage.getFLUXReportDocument().getIDS()); xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, XPathConstants.ID).storeInRepo(fact, "id"); + CodeType purposeCode = vesselPositionMessage.getFLUXReportDocument().getPurposeCode(); + fact.setPurposeCode(purposeCode); + xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, PURPOSE_CODE).storeInRepo(fact, PURPOSE_CODE); return fact; } From 64c89858073859294e81ab3c31368bb74c290b4f Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Tue, 2 Feb 2021 16:09:15 +0200 Subject: [PATCH 12/17] [UNIONVMS-MOVEMENT-RULES] Implement rule VP-L01-00-0010. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 29 +++++++++++++++++++ .../fact/MovementReportDocumentFact.java | 4 +++ 2 files changed, 33 insertions(+) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 0f73b7863..057d995a5 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -225,5 +225,34 @@ br_id = 'VP-L01-00-0009' + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20010 + + + br_id = 'VP-L01-00-0010' + + diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index ddf2f8e97..3d7a08711 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -80,6 +80,10 @@ public boolean hasValidPurposeCodeListId(CodeType purposeCode) { return MDRAcronymType.FLUX_GP_PURPOSE.name().equals(purposeCode.getListID()); } + public boolean hasValidPurposeCodeValue(CodeType purposeCode) { + return "9".equals(purposeCode.getValue()); + } + @Override public void setFactType() { this.factType = FactType.MOVEMENT_REPORT_DOCUMENT; From fcc866b31265b361e43eea5080b77e102836d30f Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Wed, 3 Feb 2021 14:05:07 +0200 Subject: [PATCH 13/17] [UNIONVMS-MOVEMENT-RULES] Implement rule VP-L00-00-0020. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 33 +++++++++++++++++-- .../fact/MovementReportDocumentFact.java | 11 ++++--- .../MovementReportDocumentFactMapper.java | 5 ++- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 057d995a5..cfcbc8c82 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -210,7 +210,7 @@ - + @@ -239,7 +239,7 @@ - + @@ -254,5 +254,34 @@ br_id = 'VP-L01-00-0010' + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 30020 + + + br_id = 'VP-L00-00-0020' + + diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index 3d7a08711..420efb5e8 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -21,8 +21,8 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; -import eu.europa.ec.fisheries.uvms.rules.service.constants.MDRAcronymType; import lombok.Data; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXPartyType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; @@ -34,6 +34,7 @@ public class MovementReportDocumentFact extends AbstractFact { private String creationDateTimeString; private List ids; private CodeType purposeCode; + private FLUXPartyType ownerFLUXParty; public boolean containsTypesOfIdXTimes(List ids,String schemaType,int count){ @@ -76,12 +77,12 @@ public boolean isDateInThePast(Date creationDateTime){ return creationDateTime.after(startDate) && creationDateTime.before(serverDate.getTime()); } - public boolean hasValidPurposeCodeListId(CodeType purposeCode) { - return MDRAcronymType.FLUX_GP_PURPOSE.name().equals(purposeCode.getListID()); + public boolean hasValidPurposeCodeListId(CodeType purposeCode, String defaultValue) { + return defaultValue.equals(purposeCode.getListID()); } - public boolean hasValidPurposeCodeValue(CodeType purposeCode) { - return "9".equals(purposeCode.getValue()); + public boolean hasValidPurposeCodeValue(CodeType purposeCode, String defaultValue) { + return defaultValue.equals(purposeCode.getValue()); } @Override diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index 36a36f7f4..be7003b5d 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -14,6 +14,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.CREATION_DATE_TIME; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.FLUX_REPORT_DOCUMENT; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.OWNER_FLUX_PARTY; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.PURPOSE_CODE; import java.util.ArrayList; @@ -63,7 +64,9 @@ public MovementReportDocumentFact generateFactForMovementReportDocument(FLUXVess CodeType purposeCode = vesselPositionMessage.getFLUXReportDocument().getPurposeCode(); fact.setPurposeCode(purposeCode); xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, PURPOSE_CODE).storeInRepo(fact, PURPOSE_CODE); - + fact.setOwnerFLUXParty(vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty()); + xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, OWNER_FLUX_PARTY).storeInRepo(fact, OWNER_FLUX_PARTY); + return fact; } From fdd716b856a0d7068e3b79a22759919375892161 Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Wed, 3 Feb 2021 15:55:33 +0200 Subject: [PATCH 14/17] [UNIONVMS-MOVEMENT-RULES] Implement rule VP-L01-00-0021. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 45 +++++++++++++++++++ .../src/main/resources/contract/Template.xsd | 1 + .../rules/service/bean/ContainerType.java | 2 +- ...MovementReportDocOwnerFluxPartyIdFact.java | 21 +++++++++ .../generator/MovementFactGenerator.java | 1 + .../business/helper/DrtPathHelper.java | 1 + .../MovementReportDocumentFactMapper.java | 21 +++++++++ .../MovementReportDocOwnerFluxPartyId.drt | 34 ++++++++++++++ 8 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java create mode 100644 service/src/main/resources/templates/MovementReportDocOwnerFluxPartyId.drt diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index cfcbc8c82..3dcf023a4 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -284,4 +284,49 @@ + + + + + + + + + + + + template_id = 2002 + + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20021 + + + br_id = 'VP-L01-00-0021' + + + diff --git a/model/src/main/resources/contract/Template.xsd b/model/src/main/resources/contract/Template.xsd index 851aa2614..95536c1c5 100755 --- a/model/src/main/resources/contract/Template.xsd +++ b/model/src/main/resources/contract/Template.xsd @@ -89,6 +89,7 @@ + \ No newline at end of file diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java index 0d956967c..cc240ce6f 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java @@ -47,7 +47,7 @@ public enum ContainerType { FactType.SALES_VALIDATION_RESULT_DOCUMENT, FactType.SALES_VALIDATION_QUALITY_ANALYSIS,FactType.SALES_REPORT_WRAPPER, FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE), - MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID); + MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID, FactType.MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID); private final String packageName; private final String containerName; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java new file mode 100644 index 000000000..dfffd5ff1 --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java @@ -0,0 +1,21 @@ +package eu.europa.ec.fisheries.uvms.rules.service.business.fact; + +import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import lombok.Data; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; + +@Data +public class MovementReportDocOwnerFluxPartyIdFact extends AbstractFact { + + private IDType id; + + public boolean hasValidSchemeID(IDType id, String schemeID) { + return schemeID.equals(id.getSchemeID()); + } + + @Override + public void setFactType() { + this.factType = FactType.MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID; + } +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java index 557982027..2e82943b2 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -55,6 +55,7 @@ public List generateAllFacts() { if (fluxReportDocument != null) { facts.add(movementReportDocumentFactMapper.generateFactForMovementReportDocument(vesselPositionMessage)); facts.addAll(movementReportDocumentFactMapper.generateFactForMovementReportDocumentId(vesselPositionMessage)); + facts.addAll(movementReportDocumentFactMapper.generateFactForMovementReportDocOwnerFluxPartyId(vesselPositionMessage)); } String df = (String) extraValueMap.get(DATA_FLOW); diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java index 6f2b63444..86ad4c048 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java @@ -36,6 +36,7 @@ public enum DrtPathHelper { FA_QUERY_PARAMETER("/templates/FaQueryParameter.drt"), MOVEMENT_REPORT_DOCUMENT("/templates/MovementReportDocument.drt"), MOVEMENT_REPORT_DOCUMENT_ID("/templates/MovementReportDocumentId.drt"), + MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID("/templates/MovementReportDocOwnerFluxPartyId.drt"), FA_RELOCATION("/templates/FaRelocation.drt"), FA_RESPONSE("/templates/FaResponse.drt"), FA_TRANSHIPMENT("/templates/FaTranshipment.drt"), diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index be7003b5d..e43a3693c 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -21,6 +21,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import java.util.Date; import java.util.List; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocOwnerFluxPartyIdFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentIdFact; import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; @@ -92,6 +93,26 @@ public List generateFactForMovementReportDocumentI } return factList; } + + public List generateFactForMovementReportDocOwnerFluxPartyId(FLUXVesselPositionMessage vesselPositionMessage) { + List factList = new ArrayList<>(); + + if(vesselPositionMessage == null || vesselPositionMessage.getFLUXReportDocument() == null || vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty() == null || vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty().getIDS().isEmpty()){ + xPathUtil.clear(); + return factList; + } + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).append(FLUX_REPORT_DOCUMENT).append(OWNER_FLUX_PARTY).getValue(); + List ids = vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty().getIDS(); + int index = 1; + for(IDType idType: ids){ + MovementReportDocOwnerFluxPartyIdFact fact = new MovementReportDocOwnerFluxPartyIdFact(); + fact.setId(idType); + xPathUtil.appendWithoutWrapping(partialXpath).appendWithIndex(XPathConstants.ID,index).storeInRepo(fact, "ownerFluxPartyId"); + factList.add(fact); + index ++; + } + return factList; + } public static MovementReportDocumentFact mapToMovementReportDocumentFact(FLUXVesselPositionMessage vesselPositionMessage){ diff --git a/service/src/main/resources/templates/MovementReportDocOwnerFluxPartyId.drt b/service/src/main/resources/templates/MovementReportDocOwnerFluxPartyId.drt new file mode 100644 index 000000000..42e12cb56 --- /dev/null +++ b/service/src/main/resources/templates/MovementReportDocOwnerFluxPartyId.drt @@ -0,0 +1,34 @@ +template header + +tname +expression +brid +rulemsg +type +level +propertyNames +context + +package eu.europa.ec.fisheries.uvms.rules.service.business.activity; + +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocOwnerFluxPartyIdFact; +import java.util.Arrays; +global eu.europa.ec.fisheries.uvms.rules.service.business.helper.RuleApplicabilityChecker appliChecker; +global eu.europa.ec.fisheries.uvms.rules.service.MDRCacheRuleService mdrService; + + +template "@{tname}" + +rule "Movement Report Document Owner Flux Party Id @{tname} - @{brid} - Context : @{context}" + +when + + $fact : MovementReportDocOwnerFluxPartyIdFact((appliChecker.isApplicable("@{brid}", "@{context}", getMessageDataFlow(), getCreationDateOfMessage(), mdrService)) && (@{expression})) + +then + $fact.setOk(false); + $fact.addWarningOrError(mdrService.getErrorTypeStrForForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), mdrService.getErrorMessageForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), "@{brid}", "@{level}", "@{propertyNames}"); + +end + +end template \ No newline at end of file From 7ff5bc45551313f155bd959823a043dd45969610 Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Wed, 3 Feb 2021 18:12:15 +0200 Subject: [PATCH 15/17] [UNIONVMS-MOVEMENT-RULES] Implement rule VP-L01-00-0022. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 30 +++++++++++++++++++ ...MovementReportDocOwnerFluxPartyIdFact.java | 2 ++ .../MovementReportDocumentFactMapper.java | 4 +++ 3 files changed, 36 insertions(+) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 3dcf023a4..0f658e534 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -328,5 +328,35 @@ br_id = 'VP-L01-00-0021' + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20022 + + + br_id = 'VP-L01-00-0022' + + diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java index dfffd5ff1..406c1bd69 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocOwnerFluxPartyIdFact.java @@ -3,12 +3,14 @@ import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import lombok.Data; +import org.joda.time.DateTime; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; @Data public class MovementReportDocOwnerFluxPartyIdFact extends AbstractFact { private IDType id; + private DateTime creationDateTime; public boolean hasValidSchemeID(IDType id, String schemeID) { return schemeID.equals(id.getSchemeID()); diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index e43a3693c..d1814f856 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -27,6 +27,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.DateTimeType; @@ -101,12 +102,15 @@ public List generateFactForMovementReport xPathUtil.clear(); return factList; } + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).append(FLUX_REPORT_DOCUMENT).append(OWNER_FLUX_PARTY).getValue(); List ids = vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty().getIDS(); + Date creationDate = getDate(vesselPositionMessage.getFLUXReportDocument().getCreationDateTime()); int index = 1; for(IDType idType: ids){ MovementReportDocOwnerFluxPartyIdFact fact = new MovementReportDocOwnerFluxPartyIdFact(); fact.setId(idType); + fact.setCreationDateTime(new DateTime(creationDate)); xPathUtil.appendWithoutWrapping(partialXpath).appendWithIndex(XPathConstants.ID,index).storeInRepo(fact, "ownerFluxPartyId"); factList.add(fact); index ++; From c6485ad040b80035bf70d03fa0cd5a429283c184 Mon Sep 17 00:00:00 2001 From: gmanifavas Date: Fri, 5 Feb 2021 16:58:59 +0200 Subject: [PATCH 16/17] [UNIONVMS-MOVEMENT-RULES] Implement rule VP-L01-00-0101. --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 45 +++++++++++++++++++ .../src/main/resources/contract/Template.xsd | 1 + .../rules/service/bean/ContainerType.java | 3 +- .../MovementVesselTransportMeansIdFact.java | 19 ++++++++ .../generator/MovementFactGenerator.java | 1 + .../business/helper/DrtPathHelper.java | 1 + .../service/constants/XPathConstants.java | 2 + .../MovementReportDocumentFactMapper.java | 26 +++++++++++ .../MovementVesselTransportMeansId.drt | 34 ++++++++++++++ 9 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementVesselTransportMeansIdFact.java create mode 100644 service/src/main/resources/templates/MovementVesselTransportMeansId.drt diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index 0f658e534..bdcb5f62b 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -359,4 +359,49 @@ + + + + + + + + + + + template_id = 2003 + + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 20101 + + + br_id = 'VP-L01-00-0101' + + + + diff --git a/model/src/main/resources/contract/Template.xsd b/model/src/main/resources/contract/Template.xsd index 95536c1c5..e07152f21 100755 --- a/model/src/main/resources/contract/Template.xsd +++ b/model/src/main/resources/contract/Template.xsd @@ -90,6 +90,7 @@ + \ No newline at end of file diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java index cc240ce6f..7d529af6d 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/ContainerType.java @@ -47,7 +47,8 @@ public enum ContainerType { FactType.SALES_VALIDATION_RESULT_DOCUMENT, FactType.SALES_VALIDATION_QUALITY_ANALYSIS,FactType.SALES_REPORT_WRAPPER, FactType.SALES_AUCTION_SALE, FactType.SALES_FLUX_SALES_QUERY_MESSAGE, FactType.SALES_QUERY_PARAMETER, FactType.SALES_FLUX_SALES_RESPONSE_MESSAGE), - MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID, FactType.MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID); + MOVEMENTS("movement","ec.europa.eu.movement", FactType.MOVEMENT_REPORT_DOCUMENT, FactType.MOVEMENT_REPORT_DOCUMENT_ID, + FactType.MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID, FactType.MOVEMENT_VESSEL_TRANSPORT_MEANS_ID); private final String packageName; private final String containerName; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementVesselTransportMeansIdFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementVesselTransportMeansIdFact.java new file mode 100644 index 000000000..d3dbd1c23 --- /dev/null +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementVesselTransportMeansIdFact.java @@ -0,0 +1,19 @@ +package eu.europa.ec.fisheries.uvms.rules.service.business.fact; + +import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; +import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; +import lombok.Data; +import org.joda.time.DateTime; +import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; + +@Data +public class MovementVesselTransportMeansIdFact extends AbstractFact { + + private IDType id; + private DateTime creationDateTime; + + @Override + public void setFactType() { + this.factType = FactType.MOVEMENT_VESSEL_TRANSPORT_MEANS_ID; + } +} diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java index 2e82943b2..757ecd1fc 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -56,6 +56,7 @@ public List generateAllFacts() { facts.add(movementReportDocumentFactMapper.generateFactForMovementReportDocument(vesselPositionMessage)); facts.addAll(movementReportDocumentFactMapper.generateFactForMovementReportDocumentId(vesselPositionMessage)); facts.addAll(movementReportDocumentFactMapper.generateFactForMovementReportDocOwnerFluxPartyId(vesselPositionMessage)); + facts.addAll(movementReportDocumentFactMapper.generateFactForMovementVesselTransportMeansId(vesselPositionMessage)); } String df = (String) extraValueMap.get(DATA_FLOW); diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java index 86ad4c048..fbb8663d2 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/helper/DrtPathHelper.java @@ -37,6 +37,7 @@ public enum DrtPathHelper { MOVEMENT_REPORT_DOCUMENT("/templates/MovementReportDocument.drt"), MOVEMENT_REPORT_DOCUMENT_ID("/templates/MovementReportDocumentId.drt"), MOVEMENT_REPORT_DOC_OWNER_FLUX_PARTY_ID("/templates/MovementReportDocOwnerFluxPartyId.drt"), + MOVEMENT_VESSEL_TRANSPORT_MEANS_ID("/templates/MovementVesselTransportMeansId.drt"), FA_RELOCATION("/templates/FaRelocation.drt"), FA_RESPONSE("/templates/FaResponse.drt"), FA_TRANSHIPMENT("/templates/FaTranshipment.drt"), diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java index c7f972fb1..a65bb751b 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/constants/XPathConstants.java @@ -39,6 +39,8 @@ public class XPathConstants { public static final String RELATED_FLUX_REPORT_DOCUMENT = "RelatedFLUXReportDocument"; public static final String TYPE_CODE = "TypeCode"; public static final String RELATED_REPORT_ID = "RelatedReportID"; + public static final String VESSEL_TRANSPORT_MEANS = "VesselTransportMeans"; + public static final String VESSEL_TRANSPORT_MEANS_ID = "VesselTransportMeansId"; public static final String SPECIFIED_VESSEL_TRANSPORT_MEANS = "SpecifiedVesselTransportMeans"; public static final String RELATED_FISHING_ACTIVITY = "RelatedFishingActivity"; public static final String SPECIFIED_DELIMITED_PERIOD = "SpecifiedDelimitedPeriod"; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index d1814f856..1e802c568 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -16,6 +16,8 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.OWNER_FLUX_PARTY; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.PURPOSE_CODE; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.VESSEL_TRANSPORT_MEANS; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.VESSEL_TRANSPORT_MEANS_ID; import java.util.ArrayList; import java.util.Date; @@ -24,6 +26,7 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocOwnerFluxPartyIdFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentIdFact; +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementVesselTransportMeansIdFact; import eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants; import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; import lombok.extern.slf4j.Slf4j; @@ -117,6 +120,29 @@ public List generateFactForMovementReport } return factList; } + + public List generateFactForMovementVesselTransportMeansId(FLUXVesselPositionMessage vesselPositionMessage) { + List factList = new ArrayList<>(); + + if(vesselPositionMessage == null || vesselPositionMessage.getVesselTransportMeans() == null || vesselPositionMessage.getVesselTransportMeans().getIDS().isEmpty()){ + xPathUtil.clear(); + return null; + } + + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).append(VESSEL_TRANSPORT_MEANS).getValue(); + List ids = vesselPositionMessage.getVesselTransportMeans().getIDS(); + Date creationDate = getDate(vesselPositionMessage.getFLUXReportDocument().getCreationDateTime()); + int index = 1; + for(IDType idType: ids){ + MovementVesselTransportMeansIdFact fact = new MovementVesselTransportMeansIdFact(); + fact.setId(idType); + fact.setCreationDateTime(new DateTime(creationDate)); + xPathUtil.appendWithoutWrapping(partialXpath).appendWithIndex(XPathConstants.ID,index).storeInRepo(fact, VESSEL_TRANSPORT_MEANS_ID); + factList.add(fact); + index ++; + } + return factList; + } public static MovementReportDocumentFact mapToMovementReportDocumentFact(FLUXVesselPositionMessage vesselPositionMessage){ diff --git a/service/src/main/resources/templates/MovementVesselTransportMeansId.drt b/service/src/main/resources/templates/MovementVesselTransportMeansId.drt new file mode 100644 index 000000000..3cf56c60b --- /dev/null +++ b/service/src/main/resources/templates/MovementVesselTransportMeansId.drt @@ -0,0 +1,34 @@ +template header + +tname +expression +brid +rulemsg +type +level +propertyNames +context + +package eu.europa.ec.fisheries.uvms.rules.service.business.activity; + +import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementVesselTransportMeansIdFact; +import java.util.Arrays; +global eu.europa.ec.fisheries.uvms.rules.service.business.helper.RuleApplicabilityChecker appliChecker; +global eu.europa.ec.fisheries.uvms.rules.service.MDRCacheRuleService mdrService; + + +template "@{tname}" + +rule "Movement Vessel Transport Means Id @{tname} - @{brid} - Context : @{context}" + +when + + $fact : MovementVesselTransportMeansIdFact((appliChecker.isApplicable("@{brid}", "@{context}", getMessageDataFlow(), getCreationDateOfMessage(), mdrService)) && (@{expression})) + +then + $fact.setOk(false); + $fact.addWarningOrError(mdrService.getErrorTypeStrForForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), mdrService.getErrorMessageForBrIAndDFAndValidity("@{brid}", "@{context}", $fact.getCreationJavaDateOfMessage()), "@{brid}", "@{level}", "@{propertyNames}"); + +end + +end template \ No newline at end of file From 5d3ca32c8a8f20d343b3d377317fa73b5409aee5 Mon Sep 17 00:00:00 2001 From: kwstaspgr Date: Fri, 5 Feb 2021 16:59:31 +0200 Subject: [PATCH 17/17] [UNIONVMS-5014] Implement rules VP-L00-00-0200 VP-L01-00-0201 VP-L01-00-0202 --- .../v3.4/db-changelog-UNIONVMS-4660.xml | 98 ++++++++++++++++++- .../fact/MovementReportDocumentFact.java | 15 ++- .../generator/MovementFactGenerator.java | 2 + .../MovementReportDocumentFactMapper.java | 21 +++- 4 files changed, 129 insertions(+), 7 deletions(-) diff --git a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml index bdcb5f62b..0c10a0faf 100644 --- a/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml +++ b/LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml @@ -359,7 +359,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -404,4 +404,98 @@ + + + + + + + + + + + + + + + + + + + + + + + rule_id = 30200 + + + br_id = 'VP-L00-00-0200' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 30201 + + + br_id = 'VP-L01-00-0201' + + + + + + + + + + + + + + + + + + + + + + + + + + rule_id = 30202 + + + br_id = 'VP-L01-00-0202' + + + + diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java index 420efb5e8..7e7afcedc 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/fact/MovementReportDocumentFact.java @@ -22,7 +22,9 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.schema.rules.template.v1.FactType; import eu.europa.ec.fisheries.uvms.rules.service.business.AbstractFact; import lombok.Data; +import org.joda.time.DateTime; import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXPartyType; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselCountryType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.CodeType; import un.unece.uncefact.data.standard.unqualifieddatatype._18.IDType; @@ -35,6 +37,9 @@ public class MovementReportDocumentFact extends AbstractFact { private List ids; private CodeType purposeCode; private FLUXPartyType ownerFLUXParty; + private VesselCountryType registrationVesselCountry; + private IDType registrationVesselCountryIdType; + private DateTime dateTime; public boolean containsTypesOfIdXTimes(List ids,String schemaType,int count){ @@ -84,7 +89,15 @@ public boolean hasValidPurposeCodeListId(CodeType purposeCode, String defaultVal public boolean hasValidPurposeCodeValue(CodeType purposeCode, String defaultValue) { return defaultValue.equals(purposeCode.getValue()); } - + + public boolean hasValidSchemeId(String schemeId, String expectedValue) { + return schemeId != null && !schemeId.isEmpty() && expectedValue.equals(schemeId); + } + + public boolean hasValidIdType(IDType idType) { + return idType != null && idType.getValue() != null && !idType.getValue().isEmpty(); + } + @Override public void setFactType() { this.factType = FactType.MOVEMENT_REPORT_DOCUMENT; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java index 757ecd1fc..29e8c48ab 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/business/generator/MovementFactGenerator.java @@ -18,6 +18,8 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import eu.europa.ec.fisheries.uvms.rules.service.mapper.xpath.util.XPathStringWrapper; import un.unece.uncefact.data.standard.fluxvesselpositionmessage._4.FLUXVesselPositionMessage; import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.FLUXReportDocumentType; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselTransportMeansType; +import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._20.VesselTransportMeans; import java.util.ArrayList; import java.util.List; diff --git a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java index 1e802c568..e9cf509d7 100644 --- a/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java +++ b/service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/mapper/fact/MovementReportDocumentFactMapper.java @@ -16,12 +16,14 @@ This file is part of the Integrated Fisheries Data Management (IFDM) Suite. The import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.MOVEMENT_REPORT_DOCUMENT; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.OWNER_FLUX_PARTY; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.PURPOSE_CODE; +import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.REGISTRATION_VESSEL_COUNTRY; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.VESSEL_TRANSPORT_MEANS; import static eu.europa.ec.fisheries.uvms.rules.service.constants.XPathConstants.VESSEL_TRANSPORT_MEANS_ID; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Optional; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocOwnerFluxPartyIdFact; import eu.europa.ec.fisheries.uvms.rules.service.business.fact.MovementReportDocumentFact; @@ -71,7 +73,18 @@ public MovementReportDocumentFact generateFactForMovementReportDocument(FLUXVess xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, PURPOSE_CODE).storeInRepo(fact, PURPOSE_CODE); fact.setOwnerFLUXParty(vesselPositionMessage.getFLUXReportDocument().getOwnerFLUXParty()); xPathUtil.appendWithoutWrapping(partialXpath).append(FLUX_REPORT_DOCUMENT, OWNER_FLUX_PARTY).storeInRepo(fact, OWNER_FLUX_PARTY); - + + Optional.ofNullable(vesselPositionMessage.getVesselTransportMeans()).ifPresent(vtm -> { + fact.setRegistrationVesselCountry(vesselPositionMessage.getVesselTransportMeans().getRegistrationVesselCountry()); + xPathUtil.appendWithoutWrapping(partialXpath).append(VESSEL_TRANSPORT_MEANS, REGISTRATION_VESSEL_COUNTRY).storeInRepo(fact, REGISTRATION_VESSEL_COUNTRY); + + Optional.ofNullable(vtm.getRegistrationVesselCountry()).ifPresent(rvc -> { + fact.setRegistrationVesselCountryIdType(rvc.getID()); + xPathUtil.appendWithoutWrapping(partialXpath).append(REGISTRATION_VESSEL_COUNTRY, XPathConstants.ID).storeInRepo(fact, "registrationVesselCountryId"); + }); + }); + fact.setDateTime(new DateTime(getDate(creationDateTime))); + return fact; } @@ -120,15 +133,15 @@ public List generateFactForMovementReport } return factList; } - + public List generateFactForMovementVesselTransportMeansId(FLUXVesselPositionMessage vesselPositionMessage) { List factList = new ArrayList<>(); - + if(vesselPositionMessage == null || vesselPositionMessage.getVesselTransportMeans() == null || vesselPositionMessage.getVesselTransportMeans().getIDS().isEmpty()){ xPathUtil.clear(); return null; } - + String partialXpath = xPathUtil.append(MOVEMENT_REPORT_DOCUMENT).append(VESSEL_TRANSPORT_MEANS).getValue(); List ids = vesselPositionMessage.getVesselTransportMeans().getIDS(); Date creationDate = getDate(vesselPositionMessage.getFLUXReportDocument().getCreationDateTime());