Skip to content

Commit

Permalink
SHIBUI-1263(1320)
Browse files Browse the repository at this point in the history
  • Loading branch information
dima767 committed Jun 24, 2019
1 parent 0326701 commit ee068aa
Show file tree
Hide file tree
Showing 9 changed files with 276 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ 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.repository.EntityDescriptorRepository
import edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport
import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService
import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService
import org.springframework.beans.factory.annotation.Autowired
Expand All @@ -19,6 +20,7 @@ import spock.lang.Specification

import java.time.LocalDateTime


@DataJpaTest
@ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration])
@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"])
Expand All @@ -40,7 +42,7 @@ class EnversEntityDescriptorVersionServiceTests extends Specification {
def "versioning service returns correct number of versions sorted by modified date in natural order"() {
when: 'Initial version'
EntityDescriptor ed = new EntityDescriptor(entityID: 'ed', serviceProviderName: 'SP1')
ed = edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport.doInExplicitTransaction(txMgr) {
ed = EnversTestsSupport.doInExplicitTransaction(txMgr) {
entityDescriptorRepository.save(ed)
}
def versions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId)
Expand Down
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
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import edu.internet2.tier.shibboleth.admin.ui.envers.EnversVersionServiceSupport;
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 edu.internet2.tier.shibboleth.admin.ui.service.EnversMetadataResolverVersionService;
import edu.internet2.tier.shibboleth.admin.ui.service.MetadataResolverVersionService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand All @@ -16,7 +19,17 @@ public class EntitiesVersioningConfiguration {
private EntityManager entityManager;

@Bean
EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) {
public EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) {
return new EnversEntityDescriptorVersionService(entityManager, entityDescriptorService);
}

@Bean
public MetadataResolverVersionService metadataResolverVersionService() {
return new EnversMetadataResolverVersionService(enversVersionServiceSupport());
}

@Bean
public EnversVersionServiceSupport enversVersionServiceSupport() {
return new EnversVersionServiceSupport(entityManager);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
Expand Down
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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
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.versioning.Version;
import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

/**
* Hibernate Envers based implementation of {@link EntityDescriptorVersionService}.
* TODO: refactor this implementation using EnversVersionServiceSupport class
*/
public class EnversEntityDescriptorVersionService implements EntityDescriptorVersionService {

Expand Down
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;
}
}
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);
}

0 comments on commit ee068aa

Please sign in to comment.