diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandler.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandler.java index 8d301518250..eb80fb5832e 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandler.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandler.java @@ -229,7 +229,7 @@ private static void addOperatorStrategyFile(SecurityAnalysisCommandOptions optio options.strategiesFile(path); LOGGER.debug("Writing operator strategies to file {}", path); new OperatorStrategyList(operatorStrategies) - .writeFile(path); + .write(path); } /** diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyDeserializer.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyDeserializer.java index d916b4d3c9a..ee95be52587 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyDeserializer.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyDeserializer.java @@ -16,6 +16,8 @@ import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.commons.extensions.ExtensionProviders; import com.powsybl.commons.json.JsonUtil; +import com.powsybl.contingency.ContingencyContext; +import com.powsybl.contingency.ContingencyContextType; import com.powsybl.security.condition.Condition; import com.powsybl.security.strategy.OperatorStrategy; @@ -37,6 +39,7 @@ public OperatorStrategyDeserializer() { private static class ParsingContext { String id; + ContingencyContextType contingencyContextType; String contingencyId; Condition condition; List actionIds; @@ -52,6 +55,9 @@ public OperatorStrategy deserialize(JsonParser parser, DeserializationContext de parser.nextToken(); context.id = parser.getValueAsString(); return true; + case "contingencyContextType": + context.contingencyContextType = ContingencyContextType.valueOf(parser.nextTextValue()); + return true; case "contingencyId": parser.nextToken(); context.contingencyId = parser.getValueAsString(); @@ -73,7 +79,12 @@ public OperatorStrategy deserialize(JsonParser parser, DeserializationContext de return false; } }); - OperatorStrategy operatorStrategy = new OperatorStrategy(context.id, context.contingencyId, context.condition, context.actionIds); + // First version of the operator strategy only allows association to one contingency. Next versions use contingency + // context. So, for backward compatibility purposes, we consider that if contingencyContextType is null, we have + // a specific contingency context type. + ContingencyContext contingencyContext = new ContingencyContext(context.contingencyId, + context.contingencyContextType != null ? context.contingencyContextType : ContingencyContextType.SPECIFIC); + OperatorStrategy operatorStrategy = new OperatorStrategy(context.id, contingencyContext, context.condition, context.actionIds); SUPPLIER.get().addExtensions(operatorStrategy, context.extensions); return operatorStrategy; } diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyListDeserializer.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyListDeserializer.java index 657725ffdcc..7ba39e45429 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyListDeserializer.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategyListDeserializer.java @@ -49,8 +49,8 @@ public OperatorStrategyList deserialize(JsonParser parser, DeserializationContex return false; } }); - if (context.version == null || !context.version.equals(OperatorStrategyList.VERSION)) { - throw new JsonMappingException(parser, "version is missing or not equal to 1.0"); + if (context.version == null) { + throw new JsonMappingException(parser, "version is missing"); } return new OperatorStrategyList(context.operatorStrategies); } diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategySerializer.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategySerializer.java index 09a336870b3..18746130f1c 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategySerializer.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/json/OperatorStrategySerializer.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.powsybl.commons.json.JsonUtil; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.security.strategy.OperatorStrategy; import java.io.IOException; @@ -27,7 +28,11 @@ public OperatorStrategySerializer() { public void serialize(OperatorStrategy operatorStrategy, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringField("id", operatorStrategy.getId()); - jsonGenerator.writeStringField("contingencyId", operatorStrategy.getContingencyId()); + ContingencyContext contingencyContext = operatorStrategy.getContingencyContext(); + jsonGenerator.writeStringField("contingencyContextType", contingencyContext.getContextType().name()); + if (contingencyContext.getContingencyId() != null) { + jsonGenerator.writeStringField("contingencyId", contingencyContext.getContingencyId()); + } jsonGenerator.writeObjectField("condition", operatorStrategy.getCondition()); jsonGenerator.writeObjectField("actionIds", operatorStrategy.getActionIds()); JsonUtil.writeExtensions(operatorStrategy, jsonGenerator, serializerProvider); diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategy.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategy.java index 7a78cb7991b..87ff584108b 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategy.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategy.java @@ -8,6 +8,7 @@ import com.google.common.collect.ImmutableList; import com.powsybl.commons.extensions.AbstractExtendable; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.security.condition.Condition; import java.util.List; @@ -26,13 +27,13 @@ */ public class OperatorStrategy extends AbstractExtendable { private final String id; - private final String contingencyId; + private final ContingencyContext contingencyContext; private final Condition condition; // under which circumstances do I want to trigger my action private final List actionIds; - public OperatorStrategy(String id, String contingencyId, Condition condition, List actionIds) { + public OperatorStrategy(String id, ContingencyContext contingencyContext, Condition condition, List actionIds) { this.id = Objects.requireNonNull(id); - this.contingencyId = Objects.requireNonNull(contingencyId); + this.contingencyContext = Objects.requireNonNull(contingencyContext); this.condition = Objects.requireNonNull(condition); this.actionIds = ImmutableList.copyOf(Objects.requireNonNull(actionIds)); } @@ -47,8 +48,8 @@ public String getId() { /** * The contingency which this strategy applies to. */ - public String getContingencyId() { - return contingencyId; + public ContingencyContext getContingencyContext() { + return contingencyContext; } /** diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategyList.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategyList.java index 1ceaea47508..7f236c268fd 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategyList.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/strategy/OperatorStrategyList.java @@ -29,7 +29,7 @@ */ public class OperatorStrategyList { private final List operatorStrategies; - public static final String VERSION = "1.0"; + public static final String VERSION = "1.1"; public OperatorStrategyList(List operatorStrategies) { this.operatorStrategies = ImmutableList.copyOf(Objects.requireNonNull(operatorStrategies)); @@ -39,15 +39,15 @@ public List getOperatorStrategies() { return operatorStrategies; } - public static OperatorStrategyList readFile(Path jsonFile) { + public static OperatorStrategyList read(Path jsonFile) { try (InputStream is = Files.newInputStream(jsonFile)) { - return readOutputStream(is); + return read(is); } catch (IOException e) { throw new UncheckedIOException(e); } } - public static OperatorStrategyList readOutputStream(InputStream is) { + public static OperatorStrategyList read(InputStream is) { Objects.requireNonNull(is); ObjectMapper objectMapper = JsonUtil.createObjectMapper() @@ -62,10 +62,10 @@ public static OperatorStrategyList readOutputStream(InputStream is) { /** * Writes action list as JSON to a file. */ - public void writeFile(Path jsonFile) { + public void write(Path jsonFile) { Objects.requireNonNull(jsonFile); try (OutputStream outputStream = Files.newOutputStream(jsonFile)) { - writeOutputStream(outputStream); + write(outputStream); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -74,7 +74,7 @@ public void writeFile(Path jsonFile) { /** * Writes action list as JSON to an output stream. */ - public void writeOutputStream(OutputStream outputStream) { + public void write(OutputStream outputStream) { try { ObjectMapper objectMapper = createObjectMapper(); ObjectWriter writer = objectMapper.writerWithDefaultPrettyPrinter(); diff --git a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/tools/SecurityAnalysisTool.java b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/tools/SecurityAnalysisTool.java index 1dd523bb353..4db0e718350 100644 --- a/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/tools/SecurityAnalysisTool.java +++ b/security-analysis/security-analysis-api/src/main/java/com/powsybl/security/tools/SecurityAnalysisTool.java @@ -301,7 +301,7 @@ void run(CommandLine line, ToolRunningContext context, .setParameters(parametersLoader.get()); options.getPath(MONITORING_FILE).ifPresent(monitorFilePath -> executionInput.setMonitors(StateMonitor.read(monitorFilePath))); - options.getPath(STRATEGIES_FILE).ifPresent(operatorStrategyFilePath -> executionInput.setOperatorStrategies(OperatorStrategyList.readFile(operatorStrategyFilePath).getOperatorStrategies())); + options.getPath(STRATEGIES_FILE).ifPresent(operatorStrategyFilePath -> executionInput.setOperatorStrategies(OperatorStrategyList.read(operatorStrategyFilePath).getOperatorStrategies())); options.getPath(ACTIONS_FILE).ifPresent(actionFilePath -> executionInput.setActions(ActionList.readJsonFile(actionFilePath).getActions())); updateInput(options, executionInput); diff --git a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/SecurityAnalysisResultBuilderTest.java b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/SecurityAnalysisResultBuilderTest.java index 0e0f7b6a54e..78c3828cbee 100644 --- a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/SecurityAnalysisResultBuilderTest.java +++ b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/SecurityAnalysisResultBuilderTest.java @@ -1,6 +1,7 @@ package com.powsybl.security; import com.powsybl.contingency.Contingency; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.VoltageLevel; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; @@ -228,7 +229,7 @@ public void onSecurityAnalysisResult(SecurityAnalysisResult result, SecurityAnal @Test public void operatorStrategyResultCreation() { //Build result with 1 operator strategy - OperatorStrategy operatorStrategy = new OperatorStrategy("strat1", "cont1", new TrueCondition(), + OperatorStrategy operatorStrategy = new OperatorStrategy("strat1", ContingencyContext.specificContingency("cont1"), new TrueCondition(), List.of("action1", "action2")); SecurityAnalysisResultBuilder builder = new SecurityAnalysisResultBuilder(new LimitViolationFilter(), diff --git a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/converter/ExporterTest.java b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/converter/ExporterTest.java index 56369b7c9c9..d8e768a8a9c 100644 --- a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/converter/ExporterTest.java +++ b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/converter/ExporterTest.java @@ -70,7 +70,7 @@ private static SecurityAnalysisResult create() { List preContingencyBusResults = List.of(new BusResult("voltageLevelId", "busId", 400, 3.14)); List threeWindingsTransformerResults = List.of(new ThreeWindingsTransformerResult("threeWindingsTransformerId", 1, 2, 3, 1.1, 2.1, 3.1, 1.2, 2.2, 3.2)); List operatorStrategyResults = new ArrayList<>(); - operatorStrategyResults.add(new OperatorStrategyResult(new OperatorStrategy("strategyId", "contingency1", new AtLeastOneViolationCondition(Collections.singletonList("violationId1")), + operatorStrategyResults.add(new OperatorStrategyResult(new OperatorStrategy("strategyId", ContingencyContext.specificContingency("contingency1"), new AtLeastOneViolationCondition(Collections.singletonList("violationId1")), Collections.singletonList("actionId1")), PostContingencyComputationStatus.CONVERGED, new LimitViolationsResult(Collections.emptyList()), new NetworkResult(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()))); SecurityAnalysisResult result = new SecurityAnalysisResult(preContingencyResult, LoadFlowResult.ComponentResult.Status.CONVERGED, diff --git a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandlersTest.java b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandlersTest.java index 6ffcb2628b5..41f54e27c14 100644 --- a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandlersTest.java +++ b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/distributed/SecurityAnalysisExecutionHandlersTest.java @@ -13,6 +13,7 @@ import com.google.common.jimfs.Jimfs; import com.powsybl.computation.*; import com.powsybl.contingency.Contingency; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.iidm.network.VariantManagerConstants; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import com.powsybl.loadflow.LoadFlowResult; @@ -117,7 +118,7 @@ public void forwardedAfter() throws IOException { @Test public void forwardedBeforeWithCompleteInput() throws IOException { Action action = new SwitchAction("action", "switch", false); - OperatorStrategy strategy = new OperatorStrategy("strat", "cont", new TrueCondition(), List.of("action")); + OperatorStrategy strategy = new OperatorStrategy("strat", ContingencyContext.specificContingency("cont"), new TrueCondition(), List.of("action")); SecurityAnalysisExecutionInput input = new SecurityAnalysisExecutionInput() .setParameters(new SecurityAnalysisParameters()) diff --git a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonActionAndOperatorStrategyTest.java b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonActionAndOperatorStrategyTest.java index 43c71475265..2defb5f996b 100644 --- a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonActionAndOperatorStrategyTest.java +++ b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonActionAndOperatorStrategyTest.java @@ -14,6 +14,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.ComparisonUtils; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.iidm.network.ThreeWindingsTransformer; import com.powsybl.security.action.*; import com.powsybl.security.condition.TrueCondition; @@ -21,9 +23,7 @@ import com.powsybl.security.strategy.OperatorStrategyList; import org.junit.Test; -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; +import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -56,13 +56,22 @@ public void actionRoundTrip() throws IOException { roundTripTest(actionList, ActionList::writeJsonFile, ActionList::readJsonFile, "/ActionFileTest.json"); } + @Test + public void operatorStrategyReadV10() throws IOException { + OperatorStrategyList operatorStrategies = OperatorStrategyList.read(getClass().getResourceAsStream("/OperatorStrategyFileTestV1.0.json")); + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + operatorStrategies.write(bos); + ComparisonUtils.compareTxt(getClass().getResourceAsStream("/OperatorStrategyFileTest.json"), new ByteArrayInputStream(bos.toByteArray())); + } + } + @Test public void operatorStrategyRoundTrip() throws IOException { List operatorStrategies = new ArrayList<>(); - operatorStrategies.add(new OperatorStrategy("id1", "contingencyId1", new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3"))); - operatorStrategies.add(new OperatorStrategy("id1", "contingencyId1", new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3"))); + operatorStrategies.add(new OperatorStrategy("id1", ContingencyContext.specificContingency("contingencyId1"), new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3"))); + operatorStrategies.add(new OperatorStrategy("id1", ContingencyContext.specificContingency("contingencyId1"), new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3"))); OperatorStrategyList operatorStrategyList = new OperatorStrategyList(operatorStrategies); - roundTripTest(operatorStrategyList, OperatorStrategyList::writeFile, OperatorStrategyList::readFile, "/OperatorStrategyFileTest.json"); + roundTripTest(operatorStrategyList, OperatorStrategyList::write, OperatorStrategyList::read, "/OperatorStrategyFileTest.json"); } @Test diff --git a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonOperatorStrategyExtensionTest.java b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonOperatorStrategyExtensionTest.java index bf82098458b..1089b6d9702 100644 --- a/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonOperatorStrategyExtensionTest.java +++ b/security-analysis/security-analysis-api/src/test/java/com/powsybl/security/json/JsonOperatorStrategyExtensionTest.java @@ -21,6 +21,7 @@ import com.powsybl.commons.extensions.AbstractExtension; import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.commons.json.JsonUtil; +import com.powsybl.contingency.ContingencyContext; import com.powsybl.security.condition.TrueCondition; import com.powsybl.security.strategy.OperatorStrategy; import com.powsybl.security.strategy.OperatorStrategyList; @@ -37,24 +38,24 @@ public class JsonOperatorStrategyExtensionTest extends AbstractConverterTest { @Test public void testWrite() throws IOException { - OperatorStrategy operatorStrategy = new OperatorStrategy("id1", "contingencyId1", + OperatorStrategy operatorStrategy = new OperatorStrategy("id1", ContingencyContext.specificContingency("contingencyId1"), new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3")); operatorStrategy.addExtension(DummyExtension.class, new DummyExtension()); OperatorStrategyList operatorStrategyList = new OperatorStrategyList(Collections.singletonList(operatorStrategy)); - writeTest(operatorStrategyList, OperatorStrategyList::writeFile, ComparisonUtils::compareTxt, + writeTest(operatorStrategyList, OperatorStrategyList::write, ComparisonUtils::compareTxt, "/OperatorStrategyFileExtensionsTest.json"); } @Test public void testRoundTrip() throws IOException { - OperatorStrategy operatorStrategy = new OperatorStrategy("id1", "contingencyId1", + OperatorStrategy operatorStrategy = new OperatorStrategy("id1", ContingencyContext.specificContingency("contingencyId1"), new TrueCondition(), Arrays.asList("actionId1", "actionId2", "actionId3")); operatorStrategy.addExtension(DummyExtension.class, new DummyExtension()); - OperatorStrategy operatorStrategy2 = new OperatorStrategy("id2", "contingencyId2", + OperatorStrategy operatorStrategy2 = new OperatorStrategy("id2", ContingencyContext.specificContingency("contingencyId2"), new TrueCondition(), Collections.singletonList("actionId4")); operatorStrategy2.addExtension(DummyExtension.class, new DummyExtension()); OperatorStrategyList operatorStrategyList = new OperatorStrategyList(Arrays.asList(operatorStrategy, operatorStrategy2)); - roundTripTest(operatorStrategyList, OperatorStrategyList::writeFile, OperatorStrategyList::readFile, + roundTripTest(operatorStrategyList, OperatorStrategyList::write, OperatorStrategyList::read, "/OperatorStrategyFileExtensionsTest2.json"); } diff --git a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest.json b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest.json index 9e9aafb4edf..1b580fb7893 100644 --- a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest.json +++ b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest.json @@ -1,7 +1,8 @@ { - "version" : "1.0", + "version" : "1.1", "operatorStrategies" : [ { "id" : "id1", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingencyId1", "condition" : { "type" : "TRUE_CONDITION" diff --git a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest2.json b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest2.json index 35f7f6d22de..d387af3cce7 100644 --- a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest2.json +++ b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileExtensionsTest2.json @@ -1,7 +1,8 @@ { - "version" : "1.0", + "version" : "1.1", "operatorStrategies" : [ { "id" : "id1", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingencyId1", "condition" : { "type" : "TRUE_CONDITION" @@ -16,6 +17,7 @@ } }, { "id" : "id2", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingencyId2", "condition" : { "type" : "TRUE_CONDITION" diff --git a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTest.json b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTest.json index 0002e912c5d..1e56f1b4c6a 100644 --- a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTest.json +++ b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTest.json @@ -1,7 +1,8 @@ { - "version" : "1.0", + "version" : "1.1", "operatorStrategies" : [ { "id" : "id1", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingencyId1", "condition" : { "type" : "TRUE_CONDITION" @@ -9,6 +10,7 @@ "actionIds" : [ "actionId1", "actionId2", "actionId3" ] }, { "id" : "id1", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingencyId1", "condition" : { "type" : "TRUE_CONDITION" diff --git a/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTestV1.0.json b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTestV1.0.json new file mode 100644 index 00000000000..0002e912c5d --- /dev/null +++ b/security-analysis/security-analysis-api/src/test/resources/OperatorStrategyFileTestV1.0.json @@ -0,0 +1,18 @@ +{ + "version" : "1.0", + "operatorStrategies" : [ { + "id" : "id1", + "contingencyId" : "contingencyId1", + "condition" : { + "type" : "TRUE_CONDITION" + }, + "actionIds" : [ "actionId1", "actionId2", "actionId3" ] + }, { + "id" : "id1", + "contingencyId" : "contingencyId1", + "condition" : { + "type" : "TRUE_CONDITION" + }, + "actionIds" : [ "actionId1", "actionId2", "actionId3" ] + } ] +} \ No newline at end of file diff --git a/security-analysis/security-analysis-api/src/test/resources/SecurityAnalysisResult.json b/security-analysis/security-analysis-api/src/test/resources/SecurityAnalysisResult.json index 36d9b8eb9f9..d646193ae34 100644 --- a/security-analysis/security-analysis-api/src/test/resources/SecurityAnalysisResult.json +++ b/security-analysis/security-analysis-api/src/test/resources/SecurityAnalysisResult.json @@ -155,6 +155,7 @@ "operatorStrategyResults" : [ { "operatorStrategy" : { "id" : "strategyId", + "contingencyContextType" : "SPECIFIC", "contingencyId" : "contingency1", "condition" : { "type" : "AT_LEAST_ONE_VIOLATION", diff --git a/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/SecurityAnalysisTest.java b/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/SecurityAnalysisTest.java index fc40ff1d2df..6ef1db49de8 100644 --- a/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/SecurityAnalysisTest.java +++ b/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/SecurityAnalysisTest.java @@ -115,7 +115,7 @@ public void run() { SecurityAnalysisInterceptorMock interceptorMock = new SecurityAnalysisInterceptorMock(); List interceptors = new ArrayList<>(); List operatorStrategies = new ArrayList<>(); - operatorStrategies.add(new OperatorStrategy("operatorStrategy", "c1", + operatorStrategies.add(new OperatorStrategy("operatorStrategy", ContingencyContext.specificContingency("c1"), new AnyViolationCondition(), Collections.singletonList("action1"))); List actions = new ArrayList<>(); @@ -165,7 +165,7 @@ public void runWithoutContingency() { interceptors.add(interceptorMock); List operatorStrategies = new ArrayList<>(); - operatorStrategies.add(new OperatorStrategy("operatorStrategy", "c1", new AnyViolationCondition(), Collections.singletonList("action1"))); + operatorStrategies.add(new OperatorStrategy("operatorStrategy", ContingencyContext.specificContingency("c1"), new AnyViolationCondition(), Collections.singletonList("action1"))); List actions = new ArrayList<>(); actions.add(new SwitchAction("action1", "switchId", true));