diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ExtRefService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ExtRefService.java index 1caffe596..3ec2823f6 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ExtRefService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ExtRefService.java @@ -8,8 +8,7 @@ import org.lfenergy.compas.sct.commons.dto.*; import org.lfenergy.compas.sct.commons.exception.ScdException; import org.lfenergy.compas.sct.commons.scl.ied.*; -import org.lfenergy.compas.sct.commons.util.ControlBlockEnum; -import org.lfenergy.compas.sct.commons.util.ILDEPFSettings; +import org.lfenergy.compas.sct.commons.util.*; import org.lfenergy.compas.scl2007b4.model.SCL; import org.lfenergy.compas.scl2007b4.model.TCompasICDHeader; import org.lfenergy.compas.scl2007b4.model.TExtRef; @@ -17,9 +16,6 @@ import org.lfenergy.compas.sct.commons.dto.ControlBlockNetworkSettings; import org.lfenergy.compas.sct.commons.dto.SclReport; import org.lfenergy.compas.sct.commons.dto.SclReportItem; -import org.lfenergy.compas.sct.commons.util.LDeviceStatus; -import org.lfenergy.compas.sct.commons.util.PrivateEnum; -import org.lfenergy.compas.sct.commons.util.Utils; import java.util.*; import java.util.function.Function; @@ -325,7 +321,7 @@ private static Optional updateVal(AbstractLNAdapter lnAdapter, case DU_DA_NAME -> setting.getChannelShortLabel(); case SETVAL_DA_NAME -> LN_PREFIX_B.equals(lnAdapter.getPrefix()) || LN_PREFIX_A.equals(lnAdapter.getPrefix()) ? setting.getChannelLevModQ() : setting.getChannelLevMod(); - case STVAL_DA_NAME -> LDeviceStatus.ON; + case STVAL_DA_NAME -> LdeviceStatus.ON.getValue(); case SETSRCREF_DA_NAME -> computeDaiValue(lnAdapter, extRef, setting.getDaName()); default -> null; }; diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/LDeviceActivation.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/LDeviceActivation.java index 4691c650a..cd1d995ce 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/LDeviceActivation.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/LDeviceActivation.java @@ -8,7 +8,7 @@ import lombok.Setter; import org.apache.commons.lang3.tuple.Pair; import org.lfenergy.compas.scl2007b4.model.TCompasLDeviceStatus; -import org.lfenergy.compas.sct.commons.util.LDeviceStatus; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; import java.util.List; import java.util.Set; @@ -38,15 +38,15 @@ public LDeviceActivation(List> iedNameLdInstList) { * @param enumValues enum values */ public void checkLDeviceActivationStatus(String iedName, String ldInst, TCompasLDeviceStatus compasLDeviceStatus, Set enumValues) { - if (!enumValues.contains(LDeviceStatus.ON) && !enumValues.contains(LDeviceStatus.OFF)) { + if (!enumValues.contains(LdeviceStatus.ON.getValue()) && !enumValues.contains(LdeviceStatus.OFF.getValue())) { errorMessage = "The LDevice cannot be activated or desactivated because its BehaviourKind Enum contains NOT 'on' AND NOT 'off'."; } - if (!enumValues.contains(LDeviceStatus.ON) && enumValues.contains(LDeviceStatus.OFF)) { + if (!enumValues.contains(LdeviceStatus.ON.getValue()) && enumValues.contains(LdeviceStatus.OFF.getValue())) { if (isDeclaredInSubstation(iedName, ldInst)) { errorMessage = "The LDevice cannot be set to 'on' but has been selected into SSD."; } else { isUpdatable = true; - newVal = LDeviceStatus.OFF; + newVal = LdeviceStatus.OFF.getValue(); } } if(compasLDeviceStatus.equals(TCompasLDeviceStatus.ACTIVE) || @@ -65,20 +65,20 @@ public void checkLDeviceActivationStatus(String iedName, String ldInst, TCompasL * @param enumValues enum values */ private void checkAuthorisationToActivateLDevice(String iedName, String ldInst, Set enumValues) { - if (!enumValues.contains(LDeviceStatus.OFF) && enumValues.contains(LDeviceStatus.ON)) { + if (!enumValues.contains(LdeviceStatus.OFF.getValue()) && enumValues.contains(LdeviceStatus.ON.getValue())) { if (isDeclaredInSubstation(iedName, ldInst)) { isUpdatable = true; - newVal = LDeviceStatus.ON; + newVal = LdeviceStatus.ON.getValue(); } else { errorMessage = "The LDevice cannot be set to 'off' but has not been selected into SSD."; } } - if (enumValues.contains(LDeviceStatus.ON) && enumValues.contains(LDeviceStatus.OFF)) { + if (enumValues.contains(LdeviceStatus.ON.getValue()) && enumValues.contains(LdeviceStatus.OFF.getValue())) { isUpdatable = true; if (isDeclaredInSubstation(iedName, ldInst)) { - newVal = LDeviceStatus.ON; + newVal = LdeviceStatus.ON.getValue(); } else { - newVal = LDeviceStatus.OFF; + newVal = LdeviceStatus.OFF.getValue(); } } @@ -91,19 +91,19 @@ private void checkAuthorisationToActivateLDevice(String iedName, String ldInst, * @param enumValues enum values */ private void checkAuthorisationToDeactivateLDevice(String iedName, String ldInst, Set enumValues) { - if (!enumValues.contains(LDeviceStatus.OFF) && enumValues.contains(LDeviceStatus.ON)) { + if (!enumValues.contains(LdeviceStatus.OFF.getValue()) && enumValues.contains(LdeviceStatus.ON.getValue())) { if (isDeclaredInSubstation(iedName, ldInst)) { errorMessage = "The LDevice is not qualified into STD but has been selected into SSD."; } else { errorMessage = "The LDevice cannot be set to 'off' but has not been selected into SSD."; } } - if (enumValues.contains(LDeviceStatus.ON) && enumValues.contains(LDeviceStatus.OFF)) { + if (enumValues.contains(LdeviceStatus.ON.getValue()) && enumValues.contains(LdeviceStatus.OFF.getValue())) { if (isDeclaredInSubstation(iedName, ldInst)) { errorMessage = "The LDevice is not qualified into STD but has been selected into SSD."; } else { isUpdatable = true; - newVal = LDeviceStatus.OFF; + newVal = LdeviceStatus.OFF.getValue(); } } } diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/InputsAdapter.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/InputsAdapter.java index 779e6c957..485db7cfa 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/InputsAdapter.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/InputsAdapter.java @@ -17,14 +17,13 @@ import org.lfenergy.compas.sct.commons.scl.SclRootAdapter; import org.lfenergy.compas.sct.commons.util.ControlBlockEnum; import org.lfenergy.compas.sct.commons.util.FcdaCandidates; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; import org.lfenergy.compas.sct.commons.util.Utils; import java.util.*; import java.util.function.Predicate; import static org.lfenergy.compas.sct.commons.util.CommonConstants.*; -import static org.lfenergy.compas.sct.commons.util.LDeviceStatus.OFF; -import static org.lfenergy.compas.sct.commons.util.LDeviceStatus.ON; /** * A representation of the model object @@ -41,17 +40,16 @@ public class InputsAdapter extends SclElementAdapter { private static final String MESSAGE_NO_MATCHING_COMPAS_FLOW = "The signal ExtRef has no matching compas:Flow Private"; private static final String MESSAGE_TOO_MANY_MATCHING_COMPAS_FLOWS = "The signal ExtRef has more than one matching compas:Flow Private"; private static final String MESSAGE_SOURCE_LDEVICE_NOT_FOUND = "The signal ExtRef ExtRefldinst does not match any " + - "LDevice with same inst attribute in source IED %s"; + "LDevice with same inst attribute in source IED %s"; private static final String MESSAGE_SOURCE_LN_NOT_FOUND = "The signal ExtRef lninst, doName or daName does not match any " + - "source in LDevice %s"; + "source in LDevice %s"; private static final String MESSAGE_SERVICE_TYPE_MISSING = "The signal ExtRef is missing ServiceType attribute"; private static final String MESSAGE_INVALID_SERVICE_TYPE = "The signal ExtRef ServiceType attribute is unexpected : %s"; private static final String MESSAGE_IED_MISSING_COMPAS_BAY_UUID = "IED is missing Private/compas:Bay@UUID attribute"; private static final String MESSAGE_EXTREF_DESC_MALFORMED = "ExtRef.serviceType=Report but ExtRef.desc attribute is malformed"; private static final String MESSAGE_LDEVICE_STATUS_UNDEFINED = "The LDevice status is undefined"; - private static final String MESSAGE_LDEVICE_STATUS_NEITHER_ON_NOR_OFF = "The LDevice status is neither \"on\" nor \"off\""; private static final String MESSAGE_EXTREF_IEDNAME_DOES_NOT_MATCH_ANY_SYSTEM_VERSION_UUID = "The signal ExtRef iedName does not match any " + - "IED/Private/compas:ICDHeader@ICDSystemVersionUUID"; + "IED/Private/compas:ICDHeader@ICDSystemVersionUUID"; private static final String MESSAGE_SOURCE_LDEVICE_STATUS_UNDEFINED = "The signal ExtRef source LDevice %s status is undefined"; private static final String MESSAGE_SOURCE_LDEVICE_STATUS_NEITHER_ON_NOR_OFF = "The signal ExtRef source LDevice %s status is neither \"on\" nor \"off\""; private static final String MESSAGE_SOURCE_LDEVICE_STATUS_OFF = "The signal ExtRef source LDevice %s status is off"; @@ -97,33 +95,36 @@ public List updateAllExtRefIedNames(Map icdSy if (optionalLDeviceStatus.isEmpty()) { return List.of(getLDeviceAdapter().buildFatalReportItem(MESSAGE_LDEVICE_STATUS_UNDEFINED)); } - String lDeviceStatus = optionalLDeviceStatus.get(); - return switch (lDeviceStatus) { - case ON -> getExtRefs().stream() - .filter(tExtRef -> StringUtils.isNotBlank(tExtRef.getIedName()) && StringUtils.isNotBlank(tExtRef.getDesc())) - .map(extRef -> - updateExtRefIedName(extRef, icdSystemVersionToIed.get(extRef.getIedName()))) - .flatMap(Optional::stream) - .toList(); - case OFF -> { - getExtRefs().forEach(this::clearBinding); - yield Collections.emptyList(); - } - default -> List.of(getLDeviceAdapter().buildFatalReportItem(MESSAGE_LDEVICE_STATUS_NEITHER_ON_NOR_OFF)); - }; + try { + LdeviceStatus lDeviceStatus = LdeviceStatus.fromValue(optionalLDeviceStatus.get()); + return switch (lDeviceStatus) { + case ON -> getExtRefs().stream() + .filter(tExtRef -> StringUtils.isNotBlank(tExtRef.getIedName()) && StringUtils.isNotBlank(tExtRef.getDesc())) + .map(extRef -> + updateExtRefIedName(extRef, icdSystemVersionToIed.get(extRef.getIedName()))) + .flatMap(Optional::stream) + .toList(); + case OFF -> { + getExtRefs().forEach(this::clearBinding); + yield Collections.emptyList(); + } + }; + } catch (IllegalArgumentException e) { + return List.of(getLDeviceAdapter().buildFatalReportItem(e.getMessage())); + } } /** * Find matching CompasFlow private and set ExtRef iedName accordingly * - * @param extRef extRef whose iedName will be updated + * @param extRef extRef whose iedName will be updated * @return Error if ExtRef could not be updated */ private Optional updateExtRefIedName(TExtRef extRef, IEDAdapter sourceIed) { List matchingCompasFlows = getMatchingCompasFlows(extRef); if (!singleMatch(matchingCompasFlows)) { return fatalReportItem(extRef, - matchingCompasFlows.isEmpty() ? MESSAGE_NO_MATCHING_COMPAS_FLOW : MESSAGE_TOO_MANY_MATCHING_COMPAS_FLOWS); + matchingCompasFlows.isEmpty() ? MESSAGE_NO_MATCHING_COMPAS_FLOW : MESSAGE_TOO_MANY_MATCHING_COMPAS_FLOWS); } TCompasFlow compasFlow = matchingCompasFlows.get(0); if (compasFlow.getFlowStatus() == TCompasFlowStatus.INACTIVE) { @@ -136,7 +137,7 @@ private Optional updateExtRefIedName(TExtRef extRef, IEDAdapter s return sourceValidationError; } String sourceIedName = PrivateService.extractCompasPrivate(sourceIed.getCurrentElem(), TCompasICDHeader.class) - .map(TCompasICDHeader::getIEDName).orElse(""); + .map(TCompasICDHeader::getIEDName).orElse(""); extRef.setIedName(sourceIedName); compasFlow.setExtRefiedName(sourceIedName); log.debug(String.format("extRef.desc=%s, iedName=%s%n", extRef.getDesc(), sourceIedName)); @@ -170,17 +171,19 @@ private Optional validateExtRefSource(TExtRef extRef, IEDAdapter Optional optionalSourceLDeviceStatus = sourceLDevice.getLDeviceStatus(); if (optionalSourceLDeviceStatus.isEmpty()) { return fatalReportItem(extRef, String.format(MESSAGE_SOURCE_LDEVICE_STATUS_UNDEFINED, - sourceLDevice.getXPath())); - } - return optionalSourceLDeviceStatus.map(sourceLDeviceStatus -> - switch (sourceLDeviceStatus) { - case OFF -> SclReportItem.warning(extRefXPath(extRef.getDesc()), String.format(MESSAGE_SOURCE_LDEVICE_STATUS_OFF, sourceLDevice.getXPath())); - case ON -> null; - default -> SclReportItem.fatal(extRefXPath(extRef.getDesc()), - String.format(MESSAGE_SOURCE_LDEVICE_STATUS_NEITHER_ON_NOR_OFF, - sourceLDevice.getXPath())); - }); + } + return optionalSourceLDeviceStatus.map(sourceLDeviceStatus -> { + try { + LdeviceStatus lDeviceStatus = LdeviceStatus.fromValue(sourceLDeviceStatus); + return switch (lDeviceStatus) { + case OFF -> SclReportItem.warning(extRefXPath(extRef.getDesc()), String.format(MESSAGE_SOURCE_LDEVICE_STATUS_OFF, sourceLDevice.getXPath())); + case ON -> null; + }; + } catch (IllegalArgumentException e) { + return SclReportItem.fatal(extRefXPath(extRef.getDesc()), String.format(MESSAGE_SOURCE_LDEVICE_STATUS_NEITHER_ON_NOR_OFF, sourceLDevice.getXPath())); + } + }); } private boolean singleMatch(List matchingCompasFlows) { @@ -213,13 +216,13 @@ private Optional fatalReportItem(TExtRef extRef, String message) private String extRefXPath(String extRefDesc) { return getXPath() + String.format("/ExtRef[%s]", - Utils.xpathAttributeFilter("desc", extRefDesc)); + Utils.xpathAttributeFilter("desc", extRefDesc)); } /** * Find CompasFlows that match given ExtRef * - * @param extRef extRef to match + * @param extRef extRef to match * @return list of matching CompasFlows */ private List getMatchingCompasFlows(TExtRef extRef) { @@ -239,18 +242,18 @@ private List getMatchingCompasFlows(TExtRef extRef) { private boolean isMatchingExtRef(TCompasFlow compasFlow, TExtRef extRef) { String extRefLnClass = extRef.isSetLnClass() ? extRef.getLnClass().get(0) : null; return Utils.equalsOrBothBlank(compasFlow.getDataStreamKey(), extRef.getDesc()) - && Utils.equalsOrBothBlank(compasFlow.getExtRefiedName(), extRef.getIedName()) - && Utils.equalsOrBothBlank(compasFlow.getExtRefldinst(), extRef.getLdInst()) - && Utils.equalsOrBothBlank(compasFlow.getExtRefprefix(), extRef.getPrefix()) - && Utils.equalsOrBothBlank(compasFlow.getExtReflnClass(), extRefLnClass) - && Utils.equalsOrBothBlank(compasFlow.getExtReflnInst(), extRef.getLnInst()); + && Utils.equalsOrBothBlank(compasFlow.getExtRefiedName(), extRef.getIedName()) + && Utils.equalsOrBothBlank(compasFlow.getExtRefldinst(), extRef.getLdInst()) + && Utils.equalsOrBothBlank(compasFlow.getExtRefprefix(), extRef.getPrefix()) + && Utils.equalsOrBothBlank(compasFlow.getExtReflnClass(), extRefLnClass) + && Utils.equalsOrBothBlank(compasFlow.getExtReflnInst(), extRef.getLnInst()); } private LDeviceAdapter getLDeviceAdapter() { return parentAdapter.getParentAdapter(); } - private AbstractLNAdapter getLNAdapter(){ + private AbstractLNAdapter getLNAdapter() { return parentAdapter; } @@ -260,19 +263,19 @@ public List updateAllSourceDataSetsAndControlBlocks() { return List.of(getIedAdapter().buildFatalReportItem(MESSAGE_IED_MISSING_COMPAS_BAY_UUID)); } return getExtRefs().stream() - .filter(this::areBindingAttributesPresent) - .filter(this::isExternalBound) - .filter(this::matchingCompasFlowIsActiveOrUntested) - .map(extRef -> updateSourceDataSetsAndControlBlocks(extRef, currentBayUuid)) - .flatMap(Optional::stream) - .toList(); + .filter(this::areBindingAttributesPresent) + .filter(this::isExternalBound) + .filter(this::matchingCompasFlowIsActiveOrUntested) + .map(extRef -> updateSourceDataSetsAndControlBlocks(extRef, currentBayUuid)) + .flatMap(Optional::stream) + .toList(); } private boolean matchingCompasFlowIsActiveOrUntested(TExtRef extRef) { return getMatchingCompasFlows(extRef).stream().findFirst() - .map(TCompasFlow::getFlowStatus) - .filter(flowStatus -> flowStatus == TCompasFlowStatus.ACTIVE || flowStatus == TCompasFlowStatus.UNTESTED) - .isPresent(); + .map(TCompasFlow::getFlowStatus) + .filter(flowStatus -> flowStatus == TCompasFlowStatus.ACTIVE || flowStatus == TCompasFlowStatus.UNTESTED) + .isPresent(); } private boolean isExternalBound(TExtRef tExtRef) { @@ -281,10 +284,10 @@ private boolean isExternalBound(TExtRef tExtRef) { private boolean areBindingAttributesPresent(TExtRef tExtRef) { return StringUtils.isNotBlank(tExtRef.getIedName()) - && StringUtils.isNotBlank(tExtRef.getDesc()) - && StringUtils.isNotBlank(tExtRef.getLdInst()) - && tExtRef.getLnClass().stream().findFirst().filter(StringUtils::isNotBlank).isPresent() - && StringUtils.isNotBlank(tExtRef.getDoName()); + && StringUtils.isNotBlank(tExtRef.getDesc()) + && StringUtils.isNotBlank(tExtRef.getLdInst()) + && tExtRef.getLnClass().stream().findFirst().filter(StringUtils::isNotBlank).isPresent() + && StringUtils.isNotBlank(tExtRef.getDoName()); } private Optional updateSourceDataSetsAndControlBlocks(TExtRef extRef, String targetBayUuid) { @@ -297,8 +300,8 @@ private Optional updateSourceDataSetsAndControlBlocks(TExtRef ext } IEDAdapter sourceIed = optionalSrcIedAdapter.get(); Optional sourceIedBayUuid = sourceIed.getPrivateCompasBay() - .map(TCompasBay::getUUID) - .filter(StringUtils::isNotBlank); + .map(TCompasBay::getUUID) + .filter(StringUtils::isNotBlank); if (sourceIedBayUuid.isEmpty()) { return fatalReportItem(extRef, MESSAGE_SOURCE_IED_MISSING_COMPAS_BAY_UUID); } @@ -342,9 +345,9 @@ private void createDataSetWithFCDA(TExtRef extRef, LDeviceAdapter sourceLDevice, String fcdaDaName = extRef.getServiceType() == TServiceType.REPORT ? null : sourceDa.getDaRef(); String fcdaLnClass = extRef.getLnClass().stream().findFirst().orElse(null); dataSetAdapter.createFCDAIfNotExists(extRef.getLdInst(), extRef.getPrefix(), fcdaLnClass, extRef.getLnInst(), - sourceDa.getDoRef(), - fcdaDaName, - sourceDa.getFc()); + sourceDa.getDoRef(), + fcdaDaName, + sourceDa.getFc()); } private void createControlBlockWithTarget(TExtRef extRef, LDeviceAdapter sourceLDevice, DataAttributeRef sourceDa, String cbName, String datSet) { diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/LDeviceAdapter.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/LDeviceAdapter.java index 0d9002929..88fde33bd 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/LDeviceAdapter.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/LDeviceAdapter.java @@ -13,7 +13,7 @@ import org.lfenergy.compas.sct.commons.scl.SclElementAdapter; import org.lfenergy.compas.sct.commons.scl.dtt.DataTypeTemplateAdapter; import org.lfenergy.compas.sct.commons.util.ControlBlockEnum; -import org.lfenergy.compas.sct.commons.util.LDeviceStatus; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; import org.lfenergy.compas.sct.commons.util.MonitoringLnClassEnum; import org.lfenergy.compas.sct.commons.util.Utils; @@ -79,12 +79,13 @@ public LDeviceAdapter(IEDAdapter parentAdapter, TLDevice currentElem) { */ public void createHmiReportControlBlocks(List fcdas) { LN0Adapter ln0 = getLN0Adapter(); - if (!ln0.getDaiModStValValue().map(LDeviceStatus.ON::equals).orElse(false)) return; + if (!ln0.getDaiModStValValue().map(LdeviceStatus::fromValue).map(LdeviceStatus.ON::equals).orElse(false)) return; fcdas.stream() .filter(fcda -> getInst().equals(fcda.getLdInst()) && fcda.isSetLnClass()) .forEach(fcda -> (fcda.getLnClass().get(0).equals(TLLN0Enum.LLN_0.value()) ? Optional.of(ln0) // ln0 Mod stVal "ON" has already been checked, no need to check it again - : findLnAdapter(fcda.getLnClass().get(0), fcda.getLnInst(), fcda.getPrefix()).filter(lnAdapter -> lnAdapter.getDaiModStValValue().map(LDeviceStatus.ON::equals).orElse(true))) + : + findLnAdapter(fcda.getLnClass().get(0), fcda.getLnInst(), fcda.getPrefix()).filter(lnAdapter -> lnAdapter.getDaiModStValValue().map(LdeviceStatus::fromValue).map(LdeviceStatus.ON::equals).orElse(true))) .map(sourceLn -> sourceLn.getDAI(new DataAttributeRef(fcda), false)) .filter(das -> das.stream().anyMatch(da -> fcda.getFc() == da.getFc())) // getDAI does not filter on DA. .ifPresent(dataAttributeRefs -> createHmiReportCB(ln0, fcda))); @@ -499,8 +500,8 @@ public List getExtRefBayReferenceForActifLDEPF(fi return Collections.emptyList(); } - getLDeviceStatus().ifPresentOrElse(s -> { - if (LDeviceStatus.ON.equals(s)) { + getLDeviceStatus().map(LdeviceStatus::fromValue).ifPresentOrElse(s -> { + if (LdeviceStatus.ON.equals(s)) { extRefBayReferenceList.addAll(getLN0Adapter().getInputsAdapter().getCurrentElem().getExtRef().stream().map(extRef -> new ExtRefInfo.ExtRefBayReference(parentIedAdapter.getName(), parentIedAdapter.getPrivateCompasBay().get(), extRef)).toList()); } }, () -> sclReportItems.add(SclReportItem.fatal(getXPath(), "There is no DOI@name=" + MOD_DO_TYPE_NAME + "/DAI@name=" + STVAL_DA_TYPE_NAME + "/Val for LDevice@inst" + LDEVICE_LDEPF))); diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/Ldevice.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/Ldevice.java new file mode 100644 index 000000000..4dcfa5dfa --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/scl/ied/Ldevice.java @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons.scl.ied; + +import lombok.Getter; +import org.lfenergy.compas.scl2007b4.model.TDAI; +import org.lfenergy.compas.scl2007b4.model.TLDevice; +import org.lfenergy.compas.scl2007b4.model.TVal; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; + +import java.util.Collection; +import java.util.Optional; + +import static org.lfenergy.compas.sct.commons.util.CommonConstants.MOD_DO_NAME; +import static org.lfenergy.compas.sct.commons.util.CommonConstants.STVAL_DA_NAME; + +/** + * Object representing '' , but with utility methods to manipulate the business + * Do not include "currentElements" and so on inside this class + */ +@Getter +public class Ldevice { + + //Object is supposed to grow by the needs we have + private final String inst; + private final String ldName; + private final String description; + private final Optional ldeviceStatus; + + public Ldevice(TLDevice tlDevice) { + inst = tlDevice.getInst(); + ldName = tlDevice.getLdName(); + description = tlDevice.getDesc(); + ldeviceStatus = tlDevice.getLN0() + .getDOI() + .stream() + .filter(tdoi -> MOD_DO_NAME.equals(tdoi.getName())) + .findFirst() + .flatMap(tdoi -> tdoi.getSDIOrDAI() + .stream() + .filter(dai -> dai.getClass().equals(TDAI.class)) + .map(TDAI.class::cast) + .filter(tdai -> STVAL_DA_NAME.equals(tdai.getName())) + .map(TDAI::getVal) + .flatMap(Collection::stream) + .findFirst() + .map(TVal::getValue)) + .map(LdeviceStatus::fromValue); + } +} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LDeviceStatus.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LDeviceStatus.java deleted file mode 100644 index 59282a30d..000000000 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LDeviceStatus.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * // SPDX-FileCopyrightText: 2022 RTE FRANCE - * // - * // SPDX-License-Identifier: Apache-2.0 - */ - -package org.lfenergy.compas.sct.commons.util; - -/** - * A representation of a specific object TDAI name that have attribute name STVal. - */ -public final class LDeviceStatus { - public static final String ON = "on"; - public static final String OFF = "off"; - - private LDeviceStatus() { - throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); - } -} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LdeviceStatus.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LdeviceStatus.java new file mode 100644 index 000000000..18fe45118 --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/LdeviceStatus.java @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons.util; + +import lombok.Getter; + +import java.util.Arrays; + +/** + * Object describing Ldevice Status, prefere this to LdeviceStatus constants as we can get the list of constants here. + */ +public enum LdeviceStatus { + ON("on"), + OFF("off"); + + @Getter + private final String value; + + LdeviceStatus(String value) { + this.value = value; + } + + public static LdeviceStatus fromValue(String ldeviceStatus) { + return Arrays.stream(LdeviceStatus.values()) + .filter(status -> status.getValue().equals(ldeviceStatus)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("The Ldevice status " + ldeviceStatus + " does not exist. It should be among " + Arrays.stream(LdeviceStatus.values()).map(LdeviceStatus::getValue).toList())); + } +} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/Utils.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/Utils.java index b9ff8d19f..61abef91b 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/Utils.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/util/Utils.java @@ -411,7 +411,7 @@ public static boolean isIcdHeaderMatch(IEDAdapter iedAdapter,LDEPFSettingData se public static Optional getActiveSourceLDevice(IEDAdapter iedAdapter, LDEPFSettingData setting) { return iedAdapter.findLDeviceAdapterByLdInst(setting.getLdInst()) .filter(lDeviceAdapter -> lDeviceAdapter.getLDeviceStatus() - .map(status -> status.equals(LDeviceStatus.ON)) + .map(status -> status.equals(LdeviceStatus.ON.getValue())) .orElse(false)) .stream().findFirst(); } @@ -426,7 +426,7 @@ public static Optional> getActiveLNodeSource(LDeviceAdapter && Utils.equalsOrBothBlank(setting.getLnPrefix(), lnAdapter.getPrefix())) .findFirst() .filter(lnAdapter -> lnAdapter.getDaiModStValValue() - .map(status -> status.equals(LDeviceStatus.ON)) + .map(status -> status.equals(LdeviceStatus.ON.getValue())) .orElse(true)); } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ExtRefServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ExtRefServiceTest.java index 70d2368a7..f95985f8b 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ExtRefServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ExtRefServiceTest.java @@ -110,7 +110,7 @@ public static Stream updateAllExtRefIedNamesErrors() { "The signal ExtRef has more than one matching compas:Flow Private"), SclReportItem.fatal( "/SCL/IED[@name=\"IED_NAME1\"]/AccessPoint/Server/LDevice[@inst=\"LD_INST13\"]", - "The LDevice status is neither \"on\" nor \"off\""), + "The Ldevice status test does not exist. It should be among [on, off]"), SclReportItem.fatal( "/SCL/IED[@name=\"IED_NAME1\"]/AccessPoint/Server/LDevice[@inst=\"LD_INST14\"]", "The LDevice status is undefined"), diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/HmiServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/HmiServiceTest.java index 4c2cda805..b65eb60d1 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/HmiServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/HmiServiceTest.java @@ -11,7 +11,7 @@ import org.lfenergy.compas.sct.commons.scl.ied.LNAdapter; import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; import org.lfenergy.compas.sct.commons.util.CommonConstants; -import org.lfenergy.compas.sct.commons.util.LDeviceStatus; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; import java.util.List; @@ -150,7 +150,7 @@ void createAllIhmReportControlBlocks_when_lDevice_OFF_should_not_create_dataset( SclRootAdapter sclRootAdapter = new SclRootAdapter(scd); LN0Adapter ln0 = findLn0(sclRootAdapter, "IedName1", "LdInst11"); ln0.getDOIAdapterByName(CommonConstants.MOD_DO_NAME).getDataAdapterByName(CommonConstants.STVAL_DA_NAME).setVal("off"); - assertThat(findLDevice(sclRootAdapter, "IedName1", "LdInst11").getLDeviceStatus()).hasValue(LDeviceStatus.OFF); + assertThat(findLDevice(sclRootAdapter, "IedName1", "LdInst11").getLDeviceStatus()).hasValue(LdeviceStatus.OFF.getValue()); TFCDA fcda = newFcda("LdInst11", "ANCR", "1", null, "DoName1", null, TFCEnum.ST); // When HmiService.createAllHmiReportControlBlocks(scd, List.of(fcda)); diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ied/LdeviceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ied/LdeviceTest.java new file mode 100644 index 000000000..7682b07b7 --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/scl/ied/LdeviceTest.java @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons.scl.ied; + +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; +import org.lfenergy.compas.sct.commons.util.LdeviceStatus; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class LdeviceTest { + + @Test + void getLdeviceStatus_should_return_status() { + //Given + SCL std = SclTestMarshaller.getSCLFromFile("/scd-ied-dtt-com-import-stds/std.xml"); + Ldevice ldevice = new Ldevice(std.getIED().get(0).getAccessPoint().get(0).getServer().getLDevice().get(0)); + //When + Optional ldeviceStatus = ldevice.getLdeviceStatus(); + //Then + assertThat(ldeviceStatus).contains(LdeviceStatus.OFF); + } +} \ No newline at end of file diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/util/LdeviceStatusEnumTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/util/LdeviceStatusEnumTest.java new file mode 100644 index 000000000..ad226b1e2 --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/util/LdeviceStatusEnumTest.java @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2021 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons.util; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +class LdeviceStatusEnumTest { + + @ParameterizedTest + @CsvSource({"on,ON", "off,OFF"}) + void fromValue(String ldeviceStatus, String expected) { + //Given + //When + LdeviceStatus ldeviceStatusEnum = LdeviceStatus.fromValue(ldeviceStatus); + //Then + assertThat(ldeviceStatusEnum).isEqualTo(LdeviceStatus.valueOf(expected)); + } + + @Test + void fromValue() { + //Given + String ldeviceStatus = "patate"; + //When + //Then + assertThatCode(() -> LdeviceStatus.fromValue(ldeviceStatus)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("The Ldevice status patate does not exist. It should be among [on, off]"); + } +} \ No newline at end of file