diff --git a/action/action-simulator/src/test/java/com/powsybl/action/simulator/LoadFlowProviderMock.java b/action/action-simulator/src/test/java/com/powsybl/action/simulator/LoadFlowProviderMock.java index 8990a8f7bb9..e99dc3999b0 100644 --- a/action/action-simulator/src/test/java/com/powsybl/action/simulator/LoadFlowProviderMock.java +++ b/action/action-simulator/src/test/java/com/powsybl/action/simulator/LoadFlowProviderMock.java @@ -7,6 +7,9 @@ package com.powsybl.action.simulator; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; import com.powsybl.loadflow.LoadFlowParameters; @@ -17,6 +20,7 @@ import org.slf4j.LoggerFactory; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -42,4 +46,14 @@ public CompletableFuture run(Network network, ComputationManager LOGGER.warn("Running loadflow mock"); return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); } + + @Override + public Optional getSpecificParametersSerializer() { + return Optional.empty(); + } + + @Override + public Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.empty(); + } } diff --git a/commons/src/main/java/com/powsybl/commons/json/JsonUtil.java b/commons/src/main/java/com/powsybl/commons/json/JsonUtil.java index 98c9db59b47..3699742d1f9 100644 --- a/commons/src/main/java/com/powsybl/commons/json/JsonUtil.java +++ b/commons/src/main/java/com/powsybl/commons/json/JsonUtil.java @@ -230,9 +230,25 @@ public static Set writeExtensions(Extendable extendable, JsonGene return writeExtensions(extendable, jsonGenerator, true, serializerProvider, supplier); } + public static Set writeExtensions(Extendable extendable, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider, + SerializerSupplier supplier) throws IOException { + return writeExtensions(extendable, jsonGenerator, true, serializerProvider, supplier); + } + public static Set writeExtensions(Extendable extendable, JsonGenerator jsonGenerator, boolean headerWanted, SerializerProvider serializerProvider, ExtensionProviders supplier) throws IOException { + return writeExtensions(extendable, jsonGenerator, headerWanted, serializerProvider, supplier::findProvider); + } + + public interface SerializerSupplier { + ExtensionJsonSerializer getSerializer(String name); + } + + public static Set writeExtensions(Extendable extendable, JsonGenerator jsonGenerator, + boolean headerWanted, SerializerProvider serializerProvider, + SerializerSupplier supplier) throws IOException { Objects.requireNonNull(extendable); Objects.requireNonNull(jsonGenerator); Objects.requireNonNull(serializerProvider); @@ -243,7 +259,7 @@ public static Set writeExtensions(Extendable extendable, JsonGene if (!extendable.getExtensions().isEmpty()) { for (Extension extension : extendable.getExtensions()) { - ExtensionJsonSerializer serializer = supplier.findProvider(extension.getName()); + ExtensionJsonSerializer serializer = supplier.getSerializer(extension.getName()); if (serializer != null) { if (!headerDone && headerWanted) { jsonGenerator.writeFieldName("extensions"); @@ -282,13 +298,22 @@ public static List> updateExtensions(JsonPar return updateExtensions(parser, context, supplier, null, extendable); } - /** - * Updates the extensions of the provided extendable with possibly partial definition read from JSON. - * - *

Note that in order for this to work correctly, extension providers need to implement {@link ExtensionJsonSerializer#deserializeAndUpdate}. - */ + public static List> updateExtensions(JsonParser parser, DeserializationContext context, + SerializerSupplier supplier, T extendable) throws IOException { + return updateExtensions(parser, context, supplier, null, extendable); + } + public static List> updateExtensions(JsonParser parser, DeserializationContext context, ExtensionProviders supplier, Set extensionsNotFound, T extendable) throws IOException { + return updateExtensions(parser, context, supplier::findProvider, extensionsNotFound, extendable); + } + + /** + * Updates the extensions of the provided extendable with possibly partial definition read from JSON. + * + *

Note that in order for this to work correctly, extension providers need to implement {@link ExtensionJsonSerializer#deserializeAndUpdate}. + */ + public static List> updateExtensions(JsonParser parser, DeserializationContext context, SerializerSupplier supplier, Set extensionsNotFound, T extendable) throws IOException { Objects.requireNonNull(parser); Objects.requireNonNull(context); Objects.requireNonNull(supplier); @@ -308,9 +333,9 @@ public static List> updateExtensions(JsonPar } private static > E updateExtension(JsonParser parser, DeserializationContext context, - ExtensionProviders supplier, Set extensionsNotFound, T extendable) throws IOException { + SerializerSupplier supplier, Set extensionsNotFound, T extendable) throws IOException { String extensionName = parser.getCurrentName(); - ExtensionJsonSerializer extensionJsonSerializer = supplier.findProvider(extensionName); + ExtensionJsonSerializer extensionJsonSerializer = supplier.getSerializer(extensionName); if (extensionJsonSerializer != null) { parser.nextToken(); if (extendable != null && extendable.getExtensionByName(extensionName) != null) { @@ -360,7 +385,7 @@ public static Extension readExtension(JsonParser parse Objects.requireNonNull(parser); Objects.requireNonNull(context); Objects.requireNonNull(supplier); - return updateExtension(parser, context, supplier, extensionsNotFound, null); + return updateExtension(parser, context, supplier::findProvider, extensionsNotFound, null); } /** diff --git a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowParameters.java b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowParameters.java index 59ce45fde13..7c66d96de7f 100644 --- a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowParameters.java +++ b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowParameters.java @@ -7,14 +7,10 @@ package com.powsybl.loadflow; import com.fasterxml.jackson.core.util.ByteArrayBuilder; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.powsybl.commons.config.PlatformConfig; import com.powsybl.commons.extensions.AbstractExtendable; -import com.powsybl.commons.extensions.Extension; -import com.powsybl.commons.extensions.ExtensionConfigLoader; -import com.powsybl.commons.extensions.ExtensionProviders; +import com.powsybl.commons.util.ServiceLoaderCache; import com.powsybl.iidm.network.Country; import com.powsybl.loadflow.json.JsonLoadFlowParameters; @@ -31,13 +27,6 @@ */ public class LoadFlowParameters extends AbstractExtendable { - /** - * A configuration loader interface for the LoadFlowParameters extensions loaded from the platform configuration - * @param The extension class - */ - public interface ConfigLoader> extends ExtensionConfigLoader { - } - public enum VoltageInitMode { UNIFORM_VALUES, // v=1pu, theta=0 PREVIOUS_VALUES, @@ -82,9 +71,6 @@ public enum ConnectedComponentMode { public static final ConnectedComponentMode DEFAULT_CONNECTED_COMPONENT_MODE = ConnectedComponentMode.MAIN; public static final boolean DEFAULT_HVDC_AC_EMULATION_ON = true; - private static final Supplier> SUPPLIER = - Suppliers.memoize(() -> ExtensionProviders.createProvider(ConfigLoader.class, "loadflow-parameters")); - /** * Loads parameters from the default platform configuration. */ @@ -113,25 +99,24 @@ protected static void load(LoadFlowParameters parameters, PlatformConfig platfor Objects.requireNonNull(platformConfig); platformConfig.getOptionalModuleConfig("load-flow-default-parameters") - .ifPresent(config -> { - parameters.setVoltageInitMode(config.getEnumProperty("voltageInitMode", VoltageInitMode.class, DEFAULT_VOLTAGE_INIT_MODE)); - parameters.setTransformerVoltageControlOn(config.getBooleanProperty("transformerVoltageControlOn", DEFAULT_TRANSFORMER_VOLTAGE_CONTROL_ON)); - parameters.setNoGeneratorReactiveLimits(config.getBooleanProperty("noGeneratorReactiveLimits", DEFAULT_NO_GENERATOR_REACTIVE_LIMITS)); - parameters.setPhaseShifterRegulationOn(config.getBooleanProperty("phaseShifterRegulationOn", DEFAULT_PHASE_SHIFTER_REGULATION_ON)); - // keep old tag name "specificCompatibility" for compatibility - parameters.setTwtSplitShuntAdmittance(config.getBooleanProperty("twtSplitShuntAdmittance", config.getBooleanProperty("specificCompatibility", DEFAULT_TWT_SPLIT_SHUNT_ADMITTANCE))); - parameters.setShuntCompensatorVoltageControlOn(config.getBooleanProperty("shuntCompensatorVoltageControlOn", - config.getOptionalBooleanProperty("simulShunt").orElse(DEFAULT_SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON))); - parameters.setReadSlackBus(config.getBooleanProperty("readSlackBus", DEFAULT_READ_SLACK_BUS)); - parameters.setWriteSlackBus(config.getBooleanProperty("writeSlackBus", DEFAULT_WRITE_SLACK_BUS)); - parameters.setDc(config.getBooleanProperty("dc", DEFAULT_DC)); - parameters.setDistributedSlack(config.getBooleanProperty("distributedSlack", DEFAULT_DISTRIBUTED_SLACK)); - parameters.setBalanceType(config.getEnumProperty("balanceType", BalanceType.class, DEFAULT_BALANCE_TYPE)); - parameters.setDcUseTransformerRatio(config.getBooleanProperty("dcUseTransformerRatio", DEFAULT_DC_USE_TRANSFORMER_RATIO_DEFAULT)); - parameters.setCountriesToBalance(config.getEnumSetProperty("countriesToBalance", Country.class, DEFAULT_COUNTRIES_TO_BALANCE)); - parameters.setConnectedComponentMode(config.getEnumProperty("connectedComponentMode", ConnectedComponentMode.class, DEFAULT_CONNECTED_COMPONENT_MODE)); - parameters.setHvdcAcEmulation(config.getBooleanProperty("hvdcAcEmulation", DEFAULT_HVDC_AC_EMULATION_ON)); - }); + .ifPresent(config -> { + parameters.setVoltageInitMode(config.getEnumProperty("voltageInitMode", VoltageInitMode.class, DEFAULT_VOLTAGE_INIT_MODE)); + parameters.setTransformerVoltageControlOn(config.getBooleanProperty("transformerVoltageControlOn", DEFAULT_TRANSFORMER_VOLTAGE_CONTROL_ON)); + parameters.setNoGeneratorReactiveLimits(config.getBooleanProperty("noGeneratorReactiveLimits", DEFAULT_NO_GENERATOR_REACTIVE_LIMITS)); + parameters.setPhaseShifterRegulationOn(config.getBooleanProperty("phaseShifterRegulationOn", DEFAULT_PHASE_SHIFTER_REGULATION_ON)); + // keep old tag name "specificCompatibility" for compatibility + parameters.setTwtSplitShuntAdmittance(config.getBooleanProperty("twtSplitShuntAdmittance", config.getBooleanProperty("specificCompatibility", DEFAULT_TWT_SPLIT_SHUNT_ADMITTANCE))); + parameters.setShuntCompensatorVoltageControlOn(config.getBooleanProperty("shuntCompensatorVoltageControlOn", + config.getOptionalBooleanProperty("simulShunt").orElse(DEFAULT_SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON))); + parameters.setReadSlackBus(config.getBooleanProperty("readSlackBus", DEFAULT_READ_SLACK_BUS)); + parameters.setWriteSlackBus(config.getBooleanProperty("writeSlackBus", DEFAULT_WRITE_SLACK_BUS)); + parameters.setDc(config.getBooleanProperty("dc", DEFAULT_DC)); + parameters.setDistributedSlack(config.getBooleanProperty("distributedSlack", DEFAULT_DISTRIBUTED_SLACK)); + parameters.setBalanceType(config.getEnumProperty("balanceType", BalanceType.class, DEFAULT_BALANCE_TYPE)); + parameters.setDcUseTransformerRatio(config.getBooleanProperty("dcUseTransformerRatio", DEFAULT_DC_USE_TRANSFORMER_RATIO_DEFAULT)); + parameters.setCountriesToBalance(config.getEnumSetProperty("countriesToBalance", Country.class, DEFAULT_COUNTRIES_TO_BALANCE)); + parameters.setConnectedComponentMode(config.getEnumProperty("connectedComponentMode", ConnectedComponentMode.class, DEFAULT_CONNECTED_COMPONENT_MODE)); + }); } private VoltageInitMode voltageInitMode; @@ -187,8 +172,8 @@ public LoadFlowParameters(VoltageInitMode voltageInitMode, boolean transformerVo } public LoadFlowParameters(VoltageInitMode voltageInitMode, boolean transformerVoltageControlOn, - boolean noGeneratorReactiveLimits, boolean phaseShifterRegulationOn, - boolean twtSplitShuntAdmittance) { + boolean noGeneratorReactiveLimits, boolean phaseShifterRegulationOn, + boolean twtSplitShuntAdmittance) { this(voltageInitMode, transformerVoltageControlOn, noGeneratorReactiveLimits, phaseShifterRegulationOn, twtSplitShuntAdmittance, DEFAULT_SHUNT_COMPENSATOR_VOLTAGE_CONTROL_ON, DEFAULT_READ_SLACK_BUS, DEFAULT_WRITE_SLACK_BUS, DEFAULT_DC, DEFAULT_DISTRIBUTED_SLACK, DEFAULT_BALANCE_TYPE, DEFAULT_DC_USE_TRANSFORMER_RATIO_DEFAULT, DEFAULT_COUNTRIES_TO_BALANCE, DEFAULT_CONNECTED_COMPONENT_MODE, DEFAULT_HVDC_AC_EMULATION_ON); } @@ -431,6 +416,7 @@ public LoadFlowParameters setHvdcAcEmulation(boolean hvdcAcEmulation) { /** * This copy methods uses json serializer mechanism to rebuild all extensions in the this parameters. * If an extension's serializer not found via {@code @AutoService}, the extension would be lost in copied. + * * @return a new copied instance and with original's extensions found based-on json serializer. */ public LoadFlowParameters copy() { @@ -455,8 +441,9 @@ public String toString() { } private void loadExtensions(PlatformConfig platformConfig) { - for (ExtensionConfigLoader provider : SUPPLIER.get().getProviders()) { - addExtension(provider.getExtensionClass(), provider.load(platformConfig)); + for (LoadFlowProvider provider : new ServiceLoaderCache<>(LoadFlowProvider.class).getServices()) { + provider.loadSpecificParameters(platformConfig).ifPresent(loadFlowParametersExtension -> + addExtension((Class) loadFlowParametersExtension.getClass(), loadFlowParametersExtension)); } } } diff --git a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowProvider.java b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowProvider.java index 8c11e666d5c..ed921fa9d4d 100644 --- a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowProvider.java +++ b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/LoadFlowProvider.java @@ -7,15 +7,32 @@ package com.powsybl.loadflow; import com.powsybl.commons.Versionable; +import com.powsybl.commons.config.PlatformConfig; import com.powsybl.commons.config.PlatformConfigNamedProvider; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.commons.reporter.Reporter; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** - * SPI for load implementations. + * Service Provider Interface for loadflow implementations. + * + *

A loadflow provider is required to implement the main method {@link #run}, in charge of actually + * running a loadflow and updating the network variant with computed physical values. + * + *

It may, additionally, provide methods to support implementation-specific parameters. + * Specific parameters should be implemented as an implementation of {@link Extension}. + * + *

    + *
  • In order to support JSON serialization for those specific parameters, + * implementing {@link #getSpecificParametersSerializer()} is required.
  • + *
  • In order to support loading specific parameters from platform configuration, + * implementing {@link #loadSpecificParameters(PlatformConfig)} is required.
  • + *
* * @author Geoffroy Jamgotchian */ @@ -27,10 +44,10 @@ public interface LoadFlowProvider extends Versionable, PlatformConfigNamedProvid * to be stateless so that it can be call simultaneously with different arguments (a different network for instance) * without any concurrency issue. * - * @param network the network + * @param network the network * @param computationManager a computation manager to external program execution - * @param workingVariantId variant id of the network - * @param parameters load flow execution parameters + * @param workingVariantId variant id of the network + * @param parameters load flow execution parameters * @return a {@link CompletableFuture} on {@link LoadFlowResult] */ default CompletableFuture run(Network network, ComputationManager computationManager, String workingVariantId, LoadFlowParameters parameters) { @@ -43,15 +60,37 @@ default CompletableFuture run(Network network, ComputationManage * to be stateless so that it can be call simultaneously with different arguments (a different network for instance) * without any concurrency issue. * - * @param network the network + * @param network the network * @param computationManager a computation manager to external program execution - * @param workingVariantId variant id of the network - * @param parameters load flow execution parameters - * @param reporter the reporter used for functional logs + * @param workingVariantId variant id of the network + * @param parameters load flow execution parameters + * @param reporter the reporter used for functional logs * @return a {@link CompletableFuture} on {@link LoadFlowResult] */ default CompletableFuture run(Network network, ComputationManager computationManager, String workingVariantId, LoadFlowParameters parameters, Reporter reporter) { return run(network, computationManager, workingVariantId, parameters); } + /** + * The serializer for implementation-specific parameters, or {@link Optional#empty()} if the implementation + * does not have any specific parameters, or does not support JSON serialization. + * + *

Note that the actual serializer type should be {@code ExtensionJsonSerializer} + * where {@code MyParametersExtension} is the specific parameters class. + * + * @return The serializer for implementation-specific parameters. + */ + default Optional getSpecificParametersSerializer() { + return Optional.empty(); + } + + /** + * Reads implementation-specific parameters from platform config, or return {@link Optional#empty()} + * if the implementation does not have any specific parameters, or does not support loading from config. + * + * @return The specific parameters read from platform config. + */ + default Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.empty(); + } } diff --git a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/JsonLoadFlowParameters.java b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/JsonLoadFlowParameters.java index 3c8a9e1cb28..ab7270712dc 100644 --- a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/JsonLoadFlowParameters.java +++ b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/JsonLoadFlowParameters.java @@ -12,13 +12,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.powsybl.commons.extensions.Extension; import com.powsybl.commons.extensions.ExtensionJsonSerializer; -import com.powsybl.commons.extensions.ExtensionProviders; +import com.powsybl.commons.extensions.ExtensionProvider; import com.powsybl.commons.json.JsonUtil; +import com.powsybl.commons.util.ServiceLoaderCache; import com.powsybl.loadflow.LoadFlowParameters; +import com.powsybl.loadflow.LoadFlowProvider; import java.io.IOException; import java.io.InputStream; @@ -26,7 +25,10 @@ import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * Provides methods to read and write LoadFlowParameters from and to JSON. @@ -35,28 +37,14 @@ */ public final class JsonLoadFlowParameters { - /** - * A configuration loader interface for the LoadFlowParameters extensions loaded from the platform configuration - * - * @param The extension class - */ - public interface ExtensionSerializer> extends ExtensionJsonSerializer { - } - - /** - * Lazily initialized list of extension serializers. - */ - private static final Supplier> SUPPLIER = - Suppliers.memoize(() -> ExtensionProviders.createProvider(ExtensionSerializer.class, "loadflow-parameters")); - - /** - * Gets the known extension serializers. - */ - public static ExtensionProviders getExtensionSerializers() { - return SUPPLIER.get(); + private JsonLoadFlowParameters() { } - private JsonLoadFlowParameters() { + public static Map getExtensionSerializers() { + List providers = new ServiceLoaderCache<>(LoadFlowProvider.class).getServices(); + return providers.stream() + .flatMap(loadFlowProvider -> loadFlowProvider.getSpecificParametersSerializer().stream()) + .collect(Collectors.toMap(ExtensionProvider::getExtensionName, loadFlowProvider -> loadFlowProvider)); } /** diff --git a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersDeserializer.java b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersDeserializer.java index 3e90ef9404b..831558cc0d8 100644 --- a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersDeserializer.java +++ b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersDeserializer.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Set; +import static com.powsybl.loadflow.json.JsonLoadFlowParameters.*; + /** * @author Sylvain Leclerc */ @@ -159,14 +161,14 @@ public LoadFlowParameters deserialize(JsonParser parser, DeserializationContext case "extensions": parser.nextToken(); - extensions = JsonUtil.updateExtensions(parser, deserializationContext, JsonLoadFlowParameters.getExtensionSerializers(), parameters); + extensions = JsonUtil.updateExtensions(parser, deserializationContext, getExtensionSerializers()::get, parameters); break; default: throw new AssertionError("Unexpected field: " + parser.getCurrentName()); } } - JsonLoadFlowParameters.getExtensionSerializers().addExtensions(parameters, extensions); + extensions.forEach(extension -> parameters.addExtension((Class) extension.getClass(), extension)); return parameters; } } diff --git a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersSerializer.java b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersSerializer.java index abae1a7e647..eb3c6efb794 100644 --- a/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersSerializer.java +++ b/loadflow/loadflow-api/src/main/java/com/powsybl/loadflow/json/LoadFlowParametersSerializer.java @@ -50,7 +50,7 @@ public void serialize(LoadFlowParameters parameters, JsonGenerator jsonGenerator jsonGenerator.writeStringField("connectedComponentMode", parameters.getConnectedComponentMode().name()); jsonGenerator.writeBooleanField("hvdcAcEmulation", parameters.isHvdcAcEmulation()); - JsonUtil.writeExtensions(parameters, jsonGenerator, serializerProvider, JsonLoadFlowParameters.getExtensionSerializers()); + JsonUtil.writeExtensions(parameters, jsonGenerator, serializerProvider, JsonLoadFlowParameters.getExtensionSerializers()::get); jsonGenerator.writeEndObject(); } diff --git a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/AnotherLoadFlowProviderMock.java b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/AnotherLoadFlowProviderMock.java deleted file mode 100644 index fcf8fdc5495..00000000000 --- a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/AnotherLoadFlowProviderMock.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2019, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package com.powsybl.loadflow; - -import com.powsybl.computation.ComputationManager; -import com.powsybl.iidm.network.Network; - -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -/** - * @author Geoffroy Jamgotchian - */ -public class AnotherLoadFlowProviderMock implements LoadFlowProvider { - - @Override - public CompletableFuture run(Network network, ComputationManager computationManager, String workingStateId, LoadFlowParameters parameters) { - return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); - } - - @Override - public String getName() { - return "AnotherLoadFlowMock"; - } - - @Override - public String getVersion() { - return "1.0"; - } -} diff --git a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowParametersTest.java b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowParametersTest.java index 839378d4f04..4ca4a1f28aa 100644 --- a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowParametersTest.java +++ b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowParametersTest.java @@ -6,30 +6,17 @@ */ package com.powsybl.loadflow; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.auto.service.AutoService; import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; import com.powsybl.commons.config.InMemoryPlatformConfig; import com.powsybl.commons.config.MapModuleConfig; -import com.powsybl.commons.config.PlatformConfig; -import com.powsybl.commons.extensions.AbstractExtension; import com.powsybl.commons.extensions.Extension; -import com.powsybl.commons.json.JsonUtil; import com.powsybl.iidm.network.Country; -import com.powsybl.loadflow.json.JsonLoadFlowParameters; -import com.powsybl.loadflow.json.JsonLoadFlowParametersTest; +import com.powsybl.loadflow.json.JsonLoadFlowParametersTest.DummyExtension; import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.io.IOException; import java.nio.file.FileSystem; import java.util.HashSet; import java.util.Set; @@ -322,7 +309,7 @@ public void testExtensions() { assertEquals(1, parameters.getExtensions().size()); assertTrue(parameters.getExtensions().contains(dummyExtension)); - assertTrue(parameters.getExtensionByName("dummyExtension") instanceof DummyExtension); + assertTrue(parameters.getExtensionByName("dummy-extension") instanceof DummyExtension); assertTrue(parameters.getExtension(DummyExtension.class) instanceof DummyExtension); } @@ -331,10 +318,9 @@ public void testCopyWithExtension() { LoadFlowParameters parameters = new LoadFlowParameters(); DummyExtension dummyExtension = new DummyExtension(); parameters.addExtension(DummyExtension.class, dummyExtension); - LoadFlowParameters copy = parameters.copy(); assertEquals(1, copy.getExtensions().size()); - Extension copiedExt = copy.getExtensionByName("dummyExtension"); + Extension copiedExt = copy.getExtensionByName("dummy-extension"); assertSame(parameters, dummyExtension.getExtendable()); assertSame(copy, copiedExt.getExtendable()); } @@ -345,7 +331,7 @@ public void testNoExtensions() { assertEquals(0, parameters.getExtensions().size()); assertFalse(parameters.getExtensions().contains(new DummyExtension())); - assertFalse(parameters.getExtensionByName("dummyExtension") instanceof DummyExtension); + assertFalse(parameters.getExtensionByName("dummy-extension") instanceof DummyExtension); assertFalse(parameters.getExtension(DummyExtension.class) instanceof DummyExtension); } @@ -354,90 +340,7 @@ public void testExtensionFromConfig() { LoadFlowParameters parameters = LoadFlowParameters.load(platformConfig); assertEquals(1, parameters.getExtensions().size()); - assertTrue(parameters.getExtensionByName("dummyExtension") instanceof DummyExtension); + assertTrue(parameters.getExtensionByName("dummy-extension") instanceof DummyExtension); assertNotNull(parameters.getExtension(DummyExtension.class)); } - - private static class DummyExtension extends AbstractExtension { - - @Override - public String getName() { - return "dummyExtension"; - } - } - - @AutoService(LoadFlowParameters.ConfigLoader.class) - public static class DummyLoader implements LoadFlowParameters.ConfigLoader { - - @Override - public DummyExtension load(PlatformConfig platformConfig) { - return new DummyExtension(); - } - - @Override - public String getExtensionName() { - return "dummyExtension"; - } - - @Override - public String getCategoryName() { - return "loadflow-parameters"; - } - - @Override - public Class getExtensionClass() { - return DummyExtension.class; - } - } - - @AutoService(JsonLoadFlowParameters.ExtensionSerializer.class) - public static class DummySerializer implements JsonLoadFlowParameters.ExtensionSerializer { - - private interface SerializationSpec { - @JsonIgnore - String getName(); - - @JsonIgnore - LoadFlowParameters getExtendable(); - } - - private static ObjectMapper createMapper() { - return JsonUtil.createObjectMapper() - .addMixIn(JsonLoadFlowParametersTest.DummyExtension.class, JsonLoadFlowParametersTest.DummySerializer.SerializationSpec.class); - } - - @Override - public void serialize(DummyExtension extension, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - jsonGenerator.writeStartObject(); - jsonGenerator.writeEndObject(); - } - - @Override - public DummyExtension deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { - return new DummyExtension(); - } - - @Override - public DummyExtension deserializeAndUpdate(JsonParser jsonParser, DeserializationContext deserializationContext, DummyExtension parameters) throws IOException { - ObjectMapper objectMapper = createMapper(); - ObjectReader objectReader = objectMapper.readerForUpdating(parameters); - DummyExtension updatedParameters = objectReader.readValue(jsonParser, DummyExtension.class); - return updatedParameters; - } - - @Override - public String getExtensionName() { - return "dummyExtension"; - } - - @Override - public String getCategoryName() { - return "loadflow-parameters"; - } - - @Override - public Class getExtensionClass() { - return DummyExtension.class; - } - } } diff --git a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowProviderMock.java b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowProviderMock.java index 22509188a08..4b134b7c041 100644 --- a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowProviderMock.java +++ b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/LoadFlowProviderMock.java @@ -7,10 +7,16 @@ package com.powsybl.loadflow; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; +import com.powsybl.loadflow.json.JsonLoadFlowParametersTest.DummySerializer; +import com.powsybl.loadflow.json.JsonLoadFlowParametersTest.DummyExtension; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -24,6 +30,16 @@ public CompletableFuture run(Network network, ComputationManager return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); } + @Override + public Optional getSpecificParametersSerializer() { + return Optional.of(new DummySerializer()); + } + + @Override + public Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.of(new DummyExtension()); + } + @Override public String getName() { return "LoadFlowMock"; diff --git a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/json/JsonLoadFlowParametersTest.java b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/json/JsonLoadFlowParametersTest.java index a2d7b29f7e0..ab5bcfea896 100644 --- a/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/json/JsonLoadFlowParametersTest.java +++ b/loadflow/loadflow-api/src/test/java/com/powsybl/loadflow/json/JsonLoadFlowParametersTest.java @@ -13,10 +13,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.auto.service.AutoService; import com.powsybl.commons.AbstractConverterTest; import com.powsybl.commons.PowsyblException; import com.powsybl.commons.extensions.AbstractExtension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.commons.json.JsonUtil; import com.powsybl.iidm.network.Country; import com.powsybl.loadflow.LoadFlowParameters; @@ -156,7 +156,7 @@ public static class DummyExtension extends AbstractExtension public boolean parameterBoolean; public String parameterString; - DummyExtension() { + public DummyExtension() { super(); } @@ -215,8 +215,7 @@ public void updateExtension() throws IOError { assertNotEquals(oldExtension.getParameterString(), extension.getParameterString()); } - @AutoService(JsonLoadFlowParameters.ExtensionSerializer.class) - public static class DummySerializer implements JsonLoadFlowParameters.ExtensionSerializer { + public static class DummySerializer implements ExtensionJsonSerializer { @Override public void serialize(DummyExtension extension, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { diff --git a/loadflow/loadflow-scripting/src/test/java/com/powsybl/loadflow/scripting/LFMock.java b/loadflow/loadflow-scripting/src/test/java/com/powsybl/loadflow/scripting/LFMock.java index f51e0c5c5f9..730b631983c 100644 --- a/loadflow/loadflow-scripting/src/test/java/com/powsybl/loadflow/scripting/LFMock.java +++ b/loadflow/loadflow-scripting/src/test/java/com/powsybl/loadflow/scripting/LFMock.java @@ -8,6 +8,9 @@ package com.powsybl.loadflow.scripting; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; import com.powsybl.loadflow.LoadFlowParameters; @@ -16,6 +19,7 @@ import com.powsybl.loadflow.LoadFlowResultImpl; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -29,6 +33,16 @@ public CompletableFuture run(Network network, ComputationManager return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); } + @Override + public Optional getSpecificParametersSerializer() { + return Optional.empty(); + } + + @Override + public Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.empty(); + } + @Override public String getName() { return "LFMock"; diff --git a/loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/LoadFlowProviderMock.java b/loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/LoadFlowProviderMock.java index b7fa1efc941..1427b20a8fa 100644 --- a/loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/LoadFlowProviderMock.java +++ b/loadflow/loadflow-validation/src/test/java/com/powsybl/loadflow/validation/LoadFlowProviderMock.java @@ -7,6 +7,9 @@ package com.powsybl.loadflow.validation; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; import com.powsybl.loadflow.LoadFlowParameters; @@ -15,6 +18,7 @@ import com.powsybl.loadflow.LoadFlowResultImpl; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -38,4 +42,14 @@ public CompletableFuture run(Network network, ComputationManager network.getGenerator("GEN").getTerminal().setP(92f); return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); } + + @Override + public Optional getSpecificParametersSerializer() { + return Optional.empty(); + } + + @Override + public Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.empty(); + } } diff --git a/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/mocks/LoadFlowProviderMock.java b/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/mocks/LoadFlowProviderMock.java index 80f5c0cefc6..98a849ff5fa 100644 --- a/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/mocks/LoadFlowProviderMock.java +++ b/security-analysis/security-analysis-default/src/test/java/com/powsybl/security/impl/mocks/LoadFlowProviderMock.java @@ -7,6 +7,9 @@ package com.powsybl.security.impl.mocks; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.extensions.Extension; +import com.powsybl.commons.extensions.ExtensionJsonSerializer; import com.powsybl.computation.ComputationManager; import com.powsybl.iidm.network.Network; import com.powsybl.loadflow.LoadFlowParameters; @@ -17,6 +20,7 @@ import org.slf4j.LoggerFactory; import java.util.Collections; +import java.util.Optional; import java.util.concurrent.CompletableFuture; /** @@ -42,4 +46,14 @@ public CompletableFuture run(Network network, ComputationManager LOGGER.warn("Running loadflow mock"); return CompletableFuture.completedFuture(new LoadFlowResultImpl(true, Collections.emptyMap(), "")); } + + @Override + public Optional getSpecificParametersSerializer() { + return Optional.empty(); + } + + @Override + public Optional> loadSpecificParameters(PlatformConfig config) { + return Optional.empty(); + } }