From 0d63979d17e9a64b3e8dea4a2d31df9daff3b750 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 25 May 2021 12:09:37 -0700 Subject: [PATCH] SHIBUI-1783 Refactored filters to move object specific code out of caller (which was checking by type to do type logic) to the actual subtypes themselves --- .../controller/MetadataFiltersController.java | 45 +------------------ .../filters/EntityAttributesFilter.java | 12 +++++ .../filters/EntityRoleWhiteListFilter.java | 28 +++++++++--- .../filters/IConcreteMetadataFilterType.java | 14 ++++++ .../ui/domain/filters/MetadataFilter.java | 2 +- .../ui/domain/filters/NameIdFormatFilter.java | 26 ++++++++--- .../filters/RequiredValidUntilFilter.java | 17 +++++-- .../filters/SignatureValidationFilter.java | 23 ++++++++-- 8 files changed, 103 insertions(+), 64 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/IConcreteMetadataFilterType.java diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java index 87c7a8bd3..33d4458b5 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/MetadataFiltersController.java @@ -125,7 +125,7 @@ public ResponseEntity update(@PathVariable String metadataResolverId, filterTobeUpdated.setName(updatedFilter.getName()); filterTobeUpdated.setFilterEnabled(updatedFilter.isFilterEnabled()); - updateConcreteFilterTypeData(filterTobeUpdated, updatedFilter); + updatedFilter.updateConcreteFilterTypeData(filterTobeUpdated); MetadataFilter persistedFilter = filterRepository.save(filterTobeUpdated); @@ -206,49 +206,6 @@ private MetadataFilter newlyPersistedFilter(Stream filters, fina return persistedFilter; } - /** - * Add else if instanceof block here for each concrete filter types we add in the future - */ - private void updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated, MetadataFilter filterWithUpdatedData) { - //TODO: Could we maybe use Dozer here before things get out of control? https://dozermapper.github.io - // Mapper mapper = new net.sf.dozer.Mapper(); // or autowire one - // mapper.map(fromFilter, toFilter); - if (filterWithUpdatedData instanceof EntityAttributesFilter) { - EntityAttributesFilter toFilter = EntityAttributesFilter.class.cast(filterToBeUpdated); - EntityAttributesFilter fromFilter = EntityAttributesFilter.class.cast(filterWithUpdatedData); - toFilter.setEntityAttributesFilterTarget(fromFilter.getEntityAttributesFilterTarget()); - toFilter.setRelyingPartyOverrides(fromFilter.getRelyingPartyOverrides()); - toFilter.setAttributeRelease(fromFilter.getAttributeRelease()); - } else if (filterWithUpdatedData instanceof EntityRoleWhiteListFilter) { - EntityRoleWhiteListFilter toFilter = EntityRoleWhiteListFilter.class.cast(filterToBeUpdated); - EntityRoleWhiteListFilter fromFilter = EntityRoleWhiteListFilter.class.cast(filterWithUpdatedData); - toFilter.setRemoveEmptyEntitiesDescriptors(fromFilter.getRemoveEmptyEntitiesDescriptors()); - toFilter.setRemoveRolelessEntityDescriptors(fromFilter.getRemoveRolelessEntityDescriptors()); - toFilter.setRetainedRoles(fromFilter.getRetainedRoles()); - } else if (filterWithUpdatedData instanceof SignatureValidationFilter) { - SignatureValidationFilter toFilter = SignatureValidationFilter.class.cast(filterToBeUpdated); - SignatureValidationFilter fromFilter = SignatureValidationFilter.class.cast(filterWithUpdatedData); - toFilter.setRequireSignedRoot(fromFilter.getRequireSignedRoot()); - toFilter.setCertificateFile(fromFilter.getCertificateFile()); - toFilter.setDefaultCriteriaRef(fromFilter.getDefaultCriteriaRef()); - toFilter.setSignaturePrevalidatorRef(fromFilter.getSignaturePrevalidatorRef()); - toFilter.setDynamicTrustedNamesStrategyRef(fromFilter.getDynamicTrustedNamesStrategyRef()); - toFilter.setTrustEngineRef(fromFilter.getTrustEngineRef()); - toFilter.setPublicKey(fromFilter.getPublicKey()); - } else if (filterWithUpdatedData instanceof RequiredValidUntilFilter) { - RequiredValidUntilFilter toFilter = RequiredValidUntilFilter.class.cast(filterToBeUpdated); - RequiredValidUntilFilter fromFilter = RequiredValidUntilFilter.class.cast(filterWithUpdatedData); - toFilter.setMaxValidityInterval(fromFilter.getMaxValidityInterval()); - } else if (filterWithUpdatedData instanceof NameIdFormatFilter) { - NameIdFormatFilter toFilter = NameIdFormatFilter.class.cast(filterToBeUpdated); - NameIdFormatFilter fromFilter = NameIdFormatFilter.class.cast(filterWithUpdatedData); - toFilter.setRemoveExistingFormats(fromFilter.getRemoveExistingFormats()); - toFilter.setFormats(fromFilter.getFormats()); - toFilter.setNameIdFormatFilterTarget(fromFilter.getNameIdFormatFilterTarget()); - } - //TODO: add other types of concrete filters update here - } - private static URI getResourceUriFor(MetadataResolver mr, String filterResourceId) { return ServletUriComponentsBuilder .fromCurrentServletMapping().path("/api/MetadataResolvers/") 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 a3e0a6a93..83ce3a66e 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 @@ -75,4 +75,16 @@ public void intoTransientRepresentation() { this.attributeRelease = getAttributeReleaseListFromAttributeList(this.attributes); this.relyingPartyOverrides = getRelyingPartyOverridesRepresentationFromAttributeList(this.attributes); } + + private EntityAttributesFilter updateConcreteFilterTypeData(EntityAttributesFilter filterToBeUpdated) { + filterToBeUpdated.setEntityAttributesFilterTarget(getEntityAttributesFilterTarget()); + filterToBeUpdated.setRelyingPartyOverrides(getRelyingPartyOverrides()); + filterToBeUpdated.setAttributeRelease(getAttributeRelease()); + return filterToBeUpdated; + } + + @Override + public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) { + return updateConcreteFilterTypeData((EntityAttributesFilter) filterToBeUpdated); + } } 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 26c5e9976..0ac107dda 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,10 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -import org.hibernate.envers.Audited; +import java.util.ArrayList; +import java.util.List; import javax.persistence.CollectionTable; import javax.persistence.Column; @@ -12,8 +9,13 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OrderColumn; -import java.util.ArrayList; -import java.util.List; + +import org.hibernate.envers.Audited; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; @Entity @EqualsAndHashCode(callSuper = true) @@ -36,4 +38,16 @@ public EntityRoleWhiteListFilter() { @Column(name="RETAINED_ROLE") @OrderColumn private List retainedRoles = new ArrayList<>(); + + private EntityRoleWhiteListFilter updateConcreteFilterTypeData(EntityRoleWhiteListFilter filterToBeUpdated) { + filterToBeUpdated.setRemoveEmptyEntitiesDescriptors(getRemoveEmptyEntitiesDescriptors()); + filterToBeUpdated.setRemoveRolelessEntityDescriptors(getRemoveRolelessEntityDescriptors()); + filterToBeUpdated.setRetainedRoles(getRetainedRoles()); + return filterToBeUpdated; + } + + @Override + public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) { + return updateConcreteFilterTypeData((EntityRoleWhiteListFilter) filterToBeUpdated); + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/IConcreteMetadataFilterType.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/IConcreteMetadataFilterType.java new file mode 100644 index 000000000..1f1448ff4 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/IConcreteMetadataFilterType.java @@ -0,0 +1,14 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.filters; + +/** + * Concrete implementations of the MetadataFilter should implement the updateConcreteFilterTypeData signature to + * populate specific type data from the existing filter to the target filter. + */ +public interface IConcreteMetadataFilterType { + + /** + * @param filterToBeUpdated the target of the data + * @return the filterToBeUpdated with the updated information from the existing filter + */ + T updateConcreteFilterTypeData(T filterToBeUpdated); +} 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 b15058cd0..9363f5711 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 @@ -38,7 +38,7 @@ @JsonSubTypes.Type(value=NameIdFormatFilter.class, name="NameIDFormat")}) @Audited @AuditOverride(forClass = AbstractAuditable.class) -public class MetadataFilter extends AbstractAuditable { +public abstract class MetadataFilter extends AbstractAuditable implements IConcreteMetadataFilterType { @JsonProperty("@type") @Transient diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/NameIdFormatFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/NameIdFormatFilter.java index 157e5f766..906926916 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/NameIdFormatFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/NameIdFormatFilter.java @@ -1,17 +1,19 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; -import org.hibernate.envers.Audited; +import java.util.List; import javax.persistence.CascadeType; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.OneToOne; import javax.persistence.OrderColumn; -import java.util.List; + +import org.hibernate.envers.Audited; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; @Entity @EqualsAndHashCode(callSuper = true) @@ -34,4 +36,16 @@ public NameIdFormatFilter() { @OneToOne(cascade = CascadeType.ALL) private NameIdFormatFilterTarget nameIdFormatFilterTarget; + private NameIdFormatFilter updateConcreteFilterTypeData(NameIdFormatFilter filterToBeUpdated) { + filterToBeUpdated.setRemoveExistingFormats(getRemoveExistingFormats()); + filterToBeUpdated.setFormats(getFormats()); + filterToBeUpdated.setNameIdFormatFilterTarget(getNameIdFormatFilterTarget()); + return filterToBeUpdated; + } + + @Override + public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) { + return updateConcreteFilterTypeData((NameIdFormatFilter) filterToBeUpdated); + } + } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/RequiredValidUntilFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/RequiredValidUntilFilter.java index cda431408..80e6152aa 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/RequiredValidUntilFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/RequiredValidUntilFilter.java @@ -1,12 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; +import javax.persistence.Entity; + +import org.hibernate.envers.Audited; + import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.hibernate.envers.Audited; - -import javax.persistence.Entity; @Entity @EqualsAndHashCode(callSuper = true) @@ -25,4 +26,14 @@ public RequiredValidUntilFilter() { public boolean xmlShouldBeGenerated() { return (maxValidityInterval != null) && (!maxValidityInterval.equals("PT0S")); } + + private RequiredValidUntilFilter updateConcreteFilterTypeData(RequiredValidUntilFilter filterToBeUpdated) { + filterToBeUpdated.setMaxValidityInterval(getMaxValidityInterval()); + return filterToBeUpdated; + } + + @Override + public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) { + return updateConcreteFilterTypeData((RequiredValidUntilFilter) filterToBeUpdated); + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/SignatureValidationFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/SignatureValidationFilter.java index 5cf71225e..cf6aa3151 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/SignatureValidationFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/filters/SignatureValidationFilter.java @@ -1,12 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.domain.filters; +import javax.persistence.Entity; + +import org.hibernate.envers.Audited; + import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.hibernate.envers.Audited; - -import javax.persistence.Entity; @Entity @EqualsAndHashCode(callSuper = true) @@ -37,4 +38,20 @@ public SignatureValidationFilter() { public boolean xmlShouldBeGenerated() { return requireSignedRoot; } + + private SignatureValidationFilter updateConcreteFilterTypeData(SignatureValidationFilter filterToBeUpdated) { + filterToBeUpdated.setRequireSignedRoot(getRequireSignedRoot()); + filterToBeUpdated.setCertificateFile(getCertificateFile()); + filterToBeUpdated.setDefaultCriteriaRef(getDefaultCriteriaRef()); + filterToBeUpdated.setSignaturePrevalidatorRef(getSignaturePrevalidatorRef()); + filterToBeUpdated.setDynamicTrustedNamesStrategyRef(getDynamicTrustedNamesStrategyRef()); + filterToBeUpdated.setTrustEngineRef(getTrustEngineRef()); + filterToBeUpdated.setPublicKey(getPublicKey()); + return filterToBeUpdated; + } + + @Override + public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) { + return updateConcreteFilterTypeData((SignatureValidationFilter) filterToBeUpdated); + } }