[java-opensaml] branch main updated: IDP-2069 - Null Handling Task

Scott Cantor cantor.2 at osu.edu
Wed Apr 5 16:56:30 UTC 2023


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch main
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=e6905d3844f4aed1fca7455aae9293b48c552bf3

The following commit(s) were added to refs/heads/main by this push:
     new e6905d384 IDP-2069 - Null Handling Task
e6905d384 is described below

commit e6905d3844f4aed1fca7455aae9293b48c552bf3
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Apr 5 12:56:23 2023 -0400

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Clean up impls of SAML extensions.
---
 .../ext/idpdisco/impl/DiscoveryResponseImpl.java   |  4 +-
 .../ext/reqattr/impl/RequestedAttributesImpl.java  |  1 -
 .../saml/ext/saml1md/impl/SourceIDImpl.java        |  7 +-
 .../saml/ext/saml2alg/impl/DigestMethodImpl.java   | 15 +++--
 .../saml/ext/saml2alg/impl/SigningMethodImpl.java  | 23 ++++---
 .../saml/ext/saml2aslo/impl/AsynchronousImpl.java  | 11 +++-
 .../saml/ext/saml2cb/impl/ChannelBindingsImpl.java | 29 +++++----
 .../ext/saml2delrestrict/impl/DelegateImpl.java    | 45 +++++++------
 .../impl/DelegationRestrictionTypeImpl.java        | 24 ++++---
 .../ext/saml2mdattr/impl/EntityAttributesImpl.java | 24 +++++--
 .../ext/saml2mdquery/impl/ActionNamespaceImpl.java |  8 ++-
 .../impl/AttributeQueryDescriptorTypeImpl.java     | 35 ++++++----
 .../impl/AuthnQueryDescriptorTypeImpl.java         | 20 ++++--
 .../impl/AuthzDecisionQueryDescriptorTypeImpl.java | 41 +++++++-----
 .../saml2mdquery/impl/QueryDescriptorTypeImpl.java | 34 +++++-----
 .../saml2mdreqinit/impl/RequestInitiatorImpl.java  | 10 ++-
 .../saml/ext/saml2mdrpi/impl/PublicationImpl.java  | 34 ++++++----
 .../ext/saml2mdrpi/impl/PublicationInfoImpl.java   | 51 +++++++--------
 .../ext/saml2mdrpi/impl/PublicationPathImpl.java   | 28 ++++----
 .../ext/saml2mdrpi/impl/RegistrationInfoImpl.java  | 41 ++++++------
 .../saml2mdrpi/impl/RegistrationPolicyImpl.java    |  7 +-
 .../saml/ext/saml2mdrpi/impl/UsagePolicyImpl.java  |  6 +-
 .../saml/ext/saml2mdui/impl/DescriptionImpl.java   | 10 ++-
 .../saml/ext/saml2mdui/impl/DiscoHintsImpl.java    | 42 ++++++------
 .../saml/ext/saml2mdui/impl/DisplayNameImpl.java   |  8 ++-
 .../saml/ext/saml2mdui/impl/DomainHintImpl.java    |  6 +-
 .../ext/saml2mdui/impl/GeolocationHintImpl.java    |  7 +-
 .../saml/ext/saml2mdui/impl/IPHintImpl.java        |  8 ++-
 .../ext/saml2mdui/impl/InformationURLImpl.java     | 12 ++--
 .../saml/ext/saml2mdui/impl/KeywordsImpl.java      | 76 ++++++++++------------
 .../opensaml/saml/ext/saml2mdui/impl/LogoImpl.java | 23 ++++---
 .../saml2mdui/impl/PrivacyStatementURLImpl.java    | 13 ++--
 .../saml/ext/saml2mdui/impl/UIInfoImpl.java        | 51 +++++++--------
 .../opensaml/saml/ext/samlec/impl/EncTypeImpl.java |  8 ++-
 .../saml/ext/samlec/impl/GeneratedKeyImpl.java     | 23 ++++---
 .../saml/ext/samlec/impl/SessionKeyImpl.java       | 59 ++++++++---------
 .../saml/ext/samlpthrpty/impl/RespondToImpl.java   |  7 +-
 37 files changed, 485 insertions(+), 366 deletions(-)

diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/idpdisco/impl/DiscoveryResponseImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/idpdisco/impl/DiscoveryResponseImpl.java
index 68ac16db0..0f881b73d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/idpdisco/impl/DiscoveryResponseImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/idpdisco/impl/DiscoveryResponseImpl.java
@@ -28,8 +28,7 @@ import org.opensaml.saml.ext.idpdisco.DiscoveryResponse;
 import org.opensaml.saml.saml2.metadata.impl.IndexedEndpointImpl;
 
 /**
- * This plugs into the standard opensaml2 parser framework to allow us to get use <code> DiscoverResponse </code>
- * elements in our extensions.
+ * Implementation of {@link DiscoveryResponse}.
  */
 public class DiscoveryResponseImpl extends IndexedEndpointImpl implements DiscoveryResponse {
     
@@ -44,4 +43,5 @@ public class DiscoveryResponseImpl extends IndexedEndpointImpl implements Discov
             @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/reqattr/impl/RequestedAttributesImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/reqattr/impl/RequestedAttributesImpl.java
index 28e47b9af..c4d129b68 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/reqattr/impl/RequestedAttributesImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/reqattr/impl/RequestedAttributesImpl.java
@@ -63,7 +63,6 @@ public class RequestedAttributesImpl extends AbstractXMLObject implements Reques
 
     /** {@inheritDoc} */
     @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
-        
         return CollectionSupport.copyToList(requestedAttributes);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml1md/impl/SourceIDImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml1md/impl/SourceIDImpl.java
index 6fad849dd..ceb3b3fa3 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml1md/impl/SourceIDImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml1md/impl/SourceIDImpl.java
@@ -18,6 +18,9 @@
 package org.opensaml.saml.ext.saml1md.impl;
 
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.saml.ext.saml1md.SourceID;
 
@@ -33,7 +36,9 @@ public class SourceIDImpl extends XSStringImpl implements SourceID {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected SourceIDImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected SourceIDImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/DigestMethodImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/DigestMethodImpl.java
index 2aecdd587..cedb1fb1b 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/DigestMethodImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/DigestMethodImpl.java
@@ -29,16 +29,20 @@ import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2alg.DigestMethod;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /**
  * Implementation of {@link DigestMethod}.
  */
 public class DigestMethodImpl extends AbstractXMLObject implements DigestMethod {
     
     /** Wildcard child elements. */
-    private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Algorithm attribute value. */
-    private String algorithm;
+    @Nullable private String algorithm;
 
     /**
      * Constructor.
@@ -66,17 +70,18 @@ public class DigestMethodImpl extends AbstractXMLObject implements DigestMethod
     /**
      * {@inheritDoc}
      */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull @Live public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull @Live public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         return Collections.unmodifiableList(unknownChildren);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/SigningMethodImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/SigningMethodImpl.java
index 70279d340..b1d1f2268 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/SigningMethodImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2alg/impl/SigningMethodImpl.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.saml.ext.saml2alg.impl;
 
-import java.util.Collections;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -29,22 +28,27 @@ import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2alg.SigningMethod;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Implementation of {@link SigningMethod}.
  */
 public class SigningMethodImpl extends AbstractXMLObject implements SigningMethod {
     
     /** Wildcard child elements. */
-    private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Algorithm attribute value. */
-    private String algorithm;
+    @Nullable private String algorithm;
     
     /** MinKeySize attribute value. */
-    private Integer minKeySize;
+    @Nullable private Integer minKeySize;
 
     /** MaxKeySize attribute value. */
-    private Integer maxKeySize;
+    @Nullable private Integer maxKeySize;
     
     /**
      * Constructor.
@@ -92,18 +96,19 @@ public class SigningMethodImpl extends AbstractXMLObject implements SigningMetho
     /**
      * {@inheritDoc}
      */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull @Live public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull @Live public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        return Collections.unmodifiableList(unknownChildren);
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2aslo/impl/AsynchronousImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2aslo/impl/AsynchronousImpl.java
index f8d8d5658..c05fc87d0 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2aslo/impl/AsynchronousImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2aslo/impl/AsynchronousImpl.java
@@ -23,10 +23,16 @@ package org.opensaml.saml.ext.saml2aslo.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.saml.ext.saml2aslo.Asynchronous;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /**
  * Concrete implementation of {@link Asynchronous}.
  */
@@ -39,12 +45,13 @@ public class AsynchronousImpl extends AbstractXMLObject implements Asynchronous
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AsynchronousImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected AsynchronousImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         // no children
         return null;
     }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2cb/impl/ChannelBindingsImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2cb/impl/ChannelBindingsImpl.java
index 13abdb9a0..e3a6085a9 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2cb/impl/ChannelBindingsImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2cb/impl/ChannelBindingsImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2cb.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
 import org.opensaml.saml.ext.saml2cb.ChannelBindings;
@@ -30,13 +33,13 @@ import org.opensaml.soap.soap11.MustUnderstandBearing;
 public class ChannelBindingsImpl extends XSBase64BinaryImpl implements ChannelBindings {
 
     /** Type attribute value. */
-    private String type;
+    @Nullable private String type;
 
     /** soap11:actor attribute. */
-    private String soap11Actor;
+    @Nullable private String soap11Actor;
     
     /** soap11:mustUnderstand. */
-    private XSBooleanValue soap11MustUnderstand;
+    @Nullable private XSBooleanValue soap11MustUnderstand;
     
     /**
      * Constructor.
@@ -45,23 +48,23 @@ public class ChannelBindingsImpl extends XSBase64BinaryImpl implements ChannelBi
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected ChannelBindingsImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected ChannelBindingsImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getType() {
+    @Nullable public String getType() {
         return type;
     }
 
     /** {@inheritDoc} */
-    public void setType(final String newType) {
+    public void setType(@Nullable final String newType) {
         type = prepareForAssignment(type, newType);
     }
 
     /** {@inheritDoc} */
-    public Boolean isSOAP11MustUnderstand() {
+    @Nullable public Boolean isSOAP11MustUnderstand() {
         if (soap11MustUnderstand != null) {
             return soap11MustUnderstand.getValue();
         }
@@ -69,12 +72,12 @@ public class ChannelBindingsImpl extends XSBase64BinaryImpl implements ChannelBi
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
         return soap11MustUnderstand;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final Boolean newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final Boolean newMustUnderstand) {
         if (newMustUnderstand != null) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, 
                     new XSBooleanValue(newMustUnderstand, true));
@@ -86,19 +89,19 @@ public class ChannelBindingsImpl extends XSBase64BinaryImpl implements ChannelBi
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final XSBooleanValue newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final XSBooleanValue newMustUnderstand) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, newMustUnderstand);
             manageQualifiedAttributeNamespace(MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME, 
                     soap11MustUnderstand != null);
     }
 
     /** {@inheritDoc} */
-    public String getSOAP11Actor() {
+    @Nullable public String getSOAP11Actor() {
         return soap11Actor;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11Actor(final String newActor) {
+    public void setSOAP11Actor(@Nullable final String newActor) {
         soap11Actor = prepareForAssignment(soap11Actor, newActor);
         manageQualifiedAttributeNamespace(ActorBearing.SOAP11_ACTOR_ATTR_NAME, soap11Actor != null);
     }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegateImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegateImpl.java
index fb161b1ac..51f7b33a4 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegateImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegateImpl.java
@@ -19,9 +19,11 @@ package org.opensaml.saml.ext.saml2delrestrict.impl;
 
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.saml.ext.saml2delrestrict.Delegate;
@@ -29,25 +31,29 @@ import org.opensaml.saml.saml2.core.BaseID;
 import org.opensaml.saml.saml2.core.EncryptedID;
 import org.opensaml.saml.saml2.core.NameID;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Implementation of {@link Delegate}.
  */
 public class DelegateImpl extends AbstractXMLObject implements Delegate {
     
     /** BaseID child element. */
-    private BaseID baseID;
+    @Nullable private BaseID baseID;
     
     /** NameID child element. */
-    private NameID nameID;
+    @Nullable private NameID nameID;
     
     /** EncryptedID child element. */
-    private EncryptedID encryptedID;
+    @Nullable private EncryptedID encryptedID;
     
     /** DelegationInstant attribute. */
-    private Instant delegationInstant;
+    @Nullable private Instant delegationInstant;
     
     /** ConfirmationMethod attribute. */
-    private String confirmationMethod;
+    @Nullable private String confirmationMethod;
 
     /**
      * Constructor.
@@ -56,62 +62,63 @@ public class DelegateImpl extends AbstractXMLObject implements Delegate {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected DelegateImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DelegateImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public BaseID getBaseID() {
+    @Nullable public BaseID getBaseID() {
         return baseID;
     }
 
     /** {@inheritDoc} */
-    public String getConfirmationMethod() {
+    @Nullable public String getConfirmationMethod() {
         return confirmationMethod;
     }
 
     /** {@inheritDoc} */
-    public Instant getDelegationInstant() {
+    @Nullable public Instant getDelegationInstant() {
         return delegationInstant;
     }
 
     /** {@inheritDoc} */
-    public EncryptedID getEncryptedID() {
+    @Nullable public EncryptedID getEncryptedID() {
         return encryptedID;
     }
 
     /** {@inheritDoc} */
-    public NameID getNameID() {
+    @Nullable public NameID getNameID() {
         return nameID;
     }
 
     /** {@inheritDoc} */
-    public void setBaseID(final BaseID newBaseID) {
+    public void setBaseID(@Nullable final BaseID newBaseID) {
         baseID = prepareForAssignment(baseID, newBaseID);
     }
     
     /** {@inheritDoc} */
-    public void setConfirmationMethod(final String newMethod) {
+    public void setConfirmationMethod(@Nullable final String newMethod) {
         confirmationMethod = prepareForAssignment(confirmationMethod, newMethod);
     }
 
     /** {@inheritDoc} */
-    public void setDelegationInstant(final Instant newInstant) {
+    public void setDelegationInstant(@Nullable final Instant newInstant) {
         delegationInstant = prepareForAssignment(delegationInstant, newInstant);
     }
 
     /** {@inheritDoc} */
-    public void setEncryptedID(final EncryptedID newEncryptedID) {
+    public void setEncryptedID(@Nullable final EncryptedID newEncryptedID) {
         encryptedID = prepareForAssignment(encryptedID, newEncryptedID);
     }
 
     /** {@inheritDoc} */
-    public void setNameID(final NameID newNameID) {
+    public void setNameID(@Nullable final NameID newNameID) {
         nameID = prepareForAssignment(nameID, newNameID);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
 
         if (baseID != null) {
@@ -123,7 +130,7 @@ public class DelegateImpl extends AbstractXMLObject implements Delegate {
         if (encryptedID != null) {
             children.add(encryptedID);
         }
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegationRestrictionTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegationRestrictionTypeImpl.java
index 84f0af78f..f3b4ca999 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegationRestrictionTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2delrestrict/impl/DelegationRestrictionTypeImpl.java
@@ -17,23 +17,29 @@
 
 package org.opensaml.saml.ext.saml2delrestrict.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.XMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2delrestrict.Delegate;
 import org.opensaml.saml.ext.saml2delrestrict.DelegationRestrictionType;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Implementation of {@link DelegationRestrictionType}.
  */
 public class DelegationRestrictionTypeImpl extends AbstractXMLObject implements DelegationRestrictionType {
     
     /** Delegate child elements. */
-    private XMLObjectChildrenList<Delegate> delegates;
+    @Nonnull private final XMLObjectChildrenList<Delegate> delegates;
     
     /**
      * Constructor.
@@ -42,22 +48,20 @@ public class DelegationRestrictionTypeImpl extends AbstractXMLObject implements
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected DelegationRestrictionTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected DelegationRestrictionTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         delegates = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<Delegate> getDelegates() {
+    @Nonnull @Live public List<Delegate> getDelegates() {
         return delegates;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(delegates);
-        return Collections.unmodifiableList(children);
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(delegates);
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdattr/impl/EntityAttributesImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdattr/impl/EntityAttributesImpl.java
index 1b6c3894f..12123464d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdattr/impl/EntityAttributesImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdattr/impl/EntityAttributesImpl.java
@@ -20,6 +20,9 @@ package org.opensaml.saml.ext.saml2mdattr.impl;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
@@ -30,11 +33,15 @@ import org.opensaml.saml.saml2.core.Attribute;
 
 import com.google.common.base.Predicates;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /** Concrete implementation of {@link EntityAttributes}. */
 public class EntityAttributesImpl extends AbstractXMLObject implements EntityAttributes {
 
     /** Extension data. */
-    private final IndexedXMLObjectChildrenList<SAMLObject> attributeInfo;
+    @Nonnull private final IndexedXMLObjectChildrenList<SAMLObject> attributeInfo;
 
     /**
      * Constructor.
@@ -43,29 +50,31 @@ public class EntityAttributesImpl extends AbstractXMLObject implements EntityAtt
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected EntityAttributesImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected EntityAttributesImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         attributeInfo = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<Attribute> getAttributes() {
+    @SuppressWarnings("unchecked")
+    @Nonnull @Live public List<Attribute> getAttributes() {
         return (List<Attribute>) attributeInfo.subList(Attribute.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<Assertion> getAssertions() {
+    @SuppressWarnings("unchecked")
+    @Nonnull @Live public List<Assertion> getAssertions() {
         return (List<Assertion>) attributeInfo.subList(Assertion.DEFAULT_ELEMENT_NAME);
     }
     
     /** {@inheritDoc} */
-    public List<SAMLObject> getEntityAttributesChildren() {
+    @Nonnull @Live public List<SAMLObject> getEntityAttributesChildren() {
         return attributeInfo;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
 
         if (attributeInfo.size() == 0) {
             return null;
@@ -76,4 +85,5 @@ public class EntityAttributesImpl extends AbstractXMLObject implements EntityAtt
                 .filter(Predicates.or(Assertion.class::isInstance, Attribute.class::isInstance))
                 .collect(Collectors.toUnmodifiableList());
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/ActionNamespaceImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/ActionNamespaceImpl.java
index 56bc87cfa..52738fa07 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/ActionNamespaceImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/ActionNamespaceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdquery.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.saml.ext.saml2mdquery.ActionNamespace;
 
@@ -32,8 +35,9 @@ public class ActionNamespaceImpl extends XSURIImpl implements ActionNamespace {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected ActionNamespaceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected ActionNamespaceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AttributeQueryDescriptorTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AttributeQueryDescriptorTypeImpl.java
index 550716e8d..17d5d486d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AttributeQueryDescriptorTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AttributeQueryDescriptorTypeImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.saml.ext.saml2mdquery.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -29,13 +30,18 @@ import org.opensaml.saml.ext.saml2mdquery.AttributeQueryDescriptorType;
 import org.opensaml.saml.saml2.metadata.AttributeConsumingService;
 import org.opensaml.saml.saml2.metadata.Endpoint;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implementation of {@link AttributeQueryDescriptorType}.
  */
 public class AttributeQueryDescriptorTypeImpl extends QueryDescriptorTypeImpl implements AttributeQueryDescriptorType {
 
     /** Attribute consuming endpoints. */
-    private XMLObjectChildrenList<AttributeConsumingService> attributeConsumingServices;
+    @Nonnull private final XMLObjectChildrenList<AttributeConsumingService> attributeConsumingServices;
 
     /**
      * Constructor.
@@ -44,35 +50,40 @@ public class AttributeQueryDescriptorTypeImpl extends QueryDescriptorTypeImpl im
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AttributeQueryDescriptorTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected AttributeQueryDescriptorTypeImpl(@Nullable final String namespaceURI,
+            @Nonnull final String elementLocalName, @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
 
         attributeConsumingServices = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<AttributeConsumingService> getAttributeConsumingServices() {
+    @Nonnull @Live public List<AttributeConsumingService> getAttributeConsumingServices() {
         return attributeConsumingServices;
     }
     
     /** {@inheritDoc} */
-    public List<Endpoint> getEndpoints() {
-        return new ArrayList<>();
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints() {
+        return CollectionSupport.emptyList();
     }
     
     /** {@inheritDoc} */
-    public List<Endpoint> getEndpoints(final QName type) {
-        return null;
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints(@Nonnull final QName type) {
+        return CollectionSupport.emptyList();
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Override
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
 
-        children.addAll(super.getOrderedChildren());
+        final List<XMLObject> superChildren = super.getOrderedChildren();
+        if (superChildren != null) {
+            children.addAll(superChildren);
+        }
         children.addAll(attributeConsumingServices);
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthnQueryDescriptorTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthnQueryDescriptorTypeImpl.java
index a2cff8577..c9303cb51 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthnQueryDescriptorTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthnQueryDescriptorTypeImpl.java
@@ -17,14 +17,19 @@
 
 package org.opensaml.saml.ext.saml2mdquery.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.saml.ext.saml2mdquery.AuthnQueryDescriptorType;
 import org.opensaml.saml.saml2.metadata.Endpoint;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implementation of {@link AuthnQueryDescriptorType}.
  */
@@ -37,18 +42,19 @@ public class AuthnQueryDescriptorTypeImpl extends QueryDescriptorTypeImpl implem
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AuthnQueryDescriptorTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected AuthnQueryDescriptorTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
     
     /** {@inheritDoc} */
-    public List<Endpoint> getEndpoints() {
-        return new ArrayList<>();
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints() {
+        return CollectionSupport.emptyList();
     }
     
     /** {@inheritDoc} */
-    public List<Endpoint> getEndpoints(final QName type) {
-        return null;
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints(@Nonnull final QName type) {
+        return CollectionSupport.emptyList();
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthzDecisionQueryDescriptorTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthzDecisionQueryDescriptorTypeImpl.java
index ab522adb8..5c6bf5927 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthzDecisionQueryDescriptorTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/AuthzDecisionQueryDescriptorTypeImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.saml.ext.saml2mdquery.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -29,6 +30,10 @@ import org.opensaml.saml.ext.saml2mdquery.ActionNamespace;
 import org.opensaml.saml.ext.saml2mdquery.AuthzDecisionQueryDescriptorType;
 import org.opensaml.saml.saml2.metadata.Endpoint;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implementation of {@link AuthzDecisionQueryDescriptorType}.
  */
@@ -36,7 +41,7 @@ public class AuthzDecisionQueryDescriptorTypeImpl extends QueryDescriptorTypeImp
         implements AuthzDecisionQueryDescriptorType{
 
     /** Supported action namespaces. */
-    private XMLObjectChildrenList<ActionNamespace> actionNamespaces;
+    @Nonnull private final XMLObjectChildrenList<ActionNamespace> actionNamespaces;
     
     /**
      * Constructor.
@@ -45,39 +50,41 @@ public class AuthzDecisionQueryDescriptorTypeImpl extends QueryDescriptorTypeImp
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AuthzDecisionQueryDescriptorTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected AuthzDecisionQueryDescriptorTypeImpl(@Nullable final String namespaceURI,
+            @Nonnull final String elementLocalName, @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
 
         actionNamespaces = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<ActionNamespace> getActionNamespaces() {
+    @Nonnull @NotLive @Unmodifiable public List<ActionNamespace> getActionNamespaces() {
         return actionNamespaces;
     }
     
     /** {@inheritDoc} */
-    @Override
-    public List<Endpoint> getEndpoints() {
-        return new ArrayList<>();
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints() {
+        return CollectionSupport.emptyList();
     }
     
-    /** {@inheritDoc} */
-    @Override
-    public List<Endpoint> getEndpoints(final QName type) {
-        return null;
+    /** {@inheritDoc} */    @Override
+    @Nonnull @NotLive @Unmodifiable public List<Endpoint> getEndpoints(@Nonnull final QName type) {
+        return CollectionSupport.emptyList();
     }
     
     /** {@inheritDoc} */
     @Override
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
-        
-        children.addAll(super.getOrderedChildren());
+
+        final List<XMLObject> superChildren = super.getOrderedChildren();
+        if (superChildren != null) {
+            children.addAll(superChildren);
+        }
+
         children.addAll(actionNamespaces);
         
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
+    
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/QueryDescriptorTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/QueryDescriptorTypeImpl.java
index 00d175e0c..d7c75dba8 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/QueryDescriptorTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdquery/impl/QueryDescriptorTypeImpl.java
@@ -21,6 +21,9 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.util.XMLObjectChildrenList;
@@ -28,16 +31,19 @@ import org.opensaml.saml.ext.saml2mdquery.QueryDescriptorType;
 import org.opensaml.saml.saml2.metadata.NameIDFormat;
 import org.opensaml.saml.saml2.metadata.impl.RoleDescriptorImpl;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /**
  * Concrete implementation of {@link QueryDescriptorType}.
  */
 public abstract class QueryDescriptorTypeImpl extends RoleDescriptorImpl implements QueryDescriptorType {
 
     /** WantAssertionSigned attribute value. */
-    private XSBooleanValue wantAssertionsSigned;
+    @Nullable private XSBooleanValue wantAssertionsSigned;
     
     /** Supported NameID formats. */
-    private XMLObjectChildrenList<NameIDFormat> nameIDFormats;
+    @Nonnull private final XMLObjectChildrenList<NameIDFormat> nameIDFormats;
     
     /**
      * Constructor.
@@ -46,16 +52,15 @@ public abstract class QueryDescriptorTypeImpl extends RoleDescriptorImpl impleme
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected QueryDescriptorTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected QueryDescriptorTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         
         nameIDFormats = new XMLObjectChildrenList<>(this);
     }
     
     /** {@inheritDoc} */
-    @Override
-    public Boolean getWantAssertionsSigned() {
+    @Nullable public Boolean getWantAssertionsSigned() {
         if (wantAssertionsSigned != null) {
             return wantAssertionsSigned.getValue();
         }
@@ -63,8 +68,7 @@ public abstract class QueryDescriptorTypeImpl extends RoleDescriptorImpl impleme
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setWantAssertionsSigned(final Boolean newWantAssertionsSigned) {
+    public void setWantAssertionsSigned(@Nullable final Boolean newWantAssertionsSigned) {
         if (newWantAssertionsSigned != null) {
             wantAssertionsSigned = prepareForAssignment(wantAssertionsSigned, 
                     new XSBooleanValue(newWantAssertionsSigned, false));
@@ -74,26 +78,23 @@ public abstract class QueryDescriptorTypeImpl extends RoleDescriptorImpl impleme
     }
 
     /** {@inheritDoc} */
-    @Override
-    public XSBooleanValue getWantAssertionsSignedXSBoolean(){
+    @Nullable public XSBooleanValue getWantAssertionsSignedXSBoolean(){
         return wantAssertionsSigned;
     }
     
     /** {@inheritDoc} */
-    @Override
-    public void setWantAssertionsSigned(final XSBooleanValue wantAssertionSigned){
-        this.wantAssertionsSigned = prepareForAssignment(this.wantAssertionsSigned, wantAssertionSigned);
+    public void setWantAssertionsSigned(@Nullable final XSBooleanValue newWantAssertionsSigned){
+        wantAssertionsSigned = prepareForAssignment(wantAssertionsSigned, newWantAssertionsSigned);
     }
     
     /** {@inheritDoc} */
-    @Override
-    public List<NameIDFormat> getNameIDFormat(){
+    @Nonnull @NotLive @Unmodifiable public List<NameIDFormat> getNameIDFormat(){
         return nameIDFormats;
     }
     
     /** {@inheritDoc} */
     @Override
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         
         children.addAll(super.getOrderedChildren());
@@ -101,4 +102,5 @@ public abstract class QueryDescriptorTypeImpl extends RoleDescriptorImpl impleme
         
         return Collections.unmodifiableList(children);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdreqinit/impl/RequestInitiatorImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdreqinit/impl/RequestInitiatorImpl.java
index 04053d436..ef56aeb48 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdreqinit/impl/RequestInitiatorImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdreqinit/impl/RequestInitiatorImpl.java
@@ -21,12 +21,15 @@
 
 package org.opensaml.saml.ext.saml2mdreqinit.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdreqinit.RequestInitiator;
 import org.opensaml.saml.saml2.metadata.impl.EndpointImpl;
 
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdreqinit.RequestInitiator}.
+ * Concrete implementation of {@link RequestInitiator}.
  */
 public class RequestInitiatorImpl extends EndpointImpl implements RequestInitiator {
 
@@ -37,8 +40,9 @@ public class RequestInitiatorImpl extends EndpointImpl implements RequestInitiat
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected RequestInitiatorImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected RequestInitiatorImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationImpl.java
index 8cf185a94..efd925752 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationImpl.java
@@ -18,26 +18,31 @@
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
 import java.time.Instant;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.saml.ext.saml2mdrpi.Publication;
 
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /**
  * A concrete {@link Publication}.
  */
 public class PublicationImpl extends AbstractXMLObject implements Publication {
 
     /** The publisher. */
-    private String publisher;
+    @Nullable private String publisher;
 
     /** The creation instant. */
-    private Instant creationInstant;
+    @Nullable private Instant creationInstant;
 
     /** The publicationId. */
-    private String publicationId;
+    @Nullable private String publicationId;
 
     /**
      * Constructor.
@@ -46,44 +51,45 @@ public class PublicationImpl extends AbstractXMLObject implements Publication {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected PublicationImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected PublicationImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
 
     /** {@inheritDoc} */
-    public String getPublisher() {
+    @Nullable public String getPublisher() {
         return publisher;
     }
 
     /** {@inheritDoc} */
-    public void setPublisher(final String thePublisher) {
+    public void setPublisher(@Nullable final String thePublisher) {
         publisher = prepareForAssignment(publisher, thePublisher);
     }
 
     /** {@inheritDoc} */
-    public Instant getCreationInstant() {
+    @Nullable public Instant getCreationInstant() {
         return creationInstant;
     }
 
     /** {@inheritDoc} */
-    public void setCreationInstant(final Instant dateTime) {
+    public void setCreationInstant(@Nullable final Instant dateTime) {
         creationInstant = prepareForAssignment(creationInstant, dateTime);
     }
 
     /** {@inheritDoc} */
-    public String getPublicationId() {
+    @Nullable public String getPublicationId() {
         return publicationId;
     }
 
     /** {@inheritDoc} */
-    public void setPublicationId(final String id) {
+    public void setPublicationId(@Nullable final String id) {
         publicationId = prepareForAssignment(publicationId, id);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        return Collections.<XMLObject>emptyList();
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationInfoImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationInfoImpl.java
index 3fa4bcddb..dc49586e5 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationInfoImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationInfoImpl.java
@@ -18,9 +18,11 @@
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
@@ -28,22 +30,27 @@ import org.opensaml.core.xml.util.XMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2mdrpi.PublicationInfo;
 import org.opensaml.saml.ext.saml2mdrpi.UsagePolicy;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete {@link PublicationInfo}.
  */
 public class PublicationInfoImpl extends AbstractXMLObject implements PublicationInfo {
 
     /** The policies. */
-    private XMLObjectChildrenList<UsagePolicy> usagePolicies;
+    @Nonnull private final XMLObjectChildrenList<UsagePolicy> usagePolicies;
 
     /** The publisher. */
-    private String publisher;
+    @Nullable private String publisher;
 
     /** The creation instant. */
-    private Instant creationInstant;
+    @Nullable private Instant creationInstant;
 
     /** The publicationId. */
-    private String publicationId;
+    @Nullable private String publicationId;
 
     /**
      * Constructor.
@@ -52,60 +59,50 @@ public class PublicationInfoImpl extends AbstractXMLObject implements Publicatio
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected PublicationInfoImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected PublicationInfoImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         usagePolicies = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public String getPublisher() {
+    @Nullable public String getPublisher() {
         return publisher;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setPublisher(final String thePublisher) {
+    public void setPublisher(@Nullable final String thePublisher) {
         publisher = prepareForAssignment(publisher, thePublisher);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public Instant getCreationInstant() {
+    @Nullable public Instant getCreationInstant() {
         return creationInstant;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setCreationInstant(final Instant dateTime) {
+    public void setCreationInstant(@Nullable final Instant dateTime) {
         creationInstant = prepareForAssignment(creationInstant, dateTime);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public String getPublicationId() {
+    @Nullable public String getPublicationId() {
         return publicationId;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setPublicationId(final String id) {
+    public void setPublicationId(@Nullable final String id) {
         publicationId = prepareForAssignment(publicationId, id);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<UsagePolicy> getUsagePolicies() {
+    @Nonnull @Live public List<UsagePolicy> getUsagePolicies() {
         return usagePolicies;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(usagePolicies);
-        return children;
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(usagePolicies);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationPathImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationPathImpl.java
index d3a30216a..ab1a9b8fc 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationPathImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/PublicationPathImpl.java
@@ -17,9 +17,11 @@
 
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
@@ -27,6 +29,11 @@ import org.opensaml.core.xml.util.XMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2mdrpi.Publication;
 import org.opensaml.saml.ext.saml2mdrpi.PublicationPath;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 
 /**
  * A concrete {@link PublicationPath}.
@@ -34,7 +41,7 @@ import org.opensaml.saml.ext.saml2mdrpi.PublicationPath;
 public class PublicationPathImpl extends AbstractXMLObject implements PublicationPath {
 
     /** The policies. */
-    private XMLObjectChildrenList<Publication> publications;
+    @Nonnull private final XMLObjectChildrenList<Publication> publications;
 
     /**
      * Constructor.
@@ -43,23 +50,20 @@ public class PublicationPathImpl extends AbstractXMLObject implements Publicatio
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected PublicationPathImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected PublicationPathImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         publications = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<Publication> getPublications() {
+    @Nonnull @Live public List<Publication> getPublications() {
         return publications;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(publications);
-        return children;
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(publications);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationInfoImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationInfoImpl.java
index d78ca150f..fae5ec182 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationInfoImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationInfoImpl.java
@@ -18,9 +18,11 @@
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
@@ -28,19 +30,24 @@ import org.opensaml.core.xml.util.XMLObjectChildrenList;
 import org.opensaml.saml.ext.saml2mdrpi.RegistrationInfo;
 import org.opensaml.saml.ext.saml2mdrpi.RegistrationPolicy;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete Implementation of {@link RegistrationInfo}.
  */
 public class RegistrationInfoImpl extends AbstractXMLObject implements RegistrationInfo {
 
     /** The policies. */
-    private XMLObjectChildrenList<RegistrationPolicy> registrationPolicies;
+    @Nonnull private final XMLObjectChildrenList<RegistrationPolicy> registrationPolicies;
 
     /** The authority. */
-    private String registrationAuthority;
+    @Nullable private String registrationAuthority;
 
     /** The registration instant. */
-    private Instant registrationInstant;
+    @Nullable private Instant registrationInstant;
 
     /**
      * Constructor.
@@ -49,48 +56,40 @@ public class RegistrationInfoImpl extends AbstractXMLObject implements Registrat
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected RegistrationInfoImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected RegistrationInfoImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         registrationPolicies = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public String getRegistrationAuthority() {
+    @Nullable public String getRegistrationAuthority() {
         return registrationAuthority;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setRegistrationAuthority(final String authority) {
+    public void setRegistrationAuthority(@Nullable final String authority) {
         registrationAuthority = prepareForAssignment(registrationAuthority, authority);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public Instant getRegistrationInstant() {
+    @Nullable public Instant getRegistrationInstant() {
         return registrationInstant;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setRegistrationInstant(final Instant dateTime) {
+    public void setRegistrationInstant(@Nullable final Instant dateTime) {
         registrationInstant = prepareForAssignment(registrationInstant, dateTime);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<RegistrationPolicy> getRegistrationPolicies() {
+    @Nonnull @Live public List<RegistrationPolicy> getRegistrationPolicies() {
         return registrationPolicies;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(registrationPolicies);
-        return children;
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(registrationPolicies);
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationPolicyImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationPolicyImpl.java
index 02933d864..a333037d2 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationPolicyImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/RegistrationPolicyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdrpi.RegistrationPolicy;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 
@@ -32,8 +35,8 @@ public class RegistrationPolicyImpl extends LocalizedURIImpl implements Registra
      * @param elementLocalName elementLocalName
      * @param namespacePrefix namespacePrefix
      */
-    protected RegistrationPolicyImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected RegistrationPolicyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/UsagePolicyImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/UsagePolicyImpl.java
index 419eb12da..968566186 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/UsagePolicyImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdrpi/impl/UsagePolicyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdrpi.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdrpi.UsagePolicy;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 
@@ -32,7 +35,8 @@ public class UsagePolicyImpl extends LocalizedURIImpl implements UsagePolicy {
      * @param elementLocalName local name
      * @param namespacePrefix prefix
      */
-    protected UsagePolicyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected UsagePolicyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DescriptionImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DescriptionImpl.java
index 089e34ace..931af0e82 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DescriptionImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DescriptionImpl.java
@@ -17,11 +17,14 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdui.Description;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedNameImpl;
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.Description}.
+ * Concrete implementation of {@link Description}.
  */
 public class DescriptionImpl extends LocalizedNameImpl implements Description {
 
@@ -32,8 +35,9 @@ public class DescriptionImpl extends LocalizedNameImpl implements Description {
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected DescriptionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DescriptionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DiscoHintsImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DiscoHintsImpl.java
index 84ea5cf39..cf0cd5fd5 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DiscoHintsImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DiscoHintsImpl.java
@@ -17,9 +17,10 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AbstractXMLObject;
@@ -30,11 +31,17 @@ import org.opensaml.saml.ext.saml2mdui.DomainHint;
 import org.opensaml.saml.ext.saml2mdui.GeolocationHint;
 import org.opensaml.saml.ext.saml2mdui.IPHint;
 
-/** Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.DiscoHints}. */
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
+/** Concrete implementation of {@link DiscoHints}. */
+ at SuppressWarnings("unchecked")
 public class DiscoHintsImpl extends AbstractXMLObject implements DiscoHints {
     
     /** Children of the UIInfo. */
-    private final IndexedXMLObjectChildrenList<XMLObject> discoHintsChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> discoHintsChildren;
 
     /**
      * Constructor.
@@ -43,47 +50,40 @@ public class DiscoHintsImpl extends AbstractXMLObject implements DiscoHints {
      * @param elementLocalName elementLocalName
      * @param namespacePrefix namespacePrefix
      */
-    protected DiscoHintsImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DiscoHintsImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         discoHintsChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getXMLObjects() {
+    @Nonnull @Live public List<XMLObject> getXMLObjects() {
         return discoHintsChildren;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getXMLObjects(final QName typeOrName) {
+    @Nonnull @Live public List<XMLObject> getXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) discoHintsChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<DomainHint> getDomainHints() {
+    @Nonnull @Live public List<DomainHint> getDomainHints() {
         return (List<DomainHint>) discoHintsChildren.subList(DomainHint.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<GeolocationHint> getGeolocationHints() {
+    @Nonnull @Live public List<GeolocationHint> getGeolocationHints() {
         return (List<GeolocationHint>) discoHintsChildren.subList(GeolocationHint.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<IPHint> getIPHints() {
+    @Nonnull @Live public List<IPHint> getIPHints() {
         return (List<IPHint>) discoHintsChildren.subList(IPHint.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-
-        children.addAll(discoHintsChildren);
-        return children;
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(discoHintsChildren);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DisplayNameImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DisplayNameImpl.java
index 63edab96d..6b6ddee9e 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DisplayNameImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DisplayNameImpl.java
@@ -17,12 +17,15 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdui.DisplayName;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedNameImpl;
 
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.DisplayName}.
+ * Concrete implementation of {@link DisplayName}.
  */
 public class DisplayNameImpl extends LocalizedNameImpl implements DisplayName {
 
@@ -33,7 +36,8 @@ public class DisplayNameImpl extends LocalizedNameImpl implements DisplayName {
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected DisplayNameImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DisplayNameImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DomainHintImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DomainHintImpl.java
index 415cc03a2..606a4f802 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DomainHintImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/DomainHintImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.saml.ext.saml2mdui.DomainHint;
 
@@ -32,7 +35,8 @@ public class DomainHintImpl extends XSStringImpl implements DomainHint{
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected DomainHintImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DomainHintImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/GeolocationHintImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/GeolocationHintImpl.java
index fc72fcd57..5815a4525 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/GeolocationHintImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/GeolocationHintImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.saml.ext.saml2mdui.GeolocationHint;
 
@@ -32,8 +35,8 @@ public class GeolocationHintImpl extends XSURIImpl implements GeolocationHint {
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected GeolocationHintImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected GeolocationHintImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/IPHintImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/IPHintImpl.java
index 74eeaad9b..80a2effff 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/IPHintImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/IPHintImpl.java
@@ -17,11 +17,14 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.saml.ext.saml2mdui.IPHint;
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.IPHint}.
+ * Concrete implementation of {@link IPHint}.
  */
 public class IPHintImpl extends XSStringImpl implements IPHint {
 
@@ -32,7 +35,8 @@ public class IPHintImpl extends XSStringImpl implements IPHint {
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected IPHintImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected IPHintImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/InformationURLImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/InformationURLImpl.java
index 83e398db8..4437b6f0d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/InformationURLImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/InformationURLImpl.java
@@ -17,12 +17,14 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdui.InformationURL;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.InformationURL}.
- * @author Rod Widdowson
+ * Concrete implementation of {@link InformationURL}.
  */
 
 public class InformationURLImpl extends LocalizedURIImpl implements InformationURL {
@@ -34,9 +36,9 @@ public class InformationURLImpl extends LocalizedURIImpl implements InformationU
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected InformationURLImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected InformationURLImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/KeywordsImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/KeywordsImpl.java
index c93705f10..7dc6ac90a 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/KeywordsImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/KeywordsImpl.java
@@ -17,11 +17,10 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.LangBearing;
@@ -30,15 +29,21 @@ import org.opensaml.saml.ext.saml2mdui.Keywords;
 
 import com.google.common.base.Strings;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 /**
- * Concrete Implementation of  {@link org.opensaml.saml.ext.saml2mdui.Keywords}.
+ * Concrete implementation of {@link Keywords}.
  */
 public class KeywordsImpl extends AbstractXMLObject implements Keywords {
 
     /** The language. */
-    private String lang;
+    @Nullable private String lang;
+    
     /** The data. */
-    @Nonnull private List<String> data = Collections.emptyList();
+    @Nullable private List<String> data;
+    
     /**
      * Constructor.
      *
@@ -46,35 +51,30 @@ public class KeywordsImpl extends AbstractXMLObject implements Keywords {
      * @param elementLocalName the local name
      * @param namespacePrefix the prefix
      */
-    protected KeywordsImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected KeywordsImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
-   
-    /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        return null;
-    }
-
     /** {@inheritDoc} */
-    public String getXMLLang() {
+    @Nullable public String getXMLLang() {
         return lang;
     }
 
     /** {@inheritDoc} */
-    public void setXMLLang(final String newLang) {
+    public void setXMLLang(@Nullable final String newLang) {
         final boolean hasValue = newLang != null && !Strings.isNullOrEmpty(newLang);
         lang = prepareForAssignment(lang, newLang);
         manageQualifiedAttributeNamespace(LangBearing.XML_LANG_ATTR_NAME, hasValue);
     }
 
     /** {@inheritDoc} */
-    public List<String> getKeywords() {
+    @Nullable @Live public List<String> getKeywords() {
         return data;
     }
 
     /** {@inheritDoc} */
-    public void setKeywords(final List<String> val) {
+    public void setKeywords(@Nullable final List<String> val) {
         data = prepareForAssignment(data, val);
     }
 
@@ -82,9 +82,11 @@ public class KeywordsImpl extends AbstractXMLObject implements Keywords {
      * {@inheritDoc}
      */
     public int hashCode() {
-        int hash = lang == null ? 12 :lang.hashCode();
-        for (final String s: data) {
-            hash = hash * 31 + s.hashCode();
+        int hash = lang != null ? lang.hashCode() : 12;
+        if (data != null) {
+            for (final String s : data) {
+                hash = hash * 31 + s.hashCode();
+            }
         }
         return hash; 
     }
@@ -96,32 +98,24 @@ public class KeywordsImpl extends AbstractXMLObject implements Keywords {
         }
         final Keywords other = (Keywords) obj;
 
-        if (lang == null) {
-            if (other.getXMLLang() != null) {
-                return false;
-            }
-        } else if (!lang.equals(other.getXMLLang())) {
+        if (lang != null && !lang.equals(other.getXMLLang())) {
             return false;
-        }
-
-        List<String> otherList = other.getKeywords();
-        if (otherList == null) {
-            otherList = Collections.emptyList();
-        }
-
-        if (otherList.size() != data.size()) {
+        } else if (other.getXMLLang() != null) {
             return false;
         }
 
-        final Iterator<String> me = data.iterator();
-        final Iterator<String> him = otherList.iterator();
-
-        while (me.hasNext()) {
-            if (!me.next().equals(him.next())) {
-                return false;
-            }
+        final List<String> ourList = getKeywords();
+        final List<String> otherList = other.getKeywords();
+        if (ourList == null) {
+            return otherList == null;
         }
-        return true;
+        
+        return ourList.equals(otherList);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/LogoImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/LogoImpl.java
index b33e595a5..a01f8213e 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/LogoImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/LogoImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdui.Logo;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 
@@ -27,10 +30,10 @@ import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 public class LogoImpl extends LocalizedURIImpl implements Logo {
 
     /** X-Dimension of the logo. */
-    private Integer width;
+    @Nullable private Integer width;
 
     /** Y-Dimension of the logo. */
-    private Integer height;
+    @Nullable private Integer height;
 
     /**
      * Constructor.
@@ -39,28 +42,28 @@ public class LogoImpl extends LocalizedURIImpl implements Logo {
      * @param elementLocalName elementLocalName
      * @param namespacePrefix namespacePrefix
      */
-    protected LogoImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected LogoImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
-
     /** {@inheritDoc} */
-    public Integer getHeight() {
+    @Nullable public Integer getHeight() {
         return height;
     }
 
     /** {@inheritDoc} */
-    public void setHeight(final Integer newHeight) {
+    public void setHeight(@Nullable final Integer newHeight) {
          height = prepareForAssignment(height, newHeight);
     }
 
     /** {@inheritDoc} */
-    public Integer getWidth() {
+    @Nullable public Integer getWidth() {
         return width;
     }
 
     /** {@inheritDoc} */
-    public void setWidth(final Integer newWidth) {
+    public void setWidth(@Nullable final Integer newWidth) {
         width = prepareForAssignment(width, newWidth);
     }
 
@@ -74,8 +77,8 @@ public class LogoImpl extends LocalizedURIImpl implements Logo {
     @Override
     public int hashCode() {
         int hash = super.hashCode();
-        hash = hash * 31 + height;
-        hash = hash * 31 + width;
+        hash = hash * 31 + (height != null ? height : 0);
+        hash = hash * 31 + (width != null ? width : 0);
         return hash;
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/PrivacyStatementURLImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/PrivacyStatementURLImpl.java
index afeaa90fd..d8b6c00ad 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/PrivacyStatementURLImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/PrivacyStatementURLImpl.java
@@ -17,15 +17,16 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.saml2mdui.PrivacyStatementURL;
 import org.opensaml.saml.saml2.metadata.impl.LocalizedURIImpl;
 
 
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.PrivacyStatementURL}.
- * @author Rod Widdowson
+ * Concrete implementation of {@link PrivacyStatementURL}.
  */
-
 public class PrivacyStatementURLImpl extends LocalizedURIImpl implements PrivacyStatementURL {
 
     /**
@@ -35,9 +36,9 @@ public class PrivacyStatementURLImpl extends LocalizedURIImpl implements Privacy
      * @param elementLocalName the elementLocalName
      * @param namespacePrefix the namespacePrefix
      */
-    protected PrivacyStatementURLImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected PrivacyStatementURLImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/UIInfoImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/UIInfoImpl.java
index 4f5069ace..b8827d9a1 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/UIInfoImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/saml2mdui/impl/UIInfoImpl.java
@@ -17,9 +17,10 @@
 
 package org.opensaml.saml.ext.saml2mdui.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AbstractXMLObject;
@@ -33,14 +34,19 @@ import org.opensaml.saml.ext.saml2mdui.Logo;
 import org.opensaml.saml.ext.saml2mdui.PrivacyStatementURL;
 import org.opensaml.saml.ext.saml2mdui.UIInfo;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
- * Concrete implementation of {@link org.opensaml.saml.ext.saml2mdui.UIInfo}.
- * @author Rod Widdowson
+ * Concrete implementation of {@link UIInfo}.
  */
+ at SuppressWarnings("unchecked")
 public class UIInfoImpl extends AbstractXMLObject implements UIInfo {
     
     /** Children of the UIInfo. */
-    private final IndexedXMLObjectChildrenList<XMLObject> uiInfoChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> uiInfoChildren;
     
     /**
      * Constructor.
@@ -48,67 +54,56 @@ public class UIInfoImpl extends AbstractXMLObject implements UIInfo {
      * @param elementLocalName elementLocalName
      * @param namespacePrefix namespacePrefix
      */
-    protected UIInfoImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected UIInfoImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         
         uiInfoChildren = new IndexedXMLObjectChildrenList<>(this);
     }
     
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getXMLObjects() {
+    @Nonnull @Live public List<XMLObject> getXMLObjects() {
         return uiInfoChildren;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getXMLObjects(final QName typeOrName) {
+    @Nonnull @Live public List<XMLObject> getXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) uiInfoChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<Description> getDescriptions() {
+    @Nonnull @Live public List<Description> getDescriptions() {
         return (List<Description>) uiInfoChildren.subList(Description.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<DisplayName> getDisplayNames() {
+    @Nonnull @Live public List<DisplayName> getDisplayNames() {
         return (List<DisplayName>) uiInfoChildren.subList(DisplayName.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<Keywords> getKeywords() {
+    @Nonnull @Live public List<Keywords> getKeywords() {
         return (List<Keywords>) uiInfoChildren.subList(Keywords.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<InformationURL> getInformationURLs() {
+    @Nonnull @Live public List<InformationURL> getInformationURLs() {
         return (List<InformationURL>) uiInfoChildren.subList(InformationURL.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<Logo> getLogos() {
+    @Nonnull @Live public List<Logo> getLogos() {
         return (List<Logo>) uiInfoChildren.subList(Logo.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<PrivacyStatementURL> getPrivacyStatementURLs() {
+    @Nonnull @Live public List<PrivacyStatementURL> getPrivacyStatementURLs() {
         return (List<PrivacyStatementURL>) uiInfoChildren.subList(PrivacyStatementURL.DEFAULT_ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        
-        children.addAll(uiInfoChildren);
-        return children;
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(uiInfoChildren);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/EncTypeImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/EncTypeImpl.java
index 427da95ce..c3af84e7b 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/EncTypeImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/EncTypeImpl.java
@@ -18,6 +18,10 @@
 package org.opensaml.saml.ext.samlec.impl;
 
 import org.opensaml.saml.ext.samlec.EncType;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 
 /**
@@ -32,7 +36,9 @@ public class EncTypeImpl extends XSStringImpl implements EncType {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected EncTypeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected EncTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/GeneratedKeyImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/GeneratedKeyImpl.java
index 66e70f067..ff0f70359 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/GeneratedKeyImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/GeneratedKeyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.samlec.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
 import org.opensaml.saml.ext.samlec.GeneratedKey;
@@ -29,10 +32,10 @@ import org.opensaml.soap.soap11.MustUnderstandBearing;
 public class GeneratedKeyImpl extends XSBase64BinaryImpl implements GeneratedKey {
 
     /** soap11:actor attribute. */
-    private String soap11Actor;
+    @Nullable private String soap11Actor;
     
     /** soap11:mustUnderstand. */
-    private XSBooleanValue soap11MustUnderstand;
+    @Nullable private XSBooleanValue soap11MustUnderstand;
     
     /**
      * Constructor.
@@ -41,12 +44,13 @@ public class GeneratedKeyImpl extends XSBase64BinaryImpl implements GeneratedKey
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected GeneratedKeyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected GeneratedKeyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public Boolean isSOAP11MustUnderstand() {
+    @Nullable public Boolean isSOAP11MustUnderstand() {
         if (soap11MustUnderstand != null) {
             return soap11MustUnderstand.getValue();
         }
@@ -54,12 +58,12 @@ public class GeneratedKeyImpl extends XSBase64BinaryImpl implements GeneratedKey
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
         return soap11MustUnderstand;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final Boolean newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final Boolean newMustUnderstand) {
         if (newMustUnderstand != null) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, 
                     new XSBooleanValue(newMustUnderstand, true));
@@ -71,20 +75,21 @@ public class GeneratedKeyImpl extends XSBase64BinaryImpl implements GeneratedKey
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final XSBooleanValue newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final XSBooleanValue newMustUnderstand) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, newMustUnderstand);
             manageQualifiedAttributeNamespace(MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME, 
                     soap11MustUnderstand != null);
     }
 
     /** {@inheritDoc} */
-    public String getSOAP11Actor() {
+    @Nullable public String getSOAP11Actor() {
         return soap11Actor;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11Actor(final String newActor) {
+    public void setSOAP11Actor(@Nullable final String newActor) {
         soap11Actor = prepareForAssignment(soap11Actor, newActor);
         manageQualifiedAttributeNamespace(ActorBearing.SOAP11_ACTOR_ATTR_NAME, soap11Actor != null);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/SessionKeyImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/SessionKeyImpl.java
index ba66821d5..2775d3574 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/SessionKeyImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlec/impl/SessionKeyImpl.java
@@ -18,9 +18,11 @@
 package org.opensaml.saml.ext.samlec.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
@@ -31,6 +33,11 @@ import org.opensaml.soap.soap11.ActorBearing;
 import org.opensaml.soap.soap11.MustUnderstandBearing;
 import org.opensaml.xmlsec.signature.KeyInfo;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
+
 
 /**
  * Concrete implementation of {@link SessionKey}.
@@ -38,19 +45,19 @@ import org.opensaml.xmlsec.signature.KeyInfo;
 public class SessionKeyImpl extends AbstractXMLObject implements SessionKey {
 
     /** soap11:actor attribute. */
-    private String soap11Actor;
+    @Nullable private String soap11Actor;
     
     /** soap11:mustUnderstand. */
-    private XSBooleanValue soap11MustUnderstand;
+    @Nullable private XSBooleanValue soap11MustUnderstand;
 
     /** Algorithm attribute. */
-    private String algorithm;
+    @Nullable private String algorithm;
     
     /** EncType children. */
-    private XMLObjectChildrenList<EncType> encTypes;
+    @Nonnull private final XMLObjectChildrenList<EncType> encTypes;
 
     /** KeyInfo child. */
-    private KeyInfo keyInfo;
+    @Nullable private KeyInfo keyInfo;
     
     /**
      * Constructor.
@@ -59,15 +66,15 @@ public class SessionKeyImpl extends AbstractXMLObject implements SessionKey {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected SessionKeyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected SessionKeyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         
         encTypes = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public Boolean isSOAP11MustUnderstand() {
+    @Nullable public Boolean isSOAP11MustUnderstand() {
         if (soap11MustUnderstand != null) {
             return soap11MustUnderstand.getValue();
         }
@@ -75,14 +82,12 @@ public class SessionKeyImpl extends AbstractXMLObject implements SessionKey {
     }
 
     /** {@inheritDoc} */
-    @Override
-    public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
         return soap11MustUnderstand;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setSOAP11MustUnderstand(final Boolean newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final Boolean newMustUnderstand) {
         if (newMustUnderstand != null) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, 
                     new XSBooleanValue(newMustUnderstand, true));
@@ -94,59 +99,50 @@ public class SessionKeyImpl extends AbstractXMLObject implements SessionKey {
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setSOAP11MustUnderstand(final XSBooleanValue newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final XSBooleanValue newMustUnderstand) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, newMustUnderstand);
             manageQualifiedAttributeNamespace(MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME, 
                     soap11MustUnderstand != null);
     }
 
     /** {@inheritDoc} */
-    @Override
     public String getSOAP11Actor() {
         return soap11Actor;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setSOAP11Actor(final String newActor) {
+    public void setSOAP11Actor(@Nullable final String newActor) {
         soap11Actor = prepareForAssignment(soap11Actor, newActor);
         manageQualifiedAttributeNamespace(ActorBearing.SOAP11_ACTOR_ATTR_NAME, soap11Actor != null);
     }
     
     /** {@inheritDoc} */
-    @Override
-    public String getAlgorithm() {
+    @Nullable public String getAlgorithm() {
         return algorithm;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setAlgorithm(final String newAlgorithm) {
+    public void setAlgorithm(@Nullable final String newAlgorithm) {
         algorithm = prepareForAssignment(algorithm, newAlgorithm);
     }
 
     /** {@inheritDoc} */
-    @Override
-    public List<EncType> getEncTypes() {
+    @Nonnull @Live public List<EncType> getEncTypes() {
         return encTypes;
     }
     
     /** {@inheritDoc} */
-    @Override
-    public KeyInfo getKeyInfo() {
+    @Nullable public KeyInfo getKeyInfo() {
         return keyInfo;
     }
 
     /** {@inheritDoc} */
-    @Override
-    public void setKeyInfo(final KeyInfo newKeyInfo) {
+    public void setKeyInfo(@Nullable final KeyInfo newKeyInfo) {
         keyInfo = prepareForAssignment(keyInfo, newKeyInfo);
     }
     
     /** {@inheritDoc} */
-    @Override
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable @NotLive @Unmodifiable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
 
         children.addAll(encTypes);
@@ -155,6 +151,7 @@ public class SessionKeyImpl extends AbstractXMLObject implements SessionKey {
             children.add(keyInfo);
         }
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlpthrpty/impl/RespondToImpl.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlpthrpty/impl/RespondToImpl.java
index 858ba1a1b..8f324ea69 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlpthrpty/impl/RespondToImpl.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/ext/samlpthrpty/impl/RespondToImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.saml.ext.samlpthrpty.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.saml.ext.samlpthrpty.RespondTo;
 import org.opensaml.saml.saml2.core.impl.AbstractNameIDType;
 
@@ -32,7 +35,9 @@ public class RespondToImpl extends AbstractNameIDType implements RespondTo {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected RespondToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected RespondToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
+
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list