Skip to content

Commit 14fb440

Browse files
author
gmanifavas
committed
[UNIONVMS-5040] Rules for VesselTransportMeans
1 parent 60367a7 commit 14fb440

9 files changed

Lines changed: 248 additions & 11 deletions

File tree

LIQUIBASE/changelog/v3.4/db-changelog-UNIONVMS-4660.xml

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,4 +721,168 @@
721721
</delete>
722722
</rollback>
723723
</changeSet>
724+
725+
<changeSet id="UNIONVMS-4660-update-VP-L03-00-0110" author="gmanifavas">
726+
727+
<insert tableName="rule">
728+
<column name="template_id" value="3004" />
729+
<column name="property_names" value="RegistrationVesselCountryId" />
730+
<column name="note" value="" />
731+
<column name="level" value="L03" />
732+
<column name="error_type" value="WARNING" />
733+
<column name="disabled" value="false" />
734+
<column name="br_id" value="VP-L03-00-0110" />
735+
<column name="rule_id" value="30110"/>
736+
</insert >
737+
<insert tableName="context_expression">
738+
<column name="expression" value="hasSchemeId(ids, &quot;CFR&quot;) &amp;&amp; hasExistingAsset(asset) &amp;&amp;
739+
registrationVesselCountry != null &amp;&amp; registrationVesselCountry.getID() !=null &amp;&amp;
740+
!mdrService.isPresentInMDRList(&quot;MEMBER_STATE&quot;, registrationVesselCountry.getID().getValue(), creationDateTime)"/>
741+
<column name="failure_message" value="CFR provided but the vessel is not found in the vessel register or the information is inconsistent."/>
742+
<column name="context" value="EU"/>
743+
<column name="rule_id" value="30110"/>
744+
<column name="id" value="30110"/>
745+
</insert >
746+
747+
<rollback>
748+
<delete tableName="context_expression">
749+
<where>rule_id = 30110</where>
750+
</delete>
751+
<delete tableName="rule">
752+
<where>br_id = 'VP-L03-00-0110'</where>
753+
</delete>
754+
</rollback>
755+
</changeSet>
756+
757+
<changeSet id="UNIONVMS-4660-update-VP-L03-00-0111" author="gmanifavas">
758+
759+
<insert tableName="rule">
760+
<column name="template_id" value="3004" />
761+
<column name="property_names" value="RegistrationVesselCountryId" />
762+
<column name="note" value="" />
763+
<column name="level" value="L03" />
764+
<column name="error_type" value="WARNING" />
765+
<column name="disabled" value="false" />
766+
<column name="br_id" value="VP-L03-00-0111" />
767+
<column name="rule_id" value="30111"/>
768+
</insert >
769+
<insert tableName="context_expression">
770+
<column name="expression" value="(hasSchemeId(ids, &quot;IRCS&quot;) || hasSchemeId(ids, &quot;EXT_MARK&quot;)) &amp;&amp;
771+
hasExistingAsset(asset) &amp;&amp;
772+
registrationVesselCountry != null &amp;&amp; registrationVesselCountry.getID() !=null &amp;&amp;
773+
!mdrService.isPresentInMDRList(&quot;MEMBER_STATE&quot;, registrationVesselCountry.getID().getValue(), creationDateTime)"/>
774+
<column name="failure_message" value="IRCS or External Marking provided but the vessel is not found in the vessel register or the information is inconsistent."/>
775+
<column name="context" value="EU"/>
776+
<column name="rule_id" value="30111"/>
777+
<column name="id" value="30111"/>
778+
</insert >
779+
780+
<rollback>
781+
<delete tableName="context_expression">
782+
<where>rule_id = 30111</where>
783+
</delete>
784+
<delete tableName="rule">
785+
<where>br_id = 'VP-L03-00-0111'</where>
786+
</delete>
787+
</rollback>
788+
</changeSet>
789+
790+
<changeSet id="UNIONVMS-4660-update-VP-L03-00-0112" author="gmanifavas">
791+
792+
<insert tableName="rule">
793+
<column name="template_id" value="3004" />
794+
<column name="property_names" value="RegistrationVesselCountryId" />
795+
<column name="note" value="" />
796+
<column name="level" value="L03" />
797+
<column name="error_type" value="WARNING" />
798+
<column name="disabled" value="false" />
799+
<column name="br_id" value="VP-L03-00-0112" />
800+
<column name="rule_id" value="30112"/>
801+
</insert >
802+
<insert tableName="context_expression">
803+
<column name="expression" value="hasSchemeId(ids, &quot;UVI&quot;) &amp;&amp;
804+
hasExistingAsset(asset) &amp;&amp;
805+
registrationVesselCountry != null &amp;&amp; registrationVesselCountry.getID() !=null &amp;&amp;
806+
!mdrService.isPresentInMDRList(&quot;MEMBER_STATE&quot;, registrationVesselCountry.getID().getValue(), creationDateTime)"/>
807+
<column name="failure_message" value="UVI is provided but the vessel is not found in the vessel register or the information is inconsistent."/>
808+
<column name="context" value="EU"/>
809+
<column name="rule_id" value="30112"/>
810+
<column name="id" value="30112"/>
811+
</insert >
812+
813+
<rollback>
814+
<delete tableName="context_expression">
815+
<where>rule_id = 30112</where>
816+
</delete>
817+
<delete tableName="rule">
818+
<where>br_id = 'VP-L03-00-0112'</where>
819+
</delete>
820+
</rollback>
821+
</changeSet>
822+
823+
<changeSet id="UNIONVMS-4660-update-VP-L03-00-0113" author="gmanifavas">
824+
825+
<insert tableName="rule">
826+
<column name="template_id" value="3004" />
827+
<column name="property_names" value="RegistrationVesselCountryId" />
828+
<column name="note" value="" />
829+
<column name="level" value="L03" />
830+
<column name="error_type" value="WARNING" />
831+
<column name="disabled" value="false" />
832+
<column name="br_id" value="VP-L03-00-0113" />
833+
<column name="rule_id" value="30113"/>
834+
</insert >
835+
<insert tableName="context_expression">
836+
<column name="expression" value="hasSchemeId(ids, &quot;ICCAT&quot;) &amp;&amp;
837+
hasExistingAsset(asset) &amp;&amp;
838+
registrationVesselCountry != null &amp;&amp; registrationVesselCountry.getID() !=null &amp;&amp;
839+
!mdrService.isPresentInMDRList(&quot;MEMBER_STATE&quot;, registrationVesselCountry.getID().getValue(), creationDateTime)"/>
840+
<column name="failure_message" value="ICCAT vessel ID is provided but the vessel is not found in the vessel register or the information is inconsistent."/>
841+
<column name="context" value="EU"/>
842+
<column name="rule_id" value="30113"/>
843+
<column name="id" value="30113"/>
844+
</insert >
845+
846+
<rollback>
847+
<delete tableName="context_expression">
848+
<where>rule_id = 30113</where>
849+
</delete>
850+
<delete tableName="rule">
851+
<where>br_id = 'VP-L03-00-0113'</where>
852+
</delete>
853+
</rollback>
854+
</changeSet>
855+
856+
<changeSet id="UNIONVMS-4660-update-VP-L03-00-0114" author="gmanifavas">
857+
858+
<insert tableName="rule">
859+
<column name="template_id" value="3004" />
860+
<column name="property_names" value="RegistrationVesselCountryId" />
861+
<column name="note" value="" />
862+
<column name="level" value="L03" />
863+
<column name="error_type" value="WARNING" />
864+
<column name="disabled" value="false" />
865+
<column name="br_id" value="VP-L03-00-0114" />
866+
<column name="rule_id" value="30114"/>
867+
</insert >
868+
<insert tableName="context_expression">
869+
<column name="expression" value="hasSchemeId(ids, &quot;GFCM&quot;) &amp;&amp;
870+
hasExistingAsset(asset) &amp;&amp;
871+
registrationVesselCountry != null &amp;&amp; registrationVesselCountry.getID() !=null &amp;&amp;
872+
!mdrService.isPresentInMDRList(&quot;MEMBER_STATE&quot;, registrationVesselCountry.getID().getValue(), creationDateTime)"/>
873+
<column name="failure_message" value="GFCM vessel ID is provided but the vessel is not found in the vessel register or the information is inconsistent."/>
874+
<column name="context" value="EU"/>
875+
<column name="rule_id" value="30114"/>
876+
<column name="id" value="30114"/>
877+
</insert >
878+
879+
<rollback>
880+
<delete tableName="context_expression">
881+
<where>rule_id = 30114</where>
882+
</delete>
883+
<delete tableName="rule">
884+
<where>br_id = 'VP-L03-00-0114'</where>
885+
</delete>
886+
</rollback>
887+
</changeSet>
724888
</databaseChangeLog>

