diff --git a/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java new file mode 100644 index 00000000..9616e585 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2021, 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.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; +import org.gridsuite.mapping.server.dto.models.SimpleModel; +import org.gridsuite.mapping.server.service.ModelService; +import org.gridsuite.mapping.server.service.implementation.ModelServiceImpl; +import org.gridsuite.mapping.server.utils.SetGroupType; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author Mathieu Scalbert + */ +@RestController +@RequestMapping(value = "/models") +@Tag(name = "Mapping model server") +@AllArgsConstructor +@ComponentScan(basePackageClasses = {ModelServiceImpl.class}) + +public class ModelController { + + private final ModelService modelService; + + @GetMapping(value = "/{modelName}/parameters/sets/{groupName}/{groupType}") + @Operation(summary = "get all parameters sets for a given group") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "parameter sets of the group")}) + + public ResponseEntity> getSetsGroupsFromModelName(@PathVariable("modelName") String modelName, @PathVariable("groupName") String groupName, @PathVariable("groupType") SetGroupType groupType) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getSetsFromGroup(modelName, groupName, groupType)); + } + + @PostMapping(value = "/{modelName}/parameters/sets/strict") + @Operation(summary = "Save a new parameter sets group without checking sets") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Parameter Set Group Saved")}) + public ResponseEntity saveParametersSet(@PathVariable("modelName") String modelName, @RequestBody ParametersSetsGroup setsGroup) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSetsGroup(modelName, setsGroup, true)); + } + + @PostMapping(value = "/{modelName}/parameters/sets/") + @Operation(summary = "Save a new parameter sets group without checking sets") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Parameter Set Group Saved")}) + public ResponseEntity saveSimpleParametersSet(@PathVariable("modelName") String modelName, @RequestBody ParametersSetsGroup setsGroup) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSetsGroup(modelName, setsGroup, false)); + } + + @GetMapping(value = "/{modelName}/parameters/definitions/") + @Operation(summary = "get parameters definitions for a given model") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "parameters definitions of the model")}) + public ResponseEntity> getParametersDefinitionsFromModelName(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getParametersDefinitionsFromModelName(modelName)); + } + + @GetMapping(value = "/") + @Operation(summary = "get models names") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "names of all models")}) + public ResponseEntity> getModels() { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getModels()); + } +} 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 488a335d..bd53be18 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/InputMapping.java @@ -31,9 +31,13 @@ public class InputMapping implements Mapping { @Schema(description = "Mapping automata") private List automata; + @Schema(description = "Mapping should control its parameters") + private boolean controlledParameters; + public MappingEntity convertMappingToEntity() { MappingEntity convertedMapping = new MappingEntity(); 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())); return convertedMapping; @@ -41,6 +45,7 @@ public MappingEntity convertMappingToEntity() { public InputMapping(MappingEntity mappingEntity) { name = mappingEntity.getName(); + controlledParameters = mappingEntity.isControlledParameters(); rules = mappingEntity.getRules().stream().map(ruleEntity -> new Rule(ruleEntity)).collect(Collectors.toList()); automata = mappingEntity.getAutomata().stream().map(automatonEntity -> AbstractAutomaton.instantiateFromEntity(automatonEntity)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/InstanceModel.java b/src/main/java/org/gridsuite/mapping/server/dto/InstanceModel.java deleted file mode 100644 index a2d9d8c7..00000000 --- a/src/main/java/org/gridsuite/mapping/server/dto/InstanceModel.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2021, 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; - -import lombok.Data; -import org.gridsuite.mapping.server.model.InstanceModelEntity; -import org.gridsuite.mapping.server.utils.EquipmentType; - -/** - * @author Mathieu Scalbert - */ -@Data -public class InstanceModel { - private String id; - - private String modelName; - - private EquipmentType equipmentType; - - private ModelParams params; - - public InstanceModel(InstanceModelEntity instanceModelEntity) { - id = instanceModelEntity.getId(); - modelName = instanceModelEntity.getModelName(); - equipmentType = instanceModelEntity.getEquipmentType(); - params = new SetParams(instanceModelEntity.getParams()); - } -} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/Rule.java b/src/main/java/org/gridsuite/mapping/server/dto/Rule.java index 7cddd1b7..c02a6bcc 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/Rule.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/Rule.java @@ -10,10 +10,11 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import org.gridsuite.mapping.server.dto.filters.AbstractFilter; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.model.RuleEntity; -import org.gridsuite.mapping.server.utils.*; -import org.gridsuite.mapping.server.dto.filters.*; +import org.gridsuite.mapping.server.utils.EquipmentType; +import org.gridsuite.mapping.server.utils.SetGroupType; import java.util.Comparator; import java.util.List; @@ -34,6 +35,12 @@ public class Rule { @Schema(description = "Mapped Model Instance ID") private String mappedModel; + @Schema(description = "Mapped Parameter Set Group ID") + private String setGroup; + + @Schema(description = "Mapped Parameter Set Group Type") + private SetGroupType groupType; + @Schema(description = "Composition") private String composition; @@ -50,6 +57,8 @@ public RuleEntity convertRuleToEntity(MappingEntity parentMapping) { convertedRule.setComposition(composition); convertedRule.setRuleId(createdId); convertedRule.setMappedModel(mappedModel); + convertedRule.setSetGroup(setGroup); + convertedRule.setGroupType(groupType); convertedRule.setEquipmentType(equipmentType); convertedRule.setMapping(parentMapping); convertedRule.setFilters(filters.stream().map(filter -> filter.convertFilterToEntity(convertedRule)).collect(Collectors.toList())); @@ -59,6 +68,8 @@ public RuleEntity convertRuleToEntity(MappingEntity parentMapping) { public Rule(RuleEntity ruleEntity) { equipmentType = ruleEntity.getEquipmentType(); mappedModel = ruleEntity.getMappedModel(); + setGroup = ruleEntity.getSetGroup(); + groupType = ruleEntity.getGroupType(); composition = ruleEntity.getComposition(); filters = ruleEntity.getFilters().stream().map(filterEmbeddable -> AbstractFilter.createFilterFromEntity(filterEmbeddable)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/Script.java b/src/main/java/org/gridsuite/mapping/server/dto/Script.java index 6d9fe715..f3004005 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/Script.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/Script.java @@ -6,11 +6,14 @@ */ package org.gridsuite.mapping.server.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import org.gridsuite.mapping.server.model.ScriptEntity; +import java.util.Date; + /** * @author Mathieu Scalbert */ @@ -28,14 +31,27 @@ public class Script { @Schema(description = "Generated Script") private String script; + @JsonIgnore + @Schema(description = "Creation date") + private Date createdDate; + + @Schema(description = "Script parameters are up to date") + private boolean current; + + @Schema(description = "Parameter file") + private String parametersFile; + public Script(ScriptEntity scriptEntity) { name = scriptEntity.getName(); parentName = scriptEntity.getParentName(); script = scriptEntity.getScript(); + createdDate = scriptEntity.getCreatedDate(); + parametersFile = scriptEntity.getParametersFile(); + current = false; // Assume false } public ScriptEntity convertToEntity() { - return new ScriptEntity(name, parentName, script); + return new ScriptEntity(name, parentName, script, createdDate, parametersFile); } } 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 80413f79..57ace6be 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 @@ -34,6 +34,9 @@ public abstract class AbstractAutomaton { @Schema(description = "Mapped Model Instance ID") private String model; + @Schema(description = "Mapped Parameters Set Group ID") + private String setGroup; + @Schema(description = "Element watched by the automaton") private String watchedElement; 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 366d370f..0f2f1b73 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,9 @@ */ package org.gridsuite.mapping.server.dto.automata; -import lombok.*; +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; @@ -34,6 +36,7 @@ public ArrayList convertToBasicProperties() { 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 foundSideProperty = automatonEntity.getProperties().stream().filter(property -> property.getName().equals("side")).findAny(); @@ -48,6 +51,7 @@ public AutomatonEntity convertAutomatonToEntity(MappingEntity parentMapping) { convertedAutomaton.setAutomatonId(createdId); convertedAutomaton.setFamily(this.getFamily()); convertedAutomaton.setModel(this.getModel()); + convertedAutomaton.setSetGroup(this.getSetGroup()); convertedAutomaton.setWatchedElement(this.getWatchedElement()); convertedAutomaton.setMapping(parentMapping); ArrayList convertedProperties = new ArrayList<>(); diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java new file mode 100644 index 00000000..d7920b58 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2021, 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.models; + +import lombok.Data; +import org.gridsuite.mapping.server.model.ModelEntity; +import org.gridsuite.mapping.server.utils.EquipmentType; +import org.gridsuite.mapping.server.utils.ParameterOrigin; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Data +public class Model { + + private String modelName; + + private EquipmentType equipmentType; + + private List parameterDefinitions; + + private List setsGroups; + + public Model(ModelEntity modelEntity) { + modelName = modelEntity.getModelName(); + equipmentType = modelEntity.getEquipmentType(); + parameterDefinitions = modelEntity.getParameterDefinitions().stream().map(ModelParameterDefinition::new).collect(Collectors.toList()); + setsGroups = modelEntity.getSetsGroups().stream().map(ParametersSetsGroup::new).collect(Collectors.toList()); + } + + public boolean isParameterSetGroupValid(String groupName, boolean strict) { + ParametersSetsGroup groupToTest = setsGroups.stream().filter(group -> group.getName().equals(groupName)).findAny().orElse(null); + if (groupToTest == null) { + return false; + } else { + AtomicBoolean isValid = new AtomicBoolean(true); + List sets = groupToTest.getSets(); + for (ParametersSet set : sets) { + if (isValid.get()) { + isValid.set(isParameterSetValid(set)); + } + } + return !(strict && sets.isEmpty()) && isValid.get(); + } + } + + public boolean isParameterSetValid(ParametersSet setToTest) { + AtomicBoolean isValid = new AtomicBoolean(true); + List parameters = setToTest.getParameters(); + parameterDefinitions.stream().filter(definition -> ParameterOrigin.USER.equals(definition.getOrigin())).forEach(definition -> { + if (isValid.get()) { + isValid.set(parameters.stream().filter(param -> param.getName().equals(definition.getName())).findAny().orElse(null) != null); + } + }); + return isValid.get(); + } +} + + diff --git a/src/main/java/org/gridsuite/mapping/server/dto/SetParams.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java similarity index 50% rename from src/main/java/org/gridsuite/mapping/server/dto/SetParams.java rename to src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java index 55aac857..189b2253 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/SetParams.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java @@ -4,22 +4,23 @@ * 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; +package org.gridsuite.mapping.server.dto.models; +import lombok.AllArgsConstructor; import lombok.Data; -import org.gridsuite.mapping.server.model.ModelParamsEmbeddable; -import org.gridsuite.mapping.server.utils.ParamsType; +import org.gridsuite.mapping.server.model.ModelParameterEntity; /** * @author Mathieu Scalbert */ @Data -public class SetParams implements ModelParams { +@AllArgsConstructor +public class ModelParameter { private String name; - private ParamsType type; + private String value; - SetParams(ModelParamsEmbeddable modelParamsEmbeddable) { - name = modelParamsEmbeddable.getName(); - type = modelParamsEmbeddable.getType(); + public ModelParameter(ModelParameterEntity modelParameterEntity) { + name = modelParameterEntity.getName(); + value = modelParameterEntity.getValue(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java new file mode 100644 index 00000000..a01193f4 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2021, 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.models; + +import lombok.Data; +import org.gridsuite.mapping.server.model.ModelParameterDefinitionEntity; +import org.gridsuite.mapping.server.utils.ParameterOrigin; +import org.gridsuite.mapping.server.utils.ParameterType; + +/** + * @author Mathieu Scalbert + */ +@Data +public class ModelParameterDefinition { + + private String name; + + private ParameterType type; + + private ParameterOrigin origin; + + private String originName; + + private String fixedValue; + + public ModelParameterDefinition(ModelParameterDefinitionEntity modelParameterDefinitionEntity) { + name = modelParameterDefinitionEntity.getName(); + type = modelParameterDefinitionEntity.getType(); + origin = modelParameterDefinitionEntity.getOrigin(); + originName = modelParameterDefinitionEntity.getOriginName(); + fixedValue = modelParameterDefinitionEntity.getFixedValue(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java new file mode 100644 index 00000000..16ce66e0 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2021, 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.models; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.gridsuite.mapping.server.model.ModelParameterSetEntity; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Data +public class ParametersSet { + private String name; + private List parameters; + @JsonIgnore + private Date lastModifiedDate; + + public ParametersSet(ModelParameterSetEntity modelParameterSetEntity) { + name = modelParameterSetEntity.getName(); + parameters = modelParameterSetEntity.getParameters().stream().map(ModelParameter::new).collect(Collectors.toList()); + lastModifiedDate = modelParameterSetEntity.getLastModifiedDate(); + } + + public ParametersSet(String name, List parameters) { + this.name = name; + this.parameters = parameters; + lastModifiedDate = new Date(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java new file mode 100644 index 00000000..c4c0814c --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSetsGroup.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2021, 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.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.gridsuite.mapping.server.model.ModelSetsGroupEntity; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Data +@AllArgsConstructor +public class ParametersSetsGroup { + + private String name; + + private SetGroupType type; + + private List sets; + + private String modelName; + + public ParametersSetsGroup(ModelSetsGroupEntity setsGroupEntity) { + name = setsGroupEntity.getName(); + type = setsGroupEntity.getType(); + sets = setsGroupEntity.getSets().stream().map(ParametersSet::new).collect(Collectors.toList()); + modelName = setsGroupEntity.getModelName(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java new file mode 100644 index 00000000..e9761f81 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleGroup.java @@ -0,0 +1,17 @@ +package org.gridsuite.mapping.server.dto.models; + +import lombok.Getter; +import org.gridsuite.mapping.server.utils.SetGroupType; + +@Getter +public class SimpleGroup { + private final String name; + private final SetGroupType type; + private final int setsNumber; + + SimpleGroup(ParametersSetsGroup group) { + name = group.getName(); + type = group.getType(); + setsNumber = group.getSets().size(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java new file mode 100644 index 00000000..13f55732 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/SimpleModel.java @@ -0,0 +1,20 @@ +package org.gridsuite.mapping.server.dto.models; + +import lombok.Getter; +import org.gridsuite.mapping.server.utils.EquipmentType; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +public class SimpleModel { + private final String name; + private final EquipmentType type; + private final List groups; + + public SimpleModel(Model model) { + name = model.getModelName(); + type = model.getEquipmentType(); + groups = model.getSetsGroups().stream().map(SimpleGroup::new).collect(Collectors.toList()); + } +} 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 47f89ce7..f06ceedf 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/AutomatonEntity.java @@ -8,6 +8,7 @@ import lombok.*; import org.gridsuite.mapping.server.utils.AutomatonFamily; + import javax.persistence.*; import java.util.List; import java.util.UUID; @@ -36,6 +37,9 @@ public class AutomatonEntity extends AbstractManuallyAssignedIdentifierEntity new AutomatonPropertyEntity(newID, automatonPropertyEntity)).collect(Collectors.toList()); } + + public String[] getInstantiatedModel() { + return new String[]{model, setGroup}; + } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/FilterEntity.java b/src/main/java/org/gridsuite/mapping/server/model/FilterEntity.java index 3e90c1b5..d9d3ff60 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/FilterEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/FilterEntity.java @@ -6,14 +6,17 @@ */ package org.gridsuite.mapping.server.model; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.utils.Operands; +import org.gridsuite.mapping.server.utils.PropertyType; import javax.persistence.*; import java.io.Serializable; import java.util.UUID; -import org.gridsuite.mapping.server.utils.*; - /** * @author Mathieu Scalbert */ @@ -45,7 +48,7 @@ public class FilterEntity implements Serializable { @Enumerated private Operands operand; - // Value is the value casted to a string for persistence issue + // Value is the value cast to a string for persistence issue @Column(name = "value") private String value; diff --git a/src/main/java/org/gridsuite/mapping/server/model/InstanceModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/InstanceModelEntity.java deleted file mode 100644 index 8501f289..00000000 --- a/src/main/java/org/gridsuite/mapping/server/model/InstanceModelEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2021, 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.model; - -import lombok.*; -import org.gridsuite.mapping.server.utils.EquipmentType; - -import javax.persistence.Embedded; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -/** - * @author Mathieu Scalbert - */ -@Getter -@Setter -@Table(name = "instance_models") -@Entity -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class InstanceModelEntity extends AbstractManuallyAssignedIdentifierEntity { - - // Could be replaced with UUID but we lose the ease of use of names - @Id - private String id; - - private String modelName; - - private EquipmentType equipmentType; - - @Embedded - private ModelParamsEmbeddable params; -} diff --git a/src/main/java/org/gridsuite/mapping/server/model/MappingEntity.java b/src/main/java/org/gridsuite/mapping/server/model/MappingEntity.java index 3d692048..d7f3ba24 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/MappingEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/MappingEntity.java @@ -7,6 +7,7 @@ package org.gridsuite.mapping.server.model; import lombok.*; + import javax.persistence.*; import java.util.List; import java.util.stream.Collectors; @@ -31,6 +32,9 @@ public class MappingEntity extends AbstractManuallyAssignedIdentifierEntity automata; + @Column(name = "control_parameters", nullable = false) + private boolean controlledParameters; + @Override public String getId() { return name; @@ -38,6 +42,7 @@ public String getId() { public MappingEntity(String name, MappingEntity mappingToCopy) { this.name = name; + this.controlledParameters = mappingToCopy.isControlledParameters(); this.rules = mappingToCopy.getRules().stream().map(ruleEntity -> new RuleEntity(this, ruleEntity)).collect(Collectors.toList()); this.automata = mappingToCopy.getAutomata().stream().map(automatonEntity -> new AutomatonEntity(this, automatonEntity)).collect(Collectors.toList()); } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java new file mode 100644 index 00000000..e1c6057e --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.*; +import org.gridsuite.mapping.server.dto.models.Model; +import org.gridsuite.mapping.server.utils.EquipmentType; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Getter +@Setter +@Table(name = "models") +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity implements Serializable { + + // Could be replaced with UUID, but we lose the ease of use of names + @Id + @Column(name = "model_name") + private String modelName; + + @Column(name = "equipment_type") + private EquipmentType equipmentType; + + @OneToMany(targetEntity = ModelParameterDefinitionEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) + private List parameterDefinitions = new ArrayList<>(0); + + @OneToMany(targetEntity = ModelSetsGroupEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) + private List setsGroups = new ArrayList<>(0); + + @Override + public String getId() { + return modelName; + } + + public ModelEntity(Model modelToConvert) { + modelName = modelToConvert.getModelName(); + equipmentType = modelToConvert.getEquipmentType(); + parameterDefinitions = modelToConvert.getParameterDefinitions().stream().map(parameterDefinition -> new ModelParameterDefinitionEntity(parameterDefinition.getName(), modelToConvert.getModelName(), parameterDefinition.getType(), parameterDefinition.getOrigin(), parameterDefinition.getOriginName(), parameterDefinition.getFixedValue(), this)).collect(Collectors.toList()); + setsGroups = modelToConvert.getSetsGroups().stream().map(group -> new ModelSetsGroupEntity(this, group)).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java new file mode 100644 index 00000000..624db623 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.utils.ParameterOrigin; +import org.gridsuite.mapping.server.utils.ParameterType; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author Mathieu Scalbert + */ +@Inheritance +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "model_parameter_definitions", indexes = {@Index(name = "model_parameter_definitions_model_name_index", columnList = "model_name")}) +@IdClass(ModelParameterDefinitionId.class) +public class ModelParameterDefinitionEntity implements Serializable { + + @Id + @Column(name = "name") + private String name; + + @Id + @Column(name = "model_name") + private String modelName; + + @Column(name = "type") + @Enumerated + private ParameterType type; + + @Column(name = "origin") + @Enumerated + private ParameterOrigin origin; + + @Column(name = "origin_name") + private String originName; + + @Column(name = "fixed_value") + private String fixedValue; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_parameter_definition_fk")) + @MapsId("modelName") + private ModelEntity model; +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java new file mode 100644 index 00000000..797305ee --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author Mathieu Scalbert + */ +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +@Getter +@Setter +public class ModelParameterDefinitionId implements Serializable { + + private String name; + + private String modelName; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelParameterDefinitionId modelParameterDefinitionIdClass = (ModelParameterDefinitionId) o; + return name.equals(modelParameterDefinitionIdClass.name) && + modelName.equals(modelParameterDefinitionIdClass.modelName); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelName); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java new file mode 100644 index 00000000..352c80fd --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.dto.models.ModelParameter; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author Mathieu Scalbert + */ +@Inheritance +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "model_parameters", indexes = {@Index(name = "model_parameter_set_index", columnList = "set_name")}) +@IdClass(ModelParameterId.class) +public class ModelParameterEntity implements Serializable { + + @Id + @Column(name = "name") + private String name; + + @Id + @Column(name = "model_name") + private String modelName; + + @Id + @Column(name = "group_name") + private String groupName; + + @Id + @Column(name = "group_type") + private SetGroupType groupType; + + @Id + @Column(name = "set_name") + private String setName; + + @Column(name = "value") + private String value; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumns(foreignKey = @ForeignKey(name = "parameter_set_fk"), value = { + @JoinColumn(name = "set_name", referencedColumnName = "name", insertable = false, updatable = false), + @JoinColumn(name = "group_name", referencedColumnName = "group_name", insertable = false, updatable = false), + @JoinColumn(name = "model_name", referencedColumnName = "model_name", insertable = false, updatable = false), + @JoinColumn(name = "group_type", referencedColumnName = "group_type", insertable = false, updatable = false) + }) + private ModelParameterSetEntity set; + + public ModelParameterEntity(ModelParameterSetEntity set, ModelParameter parameter) { + this.set = set; + name = parameter.getName(); + groupName = set.getGroup().getName(); + groupType = set.getGroup().getType(); + modelName = set.getGroup().getModelName(); + setName = set.getName(); + value = parameter.getValue(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java new file mode 100644 index 00000000..ba828d7c --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author Mathieu Scalbert + */ +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +@Getter +@Setter +public class ModelParameterId implements Serializable { + + private String name; + + private String modelName; + + private String setName; + + private String groupName; + + private SetGroupType groupType; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelParameterId modelParameterIdClass = (ModelParameterId) o; + return name.equals(modelParameterIdClass.name) && + modelName.equals(modelParameterIdClass.modelName) && + setName.equals(modelParameterIdClass.setName) && + groupName.equals(modelParameterIdClass.groupName) && + groupType.equals(modelParameterIdClass.groupType); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelName, setName, groupName, groupType); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java new file mode 100644 index 00000000..3856c68c --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Inheritance +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "model_parameter_sets", indexes = {@Index(name = "model_parameter_sets_group_name_index", columnList = "group_name")}) +@IdClass(ModelParameterSetId.class) +public class ModelParameterSetEntity implements Serializable { + + @Id + @Column(name = "name") + private String name; + + @Id + @Column(name = "group_name") + private String groupName; + + @Id + @Column(name = "model_name") + private String modelName; + + @Id + @Column(name = "group_type") + private SetGroupType groupType; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "set", cascade = CascadeType.ALL, orphanRemoval = true) + private List parameters; + + @Column(name = "last_modified_date") + private Date lastModifiedDate; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumns(foreignKey = @ForeignKey(name = "model_parameter_sets_fk"), value = { + @JoinColumn(name = "model_name", referencedColumnName = "model_name", insertable = false, updatable = false), + @JoinColumn(name = "group_name", referencedColumnName = "name", insertable = false, updatable = false), + @JoinColumn(name = "group_type", referencedColumnName = "type", insertable = false, updatable = false) + }) + private ModelSetsGroupEntity group; + + public ModelParameterSetEntity(ModelSetsGroupEntity group, ParametersSet set) { + this.group = group; + this.name = set.getName(); + this.groupName = group.getName(); + this.groupType = group.getType(); + this.modelName = group.getModelName(); + this.parameters = set.getParameters().stream().map(parameter -> new ModelParameterEntity(this, parameter)).collect(Collectors.toList()); + this.lastModifiedDate = set.getLastModifiedDate(); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java new file mode 100644 index 00000000..31ec0ede --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author Mathieu Scalbert + */ +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +@Getter +@Setter +public class ModelParameterSetId implements Serializable { + + private String name; + + private String groupName; + + private String modelName; + + private SetGroupType groupType; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelParameterSetId modelParameterSetIdClass = (ModelParameterSetId) o; + return name.equals(modelParameterSetIdClass.name) && + groupName.equals(modelParameterSetIdClass.groupName) && + modelName.equals(modelParameterSetIdClass.modelName) && + groupType.equals(modelParameterSetIdClass.groupType); + } + + @Override + public int hashCode() { + return Objects.hash(name, groupName, modelName, groupType); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParamsEmbeddable.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParamsEmbeddable.java deleted file mode 100644 index 5037f405..00000000 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParamsEmbeddable.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2021, 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.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.gridsuite.mapping.server.utils.ParamsType; - -import javax.persistence.*; - -/** - * @author Mathieu Scalbert - */ -@Inheritance -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Setter -@Embeddable -@AttributeOverrides({ - @AttributeOverride(name = "name", column = @Column(name = "params_id")), - @AttributeOverride(name = "type", column = @Column(name = "params_type")), -}) -public class ModelParamsEmbeddable { - - private String name; - - private ParamsType type; -} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java new file mode 100644 index 00000000..7bc28194 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupEntity.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Inheritance +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "model_sets_group", indexes = {@Index(name = "model_sets_group_model_name_index", columnList = "model_name")}) +@IdClass(ModelSetsGroupId.class) +public class ModelSetsGroupEntity implements Serializable { + + @Id + @Column(name = "name") + private String name; + + @Id + @Column(name = "model_name") + private String modelName; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) + private List sets = new ArrayList<>(0); + + @Id + @Column(name = "type") + private SetGroupType type; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_sets_groups_fk")) + @MapsId("modelName") + private ModelEntity model; + + public ModelSetsGroupEntity(ModelEntity model, ParametersSetsGroup group) { + this.model = model; + this.name = group.getName(); + this.modelName = model.getModelName(); + this.type = group.getType(); + this.sets = group.getSets().stream().map(set -> new ModelParameterSetEntity(this, set)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java new file mode 100644 index 00000000..78406434 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelSetsGroupId.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2021, 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.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +/** + * @author Mathieu Scalbert + */ +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +@Getter +@Setter +public class ModelSetsGroupId implements Serializable { + + private String name; + + private String modelName; + + private SetGroupType type; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelSetsGroupId modelSetsGroupIdClass = (ModelSetsGroupId) o; + return name.equals(modelSetsGroupIdClass.name) && + modelName.equals(modelSetsGroupIdClass.modelName) && + type.equals(modelSetsGroupIdClass.type); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelName, type); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/model/RuleEntity.java b/src/main/java/org/gridsuite/mapping/server/model/RuleEntity.java index d5e1f7bb..941b6bfd 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/RuleEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/RuleEntity.java @@ -7,7 +7,8 @@ package org.gridsuite.mapping.server.model; import lombok.*; -import org.gridsuite.mapping.server.utils.*; +import org.gridsuite.mapping.server.utils.EquipmentType; +import org.gridsuite.mapping.server.utils.SetGroupType; import javax.persistence.*; import java.util.List; @@ -37,6 +38,12 @@ public class RuleEntity extends AbstractManuallyAssignedIdentifierEntity { @Column(name = "model", nullable = false) private String mappedModel; + @Column(name = "set_group", nullable = false) + private String setGroup; + + @Column(name = "group_type", nullable = false) + private SetGroupType groupType; + @Column(name = "composition", nullable = false) private String composition; @@ -58,8 +65,14 @@ public RuleEntity(MappingEntity mapping, RuleEntity ruleToCopy) { this.mapping = mapping; this.equipmentType = ruleToCopy.getEquipmentType(); this.mappedModel = ruleToCopy.getMappedModel(); + this.setGroup = ruleToCopy.getSetGroup(); + this.groupType = ruleToCopy.getGroupType(); this.composition = ruleToCopy.getComposition(); this.filters = ruleToCopy.getFilters().stream().map(filterEntity -> new FilterEntity(newID, filterEntity)).collect(Collectors.toList()); } + + public String[] getInstantiatedModel() { + return new String[]{mappedModel, setGroup}; + } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java index c8310d3a..e7c62594 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java @@ -12,6 +12,7 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import java.util.Date; /** * @author Mathieu Scalbert @@ -38,10 +39,17 @@ public String getId() { return name; } + @Column(name = "created_date") + private Date createdDate; + + @Column(name = "parameters_file", nullable = true, columnDefinition = "TEXT") + private String parametersFile; + public ScriptEntity(String name, ScriptEntity scriptToCopy) { this.name = name; parentName = scriptToCopy.getParentName(); script = scriptToCopy.getScript(); + parametersFile = scriptToCopy.getParametersFile(); } } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/InstanceModelRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java similarity index 76% rename from src/main/java/org/gridsuite/mapping/server/repository/InstanceModelRepository.java rename to src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java index 4e055f31..9f23fa43 100644 --- a/src/main/java/org/gridsuite/mapping/server/repository/InstanceModelRepository.java +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java @@ -6,7 +6,7 @@ */ package org.gridsuite.mapping.server.repository; -import org.gridsuite.mapping.server.model.InstanceModelEntity; +import org.gridsuite.mapping.server.model.ModelEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,5 +14,5 @@ * @author Mathieu Scalbert */ @Repository -public interface InstanceModelRepository extends JpaRepository { +public interface ModelRepository extends JpaRepository { } diff --git a/src/main/java/org/gridsuite/mapping/server/service/ModelService.java b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java new file mode 100644 index 00000000..95840b05 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021, 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.service; + +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; +import org.gridsuite.mapping.server.dto.models.SimpleModel; +import org.gridsuite.mapping.server.utils.SetGroupType; + +import java.util.List; + +/** + * @author Mathieu Scalbert + */ +public interface ModelService { + + List getParametersDefinitionsFromModelName(String modelName); + + List getModels(); + + List getSetsFromGroup(String modelName, String groupName, SetGroupType groupType); + + ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersSetsGroup setsGroup, Boolean strict); +} 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 32f44c94..0e5ba68e 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,9 +8,12 @@ import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; +import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; import org.gridsuite.mapping.server.model.MappingEntity; import org.gridsuite.mapping.server.repository.MappingRepository; +import org.gridsuite.mapping.server.repository.ModelRepository; import org.gridsuite.mapping.server.service.MappingService; +import org.gridsuite.mapping.server.utils.Methods; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; @@ -30,12 +33,15 @@ @Service public class MappingServiceImpl implements MappingService { + private final ModelRepository modelRepository; private final MappingRepository mappingRepository; @Autowired public MappingServiceImpl( - MappingRepository mappingRepository + MappingRepository mappingRepository, + ModelRepository modelRepository ) { + this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; } @@ -50,6 +56,24 @@ public List getMappingList() { public InputMapping createMapping(String mappingName, InputMapping mapping) { MappingEntity mappingToSave = mapping.convertMappingToEntity(); mappingToSave.markNotNew(); + if (mappingToSave.isControlledParameters()) { + try { + List instantiatedModels = mappingToSave.getRules().stream().map(ruleEntity -> + new String[]{ + ruleEntity.getMappedModel(), ruleEntity.getSetGroup() + } + ).collect(Collectors.toList()); + for (String[] instantiatedModel : instantiatedModels) { + ParametersSetsGroup parametersSetsGroup = Methods.getSetsGroupFromModel(instantiatedModel[0], instantiatedModel[1], modelRepository); + if (parametersSetsGroup.getSets().isEmpty()) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No sets associated to the group"); + } + } + + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Parameter sets not found", e); + } + } mappingRepository.save(mappingToSave); return mapping; } @@ -60,6 +84,8 @@ public String deleteMapping(String mappingName) { return mappingName; } + static String conflictMappingErrorMessage = "A Mapping with this name already exists"; + @Override public RenameObject renameMapping(String oldName, String newName) { Optional mappingToRename = mappingRepository.findById(oldName); @@ -70,16 +96,16 @@ public RenameObject renameMapping(String oldName, String newName) { mappingRepository.save(mappingToSave); return new RenameObject(oldName, newName); } catch (DataIntegrityViolationException ex) { - throw new ResponseStatusException(HttpStatus.CONFLICT, "A Mapping with this name already exists", ex); + throw new ResponseStatusException(HttpStatus.CONFLICT, conflictMappingErrorMessage, ex); } } else if (oldName.equals(DEFAULT_MAPPING_NAME)) { // In case of naming of new mapping, save it to db. try { - mappingRepository.save(new MappingEntity(newName, new ArrayList<>(), new ArrayList<>())); + mappingRepository.save(new MappingEntity(newName, new ArrayList<>(), new ArrayList<>(), false)); return new RenameObject(DEFAULT_MAPPING_NAME, newName); } catch (DataIntegrityViolationException ex) { - throw new ResponseStatusException(HttpStatus.CONFLICT, "A Mapping with this name already exists", ex); + throw new ResponseStatusException(HttpStatus.CONFLICT, conflictMappingErrorMessage, ex); } } else { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No mapping found with this name"); @@ -95,7 +121,7 @@ public InputMapping copyMapping(String originalName, String copyName) { mappingRepository.save(copiedMapping); return new InputMapping(copiedMapping); } catch (DataIntegrityViolationException ex) { - throw new ResponseStatusException(HttpStatus.CONFLICT, "A Mapping with this name already exists", ex); + throw new ResponseStatusException(HttpStatus.CONFLICT, conflictMappingErrorMessage, ex); } } else { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No mapping found with this name"); diff --git a/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java new file mode 100644 index 00000000..edc559cf --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2021, 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.service.implementation; + +import org.gridsuite.mapping.server.dto.models.*; +import org.gridsuite.mapping.server.model.ModelEntity; +import org.gridsuite.mapping.server.model.ModelSetsGroupEntity; +import org.gridsuite.mapping.server.repository.ModelRepository; +import org.gridsuite.mapping.server.service.ModelService; +import org.gridsuite.mapping.server.utils.SetGroupType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.server.ResponseStatusException; + +import java.util.Date; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @author Mathieu Scalbert + */ +@Service +public class ModelServiceImpl implements ModelService { + + private final ModelRepository modelRepository; + + @Autowired + public ModelServiceImpl( + ModelRepository modelRepository + ) { + this.modelRepository = modelRepository; + } + + @Override + public List getParametersDefinitionsFromModelName(String modelName) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + Model modelToSend = new Model(foundModel.get()); + return modelToSend.getParameterDefinitions(); + } else { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + } + } + + @Override + public List getModels() { + return modelRepository.findAll().stream().map(modelEntity -> new SimpleModel(new Model(modelEntity))).collect(Collectors.toList()); + } + + @Override + public List getSetsFromGroup(String modelName, String groupName, SetGroupType groupType) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + try { + return foundModel.get().getSetsGroups().stream().map(ParametersSetsGroup::new).filter(parametersSetsGroup -> parametersSetsGroup.getName().equals(groupName) && parametersSetsGroup.getType() == groupType).findAny().orElseThrow().getSets(); + } catch (NoSuchElementException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No group found with this type"); + } + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No model found with this name"); + } + } + + @Override + public ParametersSetsGroup saveParametersSetsGroup(String modelName, ParametersSetsGroup setsGroup, Boolean strict) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + ModelEntity modelToUpdate = foundModel.get(); + List savedGroups = modelToUpdate.getSetsGroups(); + ModelSetsGroupEntity previousGroup = savedGroups.stream().filter(savedGroup -> savedGroup.getName().equals(setsGroup.getName())).findAny().orElse(null); + ModelSetsGroupEntity groupToAdd = new ModelSetsGroupEntity(modelToUpdate, setsGroup); + groupToAdd.getSets().forEach(set -> set.setLastModifiedDate(new Date())); + + if (previousGroup == null) { + savedGroups.add(groupToAdd); + } else { + // If additional checks are required here, ensure that set erasure cannot happen here with sets merging. + previousGroup.setSets(groupToAdd.getSets()); + } + if (new Model(modelToUpdate).isParameterSetGroupValid(setsGroup.getName(), strict)) { + modelRepository.save(modelToUpdate); + return setsGroup; + } else { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST); + } + } else { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + } + } +} + 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 0c3a304c..3fc30889 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 @@ -10,19 +10,19 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; - -import static java.util.stream.Collectors.groupingBy; - import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; -import org.gridsuite.mapping.server.model.InstanceModelEntity; -import org.gridsuite.mapping.server.model.MappingEntity; -import org.gridsuite.mapping.server.model.ScriptEntity; -import org.gridsuite.mapping.server.repository.InstanceModelRepository; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.dto.models.ParametersSetsGroup; +import org.gridsuite.mapping.server.model.*; import org.gridsuite.mapping.server.repository.MappingRepository; +import org.gridsuite.mapping.server.repository.ModelRepository; import org.gridsuite.mapping.server.repository.ScriptRepository; import org.gridsuite.mapping.server.service.ScriptService; import org.gridsuite.mapping.server.utils.EquipmentType; +import org.gridsuite.mapping.server.utils.ParameterOrigin; +import org.gridsuite.mapping.server.utils.ParameterType; import org.gridsuite.mapping.server.utils.Templater; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; @@ -32,26 +32,30 @@ import java.util.*; import java.util.stream.Collectors; +import static java.util.stream.Collectors.groupingBy; + /** * @author Mathieu Scalbert */ @Service public class ScriptServiceImpl implements ScriptService { - private final InstanceModelRepository instanceModelRepository; + private final ModelRepository modelRepository; private final MappingRepository mappingRepository; private final ScriptRepository scriptRepository; public ScriptServiceImpl( MappingRepository mappingRepository, ScriptRepository scriptRepository, - InstanceModelRepository instanceModelRepository + ModelRepository modelRepository ) { - this.instanceModelRepository = instanceModelRepository; + this.modelRepository = modelRepository; this.mappingRepository = mappingRepository; this.scriptRepository = scriptRepository; } + String noModelFoundErrorMessage = "No model found with this name"; + @Override public Script createFromMapping(String mappingName) { Optional foundMapping = mappingRepository.findById(mappingName); @@ -60,10 +64,25 @@ public Script createFromMapping(String mappingName) { String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; - ScriptEntity scriptToSave = new ScriptEntity(savedScriptName, sortedMapping.getName(), createdScript); + String createdPar = null; + if (foundMapping.get().isControlledParameters()) { + try { + List instantiatedModels = foundMapping.get().getRules().stream().map(RuleEntity::getInstantiatedModel).collect(Collectors.toList()); + instantiatedModels.addAll(foundMapping.get().getAutomata().stream().map(AutomatonEntity::getInstantiatedModel).collect(Collectors.toList())); + List> setsLists = instantiatedModels.stream().map(instantiatedModel -> getEnrichedSetsFromInstanceModel(instantiatedModel[0], instantiatedModel[1])).collect(Collectors.toList()); + List sets = new ArrayList<>(); + setsLists.forEach(sets::addAll); + createdPar = Templater.setsToPar(sets); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid parameter sets"); + } + } + ScriptEntity scriptToSave = new ScriptEntity(savedScriptName, sortedMapping.getName(), createdScript, new Date(), createdPar); scriptToSave.markNotNew(); scriptRepository.save(scriptToSave); - return new Script(scriptToSave); + Script scriptToReturn = new Script(scriptToSave); + scriptToReturn.setCurrent(true); + return scriptToReturn; } else { throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No mapping found with this name"); } @@ -71,11 +90,25 @@ public Script createFromMapping(String mappingName) { @Override public List