Skip to content

Commit

Permalink
Merge pull request #155 from kbss-cvut/fix/add-api-request-validation
Browse files Browse the repository at this point in the history
Extend validation api
  • Loading branch information
blcham authored Sep 12, 2024
2 parents 118ca1d + f9650d3 commit 0ed6cf2
Show file tree
Hide file tree
Showing 23 changed files with 267 additions and 141 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@
import cz.cvut.kbss.analysis.exception.EntityNotFoundException;
import cz.cvut.kbss.analysis.exception.ValidationException;
import cz.cvut.kbss.analysis.model.util.HasIdentifier;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import cz.cvut.kbss.analysis.service.validation.groups.ValidationScopes;
import org.springframework.lang.NonNull;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.validation.DataBinder;
import org.springframework.validation.Validator;


/**
Expand All @@ -42,9 +43,9 @@ public abstract class BaseRepositoryService<T extends HasIdentifier> {
*/
protected abstract GenericDao<T> getPrimaryDao();

private final Validator validator;
private final EntityValidator validator;

protected BaseRepositoryService(Validator validator) {
protected BaseRepositoryService(EntityValidator validator) {
this.validator = validator;
}

Expand Down Expand Up @@ -137,7 +138,7 @@ public void persist(@NonNull T instance) {
* @param instance The instance to be persisted, not {@code null}
*/
protected void prePersist(@NonNull T instance) {
validate(instance);
validate(instance, ValidationScopes.Create.class);
}

protected void postPersist(@NonNull T instance) {
Expand Down Expand Up @@ -173,7 +174,7 @@ protected void preUpdate(@NonNull T instance) {
if (!exists(instance.getUri())) {
throw EntityNotFoundException.create(instance.getClass().getSimpleName(), instance.getUri());
}
validate(instance);
validate(instance, ValidationScopes.Update.class);
}

/**
Expand Down Expand Up @@ -260,17 +261,25 @@ public boolean existsInPersistenceContext(URI id) {
* @param instance The instance to validate
* @throws ValidationException In case the instance is not valid
*/
protected void validate(T instance) {
public void validate(T instance, Object ... groups) {
DataBinder binder = new DataBinder(instance);
binder.setValidator(validator);
BindingResult bindingResult = binder.getBindingResult();

validator.validate(instance, bindingResult);
validator.validate(instance, bindingResult, groups);
if(bindingResult.hasErrors()) {
throw new ValidationException(bindingResult.getAllErrors());
}
}

public void validateNew(T instance){
validate(instance, ValidationScopes.Create.class);
}

public void validateUpdate(T instance){
validate(instance, ValidationScopes.Update.class);
}

public URI getToolContext(URI uri){
return getToolContext(uri.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import cz.cvut.kbss.analysis.model.ManagedEntity;
import cz.cvut.kbss.analysis.model.UserReference;
import cz.cvut.kbss.analysis.service.security.SecurityUtils;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.NonNull;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.Arrays;
Expand All @@ -24,7 +24,7 @@ public abstract class ComplexManagedEntityRepositoryService<T extends ManagedEnt
protected final UserDao userDao;
protected final SecurityUtils securityUtils;

public ComplexManagedEntityRepositoryService(Validator validator, UserDao userDao, SecurityUtils securityUtils) {
public ComplexManagedEntityRepositoryService(EntityValidator validator, UserDao userDao, SecurityUtils securityUtils) {
super(validator);
this.userDao = userDao;
this.securityUtils = securityUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
import cz.cvut.kbss.analysis.model.Component;
import cz.cvut.kbss.analysis.model.FailureMode;
import cz.cvut.kbss.analysis.model.Function;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.HashSet;
Expand All @@ -26,7 +26,7 @@ public class ComponentRepositoryService extends BaseRepositoryService<Component>
private final FunctionRepositoryService functionService;

@Autowired
public ComponentRepositoryService(@Qualifier("componentValidator") Validator validator, ComponentDao componentDao
public ComponentRepositoryService(@Qualifier("componentValidator") EntityValidator validator, ComponentDao componentDao
, FailureModeRepositoryService failureModeRepositoryService, FunctionRepositoryService functionService) {
super(validator);
this.componentDao = componentDao;
Expand Down Expand Up @@ -114,6 +114,8 @@ public void deleteFunction(URI componentUri, URI functionUri) {
public FailureMode addFailureMode(URI componentUri, FailureMode failureMode) {
log.info("> addFailureMode - {}, {}", componentUri, failureMode);

failureModeRepositoryService.validateNew(failureMode);

Component component = findRequired(componentUri);
component.addFailureMode(failureMode);
update(component);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@
import cz.cvut.kbss.analysis.dao.FailureModeDao;
import cz.cvut.kbss.analysis.dao.GenericDao;
import cz.cvut.kbss.analysis.model.FailureMode;
import cz.cvut.kbss.analysis.model.Function;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.HashSet;
import java.util.Set;

@Service
Expand All @@ -23,7 +21,7 @@ public class FailureModeRepositoryService extends BaseRepositoryService<FailureM
private final FunctionRepositoryService functionRepositoryService;

@Autowired
public FailureModeRepositoryService(@Qualifier("defaultValidator") Validator validator, FailureModeDao failureModeDao, FunctionRepositoryService functionRepositoryService) {
public FailureModeRepositoryService(@Qualifier("defaultEntityValidator") EntityValidator validator, FailureModeDao failureModeDao, FunctionRepositoryService functionRepositoryService) {
super(validator);
this.failureModeDao = failureModeDao;
this.functionRepositoryService = functionRepositoryService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import cz.cvut.kbss.analysis.dto.update.FailureModesRowRpnUpdateDTO;
import cz.cvut.kbss.analysis.model.FailureModesRow;
import cz.cvut.kbss.analysis.model.Mitigation;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;

Expand All @@ -22,8 +22,8 @@ public class FailureModesRowRepositoryService extends BaseRepositoryService<Fail
private final MitigationRepositoryService mitigationRepositoryService;

@Autowired
public FailureModesRowRepositoryService(@Qualifier("defaultValidator") Validator validator, FailureModesRowDao failureModesRowDao
,MitigationRepositoryService mitigationRepositoryService) {
public FailureModesRowRepositoryService(@Qualifier("defaultEntityValidator") EntityValidator validator, FailureModesRowDao failureModesRowDao
, MitigationRepositoryService mitigationRepositoryService) {
super(validator);
this.failureModesRowDao = failureModesRowDao;
this.mitigationRepositoryService = mitigationRepositoryService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
import cz.cvut.kbss.analysis.model.*;
import cz.cvut.kbss.analysis.service.util.FaultTreeTraversalUtils;
import cz.cvut.kbss.analysis.service.util.Pair;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SerializationUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.io.StringWriter;
import java.net.URI;
Expand All @@ -33,7 +33,7 @@ public class FailureModesTableRepositoryService extends BaseRepositoryService<Fa
private final FunctionRepositoryService functionRepositoryService;

@Autowired
public FailureModesTableRepositoryService(@Qualifier("defaultValidator") Validator validator,
public FailureModesTableRepositoryService(@Qualifier("defaultEntityValidator") EntityValidator validator,
FailureModesTableDao failureModesTableDao,
FaultEventRepositoryService faultEventRepositoryService,
FunctionRepositoryService functionRepositoryService) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
import cz.cvut.kbss.analysis.model.fta.FtaEventType;
import cz.cvut.kbss.analysis.service.security.SecurityUtils;
import cz.cvut.kbss.analysis.service.strategy.DirectFtaEvaluation;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import cz.cvut.kbss.analysis.util.Vocabulary;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.*;
Expand All @@ -39,7 +39,7 @@ public class FaultEventRepositoryService extends BaseRepositoryService<FaultEven
private final SecurityUtils securityUtils;

@Autowired
public FaultEventRepositoryService(@Qualifier("faultEventValidator") Validator validator, FaultEventDao faultEventDao, ComponentRepositoryService componentRepositoryService, FaultTreeDao faultTreeDao, FaultEventTypeService faultEventTypeService, FaultEventTypeDao faultEventTypeDao, SecurityUtils securityUtils) {
public FaultEventRepositoryService(@Qualifier("faultEventValidator") EntityValidator validator, FaultEventDao faultEventDao, ComponentRepositoryService componentRepositoryService, FaultTreeDao faultTreeDao, FaultEventTypeService faultEventTypeService, FaultEventTypeDao faultEventTypeDao, SecurityUtils securityUtils) {
super(validator);
this.faultEventDao = faultEventDao;
this.componentRepositoryService = componentRepositoryService;
Expand All @@ -62,6 +62,7 @@ protected void preRemove(FaultEvent instance) {

@Transactional
public FaultEvent addInputEvent(URI eventUri, FaultEvent inputEvent) {
validateNew(inputEvent);
FaultEvent currentEvent = findRequired(eventUri);

if(inputEvent.getUri() == null && inputEvent.getRectangle() == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,6 @@ protected GenericDao<FaultEventType> getPrimaryDao() {
}

@Override
protected void validate(FaultEventType instance) {
public void validate(FaultEventType instance, Object ... groups) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import cz.cvut.kbss.analysis.dao.*;
import cz.cvut.kbss.analysis.dao.util.FaultTreeFilterParams;
import cz.cvut.kbss.analysis.exception.EntityNotFoundException;
import cz.cvut.kbss.analysis.model.*;
import cz.cvut.kbss.analysis.model.System;
import cz.cvut.kbss.analysis.model.*;
import cz.cvut.kbss.analysis.model.ava.ATASystem;
import cz.cvut.kbss.analysis.model.ava.FHAEventType;
import cz.cvut.kbss.analysis.model.diagram.Rectangle;
Expand All @@ -19,6 +19,7 @@
import cz.cvut.kbss.analysis.service.security.SecurityUtils;
import cz.cvut.kbss.analysis.service.util.FaultTreeTraversalUtils;
import cz.cvut.kbss.analysis.service.util.Pair;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import cz.cvut.kbss.analysis.util.Vocabulary;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -29,7 +30,6 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.net.URISyntaxException;
Expand All @@ -56,7 +56,7 @@ public class FaultTreeRepositoryService extends ComplexManagedEntityRepositorySe
private final FailureRateDao failureRateDao;

@Autowired
public FaultTreeRepositoryService(@Qualifier("defaultValidator") Validator validator,
public FaultTreeRepositoryService(@Qualifier("defaultEntityValidator") EntityValidator validator,
FaultTreeDao faultTreeDao,
FaultEventScenarioDao faultEventScenarioDao,
FaultEventRepositoryService faultEventRepositoryService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
import cz.cvut.kbss.analysis.model.Behavior;
import cz.cvut.kbss.analysis.model.Component;
import cz.cvut.kbss.analysis.model.Function;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Slf4j
@Service
Expand All @@ -24,7 +27,7 @@ public class FunctionRepositoryService extends BaseRepositoryService<Function> {
private final FailureModeDao failureModeDao;

@Autowired
public FunctionRepositoryService(@Qualifier("functionValidator") Validator validator, FunctionDao functionDao, FailureModeDao failureModeDao) {
public FunctionRepositoryService(@Qualifier("functionValidator") EntityValidator validator, FunctionDao functionDao, FailureModeDao failureModeDao) {
super(validator);
this.functionDao = functionDao;
this.failureModeDao = failureModeDao;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@
import cz.cvut.kbss.analysis.dao.MitigationDao;
import cz.cvut.kbss.analysis.dto.update.MitigationUpdateDTO;
import cz.cvut.kbss.analysis.model.Mitigation;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;

@Slf4j
@Service
public class MitigationRepositoryService extends BaseRepositoryService<Mitigation> {

private MitigationDao mitigationDao;
private final MitigationDao mitigationDao;

@Autowired
public MitigationRepositoryService(@Qualifier("defaultValidator") Validator validator, MitigationDao mitigationDao) {
public MitigationRepositoryService(@Qualifier("defaultEntityValidator") EntityValidator validator, MitigationDao mitigationDao) {
super(validator);
this.mitigationDao = mitigationDao;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,6 @@ protected GenericDao<OperationalDataFilter> getPrimaryDao() {
}

@Override
protected void validate(OperationalDataFilter instance) {
public void validate(OperationalDataFilter instance, Object ... groups) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@
import cz.cvut.kbss.analysis.model.System;
import cz.cvut.kbss.analysis.model.opdata.OperationalDataFilter;
import cz.cvut.kbss.analysis.service.security.SecurityUtils;
import cz.cvut.kbss.analysis.service.validation.EntityValidator;
import cz.cvut.kbss.analysis.util.Vocabulary;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.Validator;

import java.net.URI;
import java.util.HashSet;
Expand All @@ -37,7 +37,7 @@ public class SystemRepositoryService extends ComplexManagedEntityRepositoryServi
private final OperationalDataFilterService operationalDataFilterService;

@Autowired
public SystemRepositoryService(@Qualifier("defaultValidator") Validator validator,
public SystemRepositoryService(@Qualifier("systemValidator") EntityValidator validator,
SystemDao systemDao,
ComponentRepositoryService componentRepositoryService,
ComponentDao componentDao,
Expand Down Expand Up @@ -69,12 +69,6 @@ public System findRequired(URI id) {

@Transactional
public System create(System system){
List<URI> existingSystems = systemDao.findUriByName(system.getName());
if(!existingSystems.isEmpty())
throw new LogicViolationException((
"Cannot create system with name \"%s\", " +
"the name is already assigned to another system.")
.formatted(system.getName()));
this.persist(system);
return system;
}
Expand All @@ -96,12 +90,6 @@ public void remove(@NonNull URI instanceUri) {
@Transactional
public System rename(System systemRename) {
log.info("> rename - {}", systemRename);
List<URI> existingSystems = systemDao.findUriByName(systemRename.getName());
if(!existingSystems.isEmpty())
throw new LogicViolationException((
"Cannot rename system to \"%s\", " +
"the name is already assigned to another system.")
.formatted(systemRename.getName()));

System system = findRequired(systemRename.getUri());
system.setName(systemRename.getName());
Expand Down
Loading

0 comments on commit 0ed6cf2

Please sign in to comment.