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 75dfb5ded..b73448e5e 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 @@ -6,12 +6,16 @@ import org.springframework.context.annotation.Configuration; import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; @Configuration public class EntitiesVersioningConfiguration { + @PersistenceContext + private EntityManager entityManager; + @Bean - EntityDescriptorVersionService entityDescriptorVersionService(EntityManager entityManager) { + EntityDescriptorVersionService entityDescriptorVersionService() { return new EnversEntityDescriptorVersionService(entityManager); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java index 88e20179d..6a2847b38 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/PrincipalAwareRevisionEntity.java @@ -18,4 +18,8 @@ public class PrincipalAwareRevisionEntity extends DefaultTrackingModifiedEntitiesRevisionEntity { private String principalUserName; + + public String idAsString() { + return String.valueOf(getId()); + } } 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 c5cbabc27..123940f35 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 @@ -1,12 +1,22 @@ 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.versioning.Version; +import edu.internet2.tier.shibboleth.admin.ui.envers.PrincipalAwareRevisionEntity; import org.hibernate.envers.AuditReader; import org.hibernate.envers.AuditReaderFactory; +import org.hibernate.envers.RevisionEntity; +import org.hibernate.envers.query.AuditEntity; +import org.springframework.data.jpa.repository.JpaContext; import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * Hibernate Envers based implementation of {@link EntityDescriptorVersionService}. @@ -15,14 +25,31 @@ public class EnversEntityDescriptorVersionService implements EntityDescriptorVer private AuditReader auditReader; - public EnversEntityDescriptorVersionService(EntityManager em) { + private EntityManager entityManager; - this.auditReader = AuditReaderFactory.get(em); + public EnversEntityDescriptorVersionService(EntityManager entityManager) { + this.entityManager = entityManager; } @Override public List findVersionsForEntityDescriptor(String resourceId) { - return null; + List revs = AuditReaderFactory.get(entityManager).createQuery() + .forRevisionsOfEntity(EntityDescriptor.class, false, false) + .add(AuditEntity.property("resourceId").eq(resourceId)) + .getResultList(); + + //TODO: sort + Object revEntities = revs.stream() + .map(it -> (PrincipalAwareRevisionEntity)((Object[])it)[1]) + .map(it -> { + return new Version(((PrincipalAwareRevisionEntity) it).idAsString(), + ((PrincipalAwareRevisionEntity) it).getPrincipalUserName(), + ((PrincipalAwareRevisionEntity) it).getRevisionDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + }) + .collect(Collectors.toList()); + + + return (List)revEntities; } @Override diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionServiceTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionServiceTests.groovy new file mode 100644 index 000000000..426c5eb6e --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionServiceTests.groovy @@ -0,0 +1,63 @@ +package edu.internet2.tier.shibboleth.admin.ui.service + +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.frontend.ContactRepresentation +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.envers.EnversTestsSupport +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 static edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport.* +import static edu.internet2.tier.shibboleth.admin.ui.repository.envers.EnversTestsSupport.doInExplicitTransaction + +@DataJpaTest +@ContextConfiguration(classes = [CoreShibUiConfiguration, InternationalizationConfiguration, TestConfiguration, SearchConfiguration, EntitiesVersioningConfiguration]) +@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) +@EntityScan("edu.internet2.tier.shibboleth.admin.ui") +class EnversEntityDescriptorVersionServiceTests extends Specification { + + @Autowired + EntityDescriptorVersionService entityDescriptorVersionService + + @Autowired + EntityDescriptorRepository entityDescriptorRepository + + @Autowired + EntityDescriptorService entityDescriptorService + + @Autowired + PlatformTransactionManager txMgr + + def "temp test"() { + def representation = new EntityDescriptorRepresentation().with { + it.contacts = [new ContactRepresentation(type: 'administrative', name: 'name', emailAddress: 'test@test')] + it + } + EntityDescriptor ed = entityDescriptorService.createDescriptorFromRepresentation(representation) + ed = doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + + ed.entityID = "Entity ID" + ed = doInExplicitTransaction(txMgr) { + entityDescriptorRepository.save(ed) + } + + def versions = entityDescriptorVersionService.findVersionsForEntityDescriptor(ed.resourceId) + + expect: + true + } +}