diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index 8f530bdd6..1d23d5113 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.domain; +import lombok.EqualsAndHashCode; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import org.springframework.data.annotation.CreatedBy; @@ -20,6 +21,7 @@ @MappedSuperclass @EntityListeners(AuditingEntityListener.class) +@EqualsAndHashCode public abstract class AbstractAuditable implements Auditable { @Id diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractElementExtensibleXMLObject.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractElementExtensibleXMLObject.java index 831501ecd..605cf718d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractElementExtensibleXMLObject.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractElementExtensibleXMLObject.java @@ -9,6 +9,7 @@ import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; @@ -19,6 +20,7 @@ @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class AbstractElementExtensibleXMLObject extends AbstractXMLObject implements ElementExtensibleXMLObject { @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List unknownXMLObjects = new ArrayList<>(); @Nonnull diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AffiliationDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AffiliationDescriptor.java index d97969c77..a96bd7dd6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AffiliationDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AffiliationDescriptor.java @@ -7,6 +7,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.List; @@ -19,10 +20,12 @@ public class AffiliationDescriptor extends AbstractDescriptor implements org.ope @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "affildesc_affilmemb_id") + @OrderColumn private List affiliateMembers; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "affildesc_keydesc_id") + @OrderColumn private List keyDescriptors; @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Attribute.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Attribute.java index b69b74254..45e1500e9 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Attribute.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Attribute.java @@ -7,6 +7,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -23,6 +24,7 @@ public class Attribute extends AbstractAttributeExtensibleXMLObject implements o private String friendlyName; @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List attributeValues = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeAuthorityDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeAuthorityDescriptor.java index 2dc4d89e4..57666aaad 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeAuthorityDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeAuthorityDescriptor.java @@ -6,6 +6,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; @@ -16,22 +17,27 @@ public class AttributeAuthorityDescriptor extends RoleDescriptor implements org. @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribauthdesc_attribserv_id") + @OrderColumn private List attributeServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribauthdesc_assertidreqservc_id") + @OrderColumn private List assertionIDRequestServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribauthdesc_nameidfrmt_id") + @OrderColumn private List nameIDFormats = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribauthdesc_attribprofile_id") + @OrderColumn private List attributeProfiles = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribauthdesc_attrib_id") + @OrderColumn private List attributes = new ArrayList<>(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java index dc557400b..5080c1fc0 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java @@ -7,6 +7,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; @@ -21,14 +22,17 @@ public class AttributeConsumingService extends AbstractXMLObject implements org. @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribconsserv_servicename_id") + @OrderColumn private List serviceNames = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribconsserv_servicedesc_id") + @OrderColumn private List serviceDescriptions = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "attribconsserv_requestedattrib_id") + @OrderColumn private List requestedAttributes = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AuthnAuthorityDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AuthnAuthorityDescriptor.java index 240705132..51e1f8271 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AuthnAuthorityDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AuthnAuthorityDescriptor.java @@ -7,6 +7,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.List; @@ -16,14 +17,17 @@ public class AuthnAuthorityDescriptor extends RoleDescriptor implements org.open @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "authnauthdesc_authnqueryserv_id") + @OrderColumn private List authnQueryServices; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "authnauthdesc_assertidreqserv_id") + @OrderColumn private List assertionIDRequestServices; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "authnauthdesc_nameidfmt_id") + @OrderColumn private List nameIDFormats; @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/ContactPerson.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/ContactPerson.java index e266a5555..104dc076f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/ContactPerson.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/ContactPerson.java @@ -30,10 +30,12 @@ public class ContactPerson extends AbstractAttributeExtensibleXMLObject implemen @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "contactpersn_emailaddr_id") + @OrderColumn private List emailAddresses = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "contactpersn_telenmbr_id") + @OrderColumn private List telephoneNumbers = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributes.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributes.java index 8290dcf40..ed97305fc 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributes.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributes.java @@ -8,6 +8,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.persistence.Transient; import java.util.ArrayList; import java.util.Collections; @@ -18,6 +19,7 @@ public class EntityAttributes extends AbstractElementExtensibleXMLObject implements org.opensaml.saml.ext.saml2mdattr.EntityAttributes { @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List attributes = new ArrayList<>(); @Transient // TODO: check to make sure this won't ever be used diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilter.java index 0724a75ea..10569f53e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilter.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilter.java @@ -6,6 +6,7 @@ import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.OneToOne; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,7 @@ public class EntityAttributesFilter extends MetadataFilter { private EntityAttributesFilterTarget entityAttributesFilterTarget; @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List attributes = new ArrayList<>(); public EntityAttributesFilterTarget getEntityAttributesFilterTarget() { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilterTarget.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilterTarget.java index 7b19b072e..c13c1a755 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilterTarget.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityAttributesFilterTarget.java @@ -6,6 +6,7 @@ import javax.persistence.ElementCollection; import javax.persistence.Entity; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; @@ -21,6 +22,7 @@ public enum EntityAttributesFilterTargetType { private EntityAttributesFilterTargetType entityAttributesFilterTargetType; @ElementCollection + @OrderColumn private List value; public EntityAttributesFilterTargetType getEntityAttributesFilterTargetType() { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java index f8bdd9737..67832c1b8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/EntityDescriptor.java @@ -14,6 +14,7 @@ import javax.persistence.Entity; import javax.persistence.OneToMany; import javax.persistence.OneToOne; +import javax.persistence.OrderColumn; import javax.persistence.Transient; import javax.xml.namespace.QName; @@ -42,13 +43,16 @@ public class EntityDescriptor extends AbstractDescriptor implements org.opensaml private Organization organization; @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List contactPersons = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List roleDescriptors; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "entitydesc_addlmetdatlocations_id") + @OrderColumn private List additionalMetadataLocations = new ArrayList<>(); @OneToOne(cascade = CascadeType.ALL) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/IDPSSODescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/IDPSSODescriptor.java index 2074110e5..b43745721 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/IDPSSODescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/IDPSSODescriptor.java @@ -7,6 +7,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; @@ -19,22 +20,27 @@ public class IDPSSODescriptor extends SSODescriptor implements org.opensaml.saml @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "idpssodesc_ssoserv_id") + @OrderColumn private List singleSignOnServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "idpssodesc_nameidmapserv_id") + @OrderColumn private List nameIDMappingServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "idpssodesc_asseridreqserv_id") + @OrderColumn private List assertionIDRequestServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "idpssodesc_attribprofile_id") + @OrderColumn private List attributeProfiles = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "idpssodesc_attrib_id") + @OrderColumn private List attributes = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyDescriptor.java index 0e3a4481e..74ddbaa2c 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyDescriptor.java @@ -23,6 +23,7 @@ public class KeyDescriptor extends AbstractXMLObject implements org.opensaml.sam @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "keydesc_encryptionmethod_id") + @OrderColumn private List encryptionMethods = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyInfo.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyInfo.java index 91fb325ee..7ea604d17 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyInfo.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/KeyInfo.java @@ -19,6 +19,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Arrays; @@ -31,6 +32,7 @@ public class KeyInfo extends AbstractXMLObject implements org.opensaml.xmlsec.signature.KeyInfo { @OneToMany(cascade = CascadeType.ALL) + @OrderColumn List xmlObjects = new ArrayList<>(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Keywords.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Keywords.java index 7b918ae9a..cf68af0f1 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Keywords.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Keywords.java @@ -5,12 +5,14 @@ import javax.annotation.Nullable; import javax.persistence.ElementCollection; import javax.persistence.Entity; +import javax.persistence.OrderColumn; import java.util.List; @Entity @EqualsAndHashCode(callSuper = true) public class Keywords extends AbstractXMLObject implements org.opensaml.saml.ext.saml2mdui.Keywords { @ElementCollection + @OrderColumn private List keywords; private String xmlLang; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/MetadataResolver.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/MetadataResolver.java index 9d5288dbc..96a5526c0 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/MetadataResolver.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/MetadataResolver.java @@ -5,6 +5,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -16,6 +17,7 @@ public class MetadataResolver extends AbstractAuditable { private String resourceId = UUID.randomUUID().toString(); @OneToMany(cascade = CascadeType.ALL) + @OrderColumn private List metadataFilters = new ArrayList<>(); public String getName() { diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Organization.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Organization.java index 1e52e0260..1e11b499e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Organization.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Organization.java @@ -18,14 +18,17 @@ public class Organization extends AbstractAttributeExtensibleXMLObject implement @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "org_orgname_id") + @OrderColumn private List organizationNames = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "org_orgdisplayname_id") + @OrderColumn private List organizationDisplayNames = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "org_orgurl_id") + @OrderColumn private List organizationURLs = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/PDPDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/PDPDescriptor.java index 45053fc71..2942a5063 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/PDPDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/PDPDescriptor.java @@ -7,6 +7,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import java.util.List; @@ -16,14 +17,17 @@ public class PDPDescriptor extends RoleDescriptor implements org.opensaml.saml.s @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "pdpdesc_authzserv_id") + @OrderColumn private List authzServices; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "pdpdesc_assertidreqserv_id") + @OrderColumn private List assertionIDRequestServices; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "pdpdesc_nameidfmt_id") + @OrderColumn private List nameIDFormats; @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RoleDescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RoleDescriptor.java index 4647c8d47..fa6600543 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RoleDescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RoleDescriptor.java @@ -10,6 +10,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.persistence.Transient; import javax.persistence.ElementCollection; import javax.persistence.JoinColumn; @@ -23,14 +24,16 @@ import java.util.List; @Entity -@EqualsAndHashCode(callSuper = true) +@EqualsAndHashCode(callSuper = true, exclude={"unknownAttributes"}) public class RoleDescriptor extends AbstractDescriptor implements org.opensaml.saml.saml2.metadata.RoleDescriptor { @ElementCollection + @OrderColumn private List supportedProtocols = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "roledesc_keydesc_id") + @OrderColumn private List keyDescriptors = new ArrayList<>(); // TODO: implement @OneToOne(cascade = CascadeType.ALL) @@ -38,10 +41,12 @@ public class RoleDescriptor extends AbstractDescriptor implements org.opensaml.s @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "roledesc_contactperson_id") + @OrderColumn private List contactPersons = new ArrayList<>(); // TODO: implement @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "roledesc_endpoint_id") + @OrderColumn private List endpoints = new ArrayList<>(); private boolean isSupportedProtocol; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java index aeae0164e..5688a19cb 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java @@ -21,10 +21,12 @@ public class SPSSODescriptor extends SSODescriptor implements org.opensaml.saml. @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "spssodesc_attribconsserv_id") + @OrderColumn private List attributeConsumingServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "spssodesc_assertconsserv_id") + @OrderColumn private List assertionConsumerServices = new ArrayList<>(); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SSODescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SSODescriptor.java index 1674b7d99..1f34fc931 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SSODescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SSODescriptor.java @@ -9,6 +9,7 @@ import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.persistence.Transient; import java.util.ArrayList; import java.util.Collections; @@ -20,18 +21,22 @@ public class SSODescriptor extends RoleDescriptor implements org.opensaml.saml.s @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "ssodesc_artifctresserv_id") + @OrderColumn private List artifactResolutionServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "ssodesc_singlelogoutserv_id") + @OrderColumn private List singleLogoutServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "ssodesc_managenameidserv_id") + @OrderColumn private List manageNameIDServices = new ArrayList<>(); @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "ssodesc_nameidfmt_id") + @OrderColumn private List nameIDFormats = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java index 54b1da0b9..77b0dbd79 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/UIInfo.java @@ -14,6 +14,7 @@ import javax.annotation.Nullable; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; @@ -24,6 +25,7 @@ public class UIInfo extends AbstractXMLObject implements org.opensaml.saml.ext.saml2mdui.UIInfo { @OneToMany @Cascade(CascadeType.ALL) + @OrderColumn private List xmlObjects = new ArrayList<>(); @Override diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/X509Data.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/X509Data.java index dabb50332..10fc4bdb7 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/X509Data.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/X509Data.java @@ -14,6 +14,7 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Arrays; @@ -24,6 +25,7 @@ @EqualsAndHashCode(callSuper = true) public class X509Data extends AbstractXMLObject implements org.opensaml.xmlsec.signature.X509Data { @OneToMany(cascade = CascadeType.ALL) + @OrderColumn List xmlObjects = new ArrayList<>(); @Nonnull diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EnityDescriptorRepositoryTest.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EnityDescriptorRepositoryTest.groovy new file mode 100644 index 000000000..9237228e2 --- /dev/null +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/EnityDescriptorRepositoryTest.groovy @@ -0,0 +1,55 @@ +package edu.internet2.tier.shibboleth.admin.ui.repository + +import edu.internet2.tier.shibboleth.admin.ui.configuration.CoreShibUiConfiguration +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.EntityDescriptor +import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects +import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl +import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityServiceImpl +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.annotation.DirtiesContext +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification + +import javax.persistence.EntityManager + +/** + * A highly unnecessary test so that I can check to make sure that persistence is correct for the model + */ +@DataJpaTest +@ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, MetadataResolverConfiguration]) +@EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) +@EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) +class EnityDescriptorRepositoryTest extends Specification { + @Autowired + EntityDescriptorRepository entityDescriptorRepository + + @Autowired + EntityManager entityManager + + OpenSamlObjects openSamlObjects = new OpenSamlObjects().with { + init() + it + } + + def service = new JPAEntityDescriptorServiceImpl(openSamlObjects, new JPAEntityServiceImpl(openSamlObjects)) + + def "SHIBUI-553.2"() { + when: + def input = openSamlObjects.unmarshalFromXml(this.class.getResource('/metadata/SHIBUI-553.2.xml').bytes) as EntityDescriptor + + entityDescriptorRepository.save(input) + + def item1 = entityDescriptorRepository.findByResourceId(input.resourceId) + entityManager.clear() + def item2 = entityDescriptorRepository.findByResourceId(input.resourceId) + + then: + item1.hashCode() == item2.hashCode() + } +} diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTest.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTest.groovy index 713471f48..7e35f655e 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTest.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/repository/MetadataResolverRepositoryTest.groovy @@ -6,13 +6,19 @@ import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration import edu.internet2.tier.shibboleth.admin.ui.domain.EntityAttributesFilter import edu.internet2.tier.shibboleth.admin.ui.domain.EntityAttributesFilterTarget import edu.internet2.tier.shibboleth.admin.ui.domain.MetadataResolver +import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects +import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl +import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityServiceImpl 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.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration import spock.lang.Specification +import javax.persistence.EntityManager + /** * A highly unnecessary test so that I can check to make sure that persistence is correct for the model */ @@ -20,10 +26,21 @@ import spock.lang.Specification @ContextConfiguration(classes=[CoreShibUiConfiguration, SearchConfiguration, MetadataResolverConfiguration]) @EnableJpaRepositories(basePackages = ["edu.internet2.tier.shibboleth.admin.ui"]) @EntityScan("edu.internet2.tier.shibboleth.admin.ui") +@DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD) class MetadataResolverRepositoryTest extends Specification { @Autowired MetadataResolverRepository metadataResolverRepository + @Autowired + EntityManager entityManager + + OpenSamlObjects openSamlObjects = new OpenSamlObjects().with { + init() + it + } + + def service = new JPAEntityDescriptorServiceImpl(openSamlObjects, new JPAEntityServiceImpl(openSamlObjects)) + def "test persisting a metadata resolver"() { when: def mdr = new MetadataResolver().with { @@ -49,4 +66,28 @@ class MetadataResolverRepositoryTest extends Specification { item.metadataFilters.get(0).entityAttributesFilterTarget.value.size() == 1 item.metadataFilters.get(0).entityAttributesFilterTarget.value.get(0) == "hola" } + + def "SHIBUI-553"() { + when: + def mdr = new MetadataResolver().with { + it.name = "testme" + it.metadataFilters.add(new EntityAttributesFilter().with { + it.entityAttributesFilterTarget = new EntityAttributesFilterTarget().with { + it.entityAttributesFilterTargetType = EntityAttributesFilterTarget.EntityAttributesFilterTargetType.ENTITY + it.setValue(["hola"]) + return it + } + return it + }) + return it + } + metadataResolverRepository.save(mdr) + + def item1 = metadataResolverRepository.findByName('testme') + entityManager.clear() + def item2 = metadataResolverRepository.findByName('testme') + + then: + item1.hashCode() == item2.hashCode() + } } diff --git a/backend/src/test/resources/metadata/SHIBUI-553.2.xml b/backend/src/test/resources/metadata/SHIBUI-553.2.xml new file mode 100644 index 000000000..0d8ddfaf1 --- /dev/null +++ b/backend/src/test/resources/metadata/SHIBUI-553.2.xml @@ -0,0 +1,156 @@ + + + + + + + shibboleth.SecurityConfiguration.SHA1 + + + + + false + + + + + ResponderID_EDIT + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient_EDIT + + + NameIDFormatToSend_EDIT + + + _EDIT + + + + + Authentication Methods to Use_EDIT + + + _EDIT + + + + + eduPersonPrincipalName + + + givenName + + + eduPersonAffiliation + + + eduPersonPrimaryAffiliation + + + eduPersonAssurance + + + employeeNumber + + + + + + + + + + Certificate Both_EDIT + + + + + + + + + Certificate Both_EDIT + + + + + + + + + CERT ENCRYPTION_EDIT + + + + + + + + + CERT SIGNING_EDIT + + + + + + + + + _EDIT + + + + + + + + + _EDIT + + + + + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + + + _EDIT + + + + + + + + Organization Name_EDIT + + + Organization Display Name _EDIT + + + Organization URL _EDIT + + + + + New Contact_EDIT + + + newcontact@email_EDIT.com + + + + + _EDIT + + + _EDIT@email.com + + + \ No newline at end of file