-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
276 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
136 changes: 136 additions & 0 deletions
136
.../tier/shibboleth/admin/ui/service/envers/EnversMetadataResolverVersionServiceTests.groovy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
package edu.internet2.tier.shibboleth.admin.ui.service.envers | ||
|
||
|
||
import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration | ||
import edu.internet2.tier.shibboleth.admin.ui.configuration.EntitiesVersioningConfiguration | ||
import edu.internet2.tier.shibboleth.admin.ui.configuration.InternationalizationConfiguration | ||
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.domain.EntityDescriptor | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FilesystemMetadataResolver | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ResourceBackedMetadataResolver | ||
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository | ||
import edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport | ||
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService | ||
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.transaction.PlatformTransactionManager | ||
import spock.lang.Specification | ||
|
||
import java.time.LocalDateTime | ||
|
||
|
||
@DataJpaTest | ||
@ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration]) | ||
@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) | ||
@EntityScan("edu.internet2.tier.shibboleth.admin.ui") | ||
class EnversMetadataResolverVersionServiceTests extends Specification { | ||
|
||
@Autowired | ||
MetadataResolverVersionService metadataResolverVersionService | ||
|
||
@Autowired | ||
MetadataResolverRepository metadataResolverRepository | ||
|
||
@Autowired | ||
PlatformTransactionManager txMgr | ||
|
||
def "versioning service returns correct number of versions sorted by modified date in natural order"() { | ||
when: 'Initial version' | ||
MetadataResolver mr = new LocalDynamicMetadataResolver(name: 'ldmr') | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
def versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
|
||
then: | ||
versions.size() == 1 | ||
versions[0].id | ||
versions[0].creator | ||
versions[0].date < LocalDateTime.now() | ||
|
||
when: 'Second version' | ||
mr.name = 'ldmr2' | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
|
||
|
||
then: | ||
versions.size() == 2 | ||
versions[0].id && versions[1].id | ||
versions[0].creator && versions[1].creator | ||
versions[0].date < versions[1].date | ||
|
||
when: 'Third version' | ||
mr.name = 'ldmr3' | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
|
||
then: | ||
versions.size() == 3 | ||
versions[0].id && versions[1].id && versions[2].id | ||
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 metadata resolver for version number"() { | ||
when: 'Initial version' | ||
MetadataResolver mr = new FilesystemMetadataResolver(name: 'fsmr') | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
def versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
def v1Mr = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, versions[0].id) | ||
|
||
then: | ||
v1Mr.name == 'fsmr' | ||
v1Mr.resourceId == mr.resourceId | ||
|
||
when: 'Update the original' | ||
mr.name = 'fsmr2' | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
def v2Mr = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, versions[1].id) | ||
|
||
then: | ||
v2Mr.name == 'fsmr2' | ||
v2Mr.resourceId == mr.resourceId | ||
} | ||
|
||
def "versioning service returns null for non existent version number"() { | ||
when: 'Initial version' | ||
MetadataResolver mr = new ResourceBackedMetadataResolver(name: 'rbmr') | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
def nonexitentMrVersion = metadataResolverVersionService.findSpecificVersionOfMetadataResolver(mr.resourceId, '1000') | ||
|
||
then: | ||
!nonexitentMrVersion | ||
} | ||
|
||
def "versioning service returns null for non existent metadata resolver number"() { | ||
when: 'Initial version' | ||
MetadataResolver mr = new DynamicHttpMetadataResolver(name: 'dhmr') | ||
mr = EnversTestsSupport.doInExplicitTransaction(txMgr) { | ||
metadataResolverRepository.save(mr) | ||
} | ||
def versions = metadataResolverVersionService.findVersionsForMetadataResolver(mr.resourceId) | ||
def nonexitentMr = metadataResolverVersionService.findSpecificVersionOfMetadataResolver('non-existent', versions[0].id) | ||
|
||
then: | ||
!nonexitentMr | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
...c/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
62 changes: 62 additions & 0 deletions
62
.../main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package edu.internet2.tier.shibboleth.admin.ui.envers; | ||
|
||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; | ||
import org.hibernate.envers.AuditReaderFactory; | ||
import org.hibernate.envers.query.AuditEntity; | ||
|
||
import javax.persistence.EntityManager; | ||
import javax.persistence.NoResultException; | ||
import java.time.ZoneId; | ||
import java.util.List; | ||
|
||
import static java.util.Comparator.comparing; | ||
import static java.util.stream.Collectors.toList; | ||
|
||
/** | ||
* Encapsulates common functionality interfacing with Envers AuditReader low level API | ||
* to query for revisions of various persistent entities. | ||
*/ | ||
public class EnversVersionServiceSupport { | ||
|
||
private EntityManager entityManager; | ||
|
||
public EnversVersionServiceSupport(EntityManager entityManager) { | ||
this.entityManager = entityManager; | ||
} | ||
|
||
public List<Version> findVersionsForPersistentEntity(String resourceId, Class<?> enityClass) { | ||
List revs = AuditReaderFactory.get(entityManager).createQuery() | ||
.forRevisionsOfEntity(enityClass, false, false) | ||
.add(AuditEntity.property("resourceId").eq(resourceId)) | ||
.getResultList(); | ||
|
||
Object listOfVersions = revs.stream() | ||
.map(it -> ((Object[]) it)[1]) | ||
.map(it -> { | ||
return new Version(((PrincipalAwareRevisionEntity) it).idAsString(), | ||
((PrincipalAwareRevisionEntity) it).getPrincipalUserName(), | ||
((PrincipalAwareRevisionEntity) it).getRevisionDate() | ||
.toInstant() | ||
.atZone(ZoneId.systemDefault()) | ||
.toLocalDateTime()); | ||
}) | ||
.sorted(comparing(Version::getDate)) | ||
.collect(toList()); | ||
|
||
return (List<Version>) listOfVersions; | ||
} | ||
|
||
public Object findSpecificVersionOfPersistentEntity(String resourceId, String versionId, Class<?> entityClass) { | ||
try { | ||
return AuditReaderFactory.get(entityManager).createQuery() | ||
.forEntitiesAtRevision(entityClass, Integer.valueOf(versionId)) | ||
.add(AuditEntity.property("resourceId").eq(resourceId)) | ||
.add(AuditEntity.revisionNumber().eq(Integer.valueOf(versionId))) | ||
.getSingleResult(); | ||
} | ||
catch (NoResultException e) { | ||
return null; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 43 additions & 0 deletions
43
.../edu/internet2/tier/shibboleth/admin/ui/service/EnversMetadataResolverVersionService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package edu.internet2.tier.shibboleth.admin.ui.service; | ||
|
||
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.domain.resolvers.MetadataResolver; | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; | ||
import edu.internet2.tier.shibboleth.admin.ui.envers.EnversVersionServiceSupport; | ||
import edu.internet2.tier.shibboleth.admin.ui.envers.PrincipalAwareRevisionEntity; | ||
import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository; | ||
import org.hibernate.envers.AuditReaderFactory; | ||
import org.hibernate.envers.query.AuditEntity; | ||
|
||
import javax.persistence.EntityManager; | ||
import javax.persistence.NoResultException; | ||
import java.time.ZoneId; | ||
import java.util.List; | ||
|
||
import static java.util.Comparator.comparing; | ||
import static java.util.stream.Collectors.toList; | ||
|
||
/** | ||
* Hibernate Envers based implementation of {@link MetadataResolverVersionService}. | ||
*/ | ||
public class EnversMetadataResolverVersionService implements MetadataResolverVersionService { | ||
|
||
|
||
private EnversVersionServiceSupport enversVersionServiceSupport; | ||
|
||
public EnversMetadataResolverVersionService(EnversVersionServiceSupport enversVersionServiceSupport) { | ||
this.enversVersionServiceSupport = enversVersionServiceSupport; | ||
} | ||
|
||
@Override | ||
public List<Version> findVersionsForMetadataResolver(String resourceId) { | ||
return enversVersionServiceSupport.findVersionsForPersistentEntity(resourceId, MetadataResolver.class); | ||
} | ||
|
||
@Override | ||
public MetadataResolver findSpecificVersionOfMetadataResolver(String resourceId, String versionId) { | ||
Object mrObject = enversVersionServiceSupport.findSpecificVersionOfPersistentEntity(resourceId, versionId, MetadataResolver.class); | ||
return mrObject == null ? null : (MetadataResolver) mrObject; | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
...n/java/edu/internet2/tier/shibboleth/admin/ui/service/MetadataResolverVersionService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package edu.internet2.tier.shibboleth.admin.ui.service; | ||
|
||
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver; | ||
import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; | ||
|
||
import java.util.List; | ||
|
||
/** | ||
* API containing operations pertaining to {@link MetadataResolver} versioning. | ||
*/ | ||
public interface MetadataResolverVersionService { | ||
|
||
List<Version> findVersionsForMetadataResolver(String resourceId); | ||
|
||
MetadataResolver findSpecificVersionOfMetadataResolver(String resourceId, String versionId); | ||
} |