service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/FLUXVesselPositionMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public class FLUXVesselPositionMapper {
5959
* @param registerClassName
6060
* @return
6161
*/
62-
public static List<RawMovementType> mapToRawMovementTypes(FLUXVesselPositionMessage fluxVesselPositionMessage, String registerClassName, String pluginType, Map<String, MovementTypeType> mapToMovementType) {
62+
public static List<RawMovementType> mapToRawMovementTypes(FLUXVesselPositionMessage fluxVesselPositionMessage, MovementVesselMappingContext ctx, String registerClassName, String pluginType, Map<String, MovementTypeType> mapToMovementType) {
6363
VesselTransportMeansType positionReport = fluxVesselPositionMessage.getVesselTransportMeans();
6464
List<RawMovementType> rowMovements = new ArrayList<>();
6565
for (VesselPositionEventType col : positionReport.getSpecifiedVesselPositionEvents()) {
@@ -76,6 +76,9 @@ public static List<RawMovementType> mapToRawMovementTypes(FLUXVesselPositionMess
7676
rawMovement.setPluginName(registerClassName);
7777
rawMovement.setDateRecieved(DateUtils.getNowDateUTC());
7878
rowMovements.add(rawMovement);
79+
if(ctx != null) {
80+
ctx.put(positionReport, rawMovement);
81+
}
7982
}
8083
return rowMovements;
8184
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package eu.europa.ec.fisheries.uvms.rules.service.bean.movement;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import eu.europa.ec.fisheries.schema.rules.movement.v1.RawMovementType;
7+
import eu.europa.ec.fisheries.wsdl.asset.types.Asset;
8+
import un.unece.uncefact.data.standard.reusableaggregatebusinessinformationentity._18.VesselTransportMeansType;
9+
10+
public class MovementVesselMappingContext {
11+
12+
private Map<VesselTransportMeansType, RawMovementType> vesselTransportMeansToRawMovement = new HashMap<>();
13+
14+
private Map<RawMovementType, Asset> rawMovementToAsset = new HashMap<>();
15+
16+
public void put(VesselTransportMeansType vesselTransportMeansType, RawMovementType rawMovementType) {
17+
vesselTransportMeansToRawMovement.put(vesselTransportMeansType, rawMovementType);
18+
}
19+
20+
public void put(RawMovementType rawMovementType, Asset asset) {
21+
rawMovementToAsset.put(rawMovementType, asset);
22+
}
23+
24+
public RawMovementType getRawMovement(VesselTransportMeansType vesselTransportMeansType) {
25+
return vesselTransportMeansToRawMovement.get(vesselTransportMeansType);
26+
}
27+
28+
public Asset getAsset(RawMovementType rawMovementType) {
29+
return rawMovementToAsset.get(rawMovementType);
30+
}
31+
}

service/src/main/java/eu/europa/ec/fisheries/uvms/rules/service/bean/movement/RulesMovementProcessorBean.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static eu.europa.ec.fisheries.uvms.movement.model.exception.ErrorCode.MOVEMENT_DUPLICATE_ERROR;
1717
import static eu.europa.ec.fisheries.uvms.rules.service.config.BusinessObjectType.RECEIVING_MOVEMENT_MSG;
1818
import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.DATA_FLOW;
19+
import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.MOVEMENT_VESSEL_MAP;
1920
import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.SENDER_RECEIVER;
2021
import static eu.europa.ec.fisheries.uvms.rules.service.config.ExtraValueType.XML;
2122

@@ -270,9 +271,10 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri
270271
String pluginType = request.getType().name();
271272
String userName = request.getUsername();
272273
String registeredPluginClassName = request.getRegisteredClassName();
274+
MovementVesselMappingContext ctx = new MovementVesselMappingContext();
273275
try {
274276
fluxVesselPositionMessage = JAXBUtils.unMarshallMessage(request.getRequest(), FLUXVesselPositionMessage.class, null);
275-
List<RawMovementType> movementReportsList = FLUXVesselPositionMapper.mapToRawMovementTypes(fluxVesselPositionMessage, registeredPluginClassName,pluginType,mapToMovementType);
277+
List<RawMovementType> movementReportsList = FLUXVesselPositionMapper.mapToRawMovementTypes(fluxVesselPositionMessage, ctx, registeredPluginClassName,pluginType,mapToMovementType);
276278
// If no movements were received then there is no sense to continue, so just going to update the exchange log status to FAILED!
277279
if (CollectionUtils.isEmpty(movementReportsList)) {
278280
log.warn("The list of rawMovements is EMPTY! Not going to proceed neither validation not sending to Movement Module!");
@@ -281,10 +283,14 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri
281283
return;
282284
}
283285

286+
// Enrich with MobilTerminal and Assets data. Get Mobile Terminal if it exists.
287+
EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(movementReportsList, ctx);
288+
284289
Map<ExtraValueType, Object> extraValues = new EnumMap<>(ExtraValueType.class);
285290
extraValues.put(SENDER_RECEIVER, request.getSenderOrReceiver());
286291
extraValues.put(XML, request.getRequest());
287292
extraValues.put(DATA_FLOW, request.getFluxDataFlow());
293+
extraValues.put(MOVEMENT_VESSEL_MAP, ctx);
288294
Collection<AbstractFact> factsResults = rulesEngine.evaluate(RECEIVING_MOVEMENT_MSG,fluxVesselPositionMessage,extraValues,null);
289295

290296
final String reportId = fluxVesselPositionMessage.getFLUXReportDocument().getIDS().stream()
@@ -300,14 +306,14 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri
300306
}
301307
// Decomment this one and comment the other when validation is working! Still work needs to be done after this!
302308
// processReceivedMovementsAsBatch(movementReportsList, pluginType, userName, request.getLogGuid());
303-
enrichAndSenMovementsAsBatch(validationResult, movementReportsList, userName, request.getLogGuid(), request, request.getLogGuid());
309+
enrichAndSenMovementsAsBatch(validationResult, movementReportsList, enrichedWrapper, userName, request.getLogGuid(), request, request.getLogGuid());
304310
// Send some response to Movement, if it originated from there (manual movement)
305311
if (MovementSourceType.MANUAL.equals(movementReportsList.get(0).getSource())) {// A person has created a position
306312
ProcessedMovementAck response = MovementModuleResponseMapper.mapProcessedMovementAck(eu.europa.ec.fisheries.schema.movement.common.v1.AcknowledgeTypeType.OK,
307313
messageGuid, "Movement successfully processed");
308314
movOutQueueProducer.sendMessageWithSpecificIds(JAXBMarshaller.marshallJaxBObjectToString(response), movOutQueueProducer.getDestination(), null, messageGuid, messageGuid);
309315
}
310-
} catch (JAXBException | RulesModelMarshallException | MessageException | RulesValidationException e) {
316+
} catch (JAXBException | RulesModelMarshallException | MessageException | RulesValidationException | JMSException | MobileTerminalUnmarshallException | AssetModelMapperException | MobileTerminalModelMapperException e) {
311317
log.error("Error while processing received movement", e);
312318
}
313319
}
@@ -322,10 +328,8 @@ public void setMovementReportReceived(SetFLUXMovementReportRequest request, Stri
322328
* @param exchangeLogGuid
323329
* @throws RulesServiceException
324330
*/
325-
private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, List<RawMovementType> rawMovements, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request, String reportId) throws RulesServiceException {
331+
private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, List<RawMovementType> rawMovements, EnrichedMovementWrapper enrichedWrapper, String username, String exchangeLogGuid, SetFLUXMovementReportRequest request, String reportId) throws RulesServiceException {
326332
try {
327-
// Enrich with MobilTerminal and Assets data. Get Mobile Terminal if it exists.
328-
EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements);
329333
CreateMovementBatchResponse movementBatchResponse = sendBatchToMovement(enrichedWrapper.getAssetList(), rawMovements, username);
330334
ExchangeLogStatusTypeType status;
331335
if (movementBatchResponse != null && SimpleResponse.OK.equals(movementBatchResponse.getPermitted())) {
@@ -340,15 +344,15 @@ private void enrichAndSenMovementsAsBatch(ValidationResult validationResult, Lis
340344
}
341345
sendBatchBackToExchange(exchangeLogGuid, rawMovements, MovementRefTypeType.MOVEMENT, username);
342346
updateRequestMessageStatusInExchange(exchangeLogGuid, status);
343-
} catch (MessageException | MobileTerminalModelMapperException | MobileTerminalUnmarshallException | JMSException | AssetModelMapperException | RulesModelException e) {
347+
} catch (MessageException | RulesModelException e) {
344348
throw new RulesServiceException(e.getMessage(), e);
345349
}
346350
}
347351

348352
private void processReceivedMovementsAsBatch(List<RawMovementType> rawMovements, String pluginType, String username, String exchangeLogGuid) throws RulesServiceException {
349353
try {
350354
// Enrich with MobilTerminal and Assets data. Get Mobile Terminal if it exists.
351-
EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements);
355+
EnrichedMovementWrapper enrichedWrapper = enrichBatchWithMobileTerminalAndAssets(rawMovements, null);
352356
List<RawMovementFact> rawMovementFactList = RawMovementFactMapper.mapRawMovementFacts(rawMovements, enrichedWrapper.getMobileTerminalList(),
353357
enrichedWrapper.getAssetList(), pluginType);
354358
movementValidator.evaluateRawList(rawMovementFactList);
@@ -387,7 +391,7 @@ private void processReceivedMovementsAsBatch(List<RawMovementType> rawMovements,
387391
* @throws JMSException
388392
* @throws MobileTerminalModelMapperException
389393
*/
390-
private EnrichedMovementWrapper enrichBatchWithMobileTerminalAndAssets(List<RawMovementType> rawMovementList) throws AssetModelMapperException, MessageException, MobileTerminalUnmarshallException, JMSException, MobileTerminalModelMapperException {
394+
private EnrichedMovementWrapper enrichBatchWithMobileTerminalAndAssets(List<RawMovementType> rawMovementList, MovementVesselMappingContext ctx) throws AssetModelMapperException, MessageException, MobileTerminalUnmarshallException, JMSException, MobileTerminalModelMapperException {
391395
List<Asset> assetList = new ArrayList<>();
392396
// Get Mobile Terminal if it exists
393397
List<MobileTerminalType> mobileTerminalList;
@@ -403,6 +407,7 @@ private EnrichedMovementWrapper enrichBatchWithMobileTerminalAndAssets(List<RawM
403407
for (RawMovementType rawMovementType : rawMovementList) {
404408
Asset asset = getAssetByCfrIrcs(rawMovementType.getAssetId());
405409
assetList.add(asset);
410+
ctx.put(rawMovementType, asset);
406411
if (isPluginTypeWithoutMobileTerminal(rawMovementType.getPluginType()) && asset != null) {
407412
MobileTerminalType mobileTerminal = findMobileTerminalByAsset(asset.getAssetId().getGuid());
408413
rawMovementType.setMobileTerminal(MobileTerminalMapper.mapMobileTerminal(mobileTerminal));

0 commit comments

Comments
 (0)