From 94d615d934e0e117d05f9e63a9efb560faf2d0ac Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 26 Jun 2018 17:41:12 -0400 Subject: [PATCH] SHIBUI-521(622) --- ...tadataResolverValidationConfiguration.java | 24 ++++++++++++++++ .../MetadataResolversController.java | 28 ++++++++++++++++++- ...dataResolverValidationConfiguration.groovy | 2 +- ...ResolversControllerIntegrationTests.groovy | 5 +++- ...ValidationServiceConfigurationTests.groovy | 7 +++-- 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverValidationConfiguration.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverValidationConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverValidationConfiguration.java new file mode 100644 index 000000000..e8229f8d8 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/MetadataResolverValidationConfiguration.java @@ -0,0 +1,24 @@ +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; + +import java.util.List; + +@Configuration +public class MetadataResolverValidationConfiguration { + + //@Bean + ResourceBackedMetadataResolverValidator resourceBackedMetadataResolverValidator() { + return new ResourceBackedMetadataResolverValidator(); + } + + @Bean + @SuppressWarnings("Unchecked") + MetadataResolverValidationService metadataResolverValidationService(List metadataResolverValidators) { + return new MetadataResolverValidationService(metadataResolverValidators); + } +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java index 336e32d44..ae75b3f6d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversController.java @@ -1,8 +1,10 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; +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.repository.MetadataResolverRepository; -import lombok.extern.log4j.Log4j; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -19,6 +21,8 @@ import java.net.URI; +import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; + @RestController @RequestMapping("/api") @Slf4j @@ -27,6 +31,9 @@ public class MetadataResolversController { @Autowired MetadataResolverRepository resolverRepository; + @Autowired + MetadataResolverValidationService metadataResolverValidationService; + @GetMapping("/MetadataResolvers") @Transactional(readOnly = true) public ResponseEntity getAll() { @@ -53,6 +60,11 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) { //Only deal with filters via filters endpoints? newResolver.clearAllFilters(); + ResponseEntity validationErrorResponse = validate(newResolver); + if(validationErrorResponse != null) { + return validationErrorResponse; + } + MetadataResolver persistedResolver = resolverRepository.save(newResolver); persistedResolver.updateVersion(); @@ -72,6 +84,11 @@ public ResponseEntity update(@PathVariable String resourceId, @RequestBody Me return ResponseEntity.status(HttpStatus.CONFLICT).build(); } + ResponseEntity validationErrorResponse = validate(updatedResolver); + if(validationErrorResponse != null) { + return validationErrorResponse; + } + updatedResolver.setAudId(existingResolver.getAudId()); //TODO: we are disregarding attached filters if any sent from UI. @@ -84,6 +101,15 @@ public ResponseEntity update(@PathVariable String resourceId, @RequestBody Me return ResponseEntity.ok(persistedResolver); } + @SuppressWarnings("Unchecked") + private ResponseEntity validate(MetadataResolver metadataResolver) { + ValidationResult validationResult = metadataResolverValidationService.validateIfNecessary(metadataResolver); + if(!validationResult.isValid()) { + return ResponseEntity.badRequest().body(validationResult.getErrorMessage()); + } + return null; + } + private static URI getResourceUriFor(MetadataResolver resolver) { return ServletUriComponentsBuilder .fromCurrentServletMapping().path("/api/MetadataResolvers/") diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy index d3493a06f..d5c2f4f29 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/configuration/TestMetadataResolverValidationConfiguration.groovy @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Configuration @Configuration -class TestMetadataResolverValidationServiceConfiguration { +class TestMetadataResolverValidationConfiguration { @Bean ResourceBackedMetadataResolverValidator resourceBackedMetadataResolverValidator() { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy index 81408eafd..03ae982a5 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataResolversControllerIntegrationTests.groovy @@ -162,10 +162,13 @@ class MetadataResolversControllerIntegrationTests extends Specification { PUT, createRequestHttpEntityFor { JsonOutput.toJson(metadataResolverMap) }, String) + then: + updatedResult.statusCodeValue == 200 + + and: def updatedResolverMap = new JsonSlurper().parseText(updatedResult.body) then: - updatedResult.statusCodeValue == 200 updatedResolverMap.name == 'Updated DynamicHttpMetadataResolver' } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy index 6ca9c4182..9007cb15e 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverValidationServiceConfigurationTests.groovy @@ -1,12 +1,15 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestMetadataResolverValidationServiceConfiguration +import edu.internet2.tier.shibboleth.admin.ui.configuration.TestMetadataResolverValidationConfiguration 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]) +/** + * @author Dmitriy Kopylenko + */ +@ContextConfiguration(classes=[TestMetadataResolverValidationConfiguration]) class MetadataResolverValidationServiceConfigurationTests extends Specification { @Autowired