Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,4 @@ private MappingConstants() {
// Loads
public static final String LOAD_TYPE_PROPERTY = "loadType";

public static final String CURRENT_LIMIT_MODEL_CLASS = "CurrentLimitAutomaton";
}
Original file line number Diff line number Diff line change
@@ -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.extensions;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.NamedType;

import javax.annotation.PostConstruct;
import java.util.*;

/**
* @author Thang PHAM <quyet-thang.pham at rte-france.com>
*/
public abstract class AbstractSubtypesRegister<D, E> implements SubtypesRegister<D, E> {

private final ObjectMapper objectMapper;

protected AbstractSubtypesRegister(ObjectMapper objectMapper) {
super();
this.objectMapper = objectMapper;
}

@PostConstruct
protected void registerSubtypes() {

// collect subtypes
List<NamedType> 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]));
}
}
Original file line number Diff line number Diff line change
@@ -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.extensions;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
* @author Thang PHAM <quyet-thang.pham at rte-france.com>
*/
public interface SubtypesRegister<D, E> {
Map<String, Class<?>> getSubtypes();

D fromEntity(E entity) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.extensions.AutomatonSubtypesRegister;
import org.gridsuite.mapping.server.model.MappingEntity;

import java.util.List;
Expand All @@ -21,6 +23,7 @@
@Data
@Schema(description = "Mapping")
@AllArgsConstructor
@NoArgsConstructor
public class InputMapping implements Mapping {
@Schema(description = "Name")
private String name;
Expand All @@ -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, AutomatonSubtypesRegister automatonSubtypesRegister) {
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, automatonSubtypesRegister)).collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,30 @@
*/
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;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
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;
import org.springframework.http.HttpStatus;
import org.springframework.web.client.HttpClientErrorException;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
* @author Mathieu Scalbert <mathieu.scalbert at rte-france.com>
*/
@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 {
@Schema(description = "Automaton family")
@JsonProperty
Expand All @@ -37,18 +41,37 @@ public abstract class AbstractAutomaton {
@Schema(description = "Mapped Parameters Set Group ID")
private String setGroup;

@Schema(description = "Element watched by the automaton")
private String watchedElement;
@JsonIgnore
public abstract String getExportedId();

public abstract ArrayList<BasicProperty> convertToBasicProperties();
@JsonIgnore
public abstract String getExportedClassName();

public abstract AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping);
public abstract List<BasicProperty> convertToBasicProperties();

public static AbstractAutomaton instantiateFromEntity(AutomatonEntity automatonEntity) {
if (automatonEntity.getFamily() == AutomatonFamily.CURRENT_LIMIT) {
return new CurrentLimitAutomaton(automatonEntity);
} else {
throw new HttpClientErrorException(HttpStatus.BAD_REQUEST);
protected AbstractAutomaton(AutomatonEntity automatonEntity) {
this.setFamily(automatonEntity.getFamily());
this.setModel(automatonEntity.getModel());
this.setSetGroup(automatonEntity.getSetGroup());
}

public AutomatonEntity toEntity(MappingEntity parentMappingEntity) {
UUID createdId = UUID.randomUUID();
AutomatonEntity convertedAutomaton = new AutomatonEntity();
convertedAutomaton.setAutomatonId(createdId);
convertedAutomaton.setFamily(this.getFamily());
convertedAutomaton.setModel(this.getModel());
convertedAutomaton.setSetGroup(this.getSetGroup());

convertedAutomaton.setMapping(parentMappingEntity);
return convertedAutomaton;
}

public static AbstractAutomaton fromEntity(AutomatonEntity automatonEntity, AutomatonSubtypesRegister automatonSubtypesRegister) {
try {
return automatonSubtypesRegister.fromEntity(automatonEntity);
} catch (Exception e) {
throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, e.getMessage());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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.extensions.AutomatonSubtypes;
import org.gridsuite.mapping.server.dto.automata.extensions.AutomatonSubtypesExtension;

/**
* @author Thang PHAM <quyet-thang.pham at rte-france.com>
*/
@AutomatonSubtypes({
@AutomatonSubtypes.Type(value = CurrentLimitAutomaton.class, name = "CURRENT_LIMIT"),
@AutomatonSubtypes.Type(value = TapChangerBlockingAutomaton.class, name = "VOLTAGE")
})
@AutoService(AutomatonSubtypesExtension.class)
public class CommonAutomatonSubtypesExtension implements AutomatonSubtypesExtension {
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
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;
Expand All @@ -15,8 +17,6 @@
import org.gridsuite.mapping.server.utils.PropertyType;

import java.util.ArrayList;
import java.util.Optional;
import java.util.UUID;

/**
* @author Mathieu Scalbert <mathieu.scalbert at rte-france.com>
Expand All @@ -25,43 +25,57 @@
@EqualsAndHashCode(callSuper = true)
@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";

@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 ArrayList<BasicProperty> convertToBasicProperties() {
ArrayList<BasicProperty> propertiesList = new ArrayList<>();
propertiesList.add(new BasicProperty("side", side));
return propertiesList;
public CurrentLimitAutomaton(AutomatonEntity automatonEntity) {
super(automatonEntity);

watchedElement = automatonEntity.getProperty(PROPERTY_WATCHED_ELEMENT);
side = automatonEntity.getProperty(PROPERTY_SIDE);
}

public CurrentLimitAutomaton(AutomatonEntity automatonEntity) {
this.setFamily(automatonEntity.getFamily());
this.setModel(automatonEntity.getModel());
this.setSetGroup(automatonEntity.getSetGroup());
this.setWatchedElement(automatonEntity.getWatchedElement());
// TODO Create generic function for all properties
Optional<AutomatonPropertyEntity> foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny();
if (foundSideProperty.isPresent()) {
side = foundSideProperty.get().getValue();
}
@Override
public String getExportedId() {
return String.format("%s_%s", this.getModel(), watchedElement);
}

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());
convertedAutomaton.setWatchedElement(this.getWatchedElement());
convertedAutomaton.setMapping(parentMapping);
ArrayList<AutomatonPropertyEntity> convertedProperties = new ArrayList<>();
AutomatonPropertyEntity convertedProperty = new AutomatonPropertyEntity();
convertedProperty.setAutomatonId(createdId);
convertedProperty.setName("side");
convertedProperty.setValue(this.getSide());
convertedProperty.setType(PropertyType.STRING);
convertedProperties.add(convertedProperty);
convertedAutomaton.setProperties(convertedProperties);
@Override
public String getExportedClassName() {
return MODEL_CLASS;
}

@Override
public ArrayList<BasicProperty> convertToBasicProperties() {
ArrayList<BasicProperty> properties = new ArrayList<>();
properties.add(new BasicProperty(PROPERTY_STATIC_ID, "\"" + watchedElement + "\""));
properties.add(new BasicProperty(PROPERTY_SIDE, side));

return properties;
}

@Override
public AutomatonEntity toEntity(MappingEntity parentMappingEntity) {
AutomatonEntity convertedAutomaton = super.toEntity(parentMappingEntity);

convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(),
PROPERTY_WATCHED_ELEMENT, this.getWatchedElement(), PropertyType.STRING, convertedAutomaton));

convertedAutomaton.addProperty(new AutomatonPropertyEntity(convertedAutomaton.getAutomatonId(),
PROPERTY_SIDE, this.getSide(), PropertyType.STRING, convertedAutomaton));

return convertedAutomaton;
}
}
Expand Down
Loading