Skip to content

Commit

Permalink
SHIBUI-521(622): Validation facility wip
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 26, 2018
1 parent 9bfef72 commit 01b8397
Show file tree
Hide file tree
Showing 8 changed files with 141 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,25 @@
*/
public class MetadataResolverValidationService<T extends MetadataResolver> {

private List<MetadataResolverValidator> validators;
private List<MetadataResolverValidator<T>> validators;

public MetadataResolverValidationService(List<MetadataResolverValidator> validators) {
public MetadataResolverValidationService(List<MetadataResolverValidator<T>> validators) {
this.validators = validators != null ? validators : new ArrayList<>();
}

@SuppressWarnings("Uncheked")
public ValidationResult validateIfNecessary(T metadataResolver) {
Optional<MetadataResolverValidator> validator =
Optional<MetadataResolverValidator<T>> validator =
this.validators
.stream()
.filter(v -> v.supports(metadataResolver))
.findFirst();
return validator.isPresent() ? validator.get().validate(metadataResolver) : new ValidationResult(null);

}

//Package-private - used for unit tests
boolean noValidatorsConfigured() {
return this.validators.size() == 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*/
public interface MetadataResolverValidator<T extends MetadataResolver> {

boolean supports(T resolver);
boolean supports(MetadataResolver resolver);

ValidationResult validate(T resolver);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,14 @@ public class ResourceBackedMetadataResolver extends MetadataResolver {
@Embedded
private SvnMetadataResource svnMetadataResource;

@Transient
@JsonIgnore
private ResourceType resourceType;

public void validateAndDetermineResourceType() throws InvalidResourceTypeException {
public ResourceType validateAndDetermineResourceType() throws InvalidResourceTypeException {
if (classpathMetadataResource == null && svnMetadataResource == null) {
throw new InvalidResourceTypeException("No metadata resource is provided. Exactly one is required");
}
if (classpathMetadataResource != null && svnMetadataResource != null) {
throw new InvalidResourceTypeException("Too many metadata resources are provided. Exactly one is required");
}
resourceType = classpathMetadataResource != null ? CLASSPATH : SVN;
return classpathMetadataResource != null ? CLASSPATH : SVN;
}

public class InvalidResourceTypeException extends IllegalStateException {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

public class ResourceBackedMetadataResolverValidator implements MetadataResolverValidator<ResourceBackedMetadataResolver> {

@Override
public boolean supports(MetadataResolver resolver) {
return resolver instanceof ResourceBackedMetadataResolver;
}

@Override
public ValidationResult validate(ResourceBackedMetadataResolver resolver) {
try {
resolver.validateAndDetermineResourceType();
}
catch (ResourceBackedMetadataResolver.InvalidResourceTypeException e) {
return new ValidationResult(e.getMessage());
}
return new ValidationResult(null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidationService
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolverValidator

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration


@Configuration
class TestMetadataResolverValidationServiceConfiguration {

@Bean
ResourceBackedMetadataResolverValidator resourceBackedMetadataResolverValidator() {
new ResourceBackedMetadataResolverValidator()
}

@Bean
MetadataResolverValidationService metadataResolverValidationServiceEmpty() {
new MetadataResolverValidationService(null)
}

@Bean
MetadataResolverValidationService metadataResolverValidationServiceOneValidator(List<MetadataResolverValidator> metadataResolverValidators) {
new MetadataResolverValidationService(metadataResolverValidators)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import org.springframework.context.annotation.Bean
import org.springframework.http.HttpEntity
import org.springframework.http.HttpHeaders

import org.springframework.test.annotation.DirtiesContext
import org.springframework.test.context.ActiveProfiles

import spock.lang.Specification
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers

import edu.internet2.tier.shibboleth.admin.ui.configuration.TestMetadataResolverValidationServiceConfiguration
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.test.context.ContextConfiguration
import spock.lang.Specification

@ContextConfiguration(classes=[TestMetadataResolverValidationServiceConfiguration])
class MetadataResolverValidationServiceConfigurationTests extends Specification {

@Autowired
@Qualifier("metadataResolverValidationServiceEmpty")
MetadataResolverValidationService metadataResolverValidationServiceNoValidators

@Autowired
@Qualifier("metadataResolverValidationServiceOneValidator")
MetadataResolverValidationService metadataResolverValidationServiceOneValidator

def "Validation service with no validators"() {
expect:
metadataResolverValidationServiceNoValidators.noValidatorsConfigured()
}

def "Validation service with one validator"() {
expect:
!metadataResolverValidationServiceOneValidator.noValidatorsConfigured()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers

import spock.lang.Specification

class ResourceBackedMetadataValidatorTests extends Specification {

def "Does not support foreign resolver type"() {
given:
MetadataResolverValidator<ResourceBackedMetadataResolver> validator = new ResourceBackedMetadataResolverValidator()
FileBackedHttpMetadataResolver resolver = new FileBackedHttpMetadataResolver()

expect:
!validator.supports(resolver)
}

def "Passes validation"() {
given:
MetadataResolverValidator<ResourceBackedMetadataResolver> validator = new ResourceBackedMetadataResolverValidator()
ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver().with {
it.classpathMetadataResource = new ClasspathMetadataResource()
it
}

expect:
validator.supports(resolver)
validator.validate(resolver).valid
}

def "Does not pass validation with both resource types missing"() {
given:
MetadataResolverValidator<ResourceBackedMetadataResolver> validator = new ResourceBackedMetadataResolverValidator()
ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver()

expect:
validator.supports(resolver)
!validator.validate(resolver).valid
}

def "Does not pass validation with both resource types present"() {
given:
MetadataResolverValidator<ResourceBackedMetadataResolver> validator = new ResourceBackedMetadataResolverValidator()
ResourceBackedMetadataResolver resolver = new ResourceBackedMetadataResolver().with {
it.classpathMetadataResource = new ClasspathMetadataResource()
it.svnMetadataResource = new SvnMetadataResource()
it
}

expect:
validator.supports(resolver)
!validator.validate(resolver).valid
}
}

0 comments on commit 01b8397

Please sign in to comment.