From 7951c8abe024015f159214749627396e8be26074 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 16 Jul 2018 15:34:00 -0400 Subject: [PATCH 1/8] SHIBUI-654: when creating resolvers also save attached filters --- .../MetadataResolversController.java | 19 +++++++++----- .../ui/domain/resolvers/MetadataResolver.java | 18 +++++++++++-- ...ResolversControllerIntegrationTests.groovy | 26 ++++++++++++++++++- 3 files changed, 54 insertions(+), 9 deletions(-) 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 5b24f5788..6a92bad2e 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,9 +1,11 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter; 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.repository.MetadataResolverRepository; +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -22,8 +24,10 @@ import java.io.IOException; import java.net.URI; +import java.util.List; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; +import static java.util.stream.Collectors.toList; @RestController @RequestMapping("/api") @@ -36,6 +40,9 @@ public class MetadataResolversController { @Autowired MetadataResolverValidationService metadataResolverValidationService; + @Autowired + private MetadataResolverService metadataResolverService; + @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) public ResponseEntity unableToParseJson(Exception ex) { return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); @@ -67,18 +74,19 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) { return ResponseEntity.status(HttpStatus.CONFLICT).build(); } - //TODO: we are disregarding attached filters if any sent from UI. - //Only deal with filters via filters endpoints? - newResolver.clearAllFilters(); - ResponseEntity validationErrorResponse = validate(newResolver); if(validationErrorResponse != null) { return validationErrorResponse; } + newResolver.convertFiltersFromTransientRepresentationIfNecessary(); MetadataResolver persistedResolver = resolverRepository.save(newResolver); persistedResolver.updateVersion(); + //TODO: should we call this here? Doing so currently throws ClassCastException + //this.metadataResolverService.reloadFilters(persistedResolver.getName()); + + persistedResolver.convertFiltersIntoTransientRepresentationIfNecessary(); return ResponseEntity.created(getResourceUriFor(persistedResolver)).body(persistedResolver); } @@ -102,8 +110,7 @@ public ResponseEntity update(@PathVariable String resourceId, @RequestBody Me updatedResolver.setAudId(existingResolver.getAudId()); - //TODO: we are disregarding attached filters if any sent from UI. - //Only deal with filters via filters endpoints? + //If one needs to update filters, it should be dealt with via filters endpoints updatedResolver.setMetadataFilters(existingResolver.getMetadataFilters()); MetadataResolver persistedResolver = resolverRepository.save(updatedResolver); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index e5b1221c1..d1f0e97f6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable; +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter; import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -23,6 +24,8 @@ import java.util.List; import java.util.UUID; +import static java.util.stream.Collectors.toList; + @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @EqualsAndHashCode(callSuper = true, exclude = {"version"}) @@ -71,7 +74,18 @@ public void updateVersion() { this.version = hashCode(); } - public void clearAllFilters() { - this.metadataFilters.clear(); + public void convertFiltersIntoTransientRepresentationIfNecessary() { + getAvailableEntityAttributesFilters().forEach(EntityAttributesFilter::intoTransientRepresentation); + } + + public void convertFiltersFromTransientRepresentationIfNecessary() { + getAvailableEntityAttributesFilters().forEach(EntityAttributesFilter::fromTransientRepresentation); + } + + private List getAvailableEntityAttributesFilters() { + return this.metadataFilters.stream() + .filter(EntityAttributesFilter.class::isInstance) + .map(EntityAttributesFilter.class::cast) + .collect(toList()); } } 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 cb6592990..25071cb98 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 @@ -2,6 +2,8 @@ package edu.internet2.tier.shibboleth.admin.ui.controller import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository @@ -53,6 +55,7 @@ class MetadataResolversControllerIntegrationTests extends Specification { generator = new TestObjectGenerator(attributeUtility) mapper = new ObjectMapper() mapper.enable(SerializationFeature.INDENT_OUTPUT) + mapper.registerModule(new JavaTimeModule()) } def cleanup() { @@ -148,7 +151,7 @@ class MetadataResolversControllerIntegrationTests extends Specification { } @Unroll - def "POST new DynamicHttpMetadataResolver of type #resolverType -> /api/MetadataResolvers"(String resolverType) { + def "POST new concrete MetadataResolver of type #resolverType -> /api/MetadataResolvers"(String resolverType) { given: 'New MetadataResolver JSON representation' def resolver = generator.buildRandomMetadataResolverOfType(resolverType) @@ -231,6 +234,27 @@ class MetadataResolversControllerIntegrationTests extends Specification { updatedResult.statusCodeValue == 409 } + def "POST new MetadataResolver with one EntityAttributesFilters attached -> /api/MetadataResolvers"() { + given: 'New MetadataResolver with attached entity attributes filter JSON representation' + def resolver = generator.buildRandomMetadataResolverOfType('FileBacked') + resolver.metadataFilters << generator.entityAttributesFilter() + + when: 'POST request is made with new FileBackedMetadataResolver with EntityAttributesFilter JSON representation' + def result = this.restTemplate.postForEntity(BASE_URI, createRequestHttpEntityFor { mapper.writeValueAsString(resolver) }, String) + + then: + result.statusCodeValue == 201 + result.headers.Location[0].contains(BASE_URI) + + when: 'Query REST API for newly created resolver' + def createdResolverResult = this.restTemplate.getForEntity(result.headers.Location[0], String) + def createdResolver = mapper.readValue(createdResolverResult.body, edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver) + + then: + createdResolver.metadataFilters.size() == 1 + createdResolver.metadataFilters[0] instanceof EntityAttributesFilter + } + private HttpEntity createRequestHttpEntityFor(Closure jsonBodySupplier) { new HttpEntity(jsonBodySupplier(), ['Content-Type': 'application/json'] as HttpHeaders) } From 334d81e07286f4fd69bcd615161845debe27d80e Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 17 Jul 2018 09:15:42 -0400 Subject: [PATCH 2/8] SHIBUI-654: polishing --- .../admin/ui/controller/MetadataResolversController.java | 3 --- 1 file changed, 3 deletions(-) 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 6a92bad2e..b94125889 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 @@ -83,9 +83,6 @@ public ResponseEntity create(@RequestBody MetadataResolver newResolver) { MetadataResolver persistedResolver = resolverRepository.save(newResolver); persistedResolver.updateVersion(); - //TODO: should we call this here? Doing so currently throws ClassCastException - //this.metadataResolverService.reloadFilters(persistedResolver.getName()); - persistedResolver.convertFiltersIntoTransientRepresentationIfNecessary(); return ResponseEntity.created(getResourceUriFor(persistedResolver)).body(persistedResolver); } From 517c90b30c38e9769796096e2a31d7de1e145481 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 17 Jul 2018 09:22:17 -0400 Subject: [PATCH 3/8] SHIBUI-654: polishing --- .../admin/ui/controller/MetadataResolversController.java | 7 ------- 1 file changed, 7 deletions(-) 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 b94125889..1d6c51321 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,11 +1,9 @@ package edu.internet2.tier.shibboleth.admin.ui.controller; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; -import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter; 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.repository.MetadataResolverRepository; -import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -24,10 +22,8 @@ import java.io.IOException; import java.net.URI; -import java.util.List; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; -import static java.util.stream.Collectors.toList; @RestController @RequestMapping("/api") @@ -40,9 +36,6 @@ public class MetadataResolversController { @Autowired MetadataResolverValidationService metadataResolverValidationService; - @Autowired - private MetadataResolverService metadataResolverService; - @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) public ResponseEntity unableToParseJson(Exception ex) { return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); From 7106751a9165130eeccd5bed5f4d3714e41e1574 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Wed, 18 Jul 2018 14:13:06 -0400 Subject: [PATCH 4/8] SHIBUI-621: Introduce xmlId --- .../ui/service/JPAMetadataResolverServiceImpl.groovy | 10 +++++----- .../admin/ui/domain/resolvers/MetadataResolver.java | 3 +++ .../IncommonJPAMetadataResolverServiceImplTests.groovy | 4 +--- .../service/JPAMetadataResolverServiceImplTests.groovy | 4 ++-- .../admin/ui/util/TestObjectGenerator.groovy | 5 +++++ 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index 34029e28a..a9485073b 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -163,7 +163,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { } void constructXmlNodeForResolver(FilesystemMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) { - markupBuilderDelegate.MetadataProvider(id: resolver.name, + markupBuilderDelegate.MetadataProvider(id: resolver.xmlId, 'xsi:type': 'FilesystemMetadataProvider', metadataFile: resolver.metadataFile, @@ -187,7 +187,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { } void constructXmlNodeForResolver(DynamicHttpMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) { - markupBuilderDelegate.MetadataProvider(id: resolver.name, + markupBuilderDelegate.MetadataProvider(id: resolver.xmlId, 'xsi:type': 'DynamicHttpMetadataProvider', requireValidMetadata: !resolver.requireValidMetadata ?: null, failFastInitialization: !resolver.failFastInitialization ?: null, @@ -234,7 +234,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { } void constructXmlNodeForResolver(FileBackedHttpMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) { - markupBuilderDelegate.MetadataProvider(id: resolver.name, + markupBuilderDelegate.MetadataProvider(id: resolver.xmlId, 'xsi:type': 'FileBackedHTTPMetadataProvider', backingFile: resolver.backingFile, metadataURL: resolver.metadataURL, @@ -279,7 +279,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { sourceManagerRef: resolver.sourceManagerRef, sourceKeyGeneratorRef: resolver.sourceKeyGeneratorRef, - id: resolver.name, + id: resolver.xmlId, 'xsi:type': 'DynamicHttpMetadataProvider', requireValidMetadata: !resolver.requireValidMetadata ?: null, failFastInitialization: !resolver.failFastInitialization ?: null, @@ -314,7 +314,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { def resourceType = resolver.validateAndDetermineResourceType() markupBuilderDelegate.MetadataProvider( - id: resolver.name, + id: resolver.xmlId, 'xsi:type': 'ResourceBackedMetadataProvider', parserPoolRef: resolver.reloadableMetadataResolverAttributes?.parserPoolRef, minRefreshDelay: resolver.reloadableMetadataResolverAttributes?.minRefreshDelay, diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java index d1f0e97f6..ab8eda99f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java @@ -51,6 +51,9 @@ public class MetadataResolver extends AbstractAuditable { @Column(unique = true) private String resourceId = UUID.randomUUID().toString(); + @Column(unique = true) + private String xmlId; + private Boolean requireValidMetadata = true; private Boolean failFastInitialization = true; diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy index 24a97ccdb..853ad36c1 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/IncommonJPAMetadataResolverServiceImplTests.groovy @@ -130,9 +130,7 @@ class IncommonJPAMetadataResolverServiceImplTests extends Specification { if (!metadataResolverRepository.findAll().iterator().hasNext()) { //Generate and test edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver. Add more as // we implement them - def mr = new TestObjectGenerator(attributeUtility).fileBackedHttpMetadataResolver() - mr.setName("HTTPMetadata") - metadataResolverRepository.save(mr) + metadataResolverRepository.save(new TestObjectGenerator(attributeUtility).fileBackedHttpMetadataResolver()) // Generate and test edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver. metadataResolverRepository.save(new TestObjectGenerator(attributeUtility).dynamicHttpMetadataResolver()) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy index 9c367c1d6..bbcb7f5c6 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImplTests.groovy @@ -176,7 +176,7 @@ class JPAMetadataResolverServiceImplTests extends Specification { def 'test generating ResourceBackedMetadataResolver with SVN resource type xml snippet'() { given: def resolver = new edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver().with { - it.name = 'SVNResourceMetadata' + it.xmlId = 'SVNResourceMetadata' it.svnMetadataResource = new SvnMetadataResource().with { it.resourceFile = 'entity.xml' it.repositoryURL = 'https://svn.example.org/repo/path/to.dir' @@ -198,7 +198,7 @@ class JPAMetadataResolverServiceImplTests extends Specification { def 'test generating ResourceBackedMetadataResolver with classpath resource type xml snippet'() { given: def resolver = new edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver().with { - it.name = 'ClasspathResourceMetadata' + it.xmlId = 'ClasspathResourceMetadata' it.classpathMetadataResource = new ClasspathMetadataResource().with { it.file = '/path/to/a/classpath/location/metadata.xml' it diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy index 4652fe361..4469e1b36 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/util/TestObjectGenerator.groovy @@ -403,6 +403,7 @@ class TestObjectGenerator { FilesystemMetadataResolver filesystemMetadataResolver() { new FilesystemMetadataResolver().with { it.name = 'FilesystemMetadata' + it.xmlId = 'FilesystemMetadata' it.metadataFile = 'some metadata filename' it.reloadableMetadataResolverAttributes = new ReloadableMetadataResolverAttributes().with { @@ -418,6 +419,7 @@ class TestObjectGenerator { FileBackedHttpMetadataResolver fileBackedHttpMetadataResolver() { new FileBackedHttpMetadataResolver().with { it.name = 'HTTPMetadata' + it.xmlId = 'HTTPMetadata' it.backingFile = '%{idp.home}/metadata/incommonmd.xml' it.metadataURL = 'http://md.incommon.org/InCommon/InCommon-metadata.xml' @@ -434,6 +436,7 @@ class TestObjectGenerator { DynamicHttpMetadataResolver dynamicHttpMetadataResolver() { new DynamicHttpMetadataResolver().with { it.name = 'DynamicHTTP' + it.xmlId = 'DynamicHTTP' it } } @@ -441,6 +444,7 @@ class TestObjectGenerator { LocalDynamicMetadataResolver localDynamicMetadataResolver() { new LocalDynamicMetadataResolver().with { it.name = 'LocalDynamic' + it.xmlId = 'LocalDynamic' it } } @@ -448,6 +452,7 @@ class TestObjectGenerator { ResourceBackedMetadataResolver resourceBackedMetadataResolverForSVN() { new ResourceBackedMetadataResolver().with { it.name = 'SVNResourceMetadata' + it.xmlId = 'SVNResourceMetadata' it.svnMetadataResource = new SvnMetadataResource().with { it.resourceFile = 'entity.xml' it.repositoryURL = 'https://svn.example.org/repo/path/to.dir' From 005f2f757eaf8911a58b68eef4b6a215d243d12d Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 19 Jul 2018 11:56:16 -0400 Subject: [PATCH 5/8] SHIBUI-669: clean up the dead code --- ...DynamicHttpMetadataProviderController.java | 111 ------- ...eBackedHttpMetadataProviderController.java | 110 ------- ...ocalDynamicMetadataProviderController.java | 110 ------- ...HttpMetadataProviderControllerTests.groovy | 272 ----------------- ...HttpMetadataProviderControllerTests.groovy | 274 ----------------- ...amicMetadataProviderControllerTests.groovy | 276 ------------------ 6 files changed, 1153 deletions(-) delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy delete mode 100644 backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java deleted file mode 100644 index 866f54231..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderController.java +++ /dev/null @@ -1,111 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.DynamicHttpMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/DynamicHttp") -public class DynamicHttpMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(DynamicHttpMetadataProviderController.class); - - @Autowired - DynamicHttpMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - DynamicHttpMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - DynamicHttpMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody DynamicHttpMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - DynamicHttpMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody DynamicHttpMetadataResolver resolver) { - DynamicHttpMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - DynamicHttpMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(DynamicHttpMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/DynamicHttp/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } - -} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java deleted file mode 100644 index 5b8000482..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderController.java +++ /dev/null @@ -1,110 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.FileBackedHttpMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/FileBackedHttp") -public class FileBackedHttpMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(FileBackedHttpMetadataProviderController.class); - - @Autowired - FileBackedHttpMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - FileBackedHttpMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - FileBackedHttpMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody FileBackedHttpMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - FileBackedHttpMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody FileBackedHttpMetadataResolver resolver) { - FileBackedHttpMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - FileBackedHttpMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(FileBackedHttpMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/FileBackedHttp/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } -} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java deleted file mode 100644 index 2d3a104ee..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderController.java +++ /dev/null @@ -1,110 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver; -import edu.internet2.tier.shibboleth.admin.ui.repository.LocalDynamicMetadataResolverRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@RestController -@RequestMapping("/api/MetadataProvider/LocalDynamic") -public class LocalDynamicMetadataProviderController { - private static final Logger logger = LoggerFactory.getLogger(LocalDynamicMetadataProviderController.class); - - @Autowired - LocalDynamicMetadataResolverRepository repository; - - @DeleteMapping("/{resourceId}") - public ResponseEntity deleteByResourceId(@PathVariable String resourceId) { - if (repository.deleteByResourceId(resourceId)) { - return ResponseEntity.accepted().build(); - } else { - return ResponseEntity.notFound().build(); - } - } - - @GetMapping("/name/{metadataProviderName}") - @Transactional(readOnly = true) - public ResponseEntity getOneByName(@PathVariable String metadataProviderName) { - LocalDynamicMetadataResolver resolver = repository.findByName(metadataProviderName); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @GetMapping("/{resourceId}") - @Transactional(readOnly = true) - public ResponseEntity getOneByResourceId(@PathVariable String resourceId) { - LocalDynamicMetadataResolver resolver = repository.findByResourceId(resourceId); - if (resolver == null) { - return ResponseEntity.notFound().build(); - } else { - resolver.setVersion(resolver.hashCode()); - return ResponseEntity.ok(resolver); - } - } - - @PostMapping - public ResponseEntity create(@RequestBody LocalDynamicMetadataResolver resolver) { - if (repository.findByName(resolver.getName()) != null) { - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - LocalDynamicMetadataResolver persistedResolver = repository.save(resolver); - persistedResolver.setVersion(persistedResolver.hashCode()); - - return ResponseEntity - .created(getResourceUriFor(persistedResolver)) - .body(persistedResolver); - } - - @PutMapping - public ResponseEntity update(@RequestBody LocalDynamicMetadataResolver resolver) { - LocalDynamicMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId()); - - if (existingResolver == null) { - return ResponseEntity.notFound().build(); - } - - if (existingResolver.hashCode() != resolver.getVersion()) { - logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion()); - return ResponseEntity.status(HttpStatus.CONFLICT).build(); - } - - resolver.setAudId(existingResolver.getAudId()); - //TODO: Do we need to set anything else? dates? - - LocalDynamicMetadataResolver updatedResolver = repository.save(resolver); - updatedResolver.setVersion(updatedResolver.hashCode()); - - return ResponseEntity.ok(updatedResolver); - } - - private static URI getResourceUriFor(LocalDynamicMetadataResolver resolver) { - return ServletUriComponentsBuilder - .fromCurrentServletMapping().path("/api/MetadataProvider/LocalDynamic/") - .pathSegment(resolver.getResourceId()) - .build() - .toUri(); - } -} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy deleted file mode 100644 index 5b10c9f6e..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/DynamicHttpMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,272 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.DynamicHttpMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.domain.EntityScan -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest -import org.springframework.data.jpa.repository.config.EnableJpaRepositories -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class DynamicHttpMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - def repository = Mock(DynamicHttpMetadataResolverRepository) - def controller - def mockMvc - - @Autowired - AttributeUtility attributeUtility - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new DynamicHttpMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.setVersion(resolver.hashCode()) - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/DynamicHttp/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - def resolverName = resolver.name - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.version = resolver.hashCode() - def resourceId = resolver.resourceId - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByResourceId(resourceId) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/$resourceId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - resolver.version = resolver.hashCode() - def resolverName = resolver.name - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/name/$resolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/DynamicHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - def existingResolverJson = mapper.writeValueAsString(existingResolver) - - def updatedResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - updatedResolver.resourceId = existingResolver.resourceId - updatedResolver.version = existingResolver.version - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(existingResolver.resourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - - def updatedResolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - updatedResolver.resourceId = existingResolver.resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(existingResolver.resourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def resolver = testObjectGenerator.buildDynamicHttpMetadataResolver() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByResourceId(resolver.resourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/DynamicHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy deleted file mode 100644 index 99457a335..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/FileBackedHttpMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,274 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.FileBackedHttpMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.domain.EntityScan -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest -import org.springframework.data.jpa.repository.config.EnableJpaRepositories -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class FileBackedHttpMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - @Autowired - AttributeUtility attributeUtility - - def repository = Mock(FileBackedHttpMetadataResolverRepository) - def controller - def mockMvc - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new FileBackedHttpMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/FileBackedHttp/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - def randomResolverName = existingResolver.name - def newResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - newResolver.name = randomResolverName - def postedJsonBody = mapper.writeValueAsString(newResolver) - - 1 * repository.findByName(randomResolverName) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def resolverJson = mapper.writeValueAsString(existingResolver) - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def randomResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - randomResolver.version = randomResolver.hashCode() - def randomResolverName = randomResolver.name - def resolverJson = mapper.writeValueAsString(randomResolver) - - 1 * repository.findByName(randomResolverName) >> randomResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/FileBackedHttp/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - updatedResolver.version = existingResolver.version - updatedResolver.resourceId = existingResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def randomResourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - updatedResolver.version = updatedResolver.hashCode() - updatedResolver.resourceId = existingResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(randomResourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def randomResolver = testObjectGenerator.buildFileBackedHttpMetadataResolver() - randomResolver.version = randomResolver.hashCode() - def randomResourceId = randomResolver.resourceId - def postedJsonBody = mapper.writeValueAsString(randomResolver) - - 1 * repository.findByResourceId(randomResourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/FileBackedHttp') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy deleted file mode 100644 index 14c925c5c..000000000 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/LocalDynamicMetadataProviderControllerTests.groovy +++ /dev/null @@ -1,276 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller - -import com.fasterxml.jackson.databind.ObjectMapper -import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.MetadataResolverConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration -import edu.internet2.tier.shibboleth.admin.ui.configuration.TestConfiguration -import edu.internet2.tier.shibboleth.admin.ui.repository.LocalDynamicMetadataResolverRepository -import edu.internet2.tier.shibboleth.admin.ui.util.RandomGenerator -import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator -import edu.internet2.tier.shibboleth.admin.util.AttributeUtility -import groovy.json.JsonOutput -import groovy.json.JsonSlurper -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.autoconfigure.domain.EntityScan -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest -import org.springframework.data.jpa.repository.config.EnableJpaRepositories -import org.springframework.test.context.ContextConfiguration -import org.springframework.test.web.servlet.setup.MockMvcBuilders -import spock.lang.Specification - -import static org.hamcrest.CoreMatchers.containsString -import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8 -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.* - -/** - * @author Bill Smith (wsmith@unicon.net) - */ -@DataJpaTest -@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, TestConfiguration]) -@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) -@EntityScan("edu.internet2.tier.shibboleth.admin.ui") -class LocalDynamicMetadataProviderControllerTests extends Specification { - RandomGenerator randomGenerator - TestObjectGenerator testObjectGenerator - ObjectMapper mapper - - def repository = Mock(LocalDynamicMetadataResolverRepository) - def controller - def mockMvc - - @Autowired - AttributeUtility attributeUtility - - def setup() { - randomGenerator = new RandomGenerator() - testObjectGenerator = new TestObjectGenerator(attributeUtility) - mapper = new ObjectMapper() - - controller = new LocalDynamicMetadataProviderController ( - repository: repository - ) - - mockMvc = MockMvcBuilders.standaloneSetup(controller).build() - } - - def "DELETE deletes the desired resolver"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> true - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isAccepted()) - } - - def "DELETE returns error when desired resolver is not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.deleteByResourceId(randomResourceId) >> false - - when: - def result = mockMvc.perform( - delete("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "POST a new resolver properly persists and returns the new persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.getName()) >> null - 1 * repository.save(_) >> resolver - - def expectedResolverUUID = resolver.getResourceId() - def expectedResponseHeader = 'Location' - def expectedResponseHeaderValue = "/api/MetadataProvider/LocalDynamic/$expectedResolverUUID" - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isCreated()) - .andExpect(content().json(postedJsonBody, false)) - .andExpect(header().string(expectedResponseHeader, containsString(expectedResponseHeaderValue))) - } - - def "POST a new resolver that has a name of a persisted resolver returns conflict"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolver.name) >> resolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - post('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "GET by resourceId returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def resolverJson = mapper.writeValueAsString(resolver) - def resolverId = resolver.resourceId - - 1 * repository.findByResourceId(resolverId) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/$resolverId")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resource id returns not found"() { - given: - def randomResourceId = randomGenerator.randomId() - - 1 * repository.findByResourceId(randomResourceId) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/$randomResourceId")) - - then: - result.andExpect(status().isNotFound()) - } - - def "GET by resolver name returns the desired persisted resolver"() { - given: - def resolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - resolver.version = resolver.hashCode() - def resolverName = resolver.name - def resolverJson = mapper.writeValueAsString(resolver) - - 1 * repository.findByName(resolverName) >> resolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/name/$resolverName")) - - then: - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(resolverJson, false)) - } - - def "GET by unknown resolver name returns not found"() { - given: - def randomResolverName = randomGenerator.randomString(10) - - 1 * repository.findByName(randomResolverName) >> null - - when: - def result = mockMvc.perform( - get("/api/MetadataProvider/LocalDynamic/name/$randomResolverName")) - - then: - result.andExpect(status().isNotFound()) - } - - def "PUT allows for a successful update of an already-persisted resolver"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.setResourceId(resourceId) - updatedResolver.setVersion(existingResolver.hashCode()) - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> existingResolver - 1 * repository.save(_) >> updatedResolver - - def expectedResponseContentType = APPLICATION_JSON_UTF8 - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - def expectedJson = new JsonSlurper().parseText(postedJsonBody) - expectedJson << [version: updatedResolver.hashCode()] - result.andExpect(status().isOk()) - .andExpect(content().contentType(expectedResponseContentType)) - .andExpect(content().json(JsonOutput.toJson(expectedJson), false)) - } - - def "PUT of an updated resolver with an incorrect version returns a conflict"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.resourceId = resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> existingResolver - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isConflict()) - } - - def "PUT of a resolver that is not persisted returns not found"() { - given: - def existingResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - existingResolver.version = existingResolver.hashCode() - def resourceId = existingResolver.resourceId - - def updatedResolver = testObjectGenerator.buildLocalDynamicMetadataResolver() - updatedResolver.resourceId = resourceId - updatedResolver.version = updatedResolver.hashCode() - def postedJsonBody = mapper.writeValueAsString(updatedResolver) - - 1 * repository.findByResourceId(resourceId) >> null - 0 * repository.save(_) - - when: - def result = mockMvc.perform( - put('/api/MetadataProvider/LocalDynamic') - .contentType(APPLICATION_JSON_UTF8) - .content(postedJsonBody)) - - then: - result.andExpect(status().isNotFound()) - } -} From 1db44f06ecba9cd9c83345129d42258a6a22958a Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Thu, 19 Jul 2018 15:44:03 -0400 Subject: [PATCH 6/8] SHIBUI-666 --- .../JPAMetadataResolverServiceImpl.groovy | 34 ++++++++-------- .../MetadataProvidersController.java | 40 ------------------- .../MetadataResolversController.java | 25 ++++++++++++ 3 files changed, 43 insertions(+), 56 deletions(-) delete mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy index a9485073b..aa2d1e7df 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JPAMetadataResolverServiceImpl.groovy @@ -46,12 +46,12 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { // TODO: enhance @Override void reloadFilters(String metadataResolverName) { - ChainingMetadataResolver chainingMetadataResolver = (ChainingMetadataResolver)metadataResolver + ChainingMetadataResolver chainingMetadataResolver = (ChainingMetadataResolver) metadataResolver MetadataResolver targetMetadataResolver = chainingMetadataResolver.getResolvers().find { it.id == metadataResolverName } edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver jpaMetadataResolver = metadataResolverRepository.findByName(metadataResolverName) if (targetMetadataResolver && targetMetadataResolver.getMetadataFilter() instanceof MetadataFilterChain) { - MetadataFilterChain metadataFilterChain = (MetadataFilterChain)targetMetadataResolver.getMetadataFilter() + MetadataFilterChain metadataFilterChain = (MetadataFilterChain) targetMetadataResolver.getMetadataFilter() List metadataFilters = new ArrayList<>() @@ -64,7 +64,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { if (entityAttributesFilter.getEntityAttributesFilterTarget().getEntityAttributesFilterTargetType() == EntityAttributesFilterTarget.EntityAttributesFilterTargetType.ENTITY) { rules.put( new EntityIdPredicate(entityAttributesFilter.getEntityAttributesFilterTarget().getValue()), - (List)(List)entityAttributesFilter.getAttributes() + (List) (List) entityAttributesFilter.getAttributes() ) } target.setRules(rules) @@ -76,7 +76,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { if (metadataResolver instanceof RefreshableMetadataResolver) { try { - ((RefreshableMetadataResolver)metadataResolver).refresh() + ((RefreshableMetadataResolver) metadataResolver).refresh() } catch (ResolverException e) { log.warn("error refreshing metadataResolver " + metadataResolverName, e) } @@ -99,15 +99,18 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { 'xsi:schemaLocation': 'urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd urn:mace:shibboleth:2.0:resource http://shibboleth.net/schema/idp/shibboleth-resource.xsd urn:mace:shibboleth:2.0:security http://shibboleth.net/schema/idp/shibboleth-security.xsd urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd urn:oasis:names:tc:SAML:2.0:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd' ) { metadataResolverRepository.findAll().each { edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver mr -> - constructXmlNodeForResolver(mr, delegate) { - MetadataFilter( - 'xsi:type': 'SignatureValidation', - 'requireSignedRoot': 'true', - 'certificateFile': '%{idp.home}/credentials/inc-md-cert.pem' - ) - //TODO: enhance - mr.metadataFilters.each { edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter filter -> - constructXmlNodeForFilter(filter, delegate) + //TODO: We cannot/do not currently have the code to marshall the internal incommon chaining resolver + if (mr.type != 'BaseMetadataResolver') { + constructXmlNodeForResolver(mr, delegate) { + MetadataFilter( + 'xsi:type': 'SignatureValidation', + 'requireSignedRoot': 'true', + 'certificateFile': '%{idp.home}/credentials/inc-md-cert.pem' + ) + //TODO: enhance + mr.metadataFilters.each { edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter filter -> + constructXmlNodeForFilter(filter, delegate) + } } } } @@ -324,7 +327,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { resolveViaPredicatesOnly: resolver.reloadableMetadataResolverAttributes?.resolveViaPredicatesOnly ?: null, expirationWarningThreshold: resolver.reloadableMetadataResolverAttributes?.expirationWarningThreshold) { - if(resourceType == SVN) { + if (resourceType == SVN) { MetadataResource( 'xmlns:resource': 'urn:mace:shibboleth:2.0:resource', 'xsi:type': 'resource:SVNResource', @@ -338,8 +341,7 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService { 'proxyUserName': resolver.svnMetadataResource.proxyUserName, 'proxyPassword': resolver.svnMetadataResource.proxyPassword) - } - else if (resourceType == CLASSPATH) { + } else if (resourceType == CLASSPATH) { MetadataResource( 'xmlns:resource': 'urn:mace:shibboleth:2.0:resource', 'xsi:type': 'resource:ClasspathResource', diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java deleted file mode 100644 index 538cfa5cf..000000000 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataProvidersController.java +++ /dev/null @@ -1,40 +0,0 @@ -package edu.internet2.tier.shibboleth.admin.ui.controller; - -import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.IOException; -import java.io.StringWriter; - -@Controller -@RequestMapping(value = "/api/metadataProviders") -public class MetadataProvidersController { - private static final Logger logger = LoggerFactory.getLogger(MetadataProvidersController.class); - - @Autowired - MetadataResolverService metadataResolverService; - - @RequestMapping(produces = "application/xml") - public ResponseEntity getXml() throws IOException, TransformerException { - // TODO: externalize - try (StringWriter writer = new StringWriter()) { - Transformer transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - - transformer.transform(new DOMSource(metadataResolverService.generateConfiguration()), new StreamResult(writer)); - return ResponseEntity.ok(writer.toString()); - } - } -} 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 1d6c51321..9705ddacc 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 @@ -4,6 +4,7 @@ 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.repository.MetadataResolverRepository; +import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -20,7 +21,14 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.IOException; +import java.io.StringWriter; import java.net.URI; import static edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolverValidator.ValidationResult; @@ -36,6 +44,9 @@ public class MetadataResolversController { @Autowired MetadataResolverValidationService metadataResolverValidationService; + @Autowired + MetadataResolverService metadataResolverService; + @ExceptionHandler({InvalidTypeIdException.class, IOException.class, HttpMessageNotReadableException.class}) public ResponseEntity unableToParseJson(Exception ex) { return ResponseEntity.badRequest().body(new ErrorResponse(HttpStatus.BAD_REQUEST.toString(), ex.getMessage())); @@ -49,6 +60,20 @@ public ResponseEntity getAll() { return ResponseEntity.ok(resolvers); } + @GetMapping(value = "/MetadataResolvers", produces = "application/xml") + @Transactional(readOnly = true) + public ResponseEntity getXml() throws IOException, TransformerException { + // TODO: externalize + try (StringWriter writer = new StringWriter()) { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + + transformer.transform(new DOMSource(metadataResolverService.generateConfiguration()), new StreamResult(writer)); + return ResponseEntity.ok(writer.toString()); + } + } + @GetMapping("/MetadataResolvers/{resourceId}") @Transactional(readOnly = true) public ResponseEntity getOne(@PathVariable String resourceId) { From 07ba5a400e231e4ba4fe6eec328db62175f95bc4 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 23 Jul 2018 07:50:40 -0400 Subject: [PATCH 7/8] Trigger build --- .trigger-jenkins-build | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .trigger-jenkins-build diff --git a/.trigger-jenkins-build b/.trigger-jenkins-build new file mode 100644 index 000000000..e69de29bb From 79aaa9548bf0ea7ae566541b92fc3818654d8253 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Mon, 23 Jul 2018 07:58:34 -0400 Subject: [PATCH 8/8] Cleanup --- .trigger-jenkins-build | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .trigger-jenkins-build diff --git a/.trigger-jenkins-build b/.trigger-jenkins-build deleted file mode 100644 index e69de29bb..000000000