From b9fc75c96d528cead6ee1d83f32bd46c1c75258c Mon Sep 17 00:00:00 2001 From: SCALBERT Mathieu Date: Thu, 22 Jul 2021 17:06:45 +0200 Subject: [PATCH 01/20] WIP: Add complete models classes Conflicts: src/main/resources/mappings.sql --- .../mapping/server/dto/models/Model.java | 35 ++++++++++++ .../server/dto/models/ModelParameter.java | 15 +++++ .../dto/models/ModelParameterDefinition.java | 26 +++++++++ .../server/dto/models/ParametersSet.java | 20 +++++++ .../mapping/server/model/ModelEntity.java | 46 ++++++++++++++++ .../model/ModelParameterDefinitionEntity.java | 55 +++++++++++++++++++ .../model/ModelParameterDefinitionId.java | 50 +++++++++++++++++ .../server/model/ModelParameterEntity.java | 51 +++++++++++++++++ .../server/model/ModelParameterId.java | 53 ++++++++++++++++++ .../server/model/ModelParameterSetEntity.java | 46 ++++++++++++++++ .../server/model/ModelParameterSetId.java | 50 +++++++++++++++++ .../mapping/server/utils/ParameterOrigin.java | 16 ++++++ .../mapping/server/utils/ParameterType.java | 17 ++++++ src/main/resources/mappings.sql | 49 ++++++++++++++++- 14 files changed, 528 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/models/Model.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java create mode 100644 src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionId.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java create mode 100644 src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.java create mode 100644 src/main/java/org/gridsuite/mapping/server/utils/ParameterOrigin.java create mode 100644 src/main/java/org/gridsuite/mapping/server/utils/ParameterType.java 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..4c4156ca --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java @@ -0,0 +1,35 @@ +/** + * 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.utils.EquipmentType; + +import java.util.List; + +/** + * @author Mathieu Scalbert + */ +@Data +public class Model { + + private String modelName; + + private EquipmentType equipmentType; + + private List parameterDefinitions; + + private List sets; + + +// public Model(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/models/ModelParameter.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java new file mode 100644 index 00000000..74d9768b --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java @@ -0,0 +1,15 @@ +/** + * 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; + +/** + * @author Mathieu Scalbert + */ +public class ModelParameter { + private String name; + private String value; +} 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..c61a6985 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java @@ -0,0 +1,26 @@ +/** + * 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.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; +} 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..147eddf0 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java @@ -0,0 +1,20 @@ +/** + * 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 java.util.List; + +/** + * @author Mathieu Scalbert + */ +@Data +public class ParametersSet { + private String name; + private List parameters; +} 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..593f84ef --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -0,0 +1,46 @@ +/** + * 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.*; +import java.util.List; + +/** + * @author Mathieu Scalbert + */ +@Getter +@Setter +@Table(name = "models") +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ModelEntity extends AbstractManuallyAssignedIdentifierEntity { + + // 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; + + @OneToMany(targetEntity = ModelParameterSetEntity.class, mappedBy = "model", cascade = CascadeType.ALL, orphanRemoval = true) + private List sets; + + @Override + public String getId() { + return modelName; + } + +} 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..6d9cc000 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterDefinitionEntity.java @@ -0,0 +1,55 @@ +/** + * 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; + + @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..3f518bca --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterEntity.java @@ -0,0 +1,51 @@ +/** + * 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.*; +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 = "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 = "name", referencedColumnName = "name", insertable = false, updatable = false), + @JoinColumn(name = "model_name", referencedColumnName = "model_name", insertable = false, updatable = false) + }) + private ModelParameterSetEntity set; +} 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..360a301a --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterId.java @@ -0,0 +1,53 @@ +/** + * 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 ModelParameterId implements Serializable { + + private String name; + + private String modelName; + + private String setName; + + @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); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelName, setName); + } + +} 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..477e9d38 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -0,0 +1,46 @@ +/** + * 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.*; +import java.io.Serializable; +import java.util.List; + +/** + * @author Mathieu Scalbert + */ +@Inheritance +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "model_parameter_sets", indexes = {@Index(name = "model_parameter_sets_model_name_index", columnList = "model_name")}) +@IdClass(ModelParameterSetId.class) +public class ModelParameterSetEntity implements Serializable { + + @Id + @Column(name = "name") + private String name; + + @Id + @Column(name = "model_name") + private String modelName; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "set") + private List parameters; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_parameter_sets_fk")) + @MapsId("modelName") + private ModelEntity model; +} 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..d087ccaf --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetId.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 ModelParameterSetId 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; + } + ModelParameterSetId modelParameterSetIdClass = (ModelParameterSetId) o; + return name.equals(modelParameterSetIdClass.name) && + modelName.equals(modelParameterSetIdClass.modelName); + } + + @Override + public int hashCode() { + return Objects.hash(name, modelName); + } + +} diff --git a/src/main/java/org/gridsuite/mapping/server/utils/ParameterOrigin.java b/src/main/java/org/gridsuite/mapping/server/utils/ParameterOrigin.java new file mode 100644 index 00000000..febb9a58 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/utils/ParameterOrigin.java @@ -0,0 +1,16 @@ +/** + * 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.utils; + +/** + * @author Mathieu Scalbert + */ +public enum ParameterOrigin { + NETWORK, + FIXED, + USER +} diff --git a/src/main/java/org/gridsuite/mapping/server/utils/ParameterType.java b/src/main/java/org/gridsuite/mapping/server/utils/ParameterType.java new file mode 100644 index 00000000..b6f9a973 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/utils/ParameterType.java @@ -0,0 +1,17 @@ +/** + * 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.utils; + +/** + * @author Mathieu Scalbert + */ +public enum ParameterType { + INT, + BOOL, + DOUBLE, + STRING +} diff --git a/src/main/resources/mappings.sql b/src/main/resources/mappings.sql index 16c797ab..a72a5226 100644 --- a/src/main/resources/mappings.sql +++ b/src/main/resources/mappings.sql @@ -46,6 +46,35 @@ primary key (network_id) ); + create table model_parameter_definitions ( + model_name varchar(255) not null, + name varchar(255) not null, + origin int4, + origin_name varchar(255), + type int4, + primary key (model_name, name) + ); + + create table model_parameter_sets ( + model_name varchar(255) not null, + name varchar(255) not null, + primary key (model_name, name) + ); + + create table model_parameters ( + model_name varchar(255) not null, + name varchar(255) not null, + set_name varchar(255) not null, + value varchar(255), + primary key (model_name, name, set_name) + ); + + create table models ( + model_name varchar(255) not null, + equipment_type int4, + primary key (model_name) + ); + create table rules ( rule_id uuid not null, composition varchar(255) not null, @@ -64,6 +93,9 @@ create index automaton_mappingName_index on automata (mappingName); create index property_automaton_id_index on automaton_properties (automaton_id); create index filter_rule_id_index on filters (rule_id); +create index model_parameter_definitions_model_name_index on model_parameter_definitions (model_name); +create index model_parameter_sets_model_name_index on model_parameter_sets (model_name); +create index model_parameter_set_index on model_parameters (set_name); create index rule_mappingName_index on rules (mappingName); alter table if exists automata @@ -81,7 +113,22 @@ create index rule_mappingName_index on rules (mappingName); foreign key (rule_id) references rules; - alter table if exists rules + alter table if exists model_parameter_definitions + add constraint model_parameter_definition_fk + foreign key (model_name) + references models; + + alter table if exists model_parameter_sets + add constraint model_parameter_sets_fk + foreign key (model_name) + references models; + + alter table if exists model_parameters + add constraint parameter_set_fk + foreign key (model_name, name) + references model_parameter_sets; + + alter table if exists rules add constraint mapping_rules_fk foreign key (mappingName) references mappings; From 1ffeab091e30f648697807a8c7532c1d8729a977 Mon Sep 17 00:00:00 2001 From: SCALBERT Mathieu Date: Thu, 22 Jul 2021 17:06:45 +0200 Subject: [PATCH 02/20] Add complete models classes Conflicts: src/main/java/org/gridsuite/mapping/server/dto/Script.java --- .../java/org/gridsuite/mapping/server/dto/Script.java | 10 +++++++++- .../mapping/server/dto/models/ParametersSet.java | 4 ++++ .../mapping/server/model/ModelParameterSetEntity.java | 4 ++++ .../gridsuite/mapping/server/model/ScriptEntity.java | 4 ++++ .../service/implementation/ScriptServiceImpl.java | 2 +- 5 files changed, 22 insertions(+), 2 deletions(-) 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..122fc4e0 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,19 @@ public class Script { @Schema(description = "Generated Script") private String script; + @JsonIgnore + @Schema(description = "Creation date") + private Date createdDate; + public Script(ScriptEntity scriptEntity) { name = scriptEntity.getName(); parentName = scriptEntity.getParentName(); script = scriptEntity.getScript(); + createdDate = scriptEntity.getCreatedDate(); } public ScriptEntity convertToEntity() { - return new ScriptEntity(name, parentName, script); + return new ScriptEntity(name, parentName, script, createdDate); } } 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 index 147eddf0..a07a8e5b 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java @@ -6,8 +6,10 @@ */ package org.gridsuite.mapping.server.dto.models; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; +import java.util.Date; import java.util.List; /** @@ -17,4 +19,6 @@ public class ParametersSet { private String name; private List parameters; + @JsonIgnore + private Date lastModifiedDate; } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java index 477e9d38..0cf5ec55 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelParameterSetEntity.java @@ -13,6 +13,7 @@ import javax.persistence.*; import java.io.Serializable; +import java.util.Date; import java.util.List; /** @@ -39,6 +40,9 @@ public class ModelParameterSetEntity implements Serializable { @OneToMany(fetch = FetchType.LAZY, mappedBy = "set") private List parameters; + @Column(name = "last_modified_date") + private Date lastModifiedDate; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "model_name", foreignKey = @ForeignKey(name = "model_parameter_sets_fk")) @MapsId("modelName") 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..b97642f9 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,6 +39,9 @@ public String getId() { return name; } + @Column(name = "created_date") + private Date createdDate; + public ScriptEntity(String name, ScriptEntity scriptToCopy) { this.name = name; parentName = scriptToCopy.getParentName(); 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..822d0abc 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 @@ -60,7 +60,7 @@ 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); + ScriptEntity scriptToSave = new ScriptEntity(savedScriptName, sortedMapping.getName(), createdScript, new Date()); scriptToSave.markNotNew(); scriptRepository.save(scriptToSave); return new Script(scriptToSave); From 93efc6696358144caa6c9755aa767b91ff46b17e Mon Sep 17 00:00:00 2001 From: SCALBERT Mathieu Date: Mon, 20 Sep 2021 13:14:35 +0200 Subject: [PATCH 03/20] Add model endpoints --- .../server/controller/ModelController.java | 63 ++++++++++++++ .../mapping/server/dto/models/Model.java | 17 ++-- .../server/dto/models/ModelParameter.java | 9 ++ .../dto/models/ModelParameterDefinition.java | 8 ++ .../server/dto/models/ParametersSet.java | 8 ++ .../mapping/server/model/ModelEntity.java | 17 ++++ .../server/repository/ModelRepository.java | 18 ++++ .../mapping/server/service/ModelService.java | 20 +++++ .../implementation/ModelServiceImpl.java | 82 +++++++++++++++++++ 9 files changed, 236 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/gridsuite/mapping/server/controller/ModelController.java create mode 100644 src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java create mode 100644 src/main/java/org/gridsuite/mapping/server/service/ModelService.java create mode 100644 src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java 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..c325d451 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/controller/ModelController.java @@ -0,0 +1,63 @@ +/** + * 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.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.AllArgsConstructor; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.service.ModelService; +import org.gridsuite.mapping.server.service.implementation.ModelServiceImpl; +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 = "/model") +@Api(value = "Mapping model server") +@AllArgsConstructor +@ComponentScan(basePackageClasses = {ModelServiceImpl.class}) + +public class ModelController { + + private final ModelService modelService; + + @GetMapping(value = "/{modelName}/parameters/sets/") + @ApiOperation(value = "get all parameters sets for a given model") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "parameter sets of the model")}) + + public ResponseEntity> getParametersSetsFromModelName(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getParametersSetsFromModelName(modelName)); + } + + @PostMapping(value = "/{modelName}/parameters/sets/") + @ApiOperation(value = "Save a new parameter set") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Parameter Set Saved")}) + public ResponseEntity saveParametersSet(@PathVariable("modelName") String modelName, @RequestBody ParametersSet set) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.saveParametersSet(modelName, set)); + } + + @GetMapping(value = "/{modelName}/parameters/definitions/") + @ApiOperation(value = "get parameters definitions for a given model") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "parameters definitions of the model")}) + + public ResponseEntity> getParametersDefinitionsFromModelName(@PathVariable("modelName") String modelName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(modelService.getParametersDefinitionsFromModelName(modelName)); + } +} 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 index 4c4156ca..8eaa4428 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java @@ -7,9 +7,11 @@ 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 java.util.List; +import java.util.stream.Collectors; /** * @author Mathieu Scalbert @@ -25,11 +27,14 @@ public class Model { private List sets; + public Model(ModelEntity modelEntity) { + modelName = modelEntity.getModelName(); + equipmentType = modelEntity.getEquipmentType(); + parameterDefinitions = modelEntity.getParameterDefinitions().stream().map(parameterDefinitionEntity -> new ModelParameterDefinition(parameterDefinitionEntity)).collect(Collectors.toList()); + sets = modelEntity.getSets().stream().map(parametersSetEntity -> new ParametersSet(parametersSetEntity)).collect(Collectors.toList()); + } -// public Model(InstanceModelEntity instanceModelEntity) { -// id = instanceModelEntity.getId(); -// modelName = instanceModelEntity.getModelName(); -// equipmentType = instanceModelEntity.getEquipmentType(); -// params = new SetParams(instanceModelEntity.getParams()); -// } + public ModelEntity convertToEntity() { + return new ModelEntity(this); + } } diff --git a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java index 74d9768b..6916fcd2 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameter.java @@ -6,10 +6,19 @@ */ package org.gridsuite.mapping.server.dto.models; +import lombok.Data; +import org.gridsuite.mapping.server.model.ModelParameterEntity; + /** * @author Mathieu Scalbert */ +@Data public class ModelParameter { private String name; private String value; + + 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 index c61a6985..9fdde97b 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ModelParameterDefinition.java @@ -7,6 +7,7 @@ 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; @@ -23,4 +24,11 @@ public class ModelParameterDefinition { private ParameterOrigin origin; private String originName; + + public ModelParameterDefinition(ModelParameterDefinitionEntity modelParameterDefinitionEntity) { + name = modelParameterDefinitionEntity.getName(); + type = modelParameterDefinitionEntity.getType(); + origin = modelParameterDefinitionEntity.getOrigin(); + originName = modelParameterDefinitionEntity.getOriginName(); + } } 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 index a07a8e5b..37832057 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/ParametersSet.java @@ -8,9 +8,11 @@ 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 @@ -21,4 +23,10 @@ public class ParametersSet { private List parameters; @JsonIgnore private Date lastModifiedDate; + + public ParametersSet(ModelParameterSetEntity modelParameterSetEntity) { + name = modelParameterSetEntity.getName(); + parameters = modelParameterSetEntity.getParameters().stream().map(modelParameterEntity -> new ModelParameter(modelParameterEntity)).collect(Collectors.toList()); + lastModifiedDate = modelParameterSetEntity.getLastModifiedDate(); + } } diff --git a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java index 593f84ef..7ea981c6 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ModelEntity.java @@ -7,10 +7,12 @@ 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.util.List; +import java.util.stream.Collectors; /** * @author Mathieu Scalbert @@ -43,4 +45,19 @@ public String getId() { return modelName; } + public ModelEntity(Model modelToConvert) { + ModelEntity convertedModel = new ModelEntity(); + convertedModel.setModelName(modelToConvert.getModelName()); + convertedModel.setEquipmentType(modelToConvert.getEquipmentType()); + convertedModel.setParameterDefinitions(modelToConvert.getParameterDefinitions().stream().map(parameterDefinition -> new ModelParameterDefinitionEntity(parameterDefinition.getName(), modelToConvert.getModelName(), parameterDefinition.getType(), parameterDefinition.getOrigin(), parameterDefinition.getOriginName(), convertedModel)).collect(Collectors.toList())); + convertedModel.setSets(modelToConvert.getSets().stream().map(set -> { + ModelParameterSetEntity convertedSet = new ModelParameterSetEntity(set.getName(), modelToConvert.getModelName(), null, set.getLastModifiedDate(), convertedModel); + convertedSet.setParameters(set.getParameters().stream().map(parameter -> new ModelParameterEntity( + parameter.getName(), modelToConvert.getModelName(), set.getName(), parameter.getValue(), convertedSet + )).collect(Collectors.toList())); + return convertedSet; + }).collect(Collectors.toList())); + + } + } diff --git a/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java new file mode 100644 index 00000000..9f23fa43 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/repository/ModelRepository.java @@ -0,0 +1,18 @@ +/** + * 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.repository; + +import org.gridsuite.mapping.server.model.ModelEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Mathieu Scalbert + */ +@Repository +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..18cc0827 --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/service/ModelService.java @@ -0,0 +1,20 @@ +/** + * 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 java.util.List; + +public interface ModelService { + List getParametersSetsFromModelName(String modelName); + + ParametersSet saveParametersSet(String modelName, ParametersSet set); + + List getParametersDefinitionsFromModelName(String modelName); +} 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..d5d463cd --- /dev/null +++ b/src/main/java/org/gridsuite/mapping/server/service/implementation/ModelServiceImpl.java @@ -0,0 +1,82 @@ +/** + * 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.Model; +import org.gridsuite.mapping.server.dto.models.ModelParameterDefinition; +import org.gridsuite.mapping.server.dto.models.ParametersSet; +import org.gridsuite.mapping.server.model.ModelEntity; +import org.gridsuite.mapping.server.repository.ModelRepository; +import org.gridsuite.mapping.server.service.ModelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +/** + * @author Mathieu Scalbert + */ +@Service +public class ModelServiceImpl implements ModelService { + + private final ModelRepository modelRepository; + + @Autowired + public ModelServiceImpl( + ModelRepository modelRepository + ) { + this.modelRepository = modelRepository; + } + + @Override + public List getParametersSetsFromModelName(String modelName) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + Model modelToSend = new Model(foundModel.get()); + return modelToSend.getSets(); + } else { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + } + } + + @Override + public ParametersSet saveParametersSet(String modelName, ParametersSet set) { + Optional foundModel = modelRepository.findById(modelName); + if (foundModel.isPresent()) { + Model modelToSave = new Model(foundModel.get()); + List savedSets = modelToSave.getSets(); + ParametersSet previousSet = savedSets.stream().filter(savedSet -> savedSet.getName() == set.getName()).findAny().orElse(null); + if (previousSet == null) { + set.setLastModifiedDate(new Date()); + savedSets.add(set); + } else { + previousSet.setParameters(set.getParameters()); + previousSet.setLastModifiedDate(new Date()); + } + modelRepository.save(modelToSave.convertToEntity()); + return set; + } else { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND); + } + } + + @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); + } + } +} + From 9a2248f5a59f0913765732bb732071f6151e203e Mon Sep 17 00:00:00 2001 From: SCALBERT Mathieu Date: Mon, 20 Sep 2021 13:14:44 +0200 Subject: [PATCH 04/20] WIP: Add validity check --- .../mapping/server/dto/models/Model.java | 18 ++++++++++++++++++ .../implementation/ScriptServiceImpl.java | 14 ++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) 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 index 8eaa4428..042c4dc6 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/models/Model.java @@ -11,6 +11,7 @@ import org.gridsuite.mapping.server.utils.EquipmentType; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; /** @@ -37,4 +38,21 @@ public Model(ModelEntity modelEntity) { public ModelEntity convertToEntity() { return new ModelEntity(this); } + + public boolean isParameterSetValid(String setName) { + ParametersSet setToTest = sets.stream().filter(set -> set.getName() == setName).findAny().orElse(null); + if (setToTest == null) { + return false; + } else { + AtomicBoolean isValid = new AtomicBoolean(true); + List parameters = setToTest.getParameters(); + parameterDefinitions.forEach(definition -> { + if (isValid.get()) { + isValid.set(parameters.stream().filter(param -> param.getName() == definition.getName()).findAny().orElse(null) != null); + + } + }); + return isValid.get(); + } + } } 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 822d0abc..a2f8249b 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,9 +10,6 @@ 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; @@ -20,6 +17,7 @@ import org.gridsuite.mapping.server.model.ScriptEntity; import org.gridsuite.mapping.server.repository.InstanceModelRepository; 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; @@ -32,6 +30,8 @@ import java.util.*; import java.util.stream.Collectors; +import static java.util.stream.Collectors.groupingBy; + /** * @author Mathieu Scalbert */ @@ -39,14 +39,17 @@ 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 + InstanceModelRepository instanceModelRepository, + ModelRepository modelRepository ) { + this.modelRepository = modelRepository; this.instanceModelRepository = instanceModelRepository; this.mappingRepository = mappingRepository; this.scriptRepository = scriptRepository; @@ -60,6 +63,9 @@ public Script createFromMapping(String mappingName) { String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; + //TODO Check current .par + + // End TODO ScriptEntity scriptToSave = new ScriptEntity(savedScriptName, sortedMapping.getName(), createdScript, new Date()); scriptToSave.markNotNew(); scriptRepository.save(scriptToSave); From ca012c4394cf6d32d821cde6ab2e393907974735 Mon Sep 17 00:00:00 2001 From: SCALBERT Mathieu Date: Mon, 20 Sep 2021 13:15:50 +0200 Subject: [PATCH 05/20] WIP: TODO Check current Script + .par Creation --- .../mapping/server/dto/InputMapping.java | 5 ++ .../gridsuite/mapping/server/dto/Script.java | 10 +++- .../mapping/server/model/MappingEntity.java | 5 ++ .../mapping/server/model/ScriptEntity.java | 4 ++ .../implementation/MappingServiceImpl.java | 23 +++++++- .../implementation/ScriptServiceImpl.java | 44 +++++++++++--- .../mapping/server/utils/Methods.java | 20 +++++-- .../mapping/server/utils/Templater.java | 8 ++- .../mapping/server/MappingControllerTest.java | 57 ++++++++++--------- .../mapping/server/ScriptControllerTest.java | 9 +-- 10 files changed, 138 insertions(+), 47 deletions(-) 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..afbb4601 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; + @ApiModelProperty("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/Script.java b/src/main/java/org/gridsuite/mapping/server/dto/Script.java index 122fc4e0..fe3cc2be 100644 --- a/src/main/java/org/gridsuite/mapping/server/dto/Script.java +++ b/src/main/java/org/gridsuite/mapping/server/dto/Script.java @@ -35,15 +35,23 @@ public class Script { @Schema(description = "Creation date") private Date createdDate; + @ApiModelProperty("Script parameters are up to date") + private boolean current; + + @ApiModelProperty("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, createdDate); + return new ScriptEntity(name, parentName, script, createdDate, parametersFile); } } 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/ScriptEntity.java b/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java index b97642f9..e7c62594 100644 --- a/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java +++ b/src/main/java/org/gridsuite/mapping/server/model/ScriptEntity.java @@ -42,10 +42,14 @@ public String getId() { @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/service/implementation/MappingServiceImpl.java b/src/main/java/org/gridsuite/mapping/server/service/implementation/MappingServiceImpl.java index 32f44c94..1bc93bd4 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 @@ -9,8 +9,12 @@ import org.gridsuite.mapping.server.dto.InputMapping; import org.gridsuite.mapping.server.dto.RenameObject; import org.gridsuite.mapping.server.model.MappingEntity; +import org.gridsuite.mapping.server.model.RuleEntity; +import org.gridsuite.mapping.server.repository.InstanceModelRepository; 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 +34,18 @@ @Service public class MappingServiceImpl implements MappingService { + private final InstanceModelRepository instanceModelRepository; + private final ModelRepository modelRepository; private final MappingRepository mappingRepository; @Autowired public MappingServiceImpl( - MappingRepository mappingRepository + MappingRepository mappingRepository, + InstanceModelRepository instanceModelRepository, + ModelRepository modelRepository ) { + this.modelRepository = modelRepository; + this.instanceModelRepository = instanceModelRepository; this.mappingRepository = mappingRepository; } @@ -50,6 +60,15 @@ 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::getMappedModel).collect(Collectors.toList()); + // Will throw if set is not found + instantiatedModels.stream().map(instanceId -> Methods.getSetFromInstanceId(instanceId, instanceModelRepository, modelRepository)); + } catch (Error e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "parameter sets not found"); + } + } mappingRepository.save(mappingToSave); return mapping; } @@ -75,7 +94,7 @@ public RenameObject renameMapping(String oldName, String newName) { } 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) { 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 a2f8249b..b58a86dc 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 @@ -12,8 +12,10 @@ import lombok.Setter; import org.gridsuite.mapping.server.dto.*; import org.gridsuite.mapping.server.dto.automata.AbstractAutomaton; +import org.gridsuite.mapping.server.dto.models.ParametersSet; import org.gridsuite.mapping.server.model.InstanceModelEntity; import org.gridsuite.mapping.server.model.MappingEntity; +import org.gridsuite.mapping.server.model.RuleEntity; import org.gridsuite.mapping.server.model.ScriptEntity; import org.gridsuite.mapping.server.repository.InstanceModelRepository; import org.gridsuite.mapping.server.repository.MappingRepository; @@ -21,6 +23,7 @@ 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.Methods; import org.gridsuite.mapping.server.utils.Templater; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; @@ -63,13 +66,22 @@ public Script createFromMapping(String mappingName) { String createdScript = Templater.mappingToScript(sortedMapping); // TODO: Add Date or randomise to ensure uniqueness String savedScriptName = sortedMapping.getName() + "-script"; - //TODO Check current .par - - // End TODO - ScriptEntity scriptToSave = new ScriptEntity(savedScriptName, sortedMapping.getName(), createdScript, new Date()); + String createdPar = null; + if (foundMapping.get().isControlledParameters()) { + try { + List instantiatedModels = foundMapping.get().getRules().stream().map(RuleEntity::getMappedModel).collect(Collectors.toList()); + List sets = instantiatedModels.stream().map(instanceId -> Methods.getSetFromInstanceId(instanceId, instanceModelRepository, modelRepository)).collect(Collectors.toList()); + createdPar = Templater.setsToPar(sets); + } catch (Error 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"); } @@ -77,11 +89,23 @@ public Script createFromMapping(String mappingName) { @Override public List