From 4b05a567462e47f4d5f167319e25fdf3ffe94fa8 Mon Sep 17 00:00:00 2001 From: Dmitriy Kopylenko Date: Fri, 1 Jun 2018 12:44:31 -0400 Subject: [PATCH] SHIBUI-522: refactoring REST controller for polymorphic filters endpoints --- .../filters/EntityAttributesFilter.java | 4 +++ .../filters/EntityRoleWhiteListFilter.java | 6 ++++ .../ui/domain/filters/MetadataFilter.java | 6 ++-- .../MetadataFiltersControllerTests.groovy | 13 +++---- ...ymorphicFiltersJacksonHandlingTests.groovy | 13 ++++++- .../admin/ui/util/TestObjectGenerator.groovy | 34 ++++++++++++++----- 6 files changed, 58 insertions(+), 18 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java index 4b6557071..c73710ddb 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityAttributesFilter.java @@ -1,6 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import edu.internet2.tier.shibboleth.admin.ui.domain.Attribute; import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.RelyingPartyOverridesRepresentation; import edu.internet2.tier.shibboleth.admin.util.MDDCConstants; @@ -37,6 +38,9 @@ @ToString public class EntityAttributesFilter extends MetadataFilter { + @JsonProperty("@type") + private final transient String type = "EntityAttributesFilter"; + @OneToOne(cascade = CascadeType.ALL) private EntityAttributesFilterTarget entityAttributesFilterTarget; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityRoleWhiteListFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityRoleWhiteListFilter.java index f2cc7d4c8..1d9d502b4 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityRoleWhiteListFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/EntityRoleWhiteListFilter.java @@ -1,5 +1,8 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -22,6 +25,9 @@ @ToString public class EntityRoleWhiteListFilter extends MetadataFilter { + @JsonProperty("@type") + private final transient String type = "EntityRoleWhiteList"; + private Boolean removeRolelessEntityDescriptors = true; private Boolean removeEmptyEntitiesDescriptors = true; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java index ea6eba2a3..fec19468f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/MetadataFilter.java @@ -26,9 +26,9 @@ @Getter @Setter @ToString -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") -@JsonSubTypes({@JsonSubTypes.Type(value=EntityRoleWhiteListFilter.class, name="EntityRoleWhiteList"), - @JsonSubTypes.Type(value=EntityAttributesFilter.class, name="EntityAttributesFilter")}) +//@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") +/*@JsonSubTypes({@JsonSubTypes.Type(value=EntityRoleWhiteListFilter.class, name="EntityRoleWhiteList"), + @JsonSubTypes.Type(value=EntityAttributesFilter.class, name="EntityAttributesFilter")})*/ public class MetadataFilter extends AbstractAuditable { private String name; diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy index 8986d0346..9ff6d290b 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersControllerTests.groovy @@ -6,6 +6,7 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfigurat 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.domain.filters.EntityAttributesFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.MetadataResolver import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository import edu.internet2.tier.shibboleth.admin.ui.service.FilterService @@ -82,10 +83,10 @@ class MetadataFiltersControllerTests extends Specification { mockMvc = MockMvcBuilders.standaloneSetup(controller).build() } - def "FilterController.getAll gets all filters"() { + def "FilterController.getAll gets all available types of filters"() { given: def metadataResolver = new MetadataResolver() - def expectedContent = testObjectGenerator.buildFilterList() + List expectedContent = testObjectGenerator.buildAllTypesOfFilterList() metadataResolver.setMetadataFilters(expectedContent) List metadataResolverList = [metadataResolver] 1 * metadataResolverRepository.findAll() >> metadataResolverList @@ -106,7 +107,7 @@ class MetadataFiltersControllerTests extends Specification { def "FilterController.getOne gets the desired filter"() { given: def metadataResolver = new MetadataResolver() - metadataResolver.setMetadataFilters(testObjectGenerator.buildFilterList()) + metadataResolver.setMetadataFilters(testObjectGenerator.buildAllTypesOfFilterList()) List metadataResolverList = [metadataResolver] 1 * metadataResolverRepository.findAll() >> metadataResolverList @@ -133,7 +134,7 @@ class MetadataFiltersControllerTests extends Specification { def randomFilter = testObjectGenerator.buildEntityAttributesFilter() def metadataResolver = new MetadataResolver() metadataResolver.setResourceId(randomGenerator.randomId()) - metadataResolver.setMetadataFilters(testObjectGenerator.buildFilterList()) + metadataResolver.setMetadataFilters(testObjectGenerator.buildAllTypesOfFilterList()) def metadataResolverWithFilter = new MetadataResolver() metadataResolverWithFilter.resourceId = metadataResolver.resourceId metadataResolverWithFilter.metadataFilters = metadataResolver.metadataFilters.collect() @@ -174,7 +175,7 @@ class MetadataFiltersControllerTests extends Specification { def originalMetadataResolver = new MetadataResolver() originalMetadataResolver.setResourceId(randomGenerator.randomId()) - originalMetadataResolver.setMetadataFilters(testObjectGenerator.buildFilterList()) + originalMetadataResolver.setMetadataFilters(testObjectGenerator.buildAllTypesOfFilterList()) def updatedMetadataResolver = new MetadataResolver() updatedMetadataResolver.setResourceId(originalMetadataResolver.getResourceId()) updatedMetadataResolver.setMetadataFilters(originalMetadataResolver.getMetadataFilters().collect()) @@ -209,7 +210,7 @@ class MetadataFiltersControllerTests extends Specification { def originalMetadataResolver = new MetadataResolver() originalMetadataResolver.setResourceId(randomGenerator.randomId()) - originalMetadataResolver.setMetadataFilters(testObjectGenerator.buildFilterList()) + originalMetadataResolver.setMetadataFilters(testObjectGenerator.buildAllTypesOfFilterList()) originalMetadataResolver.getMetadataFilters().add(randomFilter) 1 * metadataResolverRepository.findAll() >> [originalMetadataResolver] diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy index d6a621920..270fb4402 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/domain/PolymorphicFiltersJacksonHandlingTests.groovy @@ -66,7 +66,7 @@ class PolymorphicFiltersJacksonHandlingTests extends Specification { def "Correct polymorphic serialization of EntityAttributesFilter"() { given: - def simulatedPersistentFilter = testObjectGenerator.buildEntityAttributesFilter() + def simulatedPersistentFilter = testObjectGenerator.entityAttributesFilter() simulatedPersistentFilter.intoTransientRepresentation() def simulatedPrePersistentFilter = new EntityAttributesFilter() @@ -85,7 +85,18 @@ class PolymorphicFiltersJacksonHandlingTests extends Specification { then: simulatedPersistentFilter.attributes.size() == simulatedPrePersistentFilter.attributes.size() + } + + def "List of filters with correct types"() { + given: + def filters = [testObjectGenerator.entityRoleWhitelistFilter()] + when: + def json = mapper.writeValueAsString(filters) + println(json) + + then: + json } 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 e9bfe60c8..4d7e86e42 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 @@ -9,6 +9,8 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.LocalizedName import edu.internet2.tier.shibboleth.admin.ui.domain.OrganizationDisplayName import edu.internet2.tier.shibboleth.admin.ui.domain.OrganizationName import edu.internet2.tier.shibboleth.admin.ui.domain.OrganizationURL +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter +import edu.internet2.tier.shibboleth.admin.ui.domain.filters.MetadataFilter import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.FilterRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.FilterTargetRepresentation import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.RelyingPartyOverridesRepresentation @@ -16,6 +18,8 @@ import edu.internet2.tier.shibboleth.admin.util.AttributeUtility import edu.internet2.tier.shibboleth.admin.util.MDDCConstants import org.opensaml.saml.saml2.metadata.Organization +import java.util.function.Supplier + /** * @author Bill Smith (wsmith@unicon.net) */ @@ -29,23 +33,37 @@ class TestObjectGenerator { this.attributeUtility = attributeUtility } - List buildFilterList() { - List filterList = new ArrayList<>() + List buildAllTypesOfFilterList() { + List filterList = new ArrayList<>() (1..generator.randomInt(4, 10)).each { - filterList.add(buildEntityAttributesFilter()) + filterList.add(buildFilter { entityAttributesFilter() }) + filterList.add(buildFilter { entityRoleWhitelistFilter() }) } return filterList } - EntityAttributesFilter buildEntityAttributesFilter() { - EntityAttributesFilter filter = new EntityAttributesFilter() + EntityRoleWhiteListFilter entityRoleWhitelistFilter() { + new EntityRoleWhiteListFilter().with { + it.retainedRoles = ['role1', 'role2'] + it.removeRolelessEntityDescriptors = true + it + } + } + EntityAttributesFilter entityAttributesFilter() { + new EntityAttributesFilter().with { + it.setEntityAttributesFilterTarget(buildEntityAttributesFilterTarget()) + it.setAttributes(buildAttributesList()) + it.intoTransientRepresentation() + it + } + } + + MetadataFilter buildFilter(Supplier filterSupplier) { + MetadataFilter filter = filterSupplier.get() filter.setName(generator.randomString(10)) filter.setFilterEnabled(generator.randomBoolean()) filter.setResourceId(generator.randomId()) - filter.setEntityAttributesFilterTarget(buildEntityAttributesFilterTarget()) - filter.setAttributes(buildAttributesList()) - return filter }