From c36aa8a7ffbb000e0e50bd8e85cf72662ae670de Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 5 May 2023 19:31:03 +0200 Subject: [PATCH 01/18] Dynamic simulation - TapChangerBlocking model for automaton --- .../implementation/NetworkServiceImpl.java | 46 +++++++++++++++++++ .../mapping/server/utils/AutomatonFamily.java | 1 + .../mapping/server/utils/EquipmentType.java | 6 ++- src/main/resources/IEEE14Models.sql | 38 +++++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/NetworkServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/NetworkServiceImpl.java index 42cda2e7..63a91f92 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/NetworkServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/NetworkServiceImpl.java @@ -98,6 +98,15 @@ public NetworkValues getNetworkValuesFromExistingNetwork(UUID networkUuid) { EquipmentValues loadsEquipmentValues = getLoadsEquipmentValues(network, voltageLevelsPropertyValues, substationsPropertyValues); equipmentValuesList.add(loadsEquipmentValues); + EquipmentValues busesEquipmentValues = getBusesEquipmentValues(network, voltageLevelsPropertyValues, substationsPropertyValues); + equipmentValuesList.add(busesEquipmentValues); + + EquipmentValues linesEquipmentValues = getLinesEquipmentValues(network); + equipmentValuesList.add(linesEquipmentValues); + + EquipmentValues twoWindingsTransformersEquipmentValues = getTwoWindingsTransformersEquipmentValues(network, substationsPropertyValues); + equipmentValuesList.add(twoWindingsTransformersEquipmentValues); + return new NetworkValues(networkUuid, equipmentValuesList); } @@ -168,6 +177,43 @@ private EquipmentValues getLoadsEquipmentValues(Network network, HashMap> voltageLevelsPropertyValues, HashMap> substationsPropertyValues) { + HashMap> busValuesMap = new HashMap<>(); + // Own properties + network.getBusBreakerView().getBuses().forEach(bus -> { + setPropertyMap(busValuesMap, bus.getId(), ID_PROPERTY); + }); + + // Parent properties (merge unnecessary, no overlap in properties + busValuesMap.putAll(voltageLevelsPropertyValues); + busValuesMap.putAll(substationsPropertyValues); + + return new EquipmentValues(EquipmentType.BUS, busValuesMap); + } + + private EquipmentValues getLinesEquipmentValues(Network network) { + HashMap> lineValuesMap = new HashMap<>(); + // Own properties + network.getLines().forEach(line -> { + setPropertyMap(lineValuesMap, line.getId(), ID_PROPERTY); + }); + + return new EquipmentValues(EquipmentType.LINE, lineValuesMap); + } + + private EquipmentValues getTwoWindingsTransformersEquipmentValues(Network network, HashMap> substationsPropertyValues) { + HashMap> twoWindingsTransformersValuesMap = new HashMap<>(); + // Own properties + network.getTwoWindingsTransformers().forEach(twoWindingsTransformer -> { + setPropertyMap(twoWindingsTransformersValuesMap, twoWindingsTransformer.getId(), ID_PROPERTY); + }); + + // Parent properties (merge unnecessary, no overlap in properties + twoWindingsTransformersValuesMap.putAll(substationsPropertyValues); + + return new EquipmentValues(EquipmentType.TWO_WINDINGS_TRANSFORMER, twoWindingsTransformersValuesMap); + } + @Override public NetworkValues getNetworkValues(MultipartFile multipartFile) { HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/org/gridsuite/mapping/server/utils/AutomatonFamily.java b/src/main/java/org/gridsuite/mapping/server/utils/AutomatonFamily.java index 5687c8af..e752899b 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/AutomatonFamily.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/AutomatonFamily.java @@ -11,4 +11,5 @@ */ public enum AutomatonFamily { CURRENT_LIMIT, + VOLTAGE, } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/EquipmentType.java b/src/main/java/org/gridsuite/mapping/server/utils/EquipmentType.java index 5da58c26..e253457a 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/EquipmentType.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/EquipmentType.java @@ -12,5 +12,9 @@ public enum EquipmentType { GENERATOR, LOAD, - CURRENT_LIMIT + CURRENT_LIMIT, + VOLTAGE, + BUS, + LINE, + TWO_WINDINGS_TRANSFORMER, } diff --git a/src/main/resources/IEEE14Models.sql b/src/main/resources/IEEE14Models.sql index b0017f9a..e2b8ac5c 100644 --- a/src/main/resources/IEEE14Models.sql +++ b/src/main/resources/IEEE14Models.sql @@ -777,3 +777,41 @@ VALUES ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_Q0Pu', 'IEEE14_GEN____8_SM'), ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_U0Pu', 'IEEE14_GEN____8_SM'), ('IEEE14', 1, 'GeneratorSynchronousThreeWindingsProportionalRegulations', 'generator_UPhase0', 'IEEE14_GEN____8_SM'); + +--- model TapChangerBlocking for VOLTAGE Equipment type +INSERT INTO models (model_name, equipment_type) +VALUES ('TapChangerBlocking', 3); + +INSERT INTO model_parameter_definitions (model_name, name, origin, origin_name, type) +VALUES ('TapChangerBlocking', 'tapChangerBlocking_UMin', 2, NULL, 2), + ('TapChangerBlocking', 'tapChangerBlocking_tLagBeforeBlocked', 2, NULL, 2), + ('TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedD', 2, NULL, 2), + ('TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedT', 2, NULL, 2); + +INSERT INTO model_sets_group (model_name, name, type) +VALUES ('TapChangerBlocking', 'TCB', 0), + ('TapChangerBlocking', 'TCB_2_4', 0), + ('TapChangerBlocking', 'TCB_2_5', 0),; + +INSERT INTO model_parameter_sets (group_name, group_type, model_name, name) +VALUES ('TCB', 0, 'TapChangerBlocking', 'TCB'), + ('TCB_2_4', 0, 'TapChangerBlocking', 'TCB_2_4'), + ('TCB_2_5', 0, 'TapChangerBlocking', 'TCB_2_5'); + +INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) +VALUES ('TCB', 0, 'TapChangerBlocking', 'tapChangerBlocking_UMin', 'TCB', 10.), + ('TCB', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagBeforeBlocked', 'TCB', 100.), + ('TCB', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedD', 'TCB', 1000.), + ('TCB', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedT', 'TCB', 10.); + +INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) +VALUES ('TCB_2_4', 0, 'TapChangerBlocking', 'tapChangerBlocking_UMin', 'TCB_2_4', 14.), + ('TCB_2_4', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagBeforeBlocked', 'TCB_2_4', 104.), + ('TCB_2_4', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedD', 'TCB_2_4', 1004.), + ('TCB_2_4', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedT', 'TCB_2_4', 14.); + +INSERT INTO model_parameters (group_name, group_type, model_name, name, set_name, value_) +VALUES ('TCB_2_5', 0, 'TapChangerBlocking', 'tapChangerBlocking_UMin', 'TCB_2_5', 15.), + ('TCB_2_5', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagBeforeBlocked', 'TCB_2_5', 105.), + ('TCB_2_5', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedD', 'TCB_2_5', 1005.), + ('TCB_2_5', 0, 'TapChangerBlocking', 'tapChangerBlocking_tLagTransBlockedT', 'TCB_2_5', 15.); From c1f55fd941dc842060777db0a57cbe6defe43762 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Wed, 10 May 2023 18:20:16 +0200 Subject: [PATCH 02/18] Add name, uMeasurements, transformers to AutomatonEntity and provide a dto TapChangerBlocking --- .../mapping/server/MappingConstants.java | 1 + .../dto/automata/AbstractAutomaton.java | 31 +++++++-- .../dto/automata/CurrentLimitAutomaton.java | 42 ++++++------ .../dto/automata/TapChangerBlocking.java | 67 +++++++++++++++++++ .../mapping/server/model/AutomatonEntity.java | 20 +++++- .../implementation/ScriptServiceImpl.java | 11 ++- .../server/utils/StringListConverter.java | 22 ++++++ .../mapping/server/utils/Templater.java | 6 +- .../db/changelog/db.changelog-master.yaml | 4 ++ 9 files changed, 177 insertions(+), 27 deletions(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java create mode 100644 src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java diff --git a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java index 6832a33f..98775a30 100644 --- a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java +++ b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java @@ -35,4 +35,5 @@ private MappingConstants() { public static final String LOAD_TYPE_PROPERTY = "loadType"; public static final String CURRENT_LIMIT_MODEL_CLASS = "CurrentLimitAutomaton"; + public static final String VOLTAGE_MODEL_CLASS = "TapChangerBlocking"; } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index 2371fb9c..c8f8c75a 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.utils.AutomatonFamily; @@ -18,14 +19,19 @@ import org.springframework.web.client.HttpClientErrorException; import java.util.ArrayList; +import java.util.List; +import java.util.UUID; /** * @author Mathieu Scalbert */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "family", visible = true) @JsonSubTypes({ - @JsonSubTypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT")}) + @JsonSubTypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"), + @JsonSubTypes.Type(value = TapChangerBlocking.class, name = "VOLTAGE"), +}) @Data +@NoArgsConstructor public abstract class AbstractAutomaton { @Schema(description = "Automaton family") @JsonProperty @@ -37,16 +43,31 @@ public abstract class AbstractAutomaton { @Schema(description = "Mapped Parameters Set Group ID") private String setGroup; - @Schema(description = "Element watched by the automaton") - private String watchedElement; + protected AbstractAutomaton(AutomatonEntity automatonEntity) { + this.setFamily(automatonEntity.getFamily()); + this.setModel(automatonEntity.getModel()); + this.setSetGroup(automatonEntity.getSetGroup()); + } + + public abstract List convertToBasicProperties(); - public abstract ArrayList convertToBasicProperties(); + public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { + UUID createdId = UUID.randomUUID(); + AutomatonEntity convertedAutomaton = new AutomatonEntity(); + convertedAutomaton.setAutomatonId(createdId); + convertedAutomaton.setFamily(this.getFamily()); + convertedAutomaton.setModel(this.getModel()); + convertedAutomaton.setSetGroup(this.getSetGroup()); - public abstract AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping); + convertedAutomaton.setMapping(parentMapping); + return convertedAutomaton; + } public static AbstractAutomaton instantiateFromEntity(AutomatonEntity automatonEntity) { if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) { return new CurrentLimitAutomaton(automatonEntity); + } else if (automatonEntity.getFamily() == AutomatonFamily.VOLTAGE) { + return new TapChangerBlocking(automatonEntity); } else { throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index 0f2f1b73..9db2cc05 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.dto.automata; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -16,7 +17,6 @@ import java.util.ArrayList; import java.util.Optional; -import java.util.UUID; /** * @author Mathieu Scalbert @@ -25,18 +25,13 @@ @EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class CurrentLimitAutomaton extends AbstractAutomaton { - private String side; - public ArrayList convertToBasicProperties() { - ArrayList propertiesList = new ArrayList<>(); - propertiesList.add(new BasicProperty("side", side)); - return propertiesList; - } + @Schema(description = "Element watched by the automaton") + private String watchedElement; + private String side; public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { - this.setFamily(automatonEntity.getFamily()); - this.setModel(automatonEntity.getModel()); - this.setSetGroup(automatonEntity.getSetGroup()); + super(automatonEntity); this.setWatchedElement(automatonEntity.getWatchedElement()); // TODO Create generic function for all properties Optional foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny(); @@ -45,23 +40,32 @@ public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { } } + @Override + public ArrayList convertToBasicProperties() { + ArrayList propertiesList = new ArrayList<>(); + propertiesList.add(new BasicProperty("side", side)); + return propertiesList; + } + + @Override public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { - UUID createdId = UUID.randomUUID(); - AutomatonEntity convertedAutomaton = new AutomatonEntity(); - convertedAutomaton.setAutomatonId(createdId); - convertedAutomaton.setFamily(this.getFamily()); - convertedAutomaton.setModel(this.getModel()); - convertedAutomaton.setSetGroup(this.getSetGroup()); + AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); + + // model properties convertedAutomaton.setWatchedElement(this.getWatchedElement()); - convertedAutomaton.setMapping(parentMapping); + + // additional properties ArrayList convertedProperties = new ArrayList<>(); + convertedAutomaton.setProperties(convertedProperties); + + // side property AutomatonPropertyEntity convertedProperty = new AutomatonPropertyEntity(); - convertedProperty.setAutomatonId(createdId); + convertedProperty.setAutomatonId(convertedAutomaton.getAutomatonId()); convertedProperty.setName("side"); convertedProperty.setValue(this.getSide()); convertedProperty.setType(PropertyType.STRING); convertedProperties.add(convertedProperty); - convertedAutomaton.setProperties(convertedProperties); + return convertedAutomaton; } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java new file mode 100644 index 00000000..d52cd3bc --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.gridsuite.mapping.server.model.AutomatonEntity; +import org.gridsuite.mapping.server.model.AutomatonPropertyEntity; +import org.gridsuite.mapping.server.model.MappingEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Thang PHAM + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class TapChangerBlocking extends AbstractAutomaton { + + @Schema(description = "Name") + private String name; + + @Schema(description = "U Measurement by the automaton") + @JsonProperty("uMeasurements") + private List uMeasurements; + + @Schema(description = "Transformers by the automaton") + private List transformers; + + public TapChangerBlocking(AutomatonEntity automatonEntity) { + super(automatonEntity); + this.setName(automatonEntity.getName()); + this.setUMeasurements(new ArrayList<>(automatonEntity.getUMeasurements())); + this.setTransformers(new ArrayList<>(automatonEntity.getTransformers())); + } + + @Override + public ArrayList convertToBasicProperties() { + ArrayList propertiesList = new ArrayList<>(); + return propertiesList; + } + + @Override + public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { + AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); + + // model properties + convertedAutomaton.setName(this.getName()); + convertedAutomaton.setUMeasurements(this.getUMeasurements()); + convertedAutomaton.setTransformers(this.getTransformers()); + + // additional properties + ArrayList convertedProperties = new ArrayList<>(); + convertedAutomaton.setProperties(convertedProperties); + + return convertedAutomaton; + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java index 4725ae56..c796aa5d 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java @@ -8,8 +8,10 @@ import lombok.*; import org.gridsuite.mapping.server.utils.AutomatonFamily; +import org.gridsuite.mapping.server.utils.StringListConverter; import javax.persistence.*; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -40,9 +42,22 @@ public class AutomatonEntity extends AbstractManuallyAssignedIdentifierEntity uMeasurements; + + @Column(name = "transformer", columnDefinition = "CLOB") + @Convert(converter = StringListConverter.class) + private List transformers; + @OneToMany(targetEntity = AutomatonPropertyEntity.class, mappedBy = "automaton", cascade = CascadeType.ALL, orphanRemoval = true) private List properties; @@ -63,6 +78,9 @@ public AutomatonEntity(MappingEntity mapping, AutomatonEntity automatonToCopy) { this.model = automatonToCopy.getModel(); this.setGroup = automatonToCopy.getSetGroup(); this.watchedElement = automatonToCopy.getWatchedElement(); + this.name = automatonToCopy.getName(); + this.uMeasurements = new ArrayList<>(automatonToCopy.getUMeasurements()); + this.transformers = new ArrayList<>(automatonToCopy.getTransformers()); this.properties = automatonToCopy.getProperties().stream().map(automatonPropertyEntity -> new AutomatonPropertyEntity(newID, automatonPropertyEntity)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 60ce9b60..41e0fcc4 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,6 +9,8 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.automata.CurrentLimitAutomaton; +import org.gridsuite.mapping.server.dto.automata.TapChangerBlocking; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -332,7 +334,14 @@ public InstantiatedModel(AutomatonEntity automaton) { private class AutomatonIdProviderImpl implements AutomatonIdProvider { @Override public String getId(AbstractAutomaton automaton) { - return String.format("%s_%s", automaton.getModel(), automaton.getWatchedElement()); + String uniqueId = ""; + if (automaton instanceof CurrentLimitAutomaton) { + uniqueId = ((CurrentLimitAutomaton) automaton).getWatchedElement(); + } else if (automaton instanceof TapChangerBlocking) { + uniqueId = ((TapChangerBlocking) automaton).getName(); + } + + return String.format("%s_%s", automaton.getModel(), uniqueId); } } } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java b/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java new file mode 100644 index 00000000..64686239 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java @@ -0,0 +1,22 @@ +package org.gridsuite.mapping.server.utils; + +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import java.util.List; + +@Converter +public class StringListConverter implements AttributeConverter, String> { + + @Override + public String convertToDatabaseColumn(List attribute) { + return Methods.convertListToString(attribute == null ? List.of() : attribute); + } + + @Override + public List convertToEntityAttribute(String dbData) { + return Methods.convertStringToList(StringUtils.isBlank(dbData) ? "" : dbData); + } +} + diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 1a1609f4..8422d454 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -83,11 +83,15 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi switch (automaton.getFamily()) { case CURRENT_LIMIT: familyModel = MappingConstants.CURRENT_LIMIT_MODEL_CLASS; + break; + case VOLTAGE: + familyModel = MappingConstants.VOLTAGE_MODEL_CLASS; + break; } imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); - automatonScript.add("watchedElement", automaton.getWatchedElement()); + //automatonScript.add("watchedElement", automaton.getWatchedElement()); automatonScript.add("automatonId", automatonIdProvider.getId(automaton)); automatonScript.add("parameterSetId", automaton.getSetGroup()); String[] propertiesScripts = automaton.convertToBasicProperties().stream().map(property -> { diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 156466e1..a2e54732 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -7,3 +7,7 @@ databaseChangeLog: - include: file: changesets/changelog_2022-09-09T15:48:00Z.xml relativeToChangelogFile: true + + - include: + file: changesets/changelog_20230510T142218Z.xml + relativeToChangelogFile: true From a4f216a44cf5c133ec25b2508520fd1505de2b5c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 11 May 2023 12:45:01 +0200 Subject: [PATCH 03/18] restore watchedElement as a common field for all families of automaton --- .../server/dto/automata/AbstractAutomaton.java | 10 +++++++--- .../dto/automata/CurrentLimitAutomaton.java | 8 +------- .../dto/automata/TapChangerBlocking.java | 4 ++-- .../mapping/server/model/AutomatonEntity.java | 6 +++--- .../implementation/ScriptServiceImpl.java | 11 +---------- .../server/utils/StringListConverter.java | 4 ++-- .../mapping/server/utils/Templater.java | 2 +- .../changesets/changelog_20230510T142218Z.xml | 18 ++++++++++++++++++ 8 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index c8f8c75a..0db33f85 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -18,7 +18,6 @@ import org.springframework.http.HttpStatus; import org.springframework.web.client.HttpClientErrorException; -import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -43,14 +42,18 @@ public abstract class AbstractAutomaton { @Schema(description = "Mapped Parameters Set Group ID") private String setGroup; + @Schema(description = "Element watched by the automaton") + private String watchedElement; + + public abstract List convertToBasicProperties(); + protected AbstractAutomaton(AutomatonEntity automatonEntity) { this.setFamily(automatonEntity.getFamily()); this.setModel(automatonEntity.getModel()); this.setSetGroup(automatonEntity.getSetGroup()); + this.setWatchedElement(automatonEntity.getWatchedElement()); } - public abstract List convertToBasicProperties(); - public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { UUID createdId = UUID.randomUUID(); AutomatonEntity convertedAutomaton = new AutomatonEntity(); @@ -58,6 +61,7 @@ public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { convertedAutomaton.setFamily(this.getFamily()); convertedAutomaton.setModel(this.getModel()); convertedAutomaton.setSetGroup(this.getSetGroup()); + convertedAutomaton.setWatchedElement(this.getWatchedElement()); convertedAutomaton.setMapping(parentMapping); return convertedAutomaton; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index 9db2cc05..c6c8928e 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -25,14 +25,11 @@ @EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class CurrentLimitAutomaton extends AbstractAutomaton { - - @Schema(description = "Element watched by the automaton") - private String watchedElement; private String side; public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { super(automatonEntity); - this.setWatchedElement(automatonEntity.getWatchedElement()); + // TODO Create generic function for all properties Optional foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny(); if (foundSideProperty.isPresent()) { @@ -51,9 +48,6 @@ public ArrayList convertToBasicProperties() { public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); - // model properties - convertedAutomaton.setWatchedElement(this.getWatchedElement()); - // additional properties ArrayList convertedProperties = new ArrayList<>(); convertedAutomaton.setProperties(convertedProperties); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java index d52cd3bc..15d821e5 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java @@ -29,11 +29,11 @@ public class TapChangerBlocking extends AbstractAutomaton { @Schema(description = "Name") private String name; - @Schema(description = "U Measurement by the automaton") + @Schema(description = "U Measurement") @JsonProperty("uMeasurements") private List uMeasurements; - @Schema(description = "Transformers by the automaton") + @Schema(description = "Transformers ") private List transformers; public TapChangerBlocking(AutomatonEntity automatonEntity) { diff --git a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java index c796aa5d..0d1f126d 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java @@ -42,11 +42,10 @@ public class AutomatonEntity extends AbstractManuallyAssignedIdentifierEntity transformers; + // end fields for TapChangerBlocking model @OneToMany(targetEntity = AutomatonPropertyEntity.class, mappedBy = "automaton", cascade = CascadeType.ALL, orphanRemoval = true) private List properties; diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 41e0fcc4..60ce9b60 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,8 +9,6 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.CurrentLimitAutomaton; -import org.gridsuite.mapping.server.dto.automata.TapChangerBlocking; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -334,14 +332,7 @@ public InstantiatedModel(AutomatonEntity automaton) { private class AutomatonIdProviderImpl implements AutomatonIdProvider { @Override public String getId(AbstractAutomaton automaton) { - String uniqueId = ""; - if (automaton instanceof CurrentLimitAutomaton) { - uniqueId = ((CurrentLimitAutomaton) automaton).getWatchedElement(); - } else if (automaton instanceof TapChangerBlocking) { - uniqueId = ((TapChangerBlocking) automaton).getName(); - } - - return String.format("%s_%s", automaton.getModel(), uniqueId); + return String.format("%s_%s", automaton.getModel(), automaton.getWatchedElement()); } } } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java b/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java index 64686239..226ecc97 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java @@ -11,12 +11,12 @@ public class StringListConverter implements AttributeConverter, Str @Override public String convertToDatabaseColumn(List attribute) { - return Methods.convertListToString(attribute == null ? List.of() : attribute); + return attribute != null ? Methods.convertListToString(attribute) : null; } @Override public List convertToEntityAttribute(String dbData) { - return Methods.convertStringToList(StringUtils.isBlank(dbData) ? "" : dbData); + return !StringUtils.isBlank(dbData) ? Methods.convertStringToList(dbData) : null; } } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 8422d454..187e3a68 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -91,7 +91,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); - //automatonScript.add("watchedElement", automaton.getWatchedElement()); + automatonScript.add("watchedElement", automaton.getWatchedElement()); automatonScript.add("automatonId", automatonIdProvider.getId(automaton)); automatonScript.add("parameterSetId", automaton.getSetGroup()); String[] propertiesScripts = automaton.convertToBasicProperties().stream().map(property -> { diff --git a/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml new file mode 100644 index 00000000..e2847f29 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + From ee5e874d332f8d206658518a62f47cbda45815be Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 11 May 2023 12:51:29 +0200 Subject: [PATCH 04/18] remove unused import --- .../mapping/server/dto/automata/CurrentLimitAutomaton.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index c6c8928e..8453859e 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -6,7 +6,6 @@ */ package org.gridsuite.mapping.server.dto.automata; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; From f217f35787369820e14335d8b4595193f85d9a2f Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 11 May 2023 22:09:15 +0200 Subject: [PATCH 05/18] push down watchedElement to CurrentLimitAutomaton --- .../mapping/server/MappingConstants.java | 2 +- .../dto/automata/AbstractAutomaton.java | 9 +-- .../dto/automata/CurrentLimitAutomaton.java | 11 +++ ....java => TapChangerBlockingAutomaton.java} | 7 +- .../mapping/server/model/AutomatonEntity.java | 8 +- .../implementation/ScriptServiceImpl.java | 9 ++- .../mapping/server/utils/Templater.java | 1 - src/main/resources/automaton.st | 1 - .../changesets/changelog_20230510T142218Z.xml | 3 + .../mapping/server/NetworkControllerTest.java | 73 +++++++------------ .../resources/data/network/networkValues.json | 71 ++++++++++++++++++ src/test/resources/mappingIEEE14Test01.json | 2 - 12 files changed, 133 insertions(+), 64 deletions(-) rename src/main/java/org/gridsuite/mapping/server/dto/automata/{TapChangerBlocking.java => TapChangerBlockingAutomaton.java} (81%) create mode 100644 src/test/resources/data/network/networkValues.json diff --git a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java index 98775a30..6ad09417 100644 --- a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java +++ b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java @@ -35,5 +35,5 @@ private MappingConstants() { public static final String LOAD_TYPE_PROPERTY = "loadType"; public static final String CURRENT_LIMIT_MODEL_CLASS = "CurrentLimitAutomaton"; - public static final String VOLTAGE_MODEL_CLASS = "TapChangerBlocking"; + public static final String VOLTAGE_MODEL_CLASS = "TapChangerBlockingAutomaton"; } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index 0db33f85..c61d5d56 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -27,7 +27,7 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "family", visible = true) @JsonSubTypes({ @JsonSubTypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"), - @JsonSubTypes.Type(value = TapChangerBlocking.class, name = "VOLTAGE"), + @JsonSubTypes.Type(value = TapChangerBlockingAutomaton.class, name = "VOLTAGE"), }) @Data @NoArgsConstructor @@ -42,16 +42,12 @@ public abstract class AbstractAutomaton { @Schema(description = "Mapped Parameters Set Group ID") private String setGroup; - @Schema(description = "Element watched by the automaton") - private String watchedElement; - public abstract List convertToBasicProperties(); protected AbstractAutomaton(AutomatonEntity automatonEntity) { this.setFamily(automatonEntity.getFamily()); this.setModel(automatonEntity.getModel()); this.setSetGroup(automatonEntity.getSetGroup()); - this.setWatchedElement(automatonEntity.getWatchedElement()); } public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { @@ -61,7 +57,6 @@ public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { convertedAutomaton.setFamily(this.getFamily()); convertedAutomaton.setModel(this.getModel()); convertedAutomaton.setSetGroup(this.getSetGroup()); - convertedAutomaton.setWatchedElement(this.getWatchedElement()); convertedAutomaton.setMapping(parentMapping); return convertedAutomaton; @@ -71,7 +66,7 @@ public static AbstractAutomaton instantiateFromEntity(AutomatonEntity automatonE if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) { return new CurrentLimitAutomaton(automatonEntity); } else if (automatonEntity.getFamily() == AutomatonFamily.VOLTAGE) { - return new TapChangerBlocking(automatonEntity); + return new TapChangerBlockingAutomaton(automatonEntity); } else { throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index 8453859e..5faee295 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.dto.automata; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -24,11 +25,17 @@ @EqualsAndHashCode(callSuper = true) @NoArgsConstructor public class CurrentLimitAutomaton extends AbstractAutomaton { + + @Schema(description = "Element watched by the automaton") + private String watchedElement; + private String side; public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { super(automatonEntity); + this.setWatchedElement(automatonEntity.getWatchedElement()); + // TODO Create generic function for all properties Optional foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny(); if (foundSideProperty.isPresent()) { @@ -39,7 +46,9 @@ public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { @Override public ArrayList convertToBasicProperties() { ArrayList propertiesList = new ArrayList<>(); + propertiesList.add(new BasicProperty("staticId", "\"" + watchedElement + "\"")); propertiesList.add(new BasicProperty("side", side)); + return propertiesList; } @@ -47,6 +56,8 @@ public ArrayList convertToBasicProperties() { public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); + convertedAutomaton.setWatchedElement(this.getWatchedElement()); + // additional properties ArrayList convertedProperties = new ArrayList<>(); convertedAutomaton.setProperties(convertedProperties); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java similarity index 81% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java index 15d821e5..88d4b588 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlocking.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * @author Thang PHAM @@ -24,7 +25,7 @@ @Data @EqualsAndHashCode(callSuper = true) @NoArgsConstructor -public class TapChangerBlocking extends AbstractAutomaton { +public class TapChangerBlockingAutomaton extends AbstractAutomaton { @Schema(description = "Name") private String name; @@ -36,7 +37,7 @@ public class TapChangerBlocking extends AbstractAutomaton { @Schema(description = "Transformers ") private List transformers; - public TapChangerBlocking(AutomatonEntity automatonEntity) { + public TapChangerBlockingAutomaton(AutomatonEntity automatonEntity) { super(automatonEntity); this.setName(automatonEntity.getName()); this.setUMeasurements(new ArrayList<>(automatonEntity.getUMeasurements())); @@ -46,6 +47,8 @@ public TapChangerBlocking(AutomatonEntity automatonEntity) { @Override public ArrayList convertToBasicProperties() { ArrayList propertiesList = new ArrayList<>(); + propertiesList.add(new BasicProperty("uMeasurements", uMeasurements.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); + propertiesList.add(new BasicProperty("transformers", transformers.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); return propertiesList; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java index 0d1f126d..11539064 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java @@ -42,8 +42,10 @@ public class AutomatonEntity extends AbstractManuallyAssignedIdentifierEntity(automatonToCopy.getUMeasurements()); - this.transformers = new ArrayList<>(automatonToCopy.getTransformers()); + this.uMeasurements = automatonToCopy.getUMeasurements() != null ? new ArrayList<>(automatonToCopy.getUMeasurements()) : null; + this.transformers = automatonToCopy.getTransformers() != null ? new ArrayList<>(automatonToCopy.getTransformers()) : null; this.properties = automatonToCopy.getProperties().stream().map(automatonPropertyEntity -> new AutomatonPropertyEntity(newID, automatonPropertyEntity)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 60ce9b60..296e6a61 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,6 +9,8 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.automata.CurrentLimitAutomaton; +import org.gridsuite.mapping.server.dto.automata.TapChangerBlockingAutomaton; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -332,7 +334,12 @@ public InstantiatedModel(AutomatonEntity automaton) { private class AutomatonIdProviderImpl implements AutomatonIdProvider { @Override public String getId(AbstractAutomaton automaton) { - return String.format("%s_%s", automaton.getModel(), automaton.getWatchedElement()); + if (automaton instanceof CurrentLimitAutomaton) { + return String.format("%s_%s", automaton.getModel(), ((CurrentLimitAutomaton) automaton).getWatchedElement()); + } else if (automaton instanceof TapChangerBlockingAutomaton) { + return ((TapChangerBlockingAutomaton) automaton).getName(); + } + return automaton.getModel(); } } } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 187e3a68..18e0483a 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -91,7 +91,6 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); - automatonScript.add("watchedElement", automaton.getWatchedElement()); automatonScript.add("automatonId", automatonIdProvider.getId(automaton)); automatonScript.add("parameterSetId", automaton.getSetGroup()); String[] propertiesScripts = automaton.convertToBasicProperties().stream().map(property -> { diff --git a/src/main/resources/automaton.st b/src/main/resources/automaton.st index a0d3cdf2..b238ced1 100644 --- a/src/main/resources/automaton.st +++ b/src/main/resources/automaton.st @@ -1,5 +1,4 @@ { - staticId "" dynamicModelId "" parameterSetId "" diff --git a/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml index e2847f29..1e42e2be 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml @@ -15,4 +15,7 @@ + + + diff --git a/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java b/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java index 85aef21c..2701375f 100644 --- a/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java @@ -6,11 +6,13 @@ */ package org.gridsuite.mapping.server; +import com.fasterxml.jackson.databind.ObjectMapper; import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.test.NetworkTest1Factory; import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.client.PreloadingStrategy; +import org.gridsuite.mapping.server.dto.NetworkValues; import org.gridsuite.mapping.server.model.NetworkEntity; import org.gridsuite.mapping.server.repository.NetworkRepository; import org.gridsuite.mapping.server.service.NetworkService; @@ -18,6 +20,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -32,6 +36,7 @@ import org.springframework.test.web.client.ExpectedCount; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.web.client.RestTemplate; @@ -62,9 +67,17 @@ @ContextConfiguration(classes = {MappingApplication.class}) public class NetworkControllerTest { + private static final Logger LOGGER = LoggerFactory.getLogger(NetworkControllerTest.class); + + public static final String RESOURCE_PATH_DELIMETER = "/"; + public static final String TEST_DATA_DIR = RESOURCE_PATH_DELIMETER + "data"; + @Autowired private RestTemplate restTemplate; + @Autowired + private ObjectMapper objectMapper; + @Autowired private NetworkRepository networkRepository; @@ -159,54 +172,22 @@ public void idTest() throws Exception { Network testNetwork = NetworkTest1Factory.create(); Mockito.when(networkStoreService.getNetwork(networkUUID, PreloadingStrategy.COLLECTION)).thenReturn(testNetwork); - String expectedResult = "{\n" + - "\"networkId\": \"" + networkUUID + "\",\n" + - "\"propertyValues\": [\n" + - " {\n" + - " \"type\": \"GENERATOR\",\n" + - " \"values\": {\n" + - " \"terminal.voltageLevel.nominalV\": [\n" + - " \"400.0\"\n" + - " ],\n" + - " \"terminal.voltageLevel.substation.country.name\": [\n" + - " \"FRANCE\"\n" + - " ],\n" + - " \"id\": [\n" + - " \"generator1\"\n" + - - " ],\n" + - " \"energySource\": [\n" + - " \"NUCLEAR\"\n" + - " ],\n" + - " \"voltageRegulatorOn\": [\n" + - " \"true\"\n" + - " ]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"type\": \"LOAD\",\n" + - " \"values\": {\n" + - " \"loadType\": [\n" + - " \"UNDEFINED\"\n" + - " ],\n" + - " \"terminal.voltageLevel.nominalV\": [\n" + - " \"400.0\"\n" + - " ],\n" + - " \"terminal.voltageLevel.substation.country.name\": [\n" + - " \"FRANCE\"\n" + - " ],\n" + - " \"id\": [\n" + - " \"load1\"\n" + - " ]\n" + - " }\n" + - " }\n" + - "]\n" + - "}"; - - mvc.perform(MockMvcRequestBuilders.get("/network/" + networkUUID + "/values") + MvcResult mvcResult = mvc.perform(get("/network/" + networkUUID + "/values") .contentType(APPLICATION_JSON)) .andExpect(status().isOk()) - .andExpect(content().json(expectedResult, true)); + .andReturn(); + + String resultNetworkValuesJson = mvcResult.getResponse().getContentAsString(); + + String networkValuesJson = new String(getClass().getResourceAsStream(TEST_DATA_DIR + RESOURCE_PATH_DELIMETER + "network/networkValues.json").readAllBytes()); + NetworkValues networkValues = objectMapper.readValue(networkValuesJson, NetworkValues.class); + networkValues.setNetworkId(networkUUID); + + String expectNetworkValuesJson = objectMapper.writeValueAsString(networkValues); + LOGGER.info("expect network values = " + expectNetworkValuesJson); + LOGGER.info("result network values = " + resultNetworkValuesJson); + + assertEquals(objectMapper.readTree(expectNetworkValuesJson), objectMapper.readTree(resultNetworkValuesJson)); Mockito.verify(networkService, times(1)).getNetworkValuesFromExistingNetwork(networkUUID); diff --git a/src/test/resources/data/network/networkValues.json b/src/test/resources/data/network/networkValues.json new file mode 100644 index 00000000..b18b6f00 --- /dev/null +++ b/src/test/resources/data/network/networkValues.json @@ -0,0 +1,71 @@ +{ + "networkId": "c2f524f3-0c24-44eb-b828-db73d8d8c2ef", + "propertyValues": [ + { + "type": "GENERATOR", + "values": { + "terminal.voltageLevel.nominalV": [ + "400.0" + ], + "terminal.voltageLevel.substation.country.name": [ + "FRANCE" + ], + "id": [ + "generator1" + ], + "energySource": [ + "NUCLEAR" + ], + "voltageRegulatorOn": [ + "true" + ] + } + }, + { + "type": "LOAD", + "values": { + "loadType": [ + "UNDEFINED" + ], + "terminal.voltageLevel.nominalV": [ + "400.0" + ], + "terminal.voltageLevel.substation.country.name": [ + "FRANCE" + ], + "id": [ + "load1" + ] + } + }, + { + "type": "BUS", + "values": { + "terminal.voltageLevel.nominalV": [ + "400.0" + ], + "terminal.voltageLevel.substation.country.name": [ + "FRANCE" + ], + "id": [ + "voltageLevel1_0", + "voltageLevel1_1" + ] + } + }, + { + "type": "LINE", + "values": { + + } + }, + { + "type": "TWO_WINDINGS_TRANSFORMER", + "values": { + "terminal.voltageLevel.substation.country.name": [ + "FRANCE" + ] + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/mappingIEEE14Test01.json b/src/test/resources/mappingIEEE14Test01.json index 82caff7c..59924e15 100644 --- a/src/test/resources/mappingIEEE14Test01.json +++ b/src/test/resources/mappingIEEE14Test01.json @@ -56,7 +56,6 @@ ], "automata": [ { - "family": "CURRENT_LIMIT", "family": "CURRENT_LIMIT", "model": "CurrentLimitAutomaton", "setGroup": "CLA_2_4", @@ -64,7 +63,6 @@ "side": "Branch.Side.TWO" }, { - "family": "CURRENT_LIMIT", "family": "CURRENT_LIMIT", "model": "CurrentLimitAutomaton", "setGroup": "CLA_2_5", From b4ecb6cbe1982c558c77ed5224ac725f6dd00a46 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 11 May 2023 22:12:08 +0200 Subject: [PATCH 06/18] ESlint --- .../org/gridsuite/mapping/server/NetworkControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java b/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java index 2701375f..9d356ca2 100644 --- a/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/NetworkControllerTest.java @@ -185,7 +185,7 @@ public void idTest() throws Exception { String expectNetworkValuesJson = objectMapper.writeValueAsString(networkValues); LOGGER.info("expect network values = " + expectNetworkValuesJson); - LOGGER.info("result network values = " + resultNetworkValuesJson); + LOGGER.info("result network values = " + resultNetworkValuesJson); assertEquals(objectMapper.readTree(expectNetworkValuesJson), objectMapper.readTree(resultNetworkValuesJson)); From fdb03f8c8b87fcf2763a78438cecac305325dbc0 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 12 May 2023 09:04:57 +0200 Subject: [PATCH 07/18] correct staticId position in exported groovy --- .../java/org/gridsuite/mapping/server/ScriptControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index 15069ecc..f304a770 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -162,9 +162,9 @@ String mapping(String name, String modelName, String groupName) { String scriptOutput(String scriptName, String parentName) { return "{\"name\":\"" + scriptName + "\",\"parentName\":\"" + parentName + "\",\"script\":\"/**\n * Copyright (c) 2021, RTE (http://www.rte-france.com)\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n */\n\nimport com.powsybl.iidm.network.Generator\nimport com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton\nimport com.powsybl.iidm.network.Branch\n\nfor (Generator equipment : network.generators) {\n if (equipment.id.equals(\\\"test\\\") && equipment.minP > 3.000000 && [\\\"HYDRO\\\", \\\"OTHERS\\\"].contains(equipment.energySource) && equipment.voltageRegulatorOn != true) {\n GeneratorFourWindings {\n staticId equipment.id\n parameterSetId \\\"GSFWPR\\\" + equipment.id\n }\n }\n}\n\n" + "CurrentLimitAutomaton {\n" + - " staticId \\\"element_id\\\"\n" + " dynamicModelId \\\"automaton_model_element_id\\\"\n" + " parameterSetId \\\"automaton_model\\\"\n" + + " staticId \\\"element_id\\\"\n" + " side Branch.Side.ONE\n" + "}\",\"current\": true, \"parametersFile\": null}"; } From c189ce1487c83c55495039aef7c7b89ca387c9a8 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 12 May 2023 10:57:23 +0200 Subject: [PATCH 08/18] More unit test on MappingControllerTest --- .../gridsuite/mapping/server/MappingControllerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/org/gridsuite/mapping/server/MappingControllerTest.java b/src/test/java/org/gridsuite/mapping/server/MappingControllerTest.java index 6a387d8f..1dd037f0 100644 --- a/src/test/java/org/gridsuite/mapping/server/MappingControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/MappingControllerTest.java @@ -95,6 +95,14 @@ String mapping(String name) { " \"setGroup\": \"automaton_group\",\n" + " \"watchedElement\": \"element_id\",\n" + " \"side\": \"Branch.Side.ONE\"\n" + + " },\n" + + " {\n" + + " \"family\": \"VOLTAGE\",\n" + + " \"model\": \"automaton_model_2\",\n" + + " \"setGroup\": \"automaton_group_2\",\n" + + " \"name\": \"automaton_name\",\n" + + " \"uMeasurements\": [\"bus_id_1\", \"bus_id_2\"],\n" + + " \"transformers\": [\"load_id_1\", \"load_id_2\"]\n" + " }\n" + " ],\n" + " \"controlledParameters\": false" + From 5c60eff2b9e6073698409af529473fed954f5eae Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 12 May 2023 11:20:09 +0200 Subject: [PATCH 09/18] More unit test on ScriptControllerTest --- .../mapping/server/ScriptControllerTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java index f304a770..d4171fef 100644 --- a/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java +++ b/src/test/java/org/gridsuite/mapping/server/ScriptControllerTest.java @@ -152,6 +152,14 @@ String mapping(String name, String modelName, String groupName) { " \"setGroup\": \"automaton_model\",\n" + " \"watchedElement\": \"element_id\",\n" + " \"side\": \"Branch.Side.ONE\"\n" + + " },\n" + + " {\n" + + " \"family\": \"VOLTAGE\",\n" + + " \"model\": \"automaton_model_2\",\n" + + " \"setGroup\": \"automaton_group_2\",\n" + + " \"name\": \"automaton_name\",\n" + + " \"uMeasurements\": [\"bus_id_1\", \"bus_id_2\"],\n" + + " \"transformers\": [\"load_id_1\", \"load_id_2\"]\n" + " }\n" + " ],\n" + " \"controlledParameters\": false" + @@ -166,7 +174,14 @@ String scriptOutput(String scriptName, String parentName) { " parameterSetId \\\"automaton_model\\\"\n" + " staticId \\\"element_id\\\"\n" + " side Branch.Side.ONE\n" + - "}\",\"current\": true, \"parametersFile\": null}"; + "}\n\n" + + "TapChangerBlockingAutomaton {\n" + + " dynamicModelId \\\"automaton_name\\\"\n" + + " parameterSetId \\\"automaton_group_2\\\"\n" + + " uMeasurements \\\"bus_id_1\\\", \\\"bus_id_2\\\"\n" + + " transformers \\\"load_id_1\\\", \\\"load_id_2\\\"\n" + + "}" + + "\",\"current\": true, \"parametersFile\": null}"; } @Test From 36ec79aff7d0681b88c07cfe6e90bed0760537c2 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Fri, 12 May 2023 11:55:52 +0200 Subject: [PATCH 10/18] Enhance getId implementation of AutomatonIdProviderImpl --- .../server/service/implementation/ScriptServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 296e6a61..f7b76ca1 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -334,12 +334,13 @@ public InstantiatedModel(AutomatonEntity automaton) { private class AutomatonIdProviderImpl implements AutomatonIdProvider { @Override public String getId(AbstractAutomaton automaton) { + String id = automaton.getModel(); if (automaton instanceof CurrentLimitAutomaton) { - return String.format("%s_%s", automaton.getModel(), ((CurrentLimitAutomaton) automaton).getWatchedElement()); + id = String.format("%s_%s", automaton.getModel(), ((CurrentLimitAutomaton) automaton).getWatchedElement()); } else if (automaton instanceof TapChangerBlockingAutomaton) { - return ((TapChangerBlockingAutomaton) automaton).getName(); + id = ((TapChangerBlockingAutomaton) automaton).getName(); } - return automaton.getModel(); + return id; } } } From 5b82f2a9bc3443be030238bb17f9c35249a12952 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 15 May 2023 16:36:48 +0200 Subject: [PATCH 11/18] Persist all properties of automaton to table properties --- .../dto/automata/AbstractAutomaton.java | 4 ++ .../dto/automata/CurrentLimitAutomaton.java | 45 ++++++++-------- .../automata/TapChangerBlockingAutomaton.java | 52 ++++++++++++------- .../mapping/server/model/AutomatonEntity.java | 48 +++++++++-------- .../implementation/ScriptServiceImpl.java | 17 +----- .../server/utils/AutomatonIdProvider.java | 17 ------ .../mapping/server/utils/Methods.java | 3 ++ .../server/utils/StringListConverter.java | 22 -------- .../mapping/server/utils/Templater.java | 4 +- .../changesets/changelog_20230510T142218Z.xml | 21 -------- .../changesets/changelog_20230515T135427Z.xml | 6 +++ .../db/changelog/db.changelog-master.yaml | 2 +- 12 files changed, 98 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/utils/AutomatonIdProvider.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java delete mode 100644 src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml create mode 100644 src/main/resources/db/changelog/changesets/changelog_20230515T135427Z.xml diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index c61d5d56..be34ce06 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.dto.automata; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -42,6 +43,9 @@ public abstract class AbstractAutomaton { @Schema(description = "Mapped Parameters Set Group ID") private String setGroup; + @JsonIgnore + public abstract String getId(); + public abstract List convertToBasicProperties(); protected AbstractAutomaton(AutomatonEntity automatonEntity) { diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index 5faee295..f3ae47f7 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -6,6 +6,7 @@ */ package org.gridsuite.mapping.server.dto.automata; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -16,7 +17,6 @@ import org.gridsuite.mapping.server.utils.PropertyType; import java.util.ArrayList; -import java.util.Optional; /** * @author Mathieu Scalbert @@ -26,49 +26,48 @@ @NoArgsConstructor public class CurrentLimitAutomaton extends AbstractAutomaton { + public static final String PROPERTY_WATCHED_ELEMENT = "watchedElement"; + public static final String PROPERTY_SIDE = "side"; + public static final String PROPERTY_STATIC_ID = "staticId"; + @Schema(description = "Element watched by the automaton") + @JsonProperty(PROPERTY_WATCHED_ELEMENT) private String watchedElement; + @Schema(description = "Side of the automaton") + @JsonProperty(PROPERTY_SIDE) private String side; public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { super(automatonEntity); - this.setWatchedElement(automatonEntity.getWatchedElement()); + watchedElement = automatonEntity.getProperty(PROPERTY_WATCHED_ELEMENT); + side = automatonEntity.getProperty(PROPERTY_SIDE); + } - // TODO Create generic function for all properties - Optional foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny(); - if (foundSideProperty.isPresent()) { - side = foundSideProperty.get().getValue(); - } + @Override + public String getId() { + return String.format("%s_%s", this.getModel(), watchedElement); } @Override public ArrayList convertToBasicProperties() { - ArrayList propertiesList = new ArrayList<>(); - propertiesList.add(new BasicProperty("staticId", "\"" + watchedElement + "\"")); - propertiesList.add(new BasicProperty("side", side)); + ArrayList properties = new ArrayList<>(); + properties.add(new BasicProperty(PROPERTY_STATIC_ID, "\"" + watchedElement + "\"")); + properties.add(new BasicProperty(PROPERTY_SIDE, side)); - return propertiesList; + return properties; } @Override public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); - convertedAutomaton.setWatchedElement(this.getWatchedElement()); - - // additional properties - ArrayList convertedProperties = new ArrayList<>(); - convertedAutomaton.setProperties(convertedProperties); + convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), + PROPERTY_WATCHED_ELEMENT, this.getWatchedElement(), PropertyType.STRING, convertedAutomaton)); - // side property - AutomatonPropertyEntity convertedProperty = new AutomatonPropertyEntity(); - convertedProperty.setAutomatonId(convertedAutomaton.getAutomatonId()); - convertedProperty.setName("side"); - convertedProperty.setValue(this.getSide()); - convertedProperty.setType(PropertyType.STRING); - convertedProperties.add(convertedProperty); + convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), + PROPERTY_SIDE, this.getSide(), PropertyType.STRING, convertedAutomaton)); return convertedAutomaton; } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java index 88d4b588..a17c6d97 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java @@ -14,6 +14,8 @@ import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.AutomatonPropertyEntity; import org.gridsuite.mapping.server.model.MappingEntity; +import org.gridsuite.mapping.server.utils.Methods; +import org.gridsuite.mapping.server.utils.PropertyType; import java.util.ArrayList; import java.util.List; @@ -27,43 +29,57 @@ @NoArgsConstructor public class TapChangerBlockingAutomaton extends AbstractAutomaton { - @Schema(description = "Name") + public static final String PROPERTY_NAME = "name"; + public static final String PROPERTY_U_MEASUREMENTS = "uMeasurements"; + public static final String PROPERTY_TRANSFORMERS = "transformers"; + + @Schema(description = "Name property") + @JsonProperty(PROPERTY_NAME) private String name; - @Schema(description = "U Measurement") - @JsonProperty("uMeasurements") + @Schema(description = "U Measurement property") + @JsonProperty(PROPERTY_U_MEASUREMENTS) private List uMeasurements; - @Schema(description = "Transformers ") + @Schema(description = "Transformers property") + @JsonProperty(PROPERTY_TRANSFORMERS) private List transformers; public TapChangerBlockingAutomaton(AutomatonEntity automatonEntity) { super(automatonEntity); - this.setName(automatonEntity.getName()); - this.setUMeasurements(new ArrayList<>(automatonEntity.getUMeasurements())); - this.setTransformers(new ArrayList<>(automatonEntity.getTransformers())); + + name = automatonEntity.getProperty(PROPERTY_NAME); + uMeasurements = automatonEntity.getProperty(PROPERTY_U_MEASUREMENTS, Methods::convertStringToList); + transformers = automatonEntity.getProperty(PROPERTY_TRANSFORMERS, Methods::convertStringToList); + } + + @Override + public String getId() { + return name; } @Override public ArrayList convertToBasicProperties() { - ArrayList propertiesList = new ArrayList<>(); - propertiesList.add(new BasicProperty("uMeasurements", uMeasurements.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); - propertiesList.add(new BasicProperty("transformers", transformers.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); - return propertiesList; + ArrayList properties = new ArrayList<>(); + properties.add(new BasicProperty(PROPERTY_U_MEASUREMENTS, + uMeasurements.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); + properties.add(new BasicProperty(PROPERTY_TRANSFORMERS, + transformers.stream().map(elem -> "\"" + elem + "\"").collect(Collectors.joining(", ")))); + return properties; } @Override public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); - // model properties - convertedAutomaton.setName(this.getName()); - convertedAutomaton.setUMeasurements(this.getUMeasurements()); - convertedAutomaton.setTransformers(this.getTransformers()); + convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), + PROPERTY_NAME, this.getName(), PropertyType.STRING, convertedAutomaton)); + + convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), + PROPERTY_U_MEASUREMENTS, Methods.convertListToString(this.getUMeasurements()), PropertyType.STRING, convertedAutomaton)); - // additional properties - ArrayList convertedProperties = new ArrayList<>(); - convertedAutomaton.setProperties(convertedProperties); + convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), + PROPERTY_TRANSFORMERS, Methods.convertListToString(this.getTransformers()), PropertyType.STRING, convertedAutomaton)); return convertedAutomaton; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java index 11539064..fc0ee015 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java @@ -8,12 +8,12 @@ import lombok.*; import org.gridsuite.mapping.server.utils.AutomatonFamily; -import org.gridsuite.mapping.server.utils.StringListConverter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -42,24 +42,6 @@ public class AutomatonEntity extends AbstractManuallyAssignedIdentifierEntity uMeasurements; - - @Column(name = "transformer", columnDefinition = "CLOB") - @Convert(converter = StringListConverter.class) - private List transformers; - // end fields for TapChangerBlocking model - @OneToMany(targetEntity = AutomatonPropertyEntity.class, mappedBy = "automaton", cascade = CascadeType.ALL, orphanRemoval = true) private List properties; @@ -79,11 +61,31 @@ public AutomatonEntity(MappingEntity mapping, AutomatonEntity automatonToCopy) { this.family = automatonToCopy.getFamily(); this.model = automatonToCopy.getModel(); this.setGroup = automatonToCopy.getSetGroup(); - this.watchedElement = automatonToCopy.getWatchedElement(); - this.name = automatonToCopy.getName(); - this.uMeasurements = automatonToCopy.getUMeasurements() != null ? new ArrayList<>(automatonToCopy.getUMeasurements()) : null; - this.transformers = automatonToCopy.getTransformers() != null ? new ArrayList<>(automatonToCopy.getTransformers()) : null; this.properties = automatonToCopy.getProperties().stream().map(automatonPropertyEntity -> new AutomatonPropertyEntity(newID, automatonPropertyEntity)).collect(Collectors.toList()); } + + public String getProperty(String name) { + return properties.stream() + .filter(property -> property.getName().equals(name)) + .map(AutomatonPropertyEntity::getValue) + .findAny() + .orElse(null); + } + + public T getProperty(String name, Function converter) { + return properties.stream() + .filter(property -> property.getName().equals(name)) + .map(AutomatonPropertyEntity::getValue) + .map(converter::apply) + .findAny() + .orElse(null); + } + + public void addProperty(AutomatonPropertyEntity property) { + if (properties == null) { + properties = new ArrayList<>(); + } + properties.add(property); + } } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index f7b76ca1..774aa40f 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,8 +9,6 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.CurrentLimitAutomaton; -import org.gridsuite.mapping.server.dto.automata.TapChangerBlockingAutomaton; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -57,7 +55,7 @@ public Script createFromMapping(String mappingName, boolean isPersistent) { Optional foundMapping = mappingRepository.findById(mappingName); if (foundMapping.isPresent()) { SortedMapping sortedMapping = new SortedMapping(new InputMapping(foundMapping.get())); - String createdScript = Templater.mappingToScript(sortedMapping, new AutomatonIdProviderImpl()); + String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; String createdPar = null; @@ -330,18 +328,5 @@ public InstantiatedModel(AutomatonEntity automaton) { this.setGroup = automaton.getSetGroup(); } } - - private class AutomatonIdProviderImpl implements AutomatonIdProvider { - @Override - public String getId(AbstractAutomaton automaton) { - String id = automaton.getModel(); - if (automaton instanceof CurrentLimitAutomaton) { - id = String.format("%s_%s", automaton.getModel(), ((CurrentLimitAutomaton) automaton).getWatchedElement()); - } else if (automaton instanceof TapChangerBlockingAutomaton) { - id = ((TapChangerBlockingAutomaton) automaton).getName(); - } - return id; - } - } } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/AutomatonIdProvider.java b/src/main/java/org/gridsuite/mapping/server/utils/AutomatonIdProvider.java deleted file mode 100644 index 048c9c40..00000000 --- a/src/main/java/org/gridsuite/mapping/server/utils/AutomatonIdProvider.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) 2022, 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 org.gridsuite.mapping.server.utils; - -import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; - -/** - * @author Thang PHAM - */ - -public interface AutomatonIdProvider { - String getId(AbstractAutomaton automaton); -} diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Methods.java b/src/main/java/org/gridsuite/mapping/server/utils/Methods.java index 019329de..d66b5aa8 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Methods.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Methods.java @@ -33,6 +33,9 @@ public static List convertStringToList(String stringArray) { } public static String convertListToString(List array) { + if (array == null) { + return null; + } return array.stream().map(value -> value.replace(",", ESCAPED_COMMA)).collect(Collectors.joining(", ")); } diff --git a/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java b/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java deleted file mode 100644 index 226ecc97..00000000 --- a/src/main/java/org/gridsuite/mapping/server/utils/StringListConverter.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.gridsuite.mapping.server.utils; - -import org.apache.commons.lang3.StringUtils; - -import javax.persistence.AttributeConverter; -import javax.persistence.Converter; -import java.util.List; - -@Converter -public class StringListConverter implements AttributeConverter, String> { - - @Override - public String convertToDatabaseColumn(List attribute) { - return attribute != null ? Methods.convertListToString(attribute) : null; - } - - @Override - public List convertToEntityAttribute(String dbData) { - return !StringUtils.isBlank(dbData) ? Methods.convertStringToList(dbData) : null; - } -} - diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 18e0483a..2ddf5643 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -39,7 +39,7 @@ public static String flattenFilters(String composition, List fil return flattenedComposition[0]; } - public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMapping, AutomatonIdProvider automatonIdProvider) { + public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMapping) { String scriptTemplate; String sortedRulesTemplate; String ruleTemplate; @@ -91,7 +91,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); - automatonScript.add("automatonId", automatonIdProvider.getId(automaton)); + automatonScript.add("automatonId", automaton.getId()); automatonScript.add("parameterSetId", automaton.getSetGroup()); String[] propertiesScripts = automaton.convertToBasicProperties().stream().map(property -> { ST propertyScript = new ST(automatonPropertyTemplate); diff --git a/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml deleted file mode 100644 index 1e42e2be..00000000 --- a/src/main/resources/db/changelog/changesets/changelog_20230510T142218Z.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/db/changelog/changesets/changelog_20230515T135427Z.xml b/src/main/resources/db/changelog/changesets/changelog_20230515T135427Z.xml new file mode 100644 index 00000000..eac5b750 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20230515T135427Z.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index a2e54732..b4330c4d 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -9,5 +9,5 @@ databaseChangeLog: relativeToChangelogFile: true - include: - file: changesets/changelog_20230510T142218Z.xml + file: changesets/changelog_20230515T135427Z.xml relativeToChangelogFile: true From cfc826ad95bb3e29f88cf78abf06918e825de22e Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Wed, 17 May 2023 16:39:51 +0200 Subject: [PATCH 12/18] Correct SQL --- src/main/resources/IEEE14Models.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/IEEE14Models.sql b/src/main/resources/IEEE14Models.sql index f24ca96b..756b7b36 100644 --- a/src/main/resources/IEEE14Models.sql +++ b/src/main/resources/IEEE14Models.sql @@ -840,7 +840,7 @@ VALUES ('TapChangerBlocking', 'tapChangerBlocking_UMin', 2, NULL, 2), INSERT INTO model_sets_group (model_name, name, type) VALUES ('TapChangerBlocking', 'TCB', 0), ('TapChangerBlocking', 'TCB_2_4', 0), - ('TapChangerBlocking', 'TCB_2_5', 0),; + ('TapChangerBlocking', 'TCB_2_5', 0); INSERT INTO model_parameter_sets (group_name, group_type, model_name, name) VALUES ('TCB', 0, 'TapChangerBlocking', 'TCB'), From 7e27d32e0ecb5e7eec04f8fa2627ac6603a6d96c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 18 May 2023 00:18:17 +0200 Subject: [PATCH 13/18] Plugins mechanism implementation for DTO --- .../PluggableTypeRegistrationModule.java | 33 +++++++++++++++++++ .../plugins/PluggableTypesProvider.java | 10 ++++++ .../dto/automata/AbstractAutomaton.java | 10 +++--- .../AutomatonPluggableRegistrationModule.java | 23 +++++++++++++ .../AutomatonPluggableTypesProvider.java | 29 ++++++++++++++++ .../TapChangerBlockingAutomaton.java | 4 ++- 6 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java create mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java create mode 100644 src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java rename src/main/java/org/gridsuite/mapping/server/{dto/automata => plugins/automaton}/TapChangerBlockingAutomaton.java (94%) diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java new file mode 100644 index 00000000..acc6987b --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java @@ -0,0 +1,33 @@ +package org.gridsuite.mapping.server.common.plugins; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.NamedType; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.util.*; + +public abstract class PluggableTypeRegistrationModule extends SimpleModule { + + protected PluggableTypeRegistrationModule(ObjectMapper objectMapper) { + super(); + registerTypes(objectMapper); + } + + public abstract PluggableTypesProvider getPluggableTypesProvider(); + + private void registerTypes(ObjectMapper objectMapper) { + + // Create a list to hold all the subtypes + List pluggableTypes = new ArrayList<>(); + + // Add the additional subtype + getPluggableTypesProvider() + .getPluggableTypes() + .forEach((k, v) -> pluggableTypes.add(new NamedType(v, k))); + + // Register the merged subtypes with the ObjectMapper + objectMapper + .getSubtypeResolver() + .registerSubtypes(pluggableTypes.toArray(new NamedType[0])); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java new file mode 100644 index 00000000..cd0f4534 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java @@ -0,0 +1,10 @@ +package org.gridsuite.mapping.server.common.plugins; + +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +public interface PluggableTypesProvider { + Map> getPluggableTypes(); + + D fromEntity(E entity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException; +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index be34ce06..88823eba 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.NoArgsConstructor; +import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypesProvider; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.utils.AutomatonFamily; @@ -28,7 +29,6 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "family", visible = true) @JsonSubTypes({ @JsonSubTypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"), - @JsonSubTypes.Type(value = TapChangerBlockingAutomaton.class, name = "VOLTAGE"), }) @Data @NoArgsConstructor @@ -69,10 +69,12 @@ public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { public static AbstractAutomaton instantiateFromEntity(AutomatonEntity automatonEntity) { if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) { return new CurrentLimitAutomaton(automatonEntity); - } else if (automatonEntity.getFamily() == AutomatonFamily.VOLTAGE) { - return new TapChangerBlockingAutomaton(automatonEntity); } else { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); + try { + return (new AutomatonPluggableTypesProvider()).fromEntity(automatonEntity); + } catch (Exception e) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, e.getMessage()); + } } } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java new file mode 100644 index 00000000..5e4fa560 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java @@ -0,0 +1,23 @@ +package org.gridsuite.mapping.server.dto.automata; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.mapping.server.common.plugins.PluggableTypesProvider; +import org.gridsuite.mapping.server.common.plugins.PluggableTypeRegistrationModule; +import org.gridsuite.mapping.server.model.AutomatonEntity; +import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypesProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class AutomatonPluggableRegistrationModule extends PluggableTypeRegistrationModule { + + @Autowired + public AutomatonPluggableRegistrationModule(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public PluggableTypesProvider getPluggableTypesProvider() { + return new AutomatonPluggableTypesProvider(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java new file mode 100644 index 00000000..dd09f4d9 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java @@ -0,0 +1,29 @@ +package org.gridsuite.mapping.server.plugins.automaton; + +import org.gridsuite.mapping.server.common.plugins.PluggableTypesProvider; +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.model.AutomatonEntity; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +public class AutomatonPluggableTypesProvider implements PluggableTypesProvider { + + private final Map> pluggableTypes = Map.of( + "VOLTAGE", TapChangerBlockingAutomaton.class + ); + + @Override + public Map> getPluggableTypes() { + return pluggableTypes; + } + + @Override + public AbstractAutomaton fromEntity(AutomatonEntity automatonEntity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class dtoClass = pluggableTypes.get(automatonEntity.getFamily().name()); + Constructor constructor = dtoClass.getConstructor(AutomatonEntity.class); + + return (AbstractAutomaton) constructor.newInstance(automatonEntity); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java similarity index 94% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java rename to src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java index a17c6d97..1132457b 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java @@ -4,13 +4,15 @@ * 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 org.gridsuite.mapping.server.dto.automata; +package org.gridsuite.mapping.server.plugins.automaton; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.automata.BasicProperty; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.AutomatonPropertyEntity; import org.gridsuite.mapping.server.model.MappingEntity; From 6937e7252fd100ce5b01f5141c76d7a20a9df18c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Thu, 18 May 2023 00:21:53 +0200 Subject: [PATCH 14/18] Eslint --- ...dule.java => AbstractPluggableTypeRegistrationModule.java} | 4 ++-- .../dto/automata/AutomatonPluggableRegistrationModule.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/org/gridsuite/mapping/server/common/plugins/{PluggableTypeRegistrationModule.java => AbstractPluggableTypeRegistrationModule.java} (84%) diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java similarity index 84% rename from src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java rename to src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java index acc6987b..e043b4aa 100644 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypeRegistrationModule.java +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java @@ -6,9 +6,9 @@ import java.util.*; -public abstract class PluggableTypeRegistrationModule extends SimpleModule { +public abstract class AbstractPluggableTypeRegistrationModule extends SimpleModule { - protected PluggableTypeRegistrationModule(ObjectMapper objectMapper) { + protected AbstractPluggableTypeRegistrationModule(ObjectMapper objectMapper) { super(); registerTypes(objectMapper); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java index 5e4fa560..1a241fca 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java @@ -2,14 +2,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.gridsuite.mapping.server.common.plugins.PluggableTypesProvider; -import org.gridsuite.mapping.server.common.plugins.PluggableTypeRegistrationModule; +import org.gridsuite.mapping.server.common.plugins.AbstractPluggableTypeRegistrationModule; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypesProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class AutomatonPluggableRegistrationModule extends PluggableTypeRegistrationModule { +public class AutomatonPluggableRegistrationModule extends AbstractPluggableTypeRegistrationModule { @Autowired public AutomatonPluggableRegistrationModule(ObjectMapper objectMapper) { From c1582fdb13749f0c371faaa5ceba342a081239c2 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Sun, 21 May 2023 12:58:22 +0200 Subject: [PATCH 15/18] Refactoring plugin mechanism --- .../mapping/server/MappingConstants.java | 2 - ...java => AbstractPluggableTypesPlugin.java} | 19 +++++--- .../common/plugins/PluggableTypesPlugin.java | 19 ++++++++ .../plugins/PluggableTypesProvider.java | 10 ----- .../mapping/server/dto/InputMapping.java | 9 ++-- .../dto/automata/AbstractAutomaton.java | 14 +++--- .../AutomatonPluggableRegistrationModule.java | 23 ---------- .../dto/automata/CurrentLimitAutomaton.java | 11 ++++- .../AutomatonPluggableTypesPlugin.java | 17 +++++++ .../AutomatonPluggableTypesPluginImpl.java | 45 +++++++++++++++++++ .../automaton/AutomatonPluggableTypes.java | 22 +++++++++ .../AutomatonPluggableTypesProvider.java | 29 ------------ .../TapChangerBlockingAutomaton.java | 11 ++++- .../implementation/MappingServiceImpl.java | 10 +++-- .../implementation/ScriptServiceImpl.java | 8 +++- .../mapping/server/utils/Templater.java | 10 +---- 16 files changed, 162 insertions(+), 97 deletions(-) rename src/main/java/org/gridsuite/mapping/server/common/plugins/{AbstractPluggableTypeRegistrationModule.java => AbstractPluggableTypesPlugin.java} (54%) create mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java create mode 100644 src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java diff --git a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java index 6ad09417..6cd965c7 100644 --- a/src/main/java/org/gridsuite/mapping/server/MappingConstants.java +++ b/src/main/java/org/gridsuite/mapping/server/MappingConstants.java @@ -34,6 +34,4 @@ private MappingConstants() { // Loads public static final String LOAD_TYPE_PROPERTY = "loadType"; - public static final String CURRENT_LIMIT_MODEL_CLASS = "CurrentLimitAutomaton"; - public static final String VOLTAGE_MODEL_CLASS = "TapChangerBlockingAutomaton"; } diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java similarity index 54% rename from src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java rename to src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java index e043b4aa..8468872d 100644 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypeRegistrationModule.java +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java @@ -1,3 +1,9 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.common.plugins; import com.fasterxml.jackson.databind.ObjectMapper; @@ -6,24 +12,23 @@ import java.util.*; -public abstract class AbstractPluggableTypeRegistrationModule extends SimpleModule { +/** + * @author Thang PHAM + */ +public abstract class AbstractPluggableTypesPlugin extends SimpleModule implements PluggableTypesPlugin { - protected AbstractPluggableTypeRegistrationModule(ObjectMapper objectMapper) { + protected AbstractPluggableTypesPlugin(ObjectMapper objectMapper) { super(); registerTypes(objectMapper); } - public abstract PluggableTypesProvider getPluggableTypesProvider(); - private void registerTypes(ObjectMapper objectMapper) { // Create a list to hold all the subtypes List pluggableTypes = new ArrayList<>(); // Add the additional subtype - getPluggableTypesProvider() - .getPluggableTypes() - .forEach((k, v) -> pluggableTypes.add(new NamedType(v, k))); + getPluggableTypes().forEach((k, v) -> pluggableTypes.add(new NamedType(v, k))); // Register the merged subtypes with the ObjectMapper objectMapper diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java new file mode 100644 index 00000000..66f4e284 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.common.plugins; + +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +/** + * @author Thang PHAM + */ +public interface PluggableTypesPlugin { + Map> getPluggableTypes(); + + D fromEntity(E entity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException; +} diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java deleted file mode 100644 index cd0f4534..00000000 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.gridsuite.mapping.server.common.plugins; - -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -public interface PluggableTypesProvider { - Map> getPluggableTypes(); - - D fromEntity(E entity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException; -} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java index 6b5aea99..792e6c96 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java @@ -9,7 +9,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; import org.gridsuite.mapping.server.model.MappingEntity; import java.util.List; @@ -21,6 +23,7 @@ @Data @Schema(description = "Mapping") @AllArgsConstructor +@NoArgsConstructor public class InputMapping implements Mapping { @Schema(description = "Name") private String name; @@ -39,14 +42,14 @@ public MappingEntity convertMappingToEntity() { convertedMapping.setName(name); convertedMapping.setControlledParameters(controlledParameters); convertedMapping.setRules(rules.stream().map(rule -> rule.convertRuleToEntity(convertedMapping)).collect(Collectors.toList())); - convertedMapping.setAutomata(automata.stream().map(automaton -> automaton.convertAutomatonToEntity(convertedMapping)).collect(Collectors.toList())); + convertedMapping.setAutomata(automata.stream().map(automaton -> automaton.toEntity(convertedMapping)).collect(Collectors.toList())); return convertedMapping; } - public InputMapping(MappingEntity mappingEntity) { + public InputMapping(MappingEntity mappingEntity, AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin) { name = mappingEntity.getName(); controlledParameters = mappingEntity.isControlledParameters(); rules = mappingEntity.getRules().stream().map(Rule::new).collect(Collectors.toList()); - automata = mappingEntity.getAutomata().stream().map(AbstractAutomaton::instantiateFromEntity).collect(Collectors.toList()); + automata = mappingEntity.getAutomata().stream().map(automatonEntity -> AbstractAutomaton.fromEntity(automatonEntity, automatonPluggableTypesPlugin)).collect(Collectors.toList()); } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index 88823eba..0922caef 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -13,7 +13,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.NoArgsConstructor; -import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypesProvider; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.utils.AutomatonFamily; @@ -46,6 +46,9 @@ public abstract class AbstractAutomaton { @JsonIgnore public abstract String getId(); + @JsonIgnore + public abstract String getExportedClassName(); + public abstract List convertToBasicProperties(); protected AbstractAutomaton(AutomatonEntity automatonEntity) { @@ -54,7 +57,7 @@ protected AbstractAutomaton(AutomatonEntity automatonEntity) { this.setSetGroup(automatonEntity.getSetGroup()); } - public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { + public AutomatonEntity toEntity(MappingEntity parentMappingEntity) { UUID createdId = UUID.randomUUID(); AutomatonEntity convertedAutomaton = new AutomatonEntity(); convertedAutomaton.setAutomatonId(createdId); @@ -62,16 +65,17 @@ public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { convertedAutomaton.setModel(this.getModel()); convertedAutomaton.setSetGroup(this.getSetGroup()); - convertedAutomaton.setMapping(parentMapping); + convertedAutomaton.setMapping(parentMappingEntity); return convertedAutomaton; } - public static AbstractAutomaton instantiateFromEntity(AutomatonEntity automatonEntity) { + public static AbstractAutomaton fromEntity(AutomatonEntity automatonEntity, AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin) { if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) { return new CurrentLimitAutomaton(automatonEntity); } else { try { - return (new AutomatonPluggableTypesProvider()).fromEntity(automatonEntity); + return automatonPluggableTypesPlugin + .fromEntity(automatonEntity); } catch (Exception e) { throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, e.getMessage()); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java deleted file mode 100644 index 1a241fca..00000000 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AutomatonPluggableRegistrationModule.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.gridsuite.mapping.server.dto.automata; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.mapping.server.common.plugins.PluggableTypesProvider; -import org.gridsuite.mapping.server.common.plugins.AbstractPluggableTypeRegistrationModule; -import org.gridsuite.mapping.server.model.AutomatonEntity; -import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypesProvider; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class AutomatonPluggableRegistrationModule extends AbstractPluggableTypeRegistrationModule { - - @Autowired - public AutomatonPluggableRegistrationModule(ObjectMapper objectMapper) { - super(objectMapper); - } - - @Override - public PluggableTypesProvider getPluggableTypesProvider() { - return new AutomatonPluggableTypesProvider(); - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index f3ae47f7..665ff44c 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -26,6 +26,8 @@ @NoArgsConstructor public class CurrentLimitAutomaton extends AbstractAutomaton { + public static final String MODEL_CLASS = "CurrentLimitAutomaton"; + public static final String PROPERTY_WATCHED_ELEMENT = "watchedElement"; public static final String PROPERTY_SIDE = "side"; public static final String PROPERTY_STATIC_ID = "staticId"; @@ -50,6 +52,11 @@ public String getId() { return String.format("%s_%s", this.getModel(), watchedElement); } + @Override + public String getExportedClassName() { + return MODEL_CLASS; + } + @Override public ArrayList convertToBasicProperties() { ArrayList properties = new ArrayList<>(); @@ -60,8 +67,8 @@ public ArrayList convertToBasicProperties() { } @Override - public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { - AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); + public AutomatonEntity toEntity(MappingEntity parentMappingEntity) { + AutomatonEntity convertedAutomaton = super.toEntity(parentMappingEntity); convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), PROPERTY_WATCHED_ELEMENT, this.getWatchedElement(), PropertyType.STRING, convertedAutomaton)); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java new file mode 100644 index 00000000..b278ce82 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; + +import org.gridsuite.mapping.server.common.plugins.PluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.model.AutomatonEntity; + +/** + * @author Thang PHAM + */ +public interface AutomatonPluggableTypesPlugin extends PluggableTypesPlugin { +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java new file mode 100644 index 00000000..3194bc44 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gridsuite.mapping.server.common.plugins.AbstractPluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.model.AutomatonEntity; +import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypes; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +/** + * @author Thang PHAM + */ +@Component +public class AutomatonPluggableTypesPluginImpl + extends AbstractPluggableTypesPlugin + implements AutomatonPluggableTypesPlugin { + + @Autowired + public AutomatonPluggableTypesPluginImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + public Map> getPluggableTypes() { + return AutomatonPluggableTypes.TYPES; + } + + @Override + public AbstractAutomaton fromEntity(AutomatonEntity automatonEntity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class dtoClass = AutomatonPluggableTypes.TYPES.get(automatonEntity.getFamily().name()); + Constructor constructor = dtoClass.getConstructor(AutomatonEntity.class); + + return (AbstractAutomaton) constructor.newInstance(automatonEntity); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java new file mode 100644 index 00000000..a848aad4 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.plugins.automaton; + +import java.util.Map; + +/** + * @author Thang PHAM + */ +public class AutomatonPluggableTypes { + // declare all automaton pluggable types through this map + public static final Map> TYPES = Map.of( + "VOLTAGE", TapChangerBlockingAutomaton.class + ); + + private AutomatonPluggableTypes() { + } +} \ No newline at end of file diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java deleted file mode 100644 index dd09f4d9..00000000 --- a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypesProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.gridsuite.mapping.server.plugins.automaton; - -import org.gridsuite.mapping.server.common.plugins.PluggableTypesProvider; -import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.model.AutomatonEntity; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -public class AutomatonPluggableTypesProvider implements PluggableTypesProvider { - - private final Map> pluggableTypes = Map.of( - "VOLTAGE", TapChangerBlockingAutomaton.class - ); - - @Override - public Map> getPluggableTypes() { - return pluggableTypes; - } - - @Override - public AbstractAutomaton fromEntity(AutomatonEntity automatonEntity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Class dtoClass = pluggableTypes.get(automatonEntity.getFamily().name()); - Constructor constructor = dtoClass.getConstructor(AutomatonEntity.class); - - return (AbstractAutomaton) constructor.newInstance(automatonEntity); - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java index 1132457b..bc36c404 100644 --- a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java @@ -31,6 +31,8 @@ @NoArgsConstructor public class TapChangerBlockingAutomaton extends AbstractAutomaton { + public static final String MODEL_CLASS = "TapChangerBlockingAutomaton"; + public static final String PROPERTY_NAME = "name"; public static final String PROPERTY_U_MEASUREMENTS = "uMeasurements"; public static final String PROPERTY_TRANSFORMERS = "transformers"; @@ -60,6 +62,11 @@ public String getId() { return name; } + @Override + public String getExportedClassName() { + return MODEL_CLASS; + } + @Override public ArrayList convertToBasicProperties() { ArrayList properties = new ArrayList<>(); @@ -71,8 +78,8 @@ public ArrayList convertToBasicProperties() { } @Override - public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { - AutomatonEntity convertedAutomaton = super.convertAutomatonToEntity(parentMapping); + public AutomatonEntity toEntity(MappingEntity parentMappingEntity) { + AutomatonEntity convertedAutomaton = super.toEntity(parentMappingEntity); convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(), PROPERTY_NAME, this.getName(), PropertyType.STRING, convertedAutomaton)); diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index f2b88eef..805e71b5 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -8,6 +8,7 @@ import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.model.AutomatonEntity; @@ -37,21 +38,24 @@ public class MappingServiceImpl implements MappingService { private final ModelRepository modelRepository; private final MappingRepository mappingRepository; + private final AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin; @Autowired public MappingServiceImpl( MappingRepository mappingRepository, - ModelRepository modelRepository + ModelRepository modelRepository, + AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin ) { this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; + this.automatonPluggableTypesPlugin = automatonPluggableTypesPlugin; } @Override public List getMappingList() { List mappingEntities = mappingRepository.findAll(); - return mappingEntities.stream().map(InputMapping::new).collect(Collectors.toList()); + return mappingEntities.stream().map(entity -> new InputMapping(entity, automatonPluggableTypesPlugin)).collect(Collectors.toList()); } @Override @@ -121,7 +125,7 @@ public InputMapping copyMapping(String originalName, String copyName) { MappingEntity copiedMapping = new MappingEntity(copyName, mappingToCopy.get()); try { mappingRepository.save(copiedMapping); - return new InputMapping(copiedMapping); + return new InputMapping(copiedMapping, automatonPluggableTypesPlugin); } catch (DataIntegrityViolationException ex) { throw new ResponseStatusException(HttpStatus.CONFLICT, conflictMappingErrorMessage, ex); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 774aa40f..00f4715b 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,6 +9,7 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -37,15 +38,18 @@ public class ScriptServiceImpl implements ScriptService { private final ModelRepository modelRepository; private final MappingRepository mappingRepository; private final ScriptRepository scriptRepository; + private final AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin; public ScriptServiceImpl( MappingRepository mappingRepository, ScriptRepository scriptRepository, - ModelRepository modelRepository + ModelRepository modelRepository, + AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin ) { this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; this.scriptRepository = scriptRepository; + this.automatonPluggableTypesPlugin = automatonPluggableTypesPlugin; } String noModelFoundErrorMessage = "No model found with this name"; @@ -54,7 +58,7 @@ public ScriptServiceImpl( public Script createFromMapping(String mappingName, boolean isPersistent) { Optional foundMapping = mappingRepository.findById(mappingName); if (foundMapping.isPresent()) { - SortedMapping sortedMapping = new SortedMapping(new InputMapping(foundMapping.get())); + SortedMapping sortedMapping = new SortedMapping(new InputMapping(foundMapping.get(), automatonPluggableTypesPlugin)); String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index 2ddf5643..f275c1b9 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -79,15 +79,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi // Automata String[] automataScripts = sortedMapping.getAutomata().stream().map(automaton -> { - String familyModel = ""; - switch (automaton.getFamily()) { - case CURRENT_LIMIT: - familyModel = MappingConstants.CURRENT_LIMIT_MODEL_CLASS; - break; - case VOLTAGE: - familyModel = MappingConstants.VOLTAGE_MODEL_CLASS; - break; - } + String familyModel = automaton.getExportedClassName(); imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); From c62a98fe480bf69e76c6803aa482134f8e915e4e Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Sun, 21 May 2023 13:01:30 +0200 Subject: [PATCH 16/18] Eslint --- .../server/plugins/automaton/AutomatonPluggableTypes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java index a848aad4..d711ffb3 100644 --- a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java +++ b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java @@ -11,7 +11,7 @@ /** * @author Thang PHAM */ -public class AutomatonPluggableTypes { +public final class AutomatonPluggableTypes { // declare all automaton pluggable types through this map public static final Map> TYPES = Map.of( "VOLTAGE", TapChangerBlockingAutomaton.class @@ -19,4 +19,4 @@ public class AutomatonPluggableTypes { private AutomatonPluggableTypes() { } -} \ No newline at end of file +} From 38d76b547a1a1d0fcdf43b5e3d2187ee20f7b0d7 Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 22 May 2023 17:35:07 +0200 Subject: [PATCH 17/18] Use annotation to implement pluggable types --- .../plugins/AbstractPluggableTypesPlugin.java | 38 ------------ .../plugins/AbstractSubtypesRegister.java | 37 ++++++++++++ ...TypesPlugin.java => SubtypesRegister.java} | 4 +- .../mapping/server/dto/InputMapping.java | 6 +- .../dto/automata/AbstractAutomaton.java | 23 +++---- .../CommonAutomatonSubtypesExtension.java | 22 +++++++ .../dto/automata/CurrentLimitAutomaton.java | 2 +- .../TapChangerBlockingAutomaton.java | 6 +- .../AutomatonPluggableTypesPluginImpl.java | 45 -------------- .../automata/plugins/AutomatonSubtypes.java | 28 +++++++++ .../plugins/AutomatonSubtypesExtension.java | 13 ++++ ...in.java => AutomatonSubtypesRegister.java} | 4 +- .../AutomatonSubtypesRegisterImpl.java | 60 +++++++++++++++++++ .../automaton/AutomatonPluggableTypes.java | 22 ------- .../implementation/MappingServiceImpl.java | 12 ++-- .../implementation/ScriptServiceImpl.java | 10 ++-- .../mapping/server/utils/Templater.java | 2 +- 17 files changed, 190 insertions(+), 144 deletions(-) delete mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java create mode 100644 src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java rename src/main/java/org/gridsuite/mapping/server/common/plugins/{PluggableTypesPlugin.java => SubtypesRegister.java} (86%) create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java rename src/main/java/org/gridsuite/mapping/server/{plugins/automaton => dto/automata}/TapChangerBlockingAutomaton.java (94%) delete mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java rename src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/{AutomatonPluggableTypesPlugin.java => AutomatonSubtypesRegister.java} (73%) create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java delete mode 100644 src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java deleted file mode 100644 index 8468872d..00000000 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractPluggableTypesPlugin.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2023, 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 org.gridsuite.mapping.server.common.plugins; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsontype.NamedType; -import com.fasterxml.jackson.databind.module.SimpleModule; - -import java.util.*; - -/** - * @author Thang PHAM - */ -public abstract class AbstractPluggableTypesPlugin extends SimpleModule implements PluggableTypesPlugin { - - protected AbstractPluggableTypesPlugin(ObjectMapper objectMapper) { - super(); - registerTypes(objectMapper); - } - - private void registerTypes(ObjectMapper objectMapper) { - - // Create a list to hold all the subtypes - List pluggableTypes = new ArrayList<>(); - - // Add the additional subtype - getPluggableTypes().forEach((k, v) -> pluggableTypes.add(new NamedType(v, k))); - - // Register the merged subtypes with the ObjectMapper - objectMapper - .getSubtypeResolver() - .registerSubtypes(pluggableTypes.toArray(new NamedType[0])); - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java new file mode 100644 index 00000000..dc61e1f8 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.common.plugins; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.NamedType; + +import javax.annotation.PostConstruct; +import java.util.*; + +/** + * @author Thang PHAM + */ +public abstract class AbstractSubtypesRegister implements SubtypesRegister { + + private final ObjectMapper objectMapper; + + protected AbstractSubtypesRegister(ObjectMapper objectMapper) { + super(); + this.objectMapper = objectMapper; + } + + @PostConstruct + protected void registerSubtypes() { + + // collect subtypes + List subtypes = new ArrayList<>(); + getSubtypes().forEach((k, v) -> subtypes.add(new NamedType(v, k))); + + // Register subtypes with the ObjectMapper + objectMapper.getSubtypeResolver().registerSubtypes(subtypes.toArray(new NamedType[0])); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java b/src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java similarity index 86% rename from src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java rename to src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java index 66f4e284..9ec8a947 100644 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/PluggableTypesPlugin.java +++ b/src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java @@ -12,8 +12,8 @@ /** * @author Thang PHAM */ -public interface PluggableTypesPlugin { - Map> getPluggableTypes(); +public interface SubtypesRegister { + Map> getSubtypes(); D fromEntity(E entity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException; } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java index 792e6c96..7b6dd426 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java @@ -11,7 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.model.MappingEntity; import java.util.List; @@ -46,10 +46,10 @@ public MappingEntity convertMappingToEntity() { return convertedMapping; } - public InputMapping(MappingEntity mappingEntity, AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin) { + public InputMapping(MappingEntity mappingEntity, AutomatonSubtypesRegister automatonSubtypesRegister) { name = mappingEntity.getName(); controlledParameters = mappingEntity.isControlledParameters(); rules = mappingEntity.getRules().stream().map(Rule::new).collect(Collectors.toList()); - automata = mappingEntity.getAutomata().stream().map(automatonEntity -> AbstractAutomaton.fromEntity(automatonEntity, automatonPluggableTypesPlugin)).collect(Collectors.toList()); + automata = mappingEntity.getAutomata().stream().map(automatonEntity -> AbstractAutomaton.fromEntity(automatonEntity, automatonSubtypesRegister)).collect(Collectors.toList()); } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index 0922caef..23632ef9 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -13,7 +13,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.NoArgsConstructor; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.utils.AutomatonFamily; @@ -27,9 +27,7 @@ * @author Mathieu Scalbert */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "family", visible = true) -@JsonSubTypes({ - @JsonSubTypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"), -}) +@JsonSubTypes({ }) @Data @NoArgsConstructor public abstract class AbstractAutomaton { @@ -44,7 +42,7 @@ public abstract class AbstractAutomaton { private String setGroup; @JsonIgnore - public abstract String getId(); + public abstract String getExportedId(); @JsonIgnore public abstract String getExportedClassName(); @@ -69,16 +67,11 @@ public AutomatonEntity toEntity(MappingEntity parentMappingEntity) { return convertedAutomaton; } - public static AbstractAutomaton fromEntity(AutomatonEntity automatonEntity, AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin) { - if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) { - return new CurrentLimitAutomaton(automatonEntity); - } else { - try { - return automatonPluggableTypesPlugin - .fromEntity(automatonEntity); - } catch (Exception e) { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, e.getMessage()); - } + public static AbstractAutomaton fromEntity(AutomatonEntity automatonEntity, AutomatonSubtypesRegister automatonSubtypesRegister) { + try { + return automatonSubtypesRegister.fromEntity(automatonEntity); + } catch (Exception e) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, e.getMessage()); } } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java new file mode 100644 index 00000000..2160133b --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata; + +import com.google.auto.service.AutoService; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypes; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesExtension; + +/** + * @author Thang PHAM + */ +@AutomatonSubtypes({ + @AutomatonSubtypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"), + @AutomatonSubtypes.Type(value = TapChangerBlockingAutomaton.class, name = "VOLTAGE") +}) +@AutoService(AutomatonSubtypesExtension.class) +public class CommonAutomatonSubtypesExtension implements AutomatonSubtypesExtension { +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java index 665ff44c..9f08d78c 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CurrentLimitAutomaton.java @@ -48,7 +48,7 @@ public CurrentLimitAutomaton(AutomatonEntity automatonEntity) { } @Override - public String getId() { + public String getExportedId() { return String.format("%s_%s", this.getModel(), watchedElement); } diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java similarity index 94% rename from src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java index bc36c404..ffcc2f07 100644 --- a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/TapChangerBlockingAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/TapChangerBlockingAutomaton.java @@ -4,15 +4,13 @@ * 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 org.gridsuite.mapping.server.plugins.automaton; +package org.gridsuite.mapping.server.dto.automata; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.BasicProperty; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.AutomatonPropertyEntity; import org.gridsuite.mapping.server.model.MappingEntity; @@ -58,7 +56,7 @@ public TapChangerBlockingAutomaton(AutomatonEntity automatonEntity) { } @Override - public String getId() { + public String getExportedId() { return name; } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java deleted file mode 100644 index 3194bc44..00000000 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPluginImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.gridsuite.mapping.server.common.plugins.AbstractPluggableTypesPlugin; -import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.model.AutomatonEntity; -import org.gridsuite.mapping.server.plugins.automaton.AutomatonPluggableTypes; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -/** - * @author Thang PHAM - */ -@Component -public class AutomatonPluggableTypesPluginImpl - extends AbstractPluggableTypesPlugin - implements AutomatonPluggableTypesPlugin { - - @Autowired - public AutomatonPluggableTypesPluginImpl(ObjectMapper objectMapper) { - super(objectMapper); - } - - public Map> getPluggableTypes() { - return AutomatonPluggableTypes.TYPES; - } - - @Override - public AbstractAutomaton fromEntity(AutomatonEntity automatonEntity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Class dtoClass = AutomatonPluggableTypes.TYPES.get(automatonEntity.getFamily().name()); - Constructor constructor = dtoClass.getConstructor(AutomatonEntity.class); - - return (AbstractAutomaton) constructor.newInstance(automatonEntity); - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java new file mode 100644 index 00000000..e9f873c9 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; + +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Thang PHAM + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface AutomatonSubtypes { + Type[] value(); + @interface Type { + Class value(); + String name() default ""; + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java new file mode 100644 index 00000000..7e4d7257 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; + +/** + * @author Thang PHAM + */ +public interface AutomatonSubtypesExtension { +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java similarity index 73% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java index b278ce82..cd1d1f36 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonPluggableTypesPlugin.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java @@ -6,12 +6,12 @@ */ package org.gridsuite.mapping.server.dto.automata.plugins; -import org.gridsuite.mapping.server.common.plugins.PluggableTypesPlugin; +import org.gridsuite.mapping.server.common.plugins.SubtypesRegister; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; import org.gridsuite.mapping.server.model.AutomatonEntity; /** * @author Thang PHAM */ -public interface AutomatonPluggableTypesPlugin extends PluggableTypesPlugin { +public interface AutomatonSubtypesRegister extends SubtypesRegister { } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java new file mode 100644 index 00000000..3bc90774 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2023, 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 org.gridsuite.mapping.server.dto.automata.plugins; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import org.gridsuite.mapping.server.common.plugins.AbstractSubtypesRegister; +import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.model.AutomatonEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +/** + * @author Thang PHAM + */ +@Component +public class AutomatonSubtypesRegisterImpl + extends AbstractSubtypesRegister + implements AutomatonSubtypesRegister { + + private final Map> types = new HashMap<>(); + + @Autowired + public AutomatonSubtypesRegisterImpl(ObjectMapper objectMapper) { + + super(objectMapper); + + // load pluggable types + List automatonSubtypesExtensions = + Lists.newArrayList(ServiceLoader.load(AutomatonSubtypesExtension.class, AutomatonSubtypesExtension.class.getClassLoader())); + automatonSubtypesExtensions.stream() + .filter(cls -> cls.getClass().isAnnotationPresent(AutomatonSubtypes.class)) + .forEach(cls -> { + AutomatonSubtypes annotation = cls.getClass().getAnnotation(AutomatonSubtypes.class); + AutomatonSubtypes.Type[] subtypes = annotation.value(); + Arrays.stream(subtypes).forEach(type -> types.put(type.name(), type.value())); + }); + + } + + public Map> getSubtypes() { + return types; + } + + @Override + public AbstractAutomaton fromEntity(AutomatonEntity automatonEntity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class dtoClass = getSubtypes().get(automatonEntity.getFamily().name()); + Constructor constructor = dtoClass.getConstructor(AutomatonEntity.class); + + return (AbstractAutomaton) constructor.newInstance(automatonEntity); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java b/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java deleted file mode 100644 index d711ffb3..00000000 --- a/src/main/java/org/gridsuite/mapping/server/plugins/automaton/AutomatonPluggableTypes.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2023, 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 org.gridsuite.mapping.server.plugins.automaton; - -import java.util.Map; - -/** - * @author Thang PHAM - */ -public final class AutomatonPluggableTypes { - // declare all automaton pluggable types through this map - public static final Map> TYPES = Map.of( - "VOLTAGE", TapChangerBlockingAutomaton.class - ); - - private AutomatonPluggableTypes() { - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index 805e71b5..9608f6bb 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -8,7 +8,7 @@ import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.model.AutomatonEntity; @@ -38,24 +38,24 @@ public class MappingServiceImpl implements MappingService { private final ModelRepository modelRepository; private final MappingRepository mappingRepository; - private final AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin; + private final AutomatonSubtypesRegister automatonSubtypesRegister; @Autowired public MappingServiceImpl( MappingRepository mappingRepository, ModelRepository modelRepository, - AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin + AutomatonSubtypesRegister automatonSubtypesRegister ) { this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; - this.automatonPluggableTypesPlugin = automatonPluggableTypesPlugin; + this.automatonSubtypesRegister = automatonSubtypesRegister; } @Override public List getMappingList() { List mappingEntities = mappingRepository.findAll(); - return mappingEntities.stream().map(entity -> new InputMapping(entity, automatonPluggableTypesPlugin)).collect(Collectors.toList()); + return mappingEntities.stream().map(entity -> new InputMapping(entity, automatonSubtypesRegister)).collect(Collectors.toList()); } @Override @@ -125,7 +125,7 @@ public InputMapping copyMapping(String originalName, String copyName) { MappingEntity copiedMapping = new MappingEntity(copyName, mappingToCopy.get()); try { mappingRepository.save(copiedMapping); - return new InputMapping(copiedMapping, automatonPluggableTypesPlugin); + return new InputMapping(copiedMapping, automatonSubtypesRegister); } catch (DataIntegrityViolationException ex) { throw new ResponseStatusException(HttpStatus.CONFLICT, conflictMappingErrorMessage, ex); } diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 00f4715b..06495027 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,7 +9,7 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonPluggableTypesPlugin; +import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; @@ -38,18 +38,18 @@ public class ScriptServiceImpl implements ScriptService { private final ModelRepository modelRepository; private final MappingRepository mappingRepository; private final ScriptRepository scriptRepository; - private final AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin; + private final AutomatonSubtypesRegister automatonSubtypesRegister; public ScriptServiceImpl( MappingRepository mappingRepository, ScriptRepository scriptRepository, ModelRepository modelRepository, - AutomatonPluggableTypesPlugin automatonPluggableTypesPlugin + AutomatonSubtypesRegister automatonSubtypesRegister ) { this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; this.scriptRepository = scriptRepository; - this.automatonPluggableTypesPlugin = automatonPluggableTypesPlugin; + this.automatonSubtypesRegister = automatonSubtypesRegister; } String noModelFoundErrorMessage = "No model found with this name"; @@ -58,7 +58,7 @@ public ScriptServiceImpl( public Script createFromMapping(String mappingName, boolean isPersistent) { Optional foundMapping = mappingRepository.findById(mappingName); if (foundMapping.isPresent()) { - SortedMapping sortedMapping = new SortedMapping(new InputMapping(foundMapping.get(), automatonPluggableTypesPlugin)); + SortedMapping sortedMapping = new SortedMapping(new InputMapping(foundMapping.get(), automatonSubtypesRegister)); String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; diff --git a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java index f275c1b9..cf4f1b38 100644 --- a/src/main/java/org/gridsuite/mapping/server/utils/Templater.java +++ b/src/main/java/org/gridsuite/mapping/server/utils/Templater.java @@ -83,7 +83,7 @@ public static String mappingToScript(ScriptServiceImpl.SortedMapping sortedMappi imports.add(MappingConstants.AUTOMATON_IMPORT); ST automatonScript = new ST(automatonTemplate); automatonScript.add("familyModel", familyModel); - automatonScript.add("automatonId", automaton.getId()); + automatonScript.add("automatonId", automaton.getExportedId()); automatonScript.add("parameterSetId", automaton.getSetGroup()); String[] propertiesScripts = automaton.convertToBasicProperties().stream().map(property -> { ST propertyScript = new ST(automatonPropertyTemplate); From 451700082d5543510023e77705e8324b3b41867c Mon Sep 17 00:00:00 2001 From: Thang PHAM Date: Mon, 22 May 2023 18:52:56 +0200 Subject: [PATCH 18/18] rename package plugins to extensions --- .../{plugins => extensions}/AbstractSubtypesRegister.java | 2 +- .../common/{plugins => extensions}/SubtypesRegister.java | 2 +- .../java/org/gridsuite/mapping/server/dto/InputMapping.java | 2 +- .../mapping/server/dto/automata/AbstractAutomaton.java | 2 +- .../server/dto/automata/CommonAutomatonSubtypesExtension.java | 4 ++-- .../automata/{plugins => extensions}/AutomatonSubtypes.java | 2 +- .../{plugins => extensions}/AutomatonSubtypesExtension.java | 2 +- .../{plugins => extensions}/AutomatonSubtypesRegister.java | 4 ++-- .../AutomatonSubtypesRegisterImpl.java | 4 ++-- .../server/service/implementation/MappingServiceImpl.java | 2 +- .../server/service/implementation/ScriptServiceImpl.java | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) rename src/main/java/org/gridsuite/mapping/server/common/{plugins => extensions}/AbstractSubtypesRegister.java (95%) rename src/main/java/org/gridsuite/mapping/server/common/{plugins => extensions}/SubtypesRegister.java (91%) rename src/main/java/org/gridsuite/mapping/server/dto/automata/{plugins => extensions}/AutomatonSubtypes.java (92%) rename src/main/java/org/gridsuite/mapping/server/dto/automata/{plugins => extensions}/AutomatonSubtypesExtension.java (86%) rename src/main/java/org/gridsuite/mapping/server/dto/automata/{plugins => extensions}/AutomatonSubtypesRegister.java (80%) rename src/main/java/org/gridsuite/mapping/server/dto/automata/{plugins => extensions}/AutomatonSubtypesRegisterImpl.java (94%) diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java b/src/main/java/org/gridsuite/mapping/server/common/extensions/AbstractSubtypesRegister.java similarity index 95% rename from src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java rename to src/main/java/org/gridsuite/mapping/server/common/extensions/AbstractSubtypesRegister.java index dc61e1f8..9a80c5d4 100644 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/AbstractSubtypesRegister.java +++ b/src/main/java/org/gridsuite/mapping/server/common/extensions/AbstractSubtypesRegister.java @@ -4,7 +4,7 @@ * 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 org.gridsuite.mapping.server.common.plugins; +package org.gridsuite.mapping.server.common.extensions; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.NamedType; diff --git a/src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java b/src/main/java/org/gridsuite/mapping/server/common/extensions/SubtypesRegister.java similarity index 91% rename from src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java rename to src/main/java/org/gridsuite/mapping/server/common/extensions/SubtypesRegister.java index 9ec8a947..29581960 100644 --- a/src/main/java/org/gridsuite/mapping/server/common/plugins/SubtypesRegister.java +++ b/src/main/java/org/gridsuite/mapping/server/common/extensions/SubtypesRegister.java @@ -4,7 +4,7 @@ * 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 org.gridsuite.mapping.server.common.plugins; +package org.gridsuite.mapping.server.common.extensions; import java.lang.reflect.InvocationTargetException; import java.util.Map; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java index 7b6dd426..7bb09689 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java @@ -11,7 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.model.MappingEntity; import java.util.List; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java index 23632ef9..2408347b 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/AbstractAutomaton.java @@ -13,7 +13,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.NoArgsConstructor; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.utils.AutomatonFamily; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java index 2160133b..5749f20f 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/CommonAutomatonSubtypesExtension.java @@ -7,8 +7,8 @@ package org.gridsuite.mapping.server.dto.automata; import com.google.auto.service.AutoService; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypes; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesExtension; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypes; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesExtension; /** * @author Thang PHAM diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypes.java similarity index 92% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypes.java index e9f873c9..a56e4250 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypes.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypes.java @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.gridsuite.mapping.server.dto.automata.plugins; +package org.gridsuite.mapping.server.dto.automata.extensions; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesExtension.java similarity index 86% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesExtension.java index 7e4d7257..f12f0978 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesExtension.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesExtension.java @@ -4,7 +4,7 @@ * 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 org.gridsuite.mapping.server.dto.automata.plugins; +package org.gridsuite.mapping.server.dto.automata.extensions; /** * @author Thang PHAM diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegister.java similarity index 80% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegister.java index cd1d1f36..0e8cc6c1 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegister.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegister.java @@ -4,9 +4,9 @@ * 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 org.gridsuite.mapping.server.dto.automata.plugins; +package org.gridsuite.mapping.server.dto.automata.extensions; -import org.gridsuite.mapping.server.common.plugins.SubtypesRegister; +import org.gridsuite.mapping.server.common.extensions.SubtypesRegister; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; import org.gridsuite.mapping.server.model.AutomatonEntity; diff --git a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegisterImpl.java similarity index 94% rename from src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java rename to src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegisterImpl.java index 3bc90774..8a0ba9f8 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/automata/plugins/AutomatonSubtypesRegisterImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/automata/extensions/AutomatonSubtypesRegisterImpl.java @@ -4,11 +4,11 @@ * 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 org.gridsuite.mapping.server.dto.automata.plugins; +package org.gridsuite.mapping.server.dto.automata.extensions; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; -import org.gridsuite.mapping.server.common.plugins.AbstractSubtypesRegister; +import org.gridsuite.mapping.server.common.extensions.AbstractSubtypesRegister; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; import org.gridsuite.mapping.server.model.AutomatonEntity; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index 9608f6bb..254a0e29 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java @@ -8,7 +8,7 @@ import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.dto.models.Model; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.model.AutomatonEntity; diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java index 06495027..d134c604 100644 --- a/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ScriptServiceImpl.java @@ -9,7 +9,7 @@ import lombok.*; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.dto.automata.plugins.AutomatonSubtypesRegister; +import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesRegister; import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup;