From 17e10a0d8c07bd9a542047f52aded677c0711b98 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Tue, 11 Jun 2019 16:40:03 -0400 Subject: [PATCH] SHIBUI-1262(1315, 1316) --- .../EntitiesVersioningConfiguration.java | 5 ++- .../EntityDescriptorVersionService.java | 24 ----------- .../EnversEntityDescriptorVersionService.java | 18 ++++++++- ...lerVersionEndpointsIntegrationTests.groovy | 40 +++++++++++++++++++ ...EntityDescriptorVersionServiceTests.groovy | 38 ++++++++++++++++++ 5 files changed, 97 insertions(+), 28 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java index b73448e5e..b190f2f5d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration; +import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService; import edu.internet2.tier.shibboleth.admin.ui.service.EnversEntityDescriptorVersionService; import org.springframework.context.annotation.Bean; @@ -15,7 +16,7 @@ public class EntitiesVersioningConfiguration { private EntityManager entityManager; @Bean - EntityDescriptorVersionService entityDescriptorVersionService() { - return new EnversEntityDescriptorVersionService(entityManager); + EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) { + return new EnversEntityDescriptorVersionService(entityManager, entityDescriptorService); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorVersionService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorVersionService.java index e53072f99..6803796fa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorVersionService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorVersionService.java @@ -17,28 +17,4 @@ public interface EntityDescriptorVersionService { List findVersionsForEntityDescriptor(String resourceId); EntityDescriptorRepresentation findSpecificVersionOfEntityDescriptor(String resourceId, String versionId); - - /* Factory method to return stub impl for dev and testing purposes */ - static EntityDescriptorVersionService stubImpl(final EntityDescriptorService entityDescriptorService, - final EntityDescriptorRepository entityDescriptorRepository) { - return new EntityDescriptorVersionService() { - @Override - public List findVersionsForEntityDescriptor(String resourceId) { - return Arrays.asList( - new Version("1", "kramer", LocalDateTime.now().minusDays(10)), - new Version("2", "newman", LocalDateTime.now().minusDays(5)) - ); - } - - @Override - public EntityDescriptorRepresentation findSpecificVersionOfEntityDescriptor(String resourceId, String versionId) { - EntityDescriptor ed = new EntityDescriptor(); - ed.setID("1"); - ed.setEntityID("http://versioning/stub"); - ed.setCreatedBy("kramer"); - ed.setCreatedDate(LocalDateTime.now().minusDays(10)); - return entityDescriptorService.createRepresentationFromDescriptor(ed); - } - }; - } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java index fced0645f..ec1e8ceb8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java @@ -11,6 +11,7 @@ import org.springframework.data.jpa.repository.JpaContext; import javax.persistence.EntityManager; +import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import java.time.LocalDateTime; import java.time.ZoneId; @@ -29,8 +30,11 @@ public class EnversEntityDescriptorVersionService implements EntityDescriptorVer private EntityManager entityManager; - public EnversEntityDescriptorVersionService(EntityManager entityManager) { + private EntityDescriptorService entityDescriptorService; + + public EnversEntityDescriptorVersionService(EntityManager entityManager, EntityDescriptorService entityDescriptorService) { this.entityManager = entityManager; + this.entityDescriptorService = entityDescriptorService; } @Override @@ -58,6 +62,16 @@ public List findVersionsForEntityDescriptor(String resourceId) { @Override public EntityDescriptorRepresentation findSpecificVersionOfEntityDescriptor(String resourceId, String versionId) { - return null; + try { + Object revision = AuditReaderFactory.get(entityManager).createQuery() + .forEntitiesAtRevision(EntityDescriptor.class, Integer.valueOf(versionId)) + .add(AuditEntity.property("resourceId").eq(resourceId)) + .add(AuditEntity.revisionNumber().eq(Integer.valueOf(versionId))) + .getSingleResult(); + return entityDescriptorService.createRepresentationFromDescriptor((EntityDescriptor) revision); + } + catch (NoResultException e) { + return null; + } } } diff --git a/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy b/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy index 550604777..f7b2c90b0 100644 --- a/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy +++ b/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerVersionEndpointsIntegrationTests.groovy @@ -1,6 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.controller import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.EntityDescriptorRepresentation import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.util.TestObjectGenerator @@ -28,6 +29,8 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi static ALL_VERSIONS_URI = "$BASE_URI/%s/Versions" + static SPECIFIC_VERSION_URI = "$BASE_URI/%s/Versions/%s" + def "GET /api/EntityDescriptor/{resourceId}/Versions with non-existent entity descriptor"() { when: def result = getAllEntityDescriptorVersions('non-existent-ed-id', String) @@ -68,12 +71,49 @@ class EntityDescriptorControllerVersionEndpointsIntegrationTests extends Specifi result.body[0].date < result.body[1].date } + def "GET /api/EntityDescriptor{resourceId}/Versions/{version} for non existent version"() { + given: + EntityDescriptor ed = new EntityDescriptor(entityID: 'http://test/controller', createdBy: 'anonymousUser') + ed = entityDescriptorRepository.save(ed) + + when: + def result = getEntityDescriptorForVersion(ed.resourceId, '1000', EntityDescriptorRepresentation) + + then: + result.statusCodeValue == 404 + } + + def "GET /api/EntityDescriptor{resourceId}/Versions/{version} with 2 entity descriptor versions returns correct ED for specific versions"() { + given: + EntityDescriptor ed = new EntityDescriptor(entityID: 'http://test/controller', createdBy: 'anonymousUser', serviceProviderName: 'SP1') + ed = entityDescriptorRepository.save(ed) + //Will created a second version for UPDATE revision + ed.serviceProviderName = 'SP2' + entityDescriptorRepository.save(ed) + when: + def allVersions = getAllEntityDescriptorVersions(ed.resourceId, List) + def edv1 = getEntityDescriptorForVersion(ed.resourceId, allVersions.body[0].id, EntityDescriptorRepresentation) + def edv2 = getEntityDescriptorForVersion(ed.resourceId, allVersions.body[1].id, EntityDescriptorRepresentation) + + then: + edv1.statusCodeValue == 200 + edv1.body.serviceProviderName == 'SP1' + edv2.statusCodeValue == 200 + edv2.body.serviceProviderName == 'SP2' + } private getAllEntityDescriptorVersions(String resourceId, responseType) { this.restTemplate.getForEntity(resourceUriFor(ALL_VERSIONS_URI, resourceId), responseType) } + private getEntityDescriptorForVersion(String resourceId, String version, responseType) { + this.restTemplate.getForEntity(resourceUriFor(SPECIFIC_VERSION_URI, resourceId, version), responseType) + } + + private static resourceUriFor(String uriTemplate, String resourceId, String version) { + String.format(uriTemplate, resourceId, version) + } private static resourceUriFor(String uriTemplate, String resourceId) { String.format(uriTemplate, resourceId) diff --git a/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy b/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy index ce1b918e7..738187741 100644 --- a/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy +++ b/envers-tests-module/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/envers/EnversEntityDescriptorVersionServiceTests.groovy @@ -75,4 +75,42 @@ class EnversEntityDescriptorVersionServiceTests extends Specification { versions[0].creator && versions[1].creator && versions[2].creator (versions[0].date < versions[1].date) && (versions[1].date < versions[2].date) } + + def "versioning service returns correct entity descriptor for version number"() { + when: 'Initial version' + EntityDescriptor ed = new EntityDescriptor(entityID: 'ed', serviceProviderName: 'SP1', createdBy: 'anonymousUser') + ed = doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + def versions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + def v1EdRepresentation = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, versions[0].id) + + then: + v1EdRepresentation.serviceProviderName == 'SP1' + v1EdRepresentation.id == ed.resourceId + + when: 'Update the original' + ed.serviceProviderName = 'SP2' + ed = doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + versions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + def v2EdRepresentation = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, versions[1].id) + + then: + v2EdRepresentation.serviceProviderName == 'SP2' + v2EdRepresentation.id == ed.resourceId + } + + def "versioning service returns null for non existent version number"() { + when: 'Initial version' + EntityDescriptor ed = new EntityDescriptor(entityID: 'ed', serviceProviderName: 'SP1', createdBy: 'anonymousUser') + ed = doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + def edRepresentation = entityDescriptorVersionService.findSpecificVersionOfEntityDescriptor(ed.resourceId, '1000') + + then: + !edRepresentation + } }