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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ public interface ProcessConfig {
ProcessType processType();

List<UUID> modificationUuids();

List<ProcessConfigFieldComparison> compareWith(ProcessConfig other);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.monitor.server.dto.processconfig;

import io.swagger.v3.oas.annotations.media.Schema;
package org.gridsuite.monitor.commons.types.processconfig;

/**
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
*/
@Schema(description = "Field comparison result")
public record ProcessConfigFieldComparison(
String field,
boolean identical,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
Expand All @@ -23,4 +24,20 @@ public record SecurityAnalysisConfig(
public ProcessType processType() {
return ProcessType.SECURITY_ANALYSIS;
}

@Override
public List<ProcessConfigFieldComparison> compareWith(ProcessConfig other) {
SecurityAnalysisConfig o = (SecurityAnalysisConfig) other;
return List.of(
Comment on lines +29 to +31

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Unsafe cast will throw ClassCastException if comparing different config types.

The direct cast to SecurityAnalysisConfig on line 30 will fail at runtime if other is a different ProcessConfig implementation. Add a type check to handle this gracefully.

🐛 Proposed fix with type validation
     `@Override`
     public List<ProcessConfigFieldComparison> compareWith(ProcessConfig other) {
+        if (!(other instanceof SecurityAnalysisConfig o)) {
+            throw new IllegalArgumentException(
+                "Cannot compare SecurityAnalysisConfig with " + other.getClass().getSimpleName());
+        }
-        SecurityAnalysisConfig o = (SecurityAnalysisConfig) other;
         return List.of(
             new ProcessConfigFieldComparison("modifications",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@monitor-commons/src/main/java/org/gridsuite/monitor/commons/types/processconfig/SecurityAnalysisConfig.java`
around lines 29 - 31, The compareWith method in SecurityAnalysisConfig currently
casts the incoming ProcessConfig to SecurityAnalysisConfig unsafely; add a type
check (e.g., instanceof or isAssignableFrom) before casting: if other is not a
SecurityAnalysisConfig return an appropriate result (such as
Collections.emptyList() or a default comparison result) to avoid
ClassCastException, otherwise safely cast to SecurityAnalysisConfig and proceed
with the existing comparison logic in compareWith.

new ProcessConfigFieldComparison("modifications",
Objects.equals(modificationUuids, o.modificationUuids),
modificationUuids, o.modificationUuids),
new ProcessConfigFieldComparison("securityAnalysisParameters",
Objects.equals(securityAnalysisParametersUuid, o.securityAnalysisParametersUuid),
securityAnalysisParametersUuid, o.securityAnalysisParametersUuid),
new ProcessConfigFieldComparison("loadflowParameters",
Objects.equals(loadflowParametersUuid, o.loadflowParametersUuid),
loadflowParametersUuid, o.loadflowParametersUuid)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package org.gridsuite.monitor.server.dto.processconfig;

import io.swagger.v3.oas.annotations.media.Schema;
import org.gridsuite.monitor.commons.types.processconfig.ProcessConfigFieldComparison;

import java.util.List;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,8 @@

import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.DiscriminatorColumn;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
Expand All @@ -32,20 +29,17 @@
import java.util.List;
import java.util.UUID;

import static jakarta.persistence.DiscriminatorType.STRING;

/**
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
*/
@Entity
@Table(name = "process_config")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "process_type", discriminatorType = STRING)
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class ProcessConfigEntity {
public abstract class AbstractProcessConfigEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
Expand All @@ -59,9 +53,7 @@ public class ProcessConfigEntity {
@OrderColumn(name = "pos_modifications")
private List<UUID> modificationUuids;

@Enumerated(EnumType.STRING)
@Column(name = "process_type", insertable = false, updatable = false)
private ProcessType processType;
public abstract ProcessType getProcessType();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
package org.gridsuite.monitor.server.entities.processconfig;

import jakarta.persistence.Column;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import jakarta.persistence.ForeignKey;
import jakarta.persistence.PrimaryKeyJoinColumn;
Expand All @@ -16,6 +15,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;

import java.util.UUID;

Expand All @@ -24,16 +24,20 @@
*/
@Entity
@Table(name = "security_analysis_config")
@DiscriminatorValue("SECURITY_ANALYSIS")
@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "securityAnalysisConfig_id_fk_constraint"))
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class SecurityAnalysisConfigEntity extends ProcessConfigEntity {
public class SecurityAnalysisConfigEntity extends AbstractProcessConfigEntity {
@Column(name = "security_analysis_parameters_uuid")
private UUID securityAnalysisParametersUuid;

@Column(name = "loadflow_parameters_uuid")
private UUID loadflowParametersUuid;

@Override
public ProcessType getProcessType() {
return ProcessType.SECURITY_ANALYSIS;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
*/
@Mapper(componentModel = "spring")
public interface SecurityAnalysisConfigMapper {
@Mapping(target = "processType", expression = "java(dto.processType())")
@Mapping(target = "id", ignore = true)
SecurityAnalysisConfigEntity toEntity(SecurityAnalysisConfig dto);

SecurityAnalysisConfig toDto(SecurityAnalysisConfigEntity dto);

@Mapping(target = "id", ignore = true)
void updateEntityFromDto(SecurityAnalysisConfig dto, @MappingTarget SecurityAnalysisConfigEntity entity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@
* 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.monitor.server.repositories;
package org.gridsuite.monitor.server.repositories.processconfig;

import org.gridsuite.monitor.commons.types.processexecution.ProcessType;
import org.gridsuite.monitor.server.entities.processconfig.ProcessConfigEntity;
import org.gridsuite.monitor.server.entities.processconfig.AbstractProcessConfigEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

/**
* @author Franck Lecuyer <franck.lecuyer at rte-france.com>
*/
@Repository
public interface ProcessConfigRepository extends JpaRepository<ProcessConfigEntity, UUID> {
List<ProcessConfigEntity> findAllByProcessType(ProcessType processType);
public interface ProcessConfigRepository extends JpaRepository<AbstractProcessConfigEntity, UUID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Copyright (c) 2026, 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.monitor.server.repositories.processconfig;

import org.gridsuite.monitor.server.entities.processconfig.SecurityAnalysisConfigEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.UUID;

/**
* @author Antoine Bouhours <antoine.bouhours at rte-france.com>
*/
@Repository
public interface SecurityAnalysisProcessConfigRepository extends JpaRepository<SecurityAnalysisConfigEntity, UUID> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.gridsuite.monitor.server.repositories;
package org.gridsuite.monitor.server.repositories.processexecution;

import org.gridsuite.monitor.server.entities.processexecution.ProcessExecutionEntity;
import org.springframework.data.jpa.repository.JpaRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/**
* Copyright (c) 2026, 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.monitor.server.services.processconfig;

import org.gridsuite.monitor.commons.types.processconfig.ProcessConfig;
import org.gridsuite.monitor.commons.types.processexecution.ProcessType;
import org.gridsuite.monitor.server.entities.processconfig.AbstractProcessConfigEntity;

import java.util.List;

/**
* @author Antoine Bouhours <antoine.bouhours at rte-france.com>
*/
public interface ProcessConfigHandler<C extends ProcessConfig, E extends AbstractProcessConfigEntity> {

ProcessType getProcessType();

E toEntity(C config);

C toDto(E entity);

void updateEntity(C config, E entity);

List<E> findAll();
}
Loading
Loading