Skip to content

Commit

Permalink
SHIBUI-521(622): metadata resolver validation facility wip...
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 26, 2018
1 parent 9db33c6 commit 551cec5
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class MetadataResolverValidationService<T extends MetadataResolver> {

private List<MetadataResolverValidator> validators;

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

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

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

public interface MetadataResolverValidator<T extends MetadataResolver> {

boolean supports(T resolver);

ValidationResult validate(T resolver);

class ValidationResult {

public ValidationResult(String errorMessage) {
this.errorMessage = errorMessage;
}

private String errorMessage;

public String getErrorMessage() {
return errorMessage;
}

public boolean isValid() {
return this.errorMessage == null;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Transient;

import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.CLASSPATH;
import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver.ResourceType.SVN;

@Entity
@EqualsAndHashCode(callSuper = true)
@EqualsAndHashCode(callSuper = true, exclude = "resourceType")
@Getter
@Setter
@ToString
Expand All @@ -23,4 +28,29 @@ public class ResourceBackedMetadataResolver extends MetadataResolver {

@Embedded
private SvnMetadataResource svnMetadataResource;

@Transient
@JsonIgnore
private ResourceType resourceType;

public void 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;
}

public class InvalidResourceTypeException extends IllegalStateException {
public InvalidResourceTypeException(String s) {
super(s);
}
}

public enum ResourceType {
CLASSPATH,
SVN
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.internet2.tier.shibboleth.admin.ui.domain
package edu.internet2.tier.shibboleth.admin.ui.domain.filters

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

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers

import spock.lang.Specification
import spock.lang.Subject

import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.*

/**
* @author Dmitriy Kopylenko
*/
class MetadataResolverValidationServiceTests extends Specification {

def "Validation service with no available validators always returns default valid result"() {
given: 'Sample metadata resolver and validation service with no validators'
def resolver = Mock(MetadataResolver)
@Subject
def validationService = new MetadataResolverValidationService(null)

when: 'Validation call is made'
def validationResult = validationService.validateIfNecessary(resolver)

then:
validationResult.valid
}

def "Validation service with one validator not supporting the type of resolver returns default valid result"() {
given: 'Sample metadata resolver and validation service with one validator not supporting that type'
def resolver = Mock(MetadataResolver)
def validator = Mock(MetadataResolverValidator)
validator.supports(_) >> false
@Subject
def validationService = new MetadataResolverValidationService([validator])

when: 'Validation call is made'
def validationResult = validationService.validateIfNecessary(resolver)

then:
validationResult.valid
}

def "Validation service with one validator supporting the type of resolver but fails its validation"() {
given: 'Sample metadata resolver and validation service with one validator supporting that type'
def resolver = Mock(MetadataResolver)
def validator = Mock(MetadataResolverValidator)
validator.supports(_) >> true
validator.validate(_) >> new ValidationResult('Invalid')
@Subject
def validationService = new MetadataResolverValidationService([validator])

when: 'Validation call is made'
def validationResult = validationService.validateIfNecessary(resolver)

then:
!validationResult.valid
}

def "Validation service with with two validators supporting the type of resolver, first fails, second passes validation"() {
given: 'Sample metadata resolver and validation service with two validators supporting that type'
def resolver = Mock(MetadataResolver)
def validator1 = Mock(MetadataResolverValidator)
validator1.supports(_) >> true
validator1.validate(_) >> new ValidationResult('Invalid')
def validator2 = Mock(MetadataResolverValidator)
validator2.supports(_) >> true
validator2.validate(_) >> new ValidationResult(null)
@Subject
def validationService = new MetadataResolverValidationService([validator1, validator2])

when: 'Validation call is made'
def validationResult = validationService.validateIfNecessary(resolver)

then: 'Result depends on list order of validators if all of them support the resolver type. This would be considered a mis-configuration'
!validationResult.valid
}

def "Validation service with with two validators, only one supporting the type of resolver, passes validation"() {
given: 'Sample metadata resolver and validation service with two validators, with one supporting that type'
def resolver = Mock(MetadataResolver)
def validator1 = Mock(MetadataResolverValidator)
validator1.supports(_) >> false
def validator2 = Mock(MetadataResolverValidator)
validator2.supports(_) >> true
validator2.validate(_) >> new ValidationResult(null)
@Subject
def validationService = new MetadataResolverValidationService([validator1, validator2])

when: 'Validation call is made'
def validationResult = validationService.validateIfNecessary(resolver)

then:
validationResult.valid
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.internet2.tier.shibboleth.admin.ui.domain
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
Expand Down

0 comments on commit 551cec5

Please sign in to comment.