diff --git a/src/main/java/org/gridsuite/modification/server/modifications/AbstractScaling.java b/src/main/java/org/gridsuite/modification/server/modifications/AbstractScaling.java index 59aeb0895..bc966d805 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/AbstractScaling.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/AbstractScaling.java @@ -10,18 +10,15 @@ import com.powsybl.commons.reporter.TypedValue; import com.powsybl.iidm.modification.scalable.Scalable; import com.powsybl.iidm.network.Network; -import com.powsybl.network.store.iidm.impl.NetworkImpl; import org.gridsuite.modification.server.NetworkModificationException; import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.service.FilterService; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; import java.util.stream.Collectors; import static org.gridsuite.modification.server.modifications.ModificationUtils.createReport; @@ -52,66 +49,26 @@ public void apply(Network network, Reporter subReporter) { .filter(distinctByKey(FilterInfos::getId)) .collect(Collectors.toMap(FilterInfos::getId, FilterInfos::getName)); - // export filters from filter server - String workingVariantId = network.getVariantManager().getWorkingVariantId(); - UUID uuid = ((NetworkImpl) network).getUuid(); - Map exportFilters = filterService - .exportFilters(new ArrayList<>(filters.keySet()), uuid, workingVariantId) - .stream() - .peek(t -> t.setFilterName(filters.get(t.getFilterId()))) - .collect(Collectors.toMap(FilterEquipments::getFilterId, Function.identity())); - - // collect all filters with wrong equipments ids - Map filterWithWrongEquipmentsIds = exportFilters.entrySet().stream() - .filter(e -> !CollectionUtils.isEmpty(e.getValue().getNotFoundEquipments())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - - Boolean noValidEquipmentId = exportFilters.values().stream() - .allMatch(filterEquipments -> filterEquipments.getIdentifiableAttributes().isEmpty()); - - if (noValidEquipmentId) { - String errorMsg = scalingInfos.getErrorType() + ": There is no valid equipment ID among the provided filter(s)"; - createReport(subReporter, "invalidFilters", errorMsg, TypedValue.ERROR_SEVERITY); - return; + Map exportFilters = ModificationUtils.getUuidFilterEquipmentsMap(filterService, network, subReporter, filters, scalingInfos.getErrorType()); + if (exportFilters != null) { + Map filtersWithWrongEquipmentIds = ModificationUtils.getUuidFilterWrongEquipmentsIdsMap(subReporter, exportFilters, filters); + + // apply variations + scalingInfos.getVariations().forEach(variation -> { + List identifiableAttributes = ModificationUtils.getIdentifiableAttributes(exportFilters, filtersWithWrongEquipmentIds, variation.getFilters(), subReporter); + + if (CollectionUtils.isEmpty(identifiableAttributes)) { + String filterNames = variation.getFilters().stream().map(FilterInfos::getName).collect(Collectors.joining(", ")); + createReport(subReporter, + "allFiltersWrong", + String.format("All of the following variation's filters have equipments with wrong id : %s", filterNames), + TypedValue.WARN_SEVERITY); + } else { + applyVariation(network, subReporter, identifiableAttributes, variation); + } + }); + createReport(subReporter, "scalingCreated", "new scaling created", TypedValue.INFO_SEVERITY); } - - // create report for each wrong filter - filterWithWrongEquipmentsIds.values().forEach(f -> { - var equipmentIds = String.join(", ", f.getNotFoundEquipments()); - createReport(subReporter, - "filterEquipmentsNotFound_" + f.getFilterName(), - String.format("Cannot find the following equipments %s in filter %s", equipmentIds, filters.get(f.getFilterId())), - TypedValue.WARN_SEVERITY); - }); - - // apply variations - scalingInfos.getVariations().forEach(variation -> { - variation.getFilters().stream() - .filter(f -> !exportFilters.containsKey(f.getId())) - .forEach(f -> createReport(subReporter, - "filterNotFound", - String.format("Cannot find the following filter: %s", f.getName()), - TypedValue.WARN_SEVERITY)); - - List identifiableAttributes = variation.getFilters() - .stream() - .filter(f -> !filterWithWrongEquipmentsIds.containsKey(f.getId()) && exportFilters.containsKey(f.getId())) - .flatMap(f -> exportFilters.get(f.getId()) - .getIdentifiableAttributes() - .stream()) - .collect(Collectors.toList()); - - if (CollectionUtils.isEmpty(identifiableAttributes)) { - String filterNames = variation.getFilters().stream().map(FilterInfos::getName).collect(Collectors.joining(", ")); - createReport(subReporter, - "allFiltersWrong", - String.format("All of the following variation's filters have equipments with wrong id : %s", filterNames), - TypedValue.WARN_SEVERITY); - } else { - applyVariation(network, subReporter, identifiableAttributes, variation); - } - }); - createReport(subReporter, "scalingCreated", "new scaling created", TypedValue.INFO_SEVERITY); } private void applyVariation(Network network, diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java b/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java index b12f9fd11..aaa5ed341 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java @@ -10,30 +10,16 @@ import com.powsybl.commons.reporter.Report; import com.powsybl.commons.reporter.Reporter; import com.powsybl.commons.reporter.TypedValue; -import com.powsybl.iidm.network.Battery; -import com.powsybl.iidm.network.Generator; -import com.powsybl.iidm.network.Identifiable; -import com.powsybl.iidm.network.IdentifiableType; -import com.powsybl.iidm.network.Load; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.ShuntCompensator; -import com.powsybl.iidm.network.TwoWindingsTransformer; -import com.powsybl.iidm.network.VoltageLevel; +import com.powsybl.iidm.network.*; import org.gridsuite.modification.server.NetworkModificationException; import org.gridsuite.modification.server.dto.ByFormulaModificationInfos; import org.gridsuite.modification.server.dto.FilterEquipments; import org.gridsuite.modification.server.dto.FilterInfos; import org.gridsuite.modification.server.dto.formula.FormulaInfos; import org.gridsuite.modification.server.dto.formula.Operator; -import org.gridsuite.modification.server.dto.formula.equipmentfield.BatteryField; -import org.gridsuite.modification.server.dto.formula.equipmentfield.GeneratorField; -import org.gridsuite.modification.server.dto.formula.equipmentfield.LoadField; -import org.gridsuite.modification.server.dto.formula.equipmentfield.ShuntCompensatorField; -import org.gridsuite.modification.server.dto.formula.equipmentfield.TwoWindingsTransformerField; -import org.gridsuite.modification.server.dto.formula.equipmentfield.VoltageLevelField; +import org.gridsuite.modification.server.dto.formula.equipmentfield.*; import org.gridsuite.modification.server.service.FilterService; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.springframework.util.CollectionUtils; import java.util.ArrayList; @@ -83,7 +69,7 @@ public void apply(Network network, Reporter subReporter) { .filter(distinctByKey(FilterInfos::getId)) .collect(Collectors.toMap(FilterInfos::getId, FilterInfos::getName)); - Map exportFilters = getUuidFilterEquipmentsMap(network, subReporter, filters); + Map exportFilters = ModificationUtils.getUuidFilterEquipmentsMap(filterService, network, subReporter, filters, modificationInfos.getErrorType()); if (exportFilters != null) { long equipmentCount = exportFilters.values() @@ -218,15 +204,6 @@ private void createFormulaReports(List formulaReports, FormulaInfos form } } - @Nullable - private Map getUuidFilterEquipmentsMap(Network network, Reporter subReporter, Map filters) { - // export filters from filter server - Map exportFilters = filterService.getUuidFilterEquipmentsMap(network, filters); - - boolean isValidFilter = ModificationUtils.getInstance().isValidFilter(subReporter, modificationInfos.getErrorType(), exportFilters); - return isValidFilter ? exportFilters : null; - } - private boolean isEquipmentEditable(Identifiable identifiable, FormulaInfos formulaInfos) { if (formulaInfos.getEditedField() == null) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java index a144a16e8..f9de96006 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java @@ -19,6 +19,8 @@ import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder; import org.gridsuite.modification.server.NetworkModificationException; import org.gridsuite.modification.server.dto.*; +import org.gridsuite.modification.server.service.FilterService; +import org.jetbrains.annotations.Nullable; import org.springframework.util.CollectionUtils; import java.util.*; @@ -27,6 +29,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; +import java.util.stream.Collectors; import java.util.stream.IntStream; import static org.gridsuite.modification.server.NetworkModificationException.Type.*; @@ -1027,5 +1030,47 @@ public boolean isValidFilter(Reporter subReporter, return true; } + + public static List getIdentifiableAttributes(Map exportFilters, Map filtersWithWrongEquipmentIds, List filterInfos, Reporter subReporter) { + filterInfos.stream() + .filter(f -> !exportFilters.containsKey(f.getId())) + .forEach(f -> createReport(subReporter, + "filterNotFound", + String.format("Cannot find the following filter: %s", f.getName()), + TypedValue.WARN_SEVERITY)); + + return filterInfos + .stream() + .filter(f -> !filtersWithWrongEquipmentIds.containsKey(f.getId()) && exportFilters.containsKey(f.getId())) + .flatMap(f -> exportFilters.get(f.getId()) + .getIdentifiableAttributes() + .stream()) + .toList(); + } + + @Nullable + public static Map getUuidFilterEquipmentsMap(FilterService filterService, Network network, Reporter subReporter, Map filters, NetworkModificationException.Type errorType) { + Map exportFilters = filterService.getUuidFilterEquipmentsMap(network, filters); + + boolean isValidFilter = ModificationUtils.getInstance().isValidFilter(subReporter, errorType, exportFilters); + return isValidFilter ? exportFilters : null; + } + + public static Map getUuidFilterWrongEquipmentsIdsMap(Reporter subReporter, Map exportFilters, Map filters) { + // collect all filters with wrong equipments ids + Map filterWithWrongEquipmentsIds = exportFilters.entrySet().stream() + .filter(e -> !CollectionUtils.isEmpty(e.getValue().getNotFoundEquipments())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + // create report for each wrong filter + filterWithWrongEquipmentsIds.values().forEach(f -> { + var equipmentIds = String.join(", ", f.getNotFoundEquipments()); + createReport(subReporter, + "filterEquipmentsNotFound_" + f.getFilterName(), + String.format("Cannot find the following equipments %s in filter %s", equipmentIds, filters.get(f.getFilterId())), + TypedValue.WARN_SEVERITY); + }); + return filterWithWrongEquipmentsIds; + } }