validate namespace strategies on configuration update

This commit is contained in:
Sebastian Sdorra
2019-03-12 16:40:08 +01:00
parent cb554eb7bc
commit 7d994c62a6
4 changed files with 91 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes;
import com.webcohesion.enunciate.metadata.rs.TypeHint;
import sonia.scm.config.ConfigurationPermissions;
import sonia.scm.config.ScmConfiguration;
import sonia.scm.repository.NamespaceStrategyValidator;
import sonia.scm.util.ScmConfigurationUtil;
import sonia.scm.web.VndMediaType;
@@ -27,12 +28,16 @@ public class ConfigResource {
private final ConfigDtoToScmConfigurationMapper dtoToConfigMapper;
private final ScmConfigurationToConfigDtoMapper configToDtoMapper;
private final ScmConfiguration configuration;
private final NamespaceStrategyValidator namespaceStrategyValidator;
@Inject
public ConfigResource(ConfigDtoToScmConfigurationMapper dtoToConfigMapper, ScmConfigurationToConfigDtoMapper configToDtoMapper, ScmConfiguration configuration) {
public ConfigResource(ConfigDtoToScmConfigurationMapper dtoToConfigMapper,
ScmConfigurationToConfigDtoMapper configToDtoMapper,
ScmConfiguration configuration, NamespaceStrategyValidator namespaceStrategyValidator) {
this.dtoToConfigMapper = dtoToConfigMapper;
this.configToDtoMapper = configToDtoMapper;
this.configuration = configuration;
this.namespaceStrategyValidator = namespaceStrategyValidator;
}
/**
@@ -78,6 +83,9 @@ public class ConfigResource {
// But to where to check? load() or store()? Leave it for now, SCMv1 legacy that can be cleaned up later.
ConfigurationPermissions.write(configuration).check();
// ensure the namespace strategy is valid
namespaceStrategyValidator.check(configDto.getNamespaceStrategy());
ScmConfiguration config = dtoToConfigMapper.map(configDto);
synchronized (ScmConfiguration.class) {
configuration.load(config);

View File

@@ -0,0 +1,26 @@
package sonia.scm.repository;
import javax.inject.Inject;
import java.util.Set;
import static sonia.scm.ScmConstraintViolationException.Builder.doThrow;
public class NamespaceStrategyValidator {
private final Set<NamespaceStrategy> strategies;
@Inject
public NamespaceStrategyValidator(Set<NamespaceStrategy> strategies) {
this.strategies = strategies;
}
public void check(String name) {
doThrow()
.violation("unknown NamespaceStrategy " + name, "namespaceStrategy")
.when(!isValid(name));
}
private boolean isValid(String name) {
return strategies.stream().anyMatch(ns -> ns.getClass().getSimpleName().equals(name));
}
}