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

Scott Cantor cantor.2 at osu.edu
Tue Mar 14 13:28:34 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=eaa6eaed946ff79c5bdfd7ec6bb9a3f463d337b9

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

commit eaa6eaed946ff79c5bdfd7ec6bb9a3f463d337b9
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Mar 14 09:28:31 2023 -0400

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Clean up opensaml-xmlsec-api.
---
 .../opensaml/xmlsec/AlgorithmPolicyParameters.java |  19 ++-
 .../xmlsec/KeyTransportAlgorithmPredicate.java     |   6 +-
 .../agreement/KeyAgreementProcessorRegistry.java   |  10 +-
 .../xmlsec/agreement/KeyAgreementSupport.java      |  21 ++-
 .../xmlsec/algorithm/AlgorithmSupport.java         |   6 +
 .../org/opensaml/xmlsec/encryption/DHKeyValue.java |  11 +-
 .../opensaml/xmlsec/encryption/EncryptedData.java  |  11 +-
 .../opensaml/xmlsec/encryption/EncryptedKey.java   |  13 +-
 .../org/opensaml/xmlsec/encryption/Generator.java  |   7 +-
 .../java/org/opensaml/xmlsec/encryption/P.java     |   7 +-
 .../org/opensaml/xmlsec/encryption/Public.java     |   7 +-
 .../java/org/opensaml/xmlsec/encryption/Q.java     |   7 +-
 .../support/AbstractEncryptedKeyResolver.java      |  41 ++---
 .../support/ChainingEncryptedKeyResolver.java      |  25 +--
 .../xmlsec/encryption/support/Decrypter.java       | 129 +++++++++-------
 .../support/DefaultPreDecryptionValidator.java     |  10 +-
 .../xmlsec/encryption/support/Encrypter.java       |  97 ++++++------
 .../support/InlineEncryptedKeyResolver.java        |   6 +-
 .../support/PreDecryptionValidationException.java  |   3 +-
 ...SimpleKeyInfoReferenceEncryptedKeyResolver.java |   3 +-
 .../SimpleRetrievalMethodEncryptedKeyResolver.java |  14 +-
 .../opensaml/xmlsec/keyinfo/KeyInfoSupport.java    | 149 ++++++++++++------
 .../signature/AbstractSignableXMLObject.java       |   2 +-
 .../opensaml/xmlsec/signature/CryptoBinary.java    |   6 +-
 .../xmlsec/signature/DEREncodedKeyValue.java       |  13 +-
 .../org/opensaml/xmlsec/signature/DSAKeyValue.java |  11 +-
 .../org/opensaml/xmlsec/signature/ECKeyValue.java  |  13 +-
 .../org/opensaml/xmlsec/signature/ECPointType.java |   7 +-
 .../org/opensaml/xmlsec/signature/Exponent.java    |   7 +-
 .../main/java/org/opensaml/xmlsec/signature/G.java |   7 +-
 .../main/java/org/opensaml/xmlsec/signature/J.java |   7 +-
 .../org/opensaml/xmlsec/signature/KeyInfo.java     |  12 +-
 .../xmlsec/signature/KeyInfoReference.java         |  15 +-
 .../org/opensaml/xmlsec/signature/KeyName.java     |   7 +-
 .../org/opensaml/xmlsec/signature/KeyValue.java    |  11 +-
 .../org/opensaml/xmlsec/signature/MgmtData.java    |   7 +-
 .../org/opensaml/xmlsec/signature/Modulus.java     |   7 +-
 .../org/opensaml/xmlsec/signature/NamedCurve.java  |  13 +-
 .../main/java/org/opensaml/xmlsec/signature/P.java |   7 +-
 .../org/opensaml/xmlsec/signature/PGPData.java     |  11 +-
 .../org/opensaml/xmlsec/signature/PGPKeyID.java    |   7 +-
 .../opensaml/xmlsec/signature/PGPKeyPacket.java    |   7 +-
 .../org/opensaml/xmlsec/signature/PgenCounter.java |   7 +-
 .../org/opensaml/xmlsec/signature/PublicKey.java   |   7 +-
 .../main/java/org/opensaml/xmlsec/signature/Q.java |   7 +-
 .../org/opensaml/xmlsec/signature/RSAKeyValue.java |  11 +-
 .../opensaml/xmlsec/signature/RetrievalMethod.java |  15 +-
 .../org/opensaml/xmlsec/signature/SPKIData.java    |  10 +-
 .../org/opensaml/xmlsec/signature/SPKISexp.java    |   7 +-
 .../java/org/opensaml/xmlsec/signature/Seed.java   |   7 +-
 .../xmlsec/signature/SignableXMLObject.java        |   6 +-
 .../org/opensaml/xmlsec/signature/Signature.java   |  12 +-
 .../org/opensaml/xmlsec/signature/Transform.java   |  12 +-
 .../org/opensaml/xmlsec/signature/Transforms.java  |  10 +-
 .../org/opensaml/xmlsec/signature/X509CRL.java     |   7 +-
 .../opensaml/xmlsec/signature/X509Certificate.java |   7 +-
 .../org/opensaml/xmlsec/signature/X509Data.java    |  10 +-
 .../org/opensaml/xmlsec/signature/X509Digest.java  |  13 +-
 .../opensaml/xmlsec/signature/X509IssuerName.java  |   7 +-
 .../xmlsec/signature/X509IssuerSerial.java         |  11 +-
 .../org/opensaml/xmlsec/signature/X509SKI.java     |   7 +-
 .../xmlsec/signature/X509SerialNumber.java         |  11 +-
 .../opensaml/xmlsec/signature/X509SubjectName.java |   7 +-
 .../java/org/opensaml/xmlsec/signature/XPath.java  |   7 +-
 .../main/java/org/opensaml/xmlsec/signature/Y.java |   7 +-
 .../signature/support/SignatureConstants.java      | 171 +++++++++++----------
 .../xmlsec/signature/support/SignatureSupport.java |  14 +-
 .../SignatureValidationParametersCriterion.java    |   2 +-
 .../signature/support/SignatureValidator.java      |   4 +-
 .../opensaml/xmlsec/signature/support/Signer.java  |   9 +-
 .../signature/support/URIContentReference.java     |  17 +-
 .../support/XMLSignatureCredentialContext.java     |   2 +-
 .../KeyAgreementProcessorRegistryTest.java         |  27 +++-
 73 files changed, 754 insertions(+), 476 deletions(-)

diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/AlgorithmPolicyParameters.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/AlgorithmPolicyParameters.java
index d99349aea..8eec48efd 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/AlgorithmPolicyParameters.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/AlgorithmPolicyParameters.java
@@ -18,8 +18,6 @@
 package org.opensaml.xmlsec;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -27,6 +25,7 @@ import javax.annotation.Nullable;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -42,8 +41,8 @@ public class AlgorithmPolicyParameters {
         
     /** Constructor. */
     public AlgorithmPolicyParameters() {
-        includedAlgorithmURIs = Collections.emptySet();
-        excludedAlgorithmURIs = Collections.emptySet();
+        includedAlgorithmURIs = CollectionSupport.emptySet();
+        excludedAlgorithmURIs = CollectionSupport.emptySet();
     }
     
     /**
@@ -60,12 +59,12 @@ public class AlgorithmPolicyParameters {
      * 
      * @param uris the included algorithms
      */
-    public void setIncludedAlgorithms(@Nullable final Collection<String> uris) {
+    public void setIncludedAlgorithms(@Nullable @NonnullElements final Collection<String> uris) {
         if (uris == null) {
-            includedAlgorithmURIs = Collections.emptySet();
+            includedAlgorithmURIs = CollectionSupport.emptySet();
             return;
         }
-        includedAlgorithmURIs = Set.copyOf(StringSupport.normalizeStringCollection(uris));
+        includedAlgorithmURIs = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(uris));
     }
     
     /**
@@ -82,12 +81,12 @@ public class AlgorithmPolicyParameters {
      * 
      * @param uris the excluded algorithms
      */
-    public void setExcludedAlgorithms(@Nonnull @NonnullElements final Collection<String> uris) {
+    public void setExcludedAlgorithms(@Nullable @NonnullElements final Collection<String> uris) {
         if (uris == null) {
-            excludedAlgorithmURIs = Collections.emptySet();
+            excludedAlgorithmURIs = CollectionSupport.emptySet();
             return;
         }
-        excludedAlgorithmURIs = Set.copyOf(StringSupport.normalizeStringCollection(uris));
+        excludedAlgorithmURIs = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(uris));
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/KeyTransportAlgorithmPredicate.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/KeyTransportAlgorithmPredicate.java
index 3170f25f5..3824b97da 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/KeyTransportAlgorithmPredicate.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/KeyTransportAlgorithmPredicate.java
@@ -38,13 +38,13 @@ public interface KeyTransportAlgorithmPredicate extends Predicate<KeyTransportAl
     public static final class SelectionInput {
         
         /** The candidate key transport algorithm. */
-        private String keyTransportAlgorithm;
+        @Nonnull private final String keyTransportAlgorithm;
         
         /** The candidate data encryption algorithm. */
-        private String dataEncryptionAlgorithm;
+        @Nullable private final String dataEncryptionAlgorithm;
         
         /** The candidate key transport credential. */
-        private Credential keyTransportCredential;
+        @Nullable private final Credential keyTransportCredential;
         
         /**
          * Constructor.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistry.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistry.java
index 900363a06..51a038a9f 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistry.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistry.java
@@ -24,6 +24,10 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
@@ -78,8 +82,8 @@ public class KeyAgreementProcessorRegistry {
      * 
      * @return the set of registered algorithms
      */
-    @Nonnull public Set<String> getRegisteredAlgorithms() {
-        return Set.copyOf(processors.keySet());
+    @Nonnull @NonnullElements @Unmodifiable @NotLive public Set<String> getRegisteredAlgorithms() {
+        return CollectionSupport.copyToSet(processors.keySet());
     }
     
     /**
@@ -95,4 +99,4 @@ public class KeyAgreementProcessorRegistry {
         return processors.get(alg);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementSupport.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementSupport.java
index 9a9577d80..bf7764ebf 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementSupport.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/agreement/KeyAgreementSupport.java
@@ -17,12 +17,14 @@
 
 package org.opensaml.xmlsec.agreement;
 
+import java.security.PublicKey;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.core.config.ConfigurationService;
+import org.opensaml.core.xml.XMLObject;
 import org.opensaml.security.credential.Credential;
 import org.opensaml.security.crypto.JCAConstants;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
@@ -31,6 +33,7 @@ import org.opensaml.xmlsec.encryption.EncryptedType;
 import org.opensaml.xmlsec.encryption.EncryptionMethod;
 import org.opensaml.xmlsec.encryption.KeySize;
 
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
@@ -39,7 +42,8 @@ import net.shibboleth.shared.collection.CollectionSupport;
 public final class KeyAgreementSupport {
     
     /** JCA key algorithms that support key agreement. */
-    public static final Set<String> KEY_ALGORITHMS = CollectionSupport.setOf(JCAConstants.KEY_ALGO_EC, JCAConstants.KEY_ALGO_DH);
+    @Nonnull @NonnullElements public static final Set<String> KEY_ALGORITHMS =
+            CollectionSupport.setOf(JCAConstants.KEY_ALGO_EC, JCAConstants.KEY_ALGO_DH);
     
     /** Constructor. */
     private KeyAgreementSupport() {}
@@ -91,17 +95,19 @@ public final class KeyAgreementSupport {
      * @return the key size, or null if not present
      */
     @Nullable public static Integer getExplicitKeySize(@Nonnull final AgreementMethod agreementMethod) {
-        if (agreementMethod.getParent() == null || agreementMethod.getParent().getParent() == null
-                || ! EncryptedType.class.isInstance(agreementMethod.getParent().getParent())) {
+        final XMLObject parent = agreementMethod.getParent();
+        if (parent == null || parent.getParent() == null || ! EncryptedType.class.isInstance(parent.getParent())) {
             return null;
         }
         
-        final EncryptedType et = EncryptedType.class.cast(agreementMethod.getParent().getParent());
-        if (et.getEncryptionMethod() == null || et.getEncryptionMethod().getKeySize() == null) {
+        final EncryptedType et = EncryptedType.class.cast(parent.getParent());
+        final EncryptionMethod method = et.getEncryptionMethod();
+        if (method == null) {
             return null;
         }
         
-        return et.getEncryptionMethod().getKeySize().getValue();
+        final KeySize size = method.getKeySize();
+        return size != null ? size.getValue() : null;
     }
     
     /** 
@@ -147,6 +153,7 @@ public final class KeyAgreementSupport {
             return false;
         }
         
-        return credential.getPublicKey() != null && KEY_ALGORITHMS.contains(credential.getPublicKey().getAlgorithm());
+        final PublicKey pk = credential.getPublicKey();
+        return pk != null && KEY_ALGORITHMS.contains(pk.getAlgorithm());
     }
 }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/algorithm/AlgorithmSupport.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/algorithm/AlgorithmSupport.java
index 69b1e469e..dd8b450dc 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/algorithm/AlgorithmSupport.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/algorithm/AlgorithmSupport.java
@@ -388,6 +388,9 @@ public final class AlgorithmSupport {
     @Nonnull public static KeyPair generateKeyPair(@Nonnull final String algoURI, final int keyLength) 
             throws NoSuchAlgorithmException, NoSuchProviderException {
         final String jceAlgorithmName = getKeyAlgorithm(algoURI);
+        if (jceAlgorithmName == null) {
+            throw new NoSuchAlgorithmException("No JCE algorithm found for " + algoURI);
+        }
         return KeySupport.generateKeyPair(jceAlgorithmName, keyLength, null);
     }
 
@@ -405,6 +408,9 @@ public final class AlgorithmSupport {
             @Nonnull final AlgorithmParameterSpec paramSpec)
                     throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
         final String jceAlgorithmName = getKeyAlgorithm(algoURI);
+        if (jceAlgorithmName == null) {
+            throw new NoSuchAlgorithmException("No JCE algorithm found for " + algoURI);
+        }
         return KeySupport.generateKeyPair(jceAlgorithmName, paramSpec, null);
     }
 
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DHKeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DHKeyValue.java
index b98cf4e27..0b52b8dab 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DHKeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DHKeyValue.java
@@ -17,29 +17,32 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, DHKeyValue element.
  */
 public interface DHKeyValue extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DHKeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DHKeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "DHKeyValueType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "DHKeyValueType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
             EncryptionConstants.XMLENC_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedData.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedData.java
index 6a5e6b4c4..776ffb3eb 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedData.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedData.java
@@ -17,27 +17,30 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, EncryptedData element.
  */
 public interface EncryptedData extends EncryptedType {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "EncryptedData";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "EncryptedData";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "EncryptedDataType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "EncryptedDataType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
             EncryptionConstants.XMLENC_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedKey.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedKey.java
index ad7c4a89c..7c31a1501 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedKey.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/EncryptedKey.java
@@ -17,32 +17,35 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, EncryptedKey element.
  */
 public interface EncryptedKey extends EncryptedType {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "EncryptedKey";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "EncryptedKey";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "EncryptedKeyType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "EncryptedKeyType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC_NS, TYPE_LOCAL_NAME,
             EncryptionConstants.XMLENC_PREFIX);
 
     /** Recipient attribute name. */
-    public static final String RECIPIENT_ATTRIB_NAME = "Recipient";
+    @Nonnull @NotEmpty public static final String RECIPIENT_ATTRIB_NAME = "Recipient";
 
     /**
      * Gets the hint about for whom this encrypted key is intended.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Generator.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Generator.java
index ec2d80204..467e305c6 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Generator.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Generator.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.signature.CryptoBinary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, Generator element.
  */
 public interface Generator extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Generator";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Generator";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/P.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/P.java
index ed3bf5ba7..340336165 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/P.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/P.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.signature.CryptoBinary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, P element.
  */
 public interface P extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "P";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "P";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Public.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Public.java
index 4bc65e746..1cd6c921b 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Public.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Public.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.signature.CryptoBinary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, Public element.
  */
 public interface Public extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Public";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Public";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Q.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Q.java
index 1c1078939..9c8fe9058 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Q.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Q.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.encryption;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.signature.CryptoBinary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Encryption, version 20021210, Q element.
  */
 public interface Q extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Q";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Q";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/AbstractEncryptedKeyResolver.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/AbstractEncryptedKeyResolver.java
index 5b708d1e5..5252f2ab9 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/AbstractEncryptedKeyResolver.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/AbstractEncryptedKeyResolver.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.xmlsec.encryption.support;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -27,13 +26,17 @@ import javax.annotation.Nullable;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.primitive.StringSupport;
 
+import org.opensaml.xmlsec.encryption.CarriedKeyName;
 import org.opensaml.xmlsec.encryption.DataReference;
 import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
+import org.opensaml.xmlsec.encryption.ReferenceList;
 import org.opensaml.xmlsec.keyinfo.KeyInfoSupport;
+import org.opensaml.xmlsec.signature.KeyInfo;
 
 import com.google.common.base.Strings;
 
@@ -43,11 +46,11 @@ import com.google.common.base.Strings;
 public abstract class AbstractEncryptedKeyResolver implements EncryptedKeyResolver {
     
     /** Recipient attribute criteria against which to match.*/
-    private final Set<String> recipients;
+    @Nonnull private final Set<String> recipients;
     
     /** Constructor. */
     public AbstractEncryptedKeyResolver() {
-        recipients = Collections.emptySet();
+        recipients = CollectionSupport.emptySet();
     }
 
     /** 
@@ -56,7 +59,7 @@ public abstract class AbstractEncryptedKeyResolver implements EncryptedKeyResolv
      * @param newRecipents set of recipients
      */
     public AbstractEncryptedKeyResolver(@Nullable final Set<String> newRecipents) {
-        recipients = Set.copyOf(StringSupport.normalizeStringCollection(newRecipents));
+        recipients = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(newRecipents));
     }
 
     /** 
@@ -67,9 +70,9 @@ public abstract class AbstractEncryptedKeyResolver implements EncryptedKeyResolv
     public AbstractEncryptedKeyResolver(@Nullable final String recipient) {
         final String trimmed = StringSupport.trimOrNull(recipient);
         if (trimmed != null) {
-            recipients = Collections.singleton(trimmed);
+            recipients = CollectionSupport.singleton(trimmed);
         } else {
-            recipients = Collections.emptySet();
+            recipients = CollectionSupport.emptySet();
         }
     }
 
@@ -113,18 +116,17 @@ public abstract class AbstractEncryptedKeyResolver implements EncryptedKeyResolv
         Constraint.isNotNull(encryptedData, "EncryptedData cannot be null");
         Constraint.isNotNull(encryptedKey, "EncryptedKey cannot be null");
         
-        if (encryptedKey.getCarriedKeyName() == null 
-                || Strings.isNullOrEmpty(encryptedKey.getCarriedKeyName().getValue()) ) {
+        final CarriedKeyName carried = encryptedKey.getCarriedKeyName();
+        if (carried == null || Strings.isNullOrEmpty(carried.getValue()) ) {
             return true;
-        } else if (encryptedData.getKeyInfo() == null 
-                || encryptedData.getKeyInfo().getKeyNames().isEmpty() ) {
-            return false;
         }
         
-        final String keyCarriedKeyName = encryptedKey.getCarriedKeyName().getValue();
-        final List<String> dataKeyNames = KeyInfoSupport.getKeyNames(encryptedData.getKeyInfo());
+        final KeyInfo keyInfo = encryptedData.getKeyInfo(); 
+        if (keyInfo == null || keyInfo.getKeyNames().isEmpty() ) {
+            return false;
+        }
         
-        return dataKeyNames.contains(keyCarriedKeyName);
+        return KeyInfoSupport.getKeyNames(keyInfo).contains(carried.getValue());
     }
     
     /**
@@ -141,18 +143,19 @@ public abstract class AbstractEncryptedKeyResolver implements EncryptedKeyResolv
         Constraint.isNotNull(encryptedData, "EncryptedData cannot be null");
         Constraint.isNotNull(encryptedKey, "EncryptedKey cannot be null");
 
-        if (encryptedKey.getReferenceList() == null 
-                || encryptedKey.getReferenceList().getDataReferences().isEmpty() ) {
+        final ReferenceList reflist = encryptedKey.getReferenceList();
+        if (reflist == null || reflist.getDataReferences().isEmpty() ) {
             return true;
         } else if (Strings.isNullOrEmpty(encryptedData.getID())) {
             return false;
         }
         
-        final List<DataReference> drlist = encryptedKey.getReferenceList().getDataReferences();
+        final List<DataReference> drlist = reflist.getDataReferences();
         for (final DataReference dr : drlist) {
-            if (Strings.isNullOrEmpty(dr.getURI()) || !dr.getURI().startsWith("#") ) {
+            final String druri = dr.getURI();
+            if (druri == null || !druri.startsWith("#") ) {
                 continue;
-            } else if (dr.resolveIDFromRoot(dr.getURI().substring(1)) == encryptedData) {
+            } else if (dr.resolveIDFromRoot(druri.substring(1)) == encryptedData) {
                 return true;
             }
         }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/ChainingEncryptedKeyResolver.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/ChainingEncryptedKeyResolver.java
index ec1d8acda..7cb42804d 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/ChainingEncryptedKeyResolver.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/ChainingEncryptedKeyResolver.java
@@ -29,13 +29,14 @@ import javax.annotation.Nullable;
 import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.ParameterName;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotLive;
 import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * An implementation of {@link EncryptedKeyResolver} which chains multiple other resolver implementations together,
@@ -57,7 +58,8 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
     public ChainingEncryptedKeyResolver(
             @Nonnull @NonnullElements @ParameterName(name="encKeyResolvers")
             final List<EncryptedKeyResolver> encKeyResolvers) {
-        resolvers = List.copyOf(Constraint.isNotNull(encKeyResolvers, "List of EncryptedKeyResolvers cannot be null"));
+        resolvers = CollectionSupport.copyToList(
+                Constraint.isNotNull(encKeyResolvers, "List of EncryptedKeyResolvers cannot be null"));
     }
 
     /** 
@@ -71,7 +73,8 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
             final List<EncryptedKeyResolver> encKeyResolvers,
             @Nullable @ParameterName(name="recipients") final Set<String> recipients) {
         super(recipients);
-        resolvers = List.copyOf(Constraint.isNotNull(encKeyResolvers, "List of EncryptedKeyResolvers cannot be null"));
+        resolvers = CollectionSupport.copyToList(
+                Constraint.isNotNull(encKeyResolvers, "List of EncryptedKeyResolvers cannot be null"));
     }
     
     /** 
@@ -112,10 +115,10 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
     public class ChainingIterable implements Iterable<EncryptedKey> {
 
         /** The chaining encrypted key resolver which owns this instance. */
-        private final ChainingEncryptedKeyResolver parent;
+        @Nonnull private final ChainingEncryptedKeyResolver parent;
 
         /** The EncryptedData context for resolution. */
-        private final EncryptedData encryptedData;
+        @Nonnull private final EncryptedData encryptedData;
 
         /**
          * Constructor.
@@ -130,7 +133,6 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
         }
 
         /** {@inheritDoc} */
-        @Override
         @Nonnull public Iterator<EncryptedKey> iterator() {
             return new ChainingIterator(parent, encryptedData);
         }
@@ -144,16 +146,17 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
     public class ChainingIterator implements Iterator<EncryptedKey> {
 
         /** Class logger. */
-        private final Logger log = LoggerFactory.getLogger(ChainingEncryptedKeyResolver.ChainingIterator.class);
+        @Nonnull private final Logger log =
+                LoggerFactory.getLogger(ChainingEncryptedKeyResolver.ChainingIterator.class);
 
         /** The chaining encrypted key resolver which owns this instance. */
-        private final ChainingEncryptedKeyResolver parent;
+        @Nonnull private final ChainingEncryptedKeyResolver parent;
 
         /** The EncryptedData context for resolution. */
-        private final EncryptedData encryptedData;
+        @Nonnull private final EncryptedData encryptedData;
 
         /** The iterator over resolvers in the chain. */
-        private final Iterator<EncryptedKeyResolver> resolverIterator;
+        @Nonnull private final Iterator<EncryptedKeyResolver> resolverIterator;
 
         /** The iterator over EncryptedKey instances from the current resolver. */
         private Iterator<EncryptedKey> keyIterator;
@@ -162,7 +165,7 @@ public class ChainingEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
         private EncryptedKeyResolver currentResolver;
 
         /** The next encrypted key that is safe to return. */
-        private EncryptedKey nextKey;
+        @Nullable private EncryptedKey nextKey;
 
         /**
          * Constructor.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Decrypter.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Decrypter.java
index 9dcfd8250..415414caf 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Decrypter.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Decrypter.java
@@ -30,6 +30,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.resolver.Criterion;
@@ -62,13 +63,14 @@ import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.opensaml.xmlsec.encryption.EncryptedType;
 import org.opensaml.xmlsec.encryption.EncryptionMethod;
+import org.opensaml.xmlsec.encryption.KeySize;
 import org.opensaml.xmlsec.encryption.MGF;
 import org.opensaml.xmlsec.keyinfo.KeyInfoCredentialResolver;
 import org.opensaml.xmlsec.keyinfo.KeyInfoCriterion;
 import org.opensaml.xmlsec.signature.DigestMethod;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
@@ -186,44 +188,44 @@ import com.google.common.base.Strings;
 public class Decrypter {
 
     /** ParserPool used in parsing decrypted data. */
-    private final ParserPool parserPool;
+    @Nonnull private final ParserPool parserPool;
 
     /** Unmarshaller factory, used in decryption of EncryptedData objects. */
-    private final UnmarshallerFactory unmarshallerFactory;
+    @Nonnull private final UnmarshallerFactory unmarshallerFactory;
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(Decrypter.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(Decrypter.class);
 
     /** Resolver for data encryption keys. */
-    private KeyInfoCredentialResolver resolver;
+    @Nullable private KeyInfoCredentialResolver resolver;
 
     /** Resolver for key encryption keys. */
-    private KeyInfoCredentialResolver kekResolver;
+    @Nullable private KeyInfoCredentialResolver kekResolver;
 
     /** Resolver for EncryptedKey instances which contain the encrypted data encryption key. */
-    private EncryptedKeyResolver encKeyResolver;
+    @Nullable private EncryptedKeyResolver encKeyResolver;
     
     /** The collection of algorithm URIs which are included. */
-    private Collection<String> includedAlgorithmURIs;
+    @Nullable private Collection<String> includedAlgorithmURIs;
     
     /** The collection of algorithm URIs which are excluded. */
-    private Collection<String> excludedAlgorithmURIs;
+    @Nullable private Collection<String> excludedAlgorithmURIs;
 
     /** Additional criteria to use when resolving credentials based on an EncryptedData's KeyInfo. */
-    private CriteriaSet resolverCriteria;
+    @Nullable private CriteriaSet resolverCriteria;
 
     /** Additional criteria to use when resolving credentials based on an EncryptedKey's KeyInfo. */
-    private CriteriaSet kekResolverCriteria;
+    @Nullable private CriteriaSet kekResolverCriteria;
 
     /** The name of the JCA security provider to use. */
-    private String jcaProviderName;
+    @Nullable private String jcaProviderName;
     
     /** Flag to determine whether by default the Element which backs the underlying decrypted SAMLObject will be the 
      * root of a new DOM document. */
     private boolean defaultRootInNewDocument;
     
     /** The pre-decryption validator instance. */
-    private PreDecryptionValidator preDecryptionValidator;
+    @Nullable private PreDecryptionValidator preDecryptionValidator;
     
     /**
      * Constructor.
@@ -286,9 +288,11 @@ public class Decrypter {
         
         // Note: Use of this internal JAXP ParserPool is hopefully only temporary, 
         // to be replaced when Xerces implements DOM 3 LSParser.parseWithContext(...).
-        parserPool = buildParserPool();
+        parserPool = Constraint.isNotNull(ConfigurationService.get(DecryptionParserPool.class), 
+                "DecryptionParserPool has not been registered with the global configuration").getParserPool();
 
-        unmarshallerFactory = XMLObjectProviderRegistrySupport.getUnmarshallerFactory();
+        unmarshallerFactory = Constraint.isNotNull(XMLObjectProviderRegistrySupport.getUnmarshallerFactory(),
+                "UnmarshallerFactory not registered with the global configuration");
         
         defaultRootInNewDocument = false;
         
@@ -300,7 +304,7 @@ public class Decrypter {
      * 
      * @return the validator, may be null
      */
-    @Nullable PreDecryptionValidator getPreDecryptionValidator() {
+    @Nullable public PreDecryptionValidator getPreDecryptionValidator() {
         return preDecryptionValidator;
     }
 
@@ -544,13 +548,15 @@ public class Decrypter {
             log.debug("Failed to decrypt EncryptedData using standard KeyInfo resolver");
         }
 
-        final String algorithm = encryptedData.getEncryptionMethod().getAlgorithm();
+        final EncryptionMethod method = encryptedData.getEncryptionMethod();
+        final String algorithm = method != null ? method.getAlgorithm() : null;
         if (Strings.isNullOrEmpty(algorithm)) {
             final String msg = "EncryptedData's EncryptionMethod Algorithm attribute was empty, "
                 + "key decryption could not be attempted";
             log.error(msg);
             throw new DecryptionException(msg);
         } else if (encKeyResolver != null) {
+            assert algorithm != null;
             docFrag = decryptUsingResolvedEncryptedKey(encryptedData, algorithm);
             if (docFrag != null) {
                 return docFrag;
@@ -629,7 +635,9 @@ public class Decrypter {
             throw new DecryptionException("EncryptedData could not be decrypted");
         }
         final ByteArrayInputStream input = new ByteArrayInputStream(bytes);
-        final DocumentFragment docFragment = parseInputStream(input, encryptedData.getDOM().getOwnerDocument());
+        final Element domNode = encryptedData.getDOM();
+        assert domNode != null;
+        final DocumentFragment docFragment = parseInputStream(input, domNode.getOwnerDocument());
         return docFragment;
     }
 
@@ -655,9 +663,14 @@ public class Decrypter {
 
         final CriteriaSet criteriaSet = buildCredentialCriteria(encryptedKey, kekResolverCriteria);
         try {
+            assert kekResolver != null;
             for (final Credential cred : kekResolver.resolve(criteriaSet)) {
                 try {
-                    return decryptKey(encryptedKey, algorithm, CredentialSupport.extractDecryptionKey(cred));
+                    final Key decKey = CredentialSupport.extractDecryptionKey(cred);
+                    if (decKey == null) {
+                        throw new DecryptionException("Unable to extract key decryption key");
+                    }
+                    return decryptKey(encryptedKey, algorithm, decKey);
                 } catch (final DecryptionException e) {
                     final String msg =
                             "Attempt to decrypt EncryptedKey using credential from KEK KeyInfo resolver failed: ";
@@ -685,10 +698,7 @@ public class Decrypter {
      */
     @Nonnull public Key decryptKey(@Nonnull final EncryptedKey encryptedKey, @Nonnull final String algorithm,
             @Nonnull final Key kek) throws DecryptionException {
-        if (kek == null) {
-            log.error("Data encryption key was null");
-            throw new IllegalArgumentException("Data encryption key cannot be null");
-        } else if (Strings.isNullOrEmpty(algorithm)) {
+        if (Strings.isNullOrEmpty(algorithm)) {
             log.error("Algorithm of encrypted key not supplied, key decryption cannot proceed");
             throw new DecryptionException("Algorithm of encrypted key not supplied, key decryption cannot proceed");
         }
@@ -720,6 +730,7 @@ public class Decrypter {
         final org.apache.xml.security.encryption.EncryptedKey encKey;
         try {
             final Element targetElement = encryptedKey.getDOM();
+            assert targetElement != null;
             encKey = xmlCipher.loadEncryptedKey(targetElement.getOwnerDocument(), targetElement);
         } catch (final XMLEncryptionException e) {
             log.error("Error when loading library native encrypted key representation: {}", e.getMessage());
@@ -758,8 +769,8 @@ public class Decrypter {
     protected void preProcessEncryptedData(@Nonnull final EncryptedData encryptedData,
             @Nonnull final Key dataEncKey) throws DecryptionException {
         
-        if (getPreDecryptionValidator() != null) {
-            getPreDecryptionValidator().validate(encryptedData);
+        if (preDecryptionValidator != null) {
+            preDecryptionValidator.validate(encryptedData);
         }
     }
 
@@ -779,8 +790,8 @@ public class Decrypter {
     protected void preProcessEncryptedKey(@Nonnull final EncryptedKey encryptedKey, @Nonnull final String algorithm,
             @Nonnull final Key kek) throws DecryptionException {
         
-        if (getPreDecryptionValidator() != null) {
-            getPreDecryptionValidator().validate(encryptedKey);
+        if (preDecryptionValidator != null) {
+            preDecryptionValidator.validate(encryptedKey);
         }
     }
 
@@ -794,9 +805,14 @@ public class Decrypter {
         if (resolver != null) {
             final CriteriaSet criteriaSet = buildCredentialCriteria(encryptedData, resolverCriteria);
             try {
+                assert resolver != null;
                 for (final Credential cred : resolver.resolve(criteriaSet)) {
                     try {
-                        return decryptDataToDOM(encryptedData, CredentialSupport.extractDecryptionKey(cred));
+                        final Key decKey = CredentialSupport.extractDecryptionKey(cred);
+                        if (decKey == null) {
+                            throw new DecryptionException("Unable to extract key from resolved credential");
+                        }
+                        return decryptDataToDOM(encryptedData, decKey);
                     } catch (final DecryptionException e) {
                         final String msg =
                                 "Decryption attempt using credential from standard KeyInfo resolver failed: ";
@@ -824,6 +840,7 @@ public class Decrypter {
         if (encKeyResolver != null) {
             for (final EncryptedKey encryptedKey : encKeyResolver.resolve(encryptedData)) {
                 try {
+                    assert encryptedKey != null;
                     final Key decryptedKey = decryptKey(encryptedKey, algorithm);
                     return decryptDataToDOM(encryptedData, decryptedKey);
                 } catch (final DecryptionException e) {
@@ -936,11 +953,15 @@ public class Decrypter {
             log.debug("Added decryption key length criteria from EncryptionMethod algorithm URI: {}", lengthCrit
                     .getKeyLength());
         } else {
-            if (encMethod.getKeySize() != null && encMethod.getKeySize().getValue() != null) {
-                lengthCrit = new KeyLengthCriterion(encMethod.getKeySize().getValue());
-                critSet.add(lengthCrit);
-                log.debug("Added decryption key length criteria from EncryptionMethod/KeySize: {}", lengthCrit
-                        .getKeyLength());
+            final KeySize size = encMethod.getKeySize();
+            if (size != null) {
+                final Integer sizeInt = size.getValue();
+                if (sizeInt != null) {
+                    lengthCrit = new KeyLengthCriterion(sizeInt);
+                    critSet.add(lengthCrit);
+                    log.debug("Added decryption key length criteria from EncryptionMethod/KeySize: {}",
+                            lengthCrit.getKeyLength());
+                }
             }
         }
 
@@ -958,8 +979,10 @@ public class Decrypter {
             return null;
         }
 
+        assert encAlgorithmURI != null;
         final String jcaKeyAlgorithm = AlgorithmSupport.getKeyAlgorithm(encAlgorithmURI);
         if (!Strings.isNullOrEmpty(jcaKeyAlgorithm)) {
+            assert jcaKeyAlgorithm != null;
             return new KeyAlgorithmCriterion(jcaKeyAlgorithm);
         }
 
@@ -977,6 +1000,7 @@ public class Decrypter {
             return null;
         }
 
+        assert encAlgorithmURI != null;
         final Integer keyLength = AlgorithmSupport.getKeyLength(encAlgorithmURI);
         if (keyLength != null) {
             return new KeyLengthCriterion(keyLength);
@@ -1015,26 +1039,6 @@ public class Decrypter {
         }
     }
     
-    /**
-     * Build the internal parser pool instance used to parse decrypted XML.
-     * 
-     * <p>
-     * Note: When using a Xerces parser or derivative, the following feature must be set to false: 
-     * <code>http://apache.org/xml/features/dom/defer-node-expansion</code>
-     * </p>
-     * 
-     * @return a new parser pool instance
-     * 
-     * @deprecated
-     */
-    @Deprecated
-    protected ParserPool buildParserPool() {
-        // Note: we don't really build this here anymore, so the method name is semantically misleading.
-        // We should remove this method in next major release and just move this call to the ctor.
-        return Constraint.isNotNull(ConfigurationService.get(DecryptionParserPool.class), 
-                "DecryptionParserPool has not been registered with the global configuration").getParserPool();
-    }
-    
     /**
      * Validate the algorithms contained within an {@link EncryptedKey}.
      * 
@@ -1042,14 +1046,18 @@ public class Decrypter {
      * @throws DecryptionException if any algorithms do not satisfy include/exclude policy
      */
     protected void validateAlgorithms(@Nonnull final EncryptedKey encryptedKey) throws DecryptionException {
-        final String encryptionAlgorithm = encryptedKey.getEncryptionMethod().getAlgorithm();
+        final EncryptionMethod method = encryptedKey.getEncryptionMethod();
+        final String encryptionAlgorithm = method != null ? method.getAlgorithm() : null;
+        if (method == null || encryptionAlgorithm == null) {
+            throw new DecryptionException("EncryptionMethod or Algorithm was absent");
+        }
+        
         validateAlgorithmURI(encryptionAlgorithm);
         
         if (AlgorithmSupport.isRSAOAEP(encryptionAlgorithm)) {
             // ds:DigestMethod
             String digestAlgorithm = null;
-            final List<XMLObject> digestMethods = encryptedKey.getEncryptionMethod()
-                    .getUnknownXMLObjects(DigestMethod.DEFAULT_ELEMENT_NAME);
+            final List<XMLObject> digestMethods = method.getUnknownXMLObjects(DigestMethod.DEFAULT_ELEMENT_NAME);
             if (digestMethods.size() > 0) {
                 final DigestMethod digestMethod = (DigestMethod) digestMethods.get(0);
                 digestAlgorithm = StringSupport.trimOrNull(digestMethod.getAlgorithm());
@@ -1063,7 +1071,7 @@ public class Decrypter {
             // xenc11:MGF
             String mgfAlgorithm = null;
             final List<XMLObject> mgfs =
-                    encryptedKey.getEncryptionMethod().getUnknownXMLObjects(MGF.DEFAULT_ELEMENT_NAME);
+                    method.getUnknownXMLObjects(MGF.DEFAULT_ELEMENT_NAME);
             if (mgfs.size() > 0) {
                 final MGF mgf = (MGF) mgfs.get(0);
                 mgfAlgorithm = StringSupport.trimOrNull(mgf.getAlgorithm());
@@ -1083,7 +1091,12 @@ public class Decrypter {
      * @throws DecryptionException if any algorithms do not satisfy include/exclude policy
      */
     protected void validateAlgorithms(@Nonnull final EncryptedData encryptedData) throws DecryptionException {
-        validateAlgorithmURI(encryptedData.getEncryptionMethod().getAlgorithm());
+        final EncryptionMethod method = encryptedData.getEncryptionMethod();
+        final String alg = method != null ? method.getAlgorithm() : null;
+        if (alg == null) {
+            throw new DecryptionException("EncryptionMethod or Algorithm was absent");
+        }
+        validateAlgorithmURI(alg);
     }
     
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/DefaultPreDecryptionValidator.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/DefaultPreDecryptionValidator.java
index f8a9a239f..670557973 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/DefaultPreDecryptionValidator.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/DefaultPreDecryptionValidator.java
@@ -19,6 +19,7 @@ package org.opensaml.xmlsec.encryption.support;
 
 import javax.annotation.Nonnull;
 
+import org.opensaml.xmlsec.encryption.CipherData;
 import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.opensaml.xmlsec.encryption.EncryptedType;
@@ -30,13 +31,13 @@ public class DefaultPreDecryptionValidator implements PreDecryptionValidator {
 
     /** {@inheritDoc} */
     @Override
-    public void validate(EncryptedData encryptedData) throws PreDecryptionValidationException {
+    public void validate(@Nonnull final EncryptedData encryptedData) throws PreDecryptionValidationException {
         performCommonValidation(encryptedData);
     }
 
     /** {@inheritDoc} */
     @Override
-    public void validate(EncryptedKey encryptedKey) throws PreDecryptionValidationException {
+    public void validate(@Nonnull final EncryptedKey encryptedKey) throws PreDecryptionValidationException {
         performCommonValidation(encryptedKey);
     }
 
@@ -50,13 +51,14 @@ public class DefaultPreDecryptionValidator implements PreDecryptionValidator {
     protected void performCommonValidation(@Nonnull final EncryptedType encryptedType)
             throws PreDecryptionValidationException {
         
-        if (encryptedType.getCipherData() == null) {
+        final CipherData data = encryptedType.getCipherData();
+        if (data == null) {
             throw new PreDecryptionValidationException(
                     String.format("%s contains no CipherData child element, which is mandatory",
                             encryptedType.getClass().getSimpleName()));
         }
 
-        if (encryptedType.getCipherData().getCipherReference() != null) {
+        if (data.getCipherReference() != null) {
             throw new PreDecryptionValidationException(
                     String.format("%s contains a CipherReference, which is not allowed",
                             encryptedType.getClass().getSimpleName()));
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Encrypter.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Encrypter.java
index cdbbb15df..1b853850a 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Encrypter.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/Encrypter.java
@@ -32,6 +32,7 @@ import javax.crypto.SecretKey;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 import org.apache.xml.security.Init;
 import org.apache.xml.security.encryption.XMLCipher;
@@ -54,7 +55,7 @@ import org.opensaml.xmlsec.signature.KeyInfo;
 import org.opensaml.xmlsec.signature.XMLSignatureBuilder;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -93,19 +94,19 @@ import com.google.common.base.Strings;
 public class Encrypter {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(Encrypter.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(Encrypter.class);
 
     /** Unmarshaller used to create EncryptedData objects from DOM element. */
-    private final Unmarshaller encryptedDataUnmarshaller;
+    @Nonnull private final Unmarshaller encryptedDataUnmarshaller;
 
     /** Unmarshaller used to create EncryptedData objects from DOM element. */
-    private final Unmarshaller encryptedKeyUnmarshaller;
+    @Nonnull private final Unmarshaller encryptedKeyUnmarshaller;
 
     /** Builder instance for building KeyInfo objects. */
-    private final XMLSignatureBuilder<KeyInfo> keyInfoBuilder;
+    @Nonnull private final XMLSignatureBuilder<KeyInfo> keyInfoBuilder;
 
     /** The name of the JCA security provider to use. */
-    private String jcaProviderName;
+    @Nullable private String jcaProviderName;
 
     /**
      * Constructor.
@@ -113,15 +114,17 @@ public class Encrypter {
      */
     public Encrypter() {
         final UnmarshallerFactory unmarshallerFactory = XMLObjectProviderRegistrySupport.getUnmarshallerFactory();
-        encryptedDataUnmarshaller = unmarshallerFactory.getUnmarshaller(EncryptedData.DEFAULT_ELEMENT_NAME);
-        encryptedKeyUnmarshaller = unmarshallerFactory.getUnmarshaller(EncryptedKey.DEFAULT_ELEMENT_NAME);
-        Constraint.isNotNull(encryptedDataUnmarshaller, "EncryptedData unmarshaller not configured");
-        Constraint.isNotNull(encryptedKeyUnmarshaller, "EncryptedKey unmarshaller not configured");
+        encryptedDataUnmarshaller = Constraint.isNotNull(
+                unmarshallerFactory.getUnmarshaller(EncryptedData.DEFAULT_ELEMENT_NAME),
+                "EncryptedData unmarshaller not configured");
+        
+        encryptedKeyUnmarshaller = Constraint.isNotNull(
+                unmarshallerFactory.getUnmarshaller(EncryptedKey.DEFAULT_ELEMENT_NAME),
+                "EncryptedKey unmarshaller not configured");
 
         final XMLObjectBuilderFactory builderFactory = XMLObjectProviderRegistrySupport.getBuilderFactory();
         keyInfoBuilder = (XMLSignatureBuilder<KeyInfo>) builderFactory.<KeyInfo>getBuilderOrThrow(
                 KeyInfo.DEFAULT_ELEMENT_NAME);
-        Constraint.isNotNull(keyInfoBuilder, "KeyInfo builder not configured");
     }
 
     /**
@@ -273,6 +276,7 @@ public class Encrypter {
         final List<EncryptedKey> encKeys = new ArrayList<>();
 
         for (final KeyEncryptionParameters kekParam : kekParamsList) {
+            assert kekParam != null;
             encKeys.add(encryptKey(key, kekParam, containingDocument));
         }
         return encKeys;
@@ -295,16 +299,21 @@ public class Encrypter {
         checkParams(kekParams, false);
 
         final Key encryptionKey = CredentialSupport.extractEncryptionKey(kekParams.getEncryptionCredential());
+        if (encryptionKey == null) {
+            throw new EncryptionException("Unable to obtain encryption key from parameters");
+        }
 
-        final EncryptedKey encryptedKey = encryptKey(key, encryptionKey, kekParams.getAlgorithm(),
-                kekParams.getRSAOAEPParameters(), containingDocument);
+        final String alg = kekParams.getAlgorithm();
+        assert alg != null;
+        final EncryptedKey encryptedKey =
+                encryptKey(key, encryptionKey, alg, kekParams.getRSAOAEPParameters(), containingDocument);
 
-        if (kekParams.getKeyInfoGenerator() != null) {
-            final KeyInfoGenerator generator = kekParams.getKeyInfoGenerator();
-            log.debug("Dynamically generating KeyInfo from Credential for EncryptedKey using generator: {}", generator
-                    .getClass().getName());
+        final KeyInfoGenerator keyInfoGenerator = kekParams.getKeyInfoGenerator();
+        if (keyInfoGenerator != null) {
+            log.debug("Dynamically generating KeyInfo from Credential for EncryptedKey using generator: {}",
+                    keyInfoGenerator.getClass().getName());
             try {
-                encryptedKey.setKeyInfo(generator.generate(kekParams.getEncryptionCredential()));
+                encryptedKey.setKeyInfo(keyInfoGenerator.generate(kekParams.getEncryptionCredential()));
             } catch (final SecurityException e) {
                 log.error("Error during EncryptedKey KeyInfo generation: {}", e.getMessage());
                 throw new EncryptionException("Error during EncryptedKey KeyInfo generation", e);
@@ -333,17 +342,11 @@ public class Encrypter {
             @Nonnull final String encryptionAlgorithmURI, @Nullable final RSAOAEPParameters rsaOAEPParams,
             @Nonnull final Document containingDocument) throws EncryptionException {
         
+        Constraint.isNotNull(targetKey, "Target key cannot be null");
+        Constraint.isNotNull(encryptionKey, "Encryption key cannot be null");
         Constraint.isNotNull(encryptionAlgorithmURI, "Encryption algorithm URI cannot be null");
         Constraint.isNotNull(containingDocument, "Containing document cannot be null");
 
-        if (targetKey == null) {
-            log.error("Target key for key encryption was null");
-            throw new EncryptionException("Target key was null");
-        } else if (encryptionKey == null) {
-            log.error("Encryption key for key encryption was null");
-            throw new EncryptionException("Encryption key was null");
-        }
-
         log.debug("Encrypting encryption key with algorithm: {}", encryptionAlgorithmURI);
         
         final XMLCipher xmlCipher;
@@ -363,6 +366,7 @@ public class Encrypter {
             } else {
                 apacheEncryptedKey = xmlCipher.encryptKey(containingDocument, targetKey);
             }
+            assert apacheEncryptedKey != null;
             postProcessApacheEncryptedKey(apacheEncryptedKey, targetKey, encryptionKey, encryptionAlgorithmURI,
                     containingDocument);
         } catch (final XMLEncryptionException e) {
@@ -372,6 +376,7 @@ public class Encrypter {
 
         try {
             final Element encKeyElement = xmlCipher.martial(containingDocument, apacheEncryptedKey);
+            assert encKeyElement != null;
             return (EncryptedKey) encryptedKeyUnmarshaller.unmarshall(encKeyElement);
         } catch (final UnmarshallingException e) {
             log.error("Error unmarshalling EncryptedKey element: {}", e.getMessage());
@@ -506,19 +511,13 @@ public class Encrypter {
             @Nonnull final Key encryptionKey, @Nonnull final String encryptionAlgorithmURI,
             final boolean encryptContentMode) throws EncryptionException {
 
-        if (xmlObject == null) {
-            log.error("XMLObject for encryption was null");
-            throw new EncryptionException("XMLObject cannot be null");
-        } else if (encryptionKey == null) {
-            log.error("Encryption key for key encryption was null");
-            throw new EncryptionException("Encryption key cannot be null");
-        }
         log.debug("Encrypting XMLObject using algorithm URI {} with content mode {}", encryptionAlgorithmURI,
                 encryptContentMode);
 
         checkAndMarshall(xmlObject);
 
         final Element targetElement = xmlObject.getDOM();
+        assert targetElement != null;
         final Document ownerDocument = targetElement.getOwnerDocument();
 
         final XMLCipher xmlCipher;
@@ -544,6 +543,7 @@ public class Encrypter {
 
         try {
             final Element encDataElement = xmlCipher.martial(ownerDocument, apacheEncryptedData);
+            assert encDataElement != null;
             return (EncryptedData) encryptedDataUnmarshaller.unmarshall(encDataElement);
         } catch (final UnmarshallingException e) {
             log.error("Error unmarshalling EncryptedData element: {}", e.getMessage());
@@ -571,6 +571,7 @@ public class Encrypter {
         checkParams(encParams, kekParamsList);
 
         final String encryptionAlgorithmURI = encParams.getAlgorithm();
+        assert encryptionAlgorithmURI != null;
         Key encryptionKey = CredentialSupport.extractEncryptionKey(encParams.getEncryptionCredential());
         if (encryptionKey == null) {
             encryptionKey = generateEncryptionKey(encryptionAlgorithmURI);
@@ -578,14 +579,17 @@ public class Encrypter {
 
         final EncryptedData encryptedData =
                 encryptElement(xmlObject, encryptionKey, encryptionAlgorithmURI, encryptContentMode);
-        final Document ownerDocument = encryptedData.getDOM().getOwnerDocument();
-
-        if (encParams.getKeyInfoGenerator() != null) {
-            final KeyInfoGenerator generator = encParams.getKeyInfoGenerator();
-            log.debug("Dynamically generating KeyInfo from Credential for EncryptedData using generator: {}", generator
-                    .getClass().getName());
+        final Element domNode = encryptedData.getDOM();
+        assert domNode != null;
+        final Document ownerDocument = domNode.getOwnerDocument();
+        assert ownerDocument != null;
+
+        final KeyInfoGenerator keyInfoGenerator = encParams.getKeyInfoGenerator();
+        if (keyInfoGenerator != null) {
+            log.debug("Dynamically generating KeyInfo from Credential for EncryptedData using generator: {}",
+                    keyInfoGenerator.getClass().getName());
             try {
-                encryptedData.setKeyInfo(generator.generate(encParams.getEncryptionCredential()));
+                encryptedData.setKeyInfo(keyInfoGenerator.generate(encParams.getEncryptionCredential()));
             } catch (final SecurityException e) {
                 log.error("Error during EncryptedData KeyInfo generation: {}", e.getMessage());
                 throw new EncryptionException("Error during EncryptedData KeyInfo generation", e);
@@ -593,12 +597,14 @@ public class Encrypter {
         }
 
         for (final KeyEncryptionParameters kekParams : kekParamsList) {
+            assert kekParams != null;
             final EncryptedKey encryptedKey = encryptKey(encryptionKey, kekParams, ownerDocument);
-            if (encryptedData.getKeyInfo() == null) {
-                final KeyInfo keyInfo = keyInfoBuilder.buildObject();
+            KeyInfo keyInfo = encryptedData.getKeyInfo();
+            if (keyInfo == null) {
+                keyInfo = keyInfoBuilder.buildObject();
                 encryptedData.setKeyInfo(keyInfo);
             }
-            encryptedData.getKeyInfo().getEncryptedKeys().add(encryptedKey);
+            keyInfo.getEncryptedKeys().add(encryptedKey);
         }
 
         return encryptedData;
@@ -635,10 +641,7 @@ public class Encrypter {
      * @throws EncryptionException thrown if any parameters are missing or have invalid values
      */
     protected void checkParams(@Nonnull final DataEncryptionParameters encParams) throws EncryptionException {
-        if (encParams == null) {
-            log.error("Data encryption parameters are required");
-            throw new EncryptionException("Data encryption parameters are required");
-        } else if (Strings.isNullOrEmpty(encParams.getAlgorithm())) {
+        if (Strings.isNullOrEmpty(encParams.getAlgorithm())) {
             log.error("Data encryption algorithm URI is required");
             throw new EncryptionException("Data encryption algorithm URI is required");
         }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/InlineEncryptedKeyResolver.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/InlineEncryptedKeyResolver.java
index bb5a7be9d..dcf35a941 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/InlineEncryptedKeyResolver.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/InlineEncryptedKeyResolver.java
@@ -27,6 +27,7 @@ import javax.annotation.Nullable;
 
 import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
+import org.opensaml.xmlsec.signature.KeyInfo;
 
 import net.shibboleth.shared.logic.Constraint;
 
@@ -65,11 +66,12 @@ public class InlineEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
         
         final List<EncryptedKey> resolvedEncKeys = new ArrayList<>();
         
-        if (encryptedData.getKeyInfo() == null) {
+        final KeyInfo keyInfo = encryptedData.getKeyInfo();
+        if (keyInfo == null) {
             return resolvedEncKeys;
         }
         
-        for (final EncryptedKey encKey : encryptedData.getKeyInfo().getEncryptedKeys()) {
+        for (final EncryptedKey encKey : keyInfo.getEncryptedKeys()) {
             if (matchRecipient(encKey.getRecipient())) {
                 resolvedEncKeys.add(encKey);
             }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/PreDecryptionValidationException.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/PreDecryptionValidationException.java
index 1a6842b08..f93a744de 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/PreDecryptionValidationException.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/PreDecryptionValidationException.java
@@ -60,7 +60,8 @@ public class PreDecryptionValidationException extends DecryptionException {
      * @param message exception message
      * @param wrappedException exception to be wrapped by this one
      */
-    public PreDecryptionValidationException(@Nullable final String message, @Nullable final Exception wrappedException) {
+    public PreDecryptionValidationException(@Nullable final String message,
+            @Nullable final Exception wrappedException) {
         super(message, wrappedException);
     }
 
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleKeyInfoReferenceEncryptedKeyResolver.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleKeyInfoReferenceEncryptedKeyResolver.java
index 16c600888..5c2cdb54d 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleKeyInfoReferenceEncryptedKeyResolver.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleKeyInfoReferenceEncryptedKeyResolver.java
@@ -31,9 +31,9 @@ import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.opensaml.xmlsec.signature.KeyInfo;
 import org.opensaml.xmlsec.signature.KeyInfoReference;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Implementation of {@link EncryptedKeyResolver} which finds {@link EncryptedKey} elements by dereferencing
@@ -131,6 +131,7 @@ public class SimpleKeyInfoReferenceEncryptedKeyResolver extends AbstractEncrypte
             log.info("Reached depth limit for KeyInfoReferences");
         } else {
             for (final KeyInfoReference ref : keyInfo.getKeyInfoReferences()) {
+                assert ref != null;
                 for (final EncryptedKey encKey : resolveKeyInfo(dereferenceURI(ref), limit-1)) {
                     resolvedEncKeys.add(encKey);
                 }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleRetrievalMethodEncryptedKeyResolver.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleRetrievalMethodEncryptedKeyResolver.java
index b73b85bf3..6fec278a2 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleRetrievalMethodEncryptedKeyResolver.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/support/SimpleRetrievalMethodEncryptedKeyResolver.java
@@ -29,13 +29,12 @@ import javax.annotation.Nullable;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.encryption.EncryptedData;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
+import org.opensaml.xmlsec.signature.KeyInfo;
 import org.opensaml.xmlsec.signature.RetrievalMethod;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Strings;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Implementation of {@link EncryptedKeyResolver} which finds {@link EncryptedKey} elements by dereferencing
@@ -50,7 +49,7 @@ import net.shibboleth.shared.logic.Constraint;
 public class SimpleRetrievalMethodEncryptedKeyResolver extends AbstractEncryptedKeyResolver {
 
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(SimpleRetrievalMethodEncryptedKeyResolver.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(SimpleRetrievalMethodEncryptedKeyResolver.class);
     
     /** Constructor. */
     public SimpleRetrievalMethodEncryptedKeyResolver() {
@@ -81,11 +80,12 @@ public class SimpleRetrievalMethodEncryptedKeyResolver extends AbstractEncrypted
         
         final List<EncryptedKey> resolvedEncKeys = new ArrayList<>();
 
-        if (encryptedData.getKeyInfo() == null) {
+        final KeyInfo keyInfo = encryptedData.getKeyInfo();
+        if (keyInfo == null) {
             return resolvedEncKeys;
         }
 
-        for (final RetrievalMethod rm : encryptedData.getKeyInfo().getRetrievalMethods()) {
+        for (final RetrievalMethod rm : keyInfo.getRetrievalMethods()) {
             if (!Objects.equals(rm.getType(), EncryptionConstants.TYPE_ENCRYPTED_KEY)) {
                 continue;
             } else if (rm.getTransforms() != null) {
@@ -112,7 +112,7 @@ public class SimpleRetrievalMethodEncryptedKeyResolver extends AbstractEncrypted
      */
     @Nullable protected EncryptedKey dereferenceURI(@Nonnull final RetrievalMethod rm) {
         final String uri = rm.getURI();
-        if (Strings.isNullOrEmpty(uri) || !uri.startsWith("#")) {
+        if (uri == null || !uri.startsWith("#")) {
             log.warn("EncryptedKey RetrievalMethod did not contain a same-document URI reference, cannot process");
             return null;
         }
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/keyinfo/KeyInfoSupport.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/keyinfo/KeyInfoSupport.java
index a9a722541..acd0a2a7e 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/keyinfo/KeyInfoSupport.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/keyinfo/KeyInfoSupport.java
@@ -88,7 +88,6 @@ import org.opensaml.xmlsec.signature.X509SerialNumber;
 import org.opensaml.xmlsec.signature.X509SubjectName;
 import org.opensaml.xmlsec.signature.Y;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
@@ -96,6 +95,7 @@ import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.DecodingException;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Utility class for working with data inside a KeyInfo object.
@@ -225,11 +225,12 @@ public class KeyInfoSupport {
     @Nullable public static X509Certificate getCertificate(
             @Nullable final org.opensaml.xmlsec.signature.X509Certificate xmlCert) throws CertificateException {
 
-        if (xmlCert == null || xmlCert.getValue() == null) {
+        final String certVal = xmlCert != null ? xmlCert.getValue() : null;
+        if (certVal == null) {
             return null;
         }
 
-        return X509Support.decodeCertificate(xmlCert.getValue());
+        return X509Support.decodeCertificate(certVal);
     }
 
     /**
@@ -296,12 +297,13 @@ public class KeyInfoSupport {
     @Nullable public static X509CRL getCRL(@Nullable final org.opensaml.xmlsec.signature.X509CRL xmlCRL)
             throws CRLException {
 
-        if (xmlCRL == null || xmlCRL.getValue() == null) {
+        final String crlVal = xmlCRL != null ? xmlCRL.getValue() : null;
+        if (crlVal == null) {
             return null;
         }
 
         try {
-            return X509Support.decodeCRL(xmlCRL.getValue());
+            return X509Support.decodeCRL(crlVal);
         } catch (final CertificateException e) {
             throw new CRLException("Certificate error attempting to decode CRL", e);
         }
@@ -558,7 +560,8 @@ public class KeyInfoSupport {
         } else if (pk instanceof DHPublicKey) {
             keyValue.setDHKeyValue(buildDHKeyValue((DHPublicKey) pk));
         } else {
-            throw new IllegalArgumentException("Saw unsupported public key type: " + pk.getClass().getName());
+            final String type = pk != null ? pk.getClass().getName() : "(null)";
+            throw new IllegalArgumentException("Saw unsupported public key type: " + type);
         }
 
         keyInfo.getKeyValues().add(keyValue);
@@ -790,6 +793,7 @@ public class KeyInfoSupport {
         }
 
         for (final KeyValue keyDescriptor : keyInfo.getKeyValues()) {
+            assert keyDescriptor != null;
             final PublicKey newKey = getKey(keyDescriptor);
             if (newKey != null) {
                 keys.add(newKey);
@@ -797,6 +801,7 @@ public class KeyInfoSupport {
         }
 
         for (final DEREncodedKeyValue keyDescriptor : keyInfo.getDEREncodedKeyValues()) {
+            assert keyDescriptor != null;
             final PublicKey newKey = getKey(keyDescriptor);
             if (newKey != null) {
                 keys.add(newKey);
@@ -817,17 +822,27 @@ public class KeyInfoSupport {
     @Nullable public static PublicKey getKey(@Nonnull final KeyValue keyValue) throws KeyException {
         Constraint.isNotNull(keyValue, "KeyValue cannot be null");
 
-        if (keyValue.getDSAKeyValue() != null) {
-            return getDSAKey(keyValue.getDSAKeyValue());
-        } else if (keyValue.getRSAKeyValue() != null) {
-            return getRSAKey(keyValue.getRSAKeyValue());
-        } else if (keyValue.getECKeyValue() != null) {
-            return getECKey(keyValue.getECKeyValue());
-        } else if (keyValue.getDHKeyValue() != null) {
-            return getDHKey(keyValue.getDHKeyValue());
-        } else {
-            return null;
+        final DSAKeyValue dsa = keyValue.getDSAKeyValue();
+        if (dsa != null) {
+            return getDSAKey(dsa);
+        }
+        
+        final RSAKeyValue rsa = keyValue.getRSAKeyValue();
+        if (rsa != null) {
+            return getRSAKey(rsa);
+        }
+        
+        final ECKeyValue ec = keyValue.getECKeyValue();
+        if (ec != null) {
+            return getECKey(ec);
+        }
+        
+        final DHKeyValue dh = keyValue.getDHKeyValue();
+        if (dh != null) {
+            return getDHKey(dh);
         }
+        
+        return null;
     }
 
     /**
@@ -842,21 +857,29 @@ public class KeyInfoSupport {
      */
     @Nonnull public static PublicKey getECKey(@Nonnull final ECKeyValue keyDescriptor) throws KeyException {
         
-        if (keyDescriptor.getNamedCurve() == null || keyDescriptor.getNamedCurve().getURI() == null) {
+        final NamedCurve namedCurve = keyDescriptor.getNamedCurve();
+        if (namedCurve == null || namedCurve.getURI() == null) {
+            throw new KeyException("Only ECKeyValue NamedCurve representation is supported");
+        }
+        
+        final String curveURI = namedCurve.getURI();
+        if (curveURI == null) {
             throw new KeyException("Only ECKeyValue NamedCurve representation is supported");
         }
         
-        final ECParameterSpec ecParams =
-                ECSupport.getParameterSpecForURI(keyDescriptor.getNamedCurve().getURI());
+        final ECParameterSpec ecParams = ECSupport.getParameterSpecForURI(curveURI);
         if (ecParams == null) {
-            throw new KeyException("Could not resolve ECParametersSpec for NamedCurve URI: "
-                    + keyDescriptor.getNamedCurve().getURI());
+            throw new KeyException("Could not resolve ECParametersSpec for NamedCurve URI: " + curveURI);
         }
 
+        final org.opensaml.xmlsec.signature.PublicKey pub = keyDescriptor.getPublicKey();
+        final String pubval = pub != null ? pub.getValue() : null;
+        if (pubval == null) {
+            throw new KeyException("Could not obtain public key value");
+        }
+        
         try {
-            final ECPoint ecPoint = ECSupport.decodeECPoint(
-                    Base64Support.decode(keyDescriptor.getPublicKey().getValue()),
-                    ecParams.getCurve());
+            final ECPoint ecPoint = ECSupport.decodeECPoint(Base64Support.decode(pubval), ecParams.getCurve());
             
             final ECPublicKeySpec keySpec = new ECPublicKeySpec(ecPoint, ecParams);
             
@@ -883,11 +906,18 @@ public class KeyInfoSupport {
             throw new KeyException("DHKeyValue element did not contain at least one of DH parameters P, Q or G");
         }
 
-        final BigInteger gComponent = keyDescriptor.getGenerator().getValueBigInt();
-        final BigInteger pComponent = keyDescriptor.getP().getValueBigInt();
+        final Generator gen = keyDescriptor.getGenerator();
+        final org.opensaml.xmlsec.encryption.P pComp = keyDescriptor.getP();
+        final Public pub = keyDescriptor.getPublic();
+        
+        assert gen != null;
+        assert pComp != null;
+        
+        final BigInteger gComponent = gen.getValueBigInt();
+        final BigInteger pComponent = pComp.getValueBigInt();
         // Note: Java doesn't need or even accept the prime Q component, so don't bother to parse it
 
-        final BigInteger publicComponent = keyDescriptor.getPublic().getValueBigInt();
+        final BigInteger publicComponent = pub != null ? pub.getValueBigInt() : null;
 
         final DHPublicKeySpec keySpec = new DHPublicKeySpec(publicComponent, pComponent, gComponent);
         return buildKey(keySpec, JCAConstants.KEY_ALGO_DIFFIE_HELLMAN);
@@ -901,15 +931,21 @@ public class KeyInfoSupport {
      * @return true if all parameters are present and non-empty, false otherwise
      */
     public static boolean hasCompleteDHParams(@Nullable final DHKeyValue keyDescriptor) {
-        if (keyDescriptor == null
-                || keyDescriptor.getGenerator() == null
-                || Strings.isNullOrEmpty(keyDescriptor.getGenerator().getValue())
-                || keyDescriptor.getP() == null || Strings.isNullOrEmpty(keyDescriptor.getP().getValue())
+        if (keyDescriptor == null) {
+            return false;
+        }
+        
+        final Generator gen = keyDescriptor.getGenerator();
+        final org.opensaml.xmlsec.encryption.P pComp = keyDescriptor.getP();
+        
+        if (gen == null || Strings.isNullOrEmpty(gen.getValue())
+                || pComp == null || Strings.isNullOrEmpty(pComp.getValue())
                 // Note: Java doesn't need or even accept the prime Q component.  So even though it's
                 // required per the schema, relax the check here and don't require.
                 ) {
             return false;
         }
+        
         return true;
     }
 
@@ -928,10 +964,18 @@ public class KeyInfoSupport {
         if (!hasCompleteDSAParams(keyDescriptor)) {
             throw new KeyException("DSAKeyValue element did not contain at least one of DSA parameters P, Q or G");
         }
+        
+        final G gComp = keyDescriptor.getG();
+        final P pComp = keyDescriptor.getP();
+        final Q qComp = keyDescriptor.getQ();
 
-        final BigInteger gComponent = keyDescriptor.getG().getValueBigInt();
-        final BigInteger pComponent = keyDescriptor.getP().getValueBigInt();
-        final BigInteger qComponent = keyDescriptor.getQ().getValueBigInt();
+        assert gComp != null;
+        assert pComp != null;
+        assert qComp != null;
+        
+        final BigInteger gComponent = gComp.getValueBigInt();
+        final BigInteger pComponent = pComp.getValueBigInt();
+        final BigInteger qComponent = qComp.getValueBigInt();
 
         final DSAParams dsaParams = new DSAParameterSpec(pComponent, qComponent, gComponent);
         return getDSAKey(keyDescriptor, dsaParams);
@@ -954,10 +998,11 @@ public class KeyInfoSupport {
         Constraint.isNotNull(keyDescriptor, "DSAKeyValue cannot be null");
         Constraint.isNotNull(dsaParams, "DSAParams cannot be null");
         
-        final BigInteger yComponent = keyDescriptor.getY().getValueBigInt();
+        final Y yComponent = keyDescriptor.getY();
 
         final DSAPublicKeySpec keySpec =
-                new DSAPublicKeySpec(yComponent, dsaParams.getP(), dsaParams.getQ(), dsaParams.getG());
+                new DSAPublicKeySpec(yComponent != null ? yComponent.getValueBigInt() : null,
+                        dsaParams.getP(), dsaParams.getQ(), dsaParams.getG());
         return buildKey(keySpec, JCAConstants.KEY_ALGO_DSA);
     }
 
@@ -969,12 +1014,21 @@ public class KeyInfoSupport {
      * @return true if all parameters are present and non-empty, false otherwise
      */
     public static boolean hasCompleteDSAParams(@Nullable final DSAKeyValue keyDescriptor) {
-        if (keyDescriptor == null
-                || keyDescriptor.getG() == null || Strings.isNullOrEmpty(keyDescriptor.getG().getValue())
-                || keyDescriptor.getP() == null || Strings.isNullOrEmpty(keyDescriptor.getP().getValue())
-                || keyDescriptor.getQ() == null || Strings.isNullOrEmpty(keyDescriptor.getQ().getValue())) {
+        
+        if (keyDescriptor == null) {
+            return false;
+        }
+        
+        final G gComp = keyDescriptor.getG();
+        final P pComp = keyDescriptor.getP();
+        final Q qComp = keyDescriptor.getQ();
+        
+        if (gComp == null || Strings.isNullOrEmpty(gComp.getValue())
+                || pComp == null || Strings.isNullOrEmpty(pComp.getValue())
+                || qComp == null || Strings.isNullOrEmpty(qComp.getValue())) {
             return false;
         }
+        
         return true;
     }
 
@@ -991,10 +1045,11 @@ public class KeyInfoSupport {
     @Nonnull public static PublicKey getRSAKey(@Nonnull final RSAKeyValue keyDescriptor) throws KeyException {
         Constraint.isNotNull(keyDescriptor, "RSAKeyValue cannot be null");
         
-        final BigInteger modulus = keyDescriptor.getModulus().getValueBigInt();
-        final BigInteger exponent = keyDescriptor.getExponent().getValueBigInt();
-
-        final RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
+        final Modulus mod = keyDescriptor.getModulus();
+        final Exponent exp = keyDescriptor.getExponent();
+        
+        final RSAPublicKeySpec keySpec = new RSAPublicKeySpec(mod != null ? mod.getValueBigInt() : null,
+                exp != null ? exp.getValueBigInt() : null);
         return buildKey(keySpec, JCAConstants.KEY_ALGO_RSA);
     }
 
@@ -1074,12 +1129,13 @@ public class KeyInfoSupport {
                 JCAConstants.KEY_ALGO_DSA};
         
         Constraint.isNotNull(keyValue, "DEREncodedKeyValue cannot be null");
-        if (keyValue.getValue() == null) {
+        final String keyValueValue = keyValue.getValue();
+        if (keyValueValue == null) {
             throw new KeyException("No data found in key value element");
         }
         byte[] encodedKey = null;
         try {
-            encodedKey = Base64Support.decode(keyValue.getValue());
+            encodedKey = Base64Support.decode(keyValueValue);
         } catch (final DecodingException e) {
            throw new KeyException("DEREncodedKeyValue could not be base64 decoded",e);
         }
@@ -1168,6 +1224,7 @@ public class KeyInfoSupport {
             x509CertFactory = CertificateFactory.getInstance("X.509");
         }
 
+        assert x509CertFactory != null;
         return x509CertFactory;
     }
 
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/AbstractSignableXMLObject.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/AbstractSignableXMLObject.java
index 1ba02b4f3..a29f19b34 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/AbstractSignableXMLObject.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/AbstractSignableXMLObject.java
@@ -33,7 +33,7 @@ import net.shibboleth.shared.xml.ElementSupport;
 public abstract class AbstractSignableXMLObject extends AbstractXMLObject implements SignableXMLObject {
 
     /** Signature child. */
-    private Signature signature;
+    @Nullable private Signature signature;
 
     /**
      * Constructor.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/CryptoBinary.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/CryptoBinary.java
index 9c62572e1..826ab4b6d 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/CryptoBinary.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/CryptoBinary.java
@@ -19,12 +19,14 @@ package org.opensaml.xmlsec.signature;
 
 import java.math.BigInteger;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.codec.EncodingException;
 
 /**
@@ -33,10 +35,10 @@ import net.shibboleth.shared.codec.EncodingException;
 public interface CryptoBinary extends XSBase64Binary {
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "CryptoBinary";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "CryptoBinary";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DEREncodedKeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DEREncodedKeyValue.java
index 0adfdbc8b..b362a9738 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DEREncodedKeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DEREncodedKeyValue.java
@@ -17,31 +17,34 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature 1.1 DEREncodedKeyValue element. */
 public interface DEREncodedKeyValue extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DEREncodedKeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DEREncodedKeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG11_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG11_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "DEREncodedKeyValueType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "DEREncodedKeyValueType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Id attribute name. */
-    public static final String ID_ATTRIB_NAME = "Id";
+    @Nonnull @NotEmpty public static final String ID_ATTRIB_NAME = "Id";
 
     /**
      * Get the Id attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DSAKeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DSAKeyValue.java
index 94bbcae4d..867846b08 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DSAKeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/DSAKeyValue.java
@@ -17,27 +17,30 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, DSAKeyValue element. */
 public interface DSAKeyValue extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DSAKeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DSAKeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "DSAKeyValueType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "DSAKeyValueType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECKeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECKeyValue.java
index 2bc1e5aec..8cb27f088 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECKeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECKeyValue.java
@@ -17,32 +17,35 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /** XMLObject representing XML Digital Signature, version 20020212, ECKeyValue element. */
 public interface ECKeyValue extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "ECKeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "ECKeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME =
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ECKeyValueType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ECKeyValueType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
 
     /** Id attribute name. */
-    public static final String ID_ATTRIB_NAME = "Id";
+    @Nonnull @NotEmpty public static final String ID_ATTRIB_NAME = "Id";
 
     /**
      * Get the Id attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECPointType.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECPointType.java
index d96697ae2..c5fb91bac 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECPointType.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/ECPointType.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * XMLObject representing XML Digital Signature 1.1 ECPointType element.
@@ -28,10 +31,10 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants;
 public interface ECPointType extends CryptoBinary {
     
     /** Element local name. */
-    public static final String TYPE_LOCAL_NAME = "ECPointType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ECPointType";
     
     /** Default element name. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Exponent.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Exponent.java
index 43a1decc1..33065a1da 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Exponent.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Exponent.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Exponent element.
  */
 public interface Exponent extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Exponent";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Exponent";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/G.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/G.java
index 46600d9f4..491e51df5 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/G.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/G.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, G element.
  */
 public interface G extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "G";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "G";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/J.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/J.java
index 6d18bf660..b3c0878c3 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/J.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/J.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, J element.
  */
 public interface J extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "J";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "J";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfo.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfo.java
index 390f49b47..92381fa91 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfo.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfo.java
@@ -28,25 +28,27 @@ import org.opensaml.xmlsec.encryption.AgreementMethod;
 import org.opensaml.xmlsec.encryption.EncryptedKey;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, KeyInfo element. */
 public interface KeyInfo extends XMLObject {
     
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyInfo";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyInfo";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "KeyInfoType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "KeyInfoType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /** Id attribute name. */
-    public static final String ID_ATTRIB_NAME = "Id";
+    @Nonnull @NotEmpty public static final String ID_ATTRIB_NAME = "Id";
 
     /**
      * Get the Id attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfoReference.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfoReference.java
index 780f46204..c3659762e 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfoReference.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyInfoReference.java
@@ -17,12 +17,15 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * XMLObject representing XML Digital Signature 1.1 KeyInfoReference element.
@@ -30,24 +33,24 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants;
 public interface KeyInfoReference extends XMLObject {
     
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyInfoReference";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyInfoReference";
     
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME =
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "KeyInfoReferenceType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "KeyInfoReferenceType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Id attribute name. */
-    public static final String ID_ATTRIB_NAME = "Id";
+    @Nonnull @NotEmpty public static final String ID_ATTRIB_NAME = "Id";
 
     /** URI attribute name. */
-    public static final String URI_ATTRIB_NAME = "URI";
+    @Nonnull @NotEmpty public static final String URI_ATTRIB_NAME = "URI";
         
     /**
      * Get the Id attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyName.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyName.java
index 846052bb4..08adb091b 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyName.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyName.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, KeyName element.
  */
 public interface KeyName extends XSString {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyName";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyName";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyValue.java
index c0776ab5c..a68c25f6a 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/KeyValue.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
@@ -24,23 +25,25 @@ import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.encryption.DHKeyValue;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, KeyValue element.
  */
 public interface KeyValue extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "KeyValueType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "KeyValueType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/MgmtData.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/MgmtData.java
index e31074fba..37ac740f8 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/MgmtData.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/MgmtData.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, MgmtData element.
  */
 public interface MgmtData extends XSString {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "MgmtData";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "MgmtData";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Modulus.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Modulus.java
index cf80559cf..0aee9f173 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Modulus.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Modulus.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Modulus element.
  */
 public interface Modulus extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Modulus";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Modulus";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/NamedCurve.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/NamedCurve.java
index a4aa0fc0a..c332b0365 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/NamedCurve.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/NamedCurve.java
@@ -17,12 +17,15 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * XMLObject representing XML Digital Signature 1.1 NamedCurve element.
@@ -30,21 +33,21 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants;
 public interface NamedCurve extends XMLObject {
     
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "NamedCurve";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "NamedCurve";
     
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME =
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "NamedCurveType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "NamedCurveType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** URI attribute name. */
-    public static final String URI_ATTRIB_NAME = "URI";
+    @Nonnull @NotEmpty public static final String URI_ATTRIB_NAME = "URI";
     
     /**
      * Get the URI attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/P.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/P.java
index 8bad47e91..ede03a48f 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/P.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/P.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, P element.
  */
 public interface P extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "P";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "P";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPData.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPData.java
index 49f007d76..27c82d9c8 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPData.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPData.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
@@ -24,23 +25,25 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, PGPData element.
  */
 public interface PGPData extends XMLObject, ElementExtensibleXMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPData";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPData";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "PGPDataType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "PGPDataType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyID.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyID.java
index f85734788..59fcd0189 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyID.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyID.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, PGPKeyID element.
  */
 public interface PGPKeyID extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPKeyID";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPKeyID";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyPacket.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyPacket.java
index 0cf2f7c87..493708b4a 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyPacket.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PGPKeyPacket.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, PGPKeyPacket element.
  */
 public interface PGPKeyPacket extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPKeyPacket";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PGPKeyPacket";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PgenCounter.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PgenCounter.java
index e1ee67b00..adc450831 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PgenCounter.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PgenCounter.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, PgenCounter element.
  */
 public interface PgenCounter extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PgenCounter";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PgenCounter";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PublicKey.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PublicKey.java
index 89b851ccd..c7ccd4d60 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PublicKey.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/PublicKey.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * XMLObject representing XML Digital Signature 1.1 PublicKey element.
@@ -28,10 +31,10 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants;
 public interface PublicKey extends ECPointType {
     
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PublicKey";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PublicKey";
     
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME =
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Q.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Q.java
index b81e54fe5..1834ee246 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Q.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Q.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Q element.
  */
 public interface Q extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Q";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Q";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RSAKeyValue.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RSAKeyValue.java
index 2e04c5727..995fb3996 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RSAKeyValue.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RSAKeyValue.java
@@ -17,27 +17,30 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, RSAKeyValue element. */
 public interface RSAKeyValue extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "RSAKeyValue";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "RSAKeyValue";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RSAKeyValueType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RSAKeyValueType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RetrievalMethod.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RetrievalMethod.java
index 82161ba9f..b0c21c3b1 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RetrievalMethod.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/RetrievalMethod.java
@@ -17,36 +17,39 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, RetrievalMethod element.
  */
 public interface RetrievalMethod extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "RetrievalMethod";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "RetrievalMethod";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RetrievalMethodType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RetrievalMethodType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /** URI attribute name. */
-    public static final String URI_ATTRIB_NAME = "URI";
+    @Nonnull @NotEmpty public static final String URI_ATTRIB_NAME = "URI";
 
     /** Type attribute name. */
-    public static final String TYPE_ATTRIB_NAME = "Type";
+    @Nonnull @NotEmpty public static final String TYPE_ATTRIB_NAME = "Type";
 
     /**
      * Get the URI attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKIData.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKIData.java
index 68d1a6fb4..09d9ce898 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKIData.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKIData.java
@@ -25,23 +25,25 @@ import javax.xml.namespace.QName;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, SPKIData element.
  */
 public interface SPKIData extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "SPKIData";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "SPKIData";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "SPKIDataType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "SPKIDataType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKISexp.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKISexp.java
index 782506201..af8cc4ee2 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKISexp.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SPKISexp.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, SPKISexp element.
  */
 public interface SPKISexp extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "SPKISexp";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "SPKISexp";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Seed.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Seed.java
index eff6ca199..3d6c5716b 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Seed.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Seed.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Seed element.
  */
 public interface Seed extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Seed";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Seed";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SignableXMLObject.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SignableXMLObject.java
index 3b9ac3c88..50a15faf2 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SignableXMLObject.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/SignableXMLObject.java
@@ -31,19 +31,19 @@ public interface SignableXMLObject extends XMLObject {
      * 
      * @return true iff this element is signed
      */
-    public boolean isSigned();
+    boolean isSigned();
     
     /**
      * Gets the Signature XMLObject.
      * 
      * @return the Signature XMLObject
      */
-    @Nullable public Signature getSignature();
+    @Nullable Signature getSignature();
     
     /**
      * Sets the Signature XMLObject.
      * 
      * @param newSignature the Signature XMLObject
      */
-    public void setSignature(@Nullable final Signature newSignature);
+    void setSignature(@Nullable final Signature newSignature);
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Signature.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Signature.java
index 4b47fd462..16e3cc943 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Signature.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Signature.java
@@ -28,23 +28,25 @@ import org.opensaml.security.credential.Credential;
 import org.opensaml.xmlsec.signature.support.ContentReference;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing an enveloped or detached XML Digital Signature, version 20020212, Signature element.
  */
 public interface Signature extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Signature";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Signature";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS, DEFAULT_ELEMENT_LOCAL_NAME,
-            SignatureConstants.XMLSIG_PREFIX);
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(SignatureConstants.XMLSIG_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "SignatureType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "SignatureType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME, 
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME, 
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transform.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transform.java
index f353b0ed5..2bfb5aaac 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transform.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transform.java
@@ -26,27 +26,29 @@ import javax.xml.namespace.QName;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Transform element.
  */
 public interface Transform extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Transform";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Transform";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "TransformType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "TransformType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /** Algorithm attribute name. */
-    public static final String ALGORITHM_ATTRIB_NAME = "Algorithm";
+    @Nonnull @NotEmpty public static final String ALGORITHM_ATTRIB_NAME = "Algorithm";
 
     /**
      * Get the Algorithm URI attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transforms.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transforms.java
index 962b44d79..bd0b869f6 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transforms.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Transforms.java
@@ -25,23 +25,25 @@ import javax.xml.namespace.QName;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Transforms element.
  */
 public interface Transforms extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Transforms";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Transforms";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "TransformsType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "TransformsType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509CRL.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509CRL.java
index 713f45cbc..f9b911213 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509CRL.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509CRL.java
@@ -17,19 +17,22 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509CRL element. */
 public interface X509CRL extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509CRL";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509CRL";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Certificate.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Certificate.java
index 7f6c770b6..ec11a923b 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Certificate.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Certificate.java
@@ -17,19 +17,22 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509Certificate element. */
 public interface X509Certificate extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Certificate";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Certificate";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Data.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Data.java
index 5cfa668c9..021c2a0d5 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Data.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Data.java
@@ -25,21 +25,23 @@ import javax.xml.namespace.QName;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509Data element. */
 public interface X509Data extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Data";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Data";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "X509DataType";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "X509DataType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Digest.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Digest.java
index f4623a872..5b57293f4 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Digest.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509Digest.java
@@ -18,33 +18,36 @@
 package org.opensaml.xmlsec.signature;
 
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature 1.1 X509Digest element.
  */
 public interface X509Digest extends XSBase64Binary {
     
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Digest";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509Digest";
     
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME =
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "X509DigestType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "X509DigestType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME =
+    @Nonnull public static final QName TYPE_NAME =
             new QName(SignatureConstants.XMLSIG11_NS, TYPE_LOCAL_NAME, SignatureConstants.XMLSIG11_PREFIX);
     
     /** Algorithm attribute name. */
-    public static final String ALGORITHM_ATTRIB_NAME = "Algorithm";
+    @Nonnull @NotEmpty public static final String ALGORITHM_ATTRIB_NAME = "Algorithm";
     
     /**
      * Get the Algorithm URI attribute value.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerName.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerName.java
index 9638c4131..a297ba21c 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerName.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerName.java
@@ -17,19 +17,22 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509IssuerName element. */
 public interface X509IssuerName extends XSString {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509IssuerName";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509IssuerName";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerSerial.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerSerial.java
index 6d52cc475..b17bbd9c4 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerSerial.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509IssuerSerial.java
@@ -17,27 +17,30 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509IssuerSerial element. */
 public interface X509IssuerSerial extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509IssuerSerial";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509IssuerSerial";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "X509IssuerSerialType";
+    @Nonnull public static final String TYPE_LOCAL_NAME = "X509IssuerSerialType";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
+    @Nonnull @NotEmpty public static final QName TYPE_NAME = new QName(SignatureConstants.XMLSIG_NS, TYPE_LOCAL_NAME,
             SignatureConstants.XMLSIG_PREFIX);
 
     /**
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SKI.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SKI.java
index 6387aa3b5..9e3795881 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SKI.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SKI.java
@@ -17,19 +17,22 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509SKI element. */
 public interface X509SKI extends XSBase64Binary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SKI";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SKI";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SerialNumber.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SerialNumber.java
index 66b64326b..9526b0575 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SerialNumber.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SerialNumber.java
@@ -19,12 +19,14 @@ package org.opensaml.xmlsec.signature;
 
 import java.math.BigInteger;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.xml.XMLConstants;
 
 /**
@@ -33,17 +35,18 @@ import net.shibboleth.shared.xml.XMLConstants;
 public interface X509SerialNumber extends XMLObject {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SerialNumber";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SerialNumber";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "integer";
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "integer";
 
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = new QName(XMLConstants.XSD_NS, TYPE_LOCAL_NAME, XMLConstants.XSD_PREFIX);
+    @Nonnull public static final QName TYPE_NAME =
+            new QName(XMLConstants.XSD_NS, TYPE_LOCAL_NAME, XMLConstants.XSD_PREFIX);
 
     /**
      * Gets the integer.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SubjectName.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SubjectName.java
index 5a8592461..ca37d81d0 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SubjectName.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/X509SubjectName.java
@@ -17,19 +17,22 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /** XMLObject representing XML Digital Signature, version 20020212, X509SubjectName element. */
 public interface X509SubjectName extends XSString {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SubjectName";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "X509SubjectName";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/XPath.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/XPath.java
index 748bc5905..63855495c 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/XPath.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/XPath.java
@@ -17,21 +17,24 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, XPath element.
  */
 public interface XPath extends XSString {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "XPath";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "XPath";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Y.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Y.java
index ed2890ba6..593dbf318 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Y.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/Y.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.xmlsec.signature;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.xmlsec.signature.support.SignatureConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * XMLObject representing XML Digital Signature, version 20020212, Y element.
  */
 public interface Y extends CryptoBinary {
 
     /** Element local name. */
-    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Y";
+    @Nonnull @NotEmpty public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Y";
 
     /** Default element name. */
-    public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
+    @Nonnull public static final QName DEFAULT_ELEMENT_NAME = new QName(SignatureConstants.XMLSIG_NS,
             DEFAULT_ELEMENT_LOCAL_NAME, SignatureConstants.XMLSIG_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureConstants.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureConstants.java
index 0a15d390c..7169edddd 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureConstants.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureConstants.java
@@ -17,8 +17,12 @@
 
 package org.opensaml.xmlsec.signature.support;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * Constants defined in or related to the XML Signature 1.0 and 1.1 specifications and
  * related RFCs.
@@ -26,44 +30,44 @@ import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 public final class SignatureConstants {
 
     /** XML Signature namespace and algorithm prefix. */
-    public static final String XMLSIG_NS = "http://www.w3.org/2000/09/xmldsig#";
+    @Nonnull @NotEmpty public static final String XMLSIG_NS = "http://www.w3.org/2000/09/xmldsig#";
 
     /** XML Signature 1.1 namespace and algorithm prefix. */
-    public static final String XMLSIG11_NS = "http://www.w3.org/2009/xmldsig11#";
+    @Nonnull @NotEmpty public static final String XMLSIG11_NS = "http://www.w3.org/2009/xmldsig11#";
     
     /** XML Signature QName prefix. */
-    public static final String XMLSIG_PREFIX = "ds";
+    @Nonnull @NotEmpty public static final String XMLSIG_PREFIX = "ds";
     
     /** XML Signature 1.1 QName prefix. */
-    public static final String XMLSIG11_PREFIX = "ds11";
+    @Nonnull @NotEmpty public static final String XMLSIG11_PREFIX = "ds11";
 
     /** Algorithm URI prefix used by RFC 4051. */
-    public static final String MORE_ALGO_NS = "http://www.w3.org/2001/04/xmldsig-more#";
+    @Nonnull @NotEmpty public static final String MORE_ALGO_NS = "http://www.w3.org/2001/04/xmldsig-more#";
 
     // *********************************************************
     // Algorithm URI's
     // *********************************************************
 
     /** Signature - Optional DSAwithSHA1 (DSS). */
-    public static final String ALGO_ID_SIGNATURE_DSA = XMLSIG_NS + "dsa-sha1";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_DSA = XMLSIG_NS + "dsa-sha1";
 
     /** Signature - Optional DSAwithSHA1 (DSS). */
-    public static final String ALGO_ID_SIGNATURE_DSA_SHA1 = ALGO_ID_SIGNATURE_DSA;
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_DSA_SHA1 = ALGO_ID_SIGNATURE_DSA;
     
     /** Signature - Required RSAwithSHA1 (PKCS1). */
-    public static final String ALGO_ID_SIGNATURE_RSA = XMLSIG_NS + "rsa-sha1";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA = XMLSIG_NS + "rsa-sha1";
 
     /** Signature - Required RSAwithSHA1 (PKCS1). */
-    public static final String ALGO_ID_SIGNATURE_RSA_SHA1 = ALGO_ID_SIGNATURE_RSA;
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_SHA1 = ALGO_ID_SIGNATURE_RSA;
 
     /** MAC - Required HMAC-SHA1. */
-    public static final String ALGO_ID_MAC_HMAC_SHA1 = XMLSIG_NS + "hmac-sha1";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_SHA1 = XMLSIG_NS + "hmac-sha1";
 
     /** Digest - Required SHA1. */
-    public static final String ALGO_ID_DIGEST_SHA1 = XMLSIG_NS + "sha1";
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_SHA1 = XMLSIG_NS + "sha1";
 
     /** Encoding - Required Base64. */
-    public static final String ALGO_ID_ENCODING_BASE64 = XMLSIG_NS + "base64";
+    @Nonnull @NotEmpty public static final String ALGO_ID_ENCODING_BASE64 = XMLSIG_NS + "base64";
 
     // *********************************************************
     // URI's representing types that may be dereferenced, such
@@ -71,68 +75,70 @@ public final class SignatureConstants {
     // *********************************************************
 
     /** Type - KeyInfo DSAKeyValue. */
-    public static final String TYPE_KEYINFO_DSA_KEYVALUE = XMLSIG_NS + "DSAKeyValue";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_DSA_KEYVALUE = XMLSIG_NS + "DSAKeyValue";
 
     /** Type - KeyInfo RSAKeyValue. */
-    public static final String TYPE_KEYINFO_RSA_KEYVALUE = XMLSIG_NS + "RSAKeyValue";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RSA_KEYVALUE = XMLSIG_NS + "RSAKeyValue";
 
     /** Type - KeyInfo X509Data. */
-    public static final String TYPE_KEYINFO_X509DATA = XMLSIG_NS + "X509Data";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_X509DATA = XMLSIG_NS + "X509Data";
 
     /** Type - KeyInfo PGPData. */
-    public static final String TYPE_KEYINFO_PGPDATA = XMLSIG_NS + "PGPData";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_PGPDATA = XMLSIG_NS + "PGPData";
 
     /** Type - KeyInfo SPKIData. */
-    public static final String TYPE_KEYINFO_SPKIDATA = XMLSIG_NS + "SPKIData";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_SPKIDATA = XMLSIG_NS + "SPKIData";
 
     /** Type - KeyInfo MgmtData. */
-    public static final String TYPE_KEYINFO_MGMTDATA = XMLSIG_NS + "MgmtData";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_MGMTDATA = XMLSIG_NS + "MgmtData";
 
     /** Type - A binary (ASN.1 DER) X.509 Certificate. */
-    public static final String TYPE_KEYINFO_RAW_X509CERT = XMLSIG_NS + "rawX509Certificate";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RAW_X509CERT = XMLSIG_NS + "rawX509Certificate";
 
-    /** Type - Signature Object. */
-    // public static final String TYPE_SIGNATURE_OBJECT = XMLSIG_NS + "Object";
+    /* Type - Signature Object. */
+    // @Nonnull @NotEmpty public static final String TYPE_SIGNATURE_OBJECT = XMLSIG_NS + "Object";
 
-    /** Type - Signature Manifest. */
-    // public static final String TYPE_SIGNATURE_MANIFEST = XMLSIG_NS + "Manifest";
+    /*  Type - Signature Manifest. */
+    // @Nonnull @NotEmpty public static final String TYPE_SIGNATURE_MANIFEST = XMLSIG_NS + "Manifest";
 
-    /** Type - Signature SignatureProperties. */
-    // public static final String TYPE_SIGNATURE_SIGNATURE_PROPERTIES = XMLSIG_NS + "SignatureProperties";
+    /*  Type - Signature SignatureProperties. */
+    // @Nonnull @NotEmpty public static final String TYPE_SIGNATURE_SIGNATURE_PROPERTIES =
+        // XMLSIG_NS + "SignatureProperties";
 
     // These are additional type URIs defined by RFC 4051
 
     /** Type - KeyInfo KeyValue. */
-    public static final String TYPE_KEYINFO_KEYVALUE = MORE_ALGO_NS + "KeyValue";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_KEYVALUE = MORE_ALGO_NS + "KeyValue";
 
     /** Type - KeyInfo RetrievalMethod. */
-    public static final String TYPE_KEYINFO_RETRIEVAL_METHOD = MORE_ALGO_NS + "RetrievalMethod";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RETRIEVAL_METHOD = MORE_ALGO_NS + "RetrievalMethod";
 
     /** Type - KeyInfo KeyName. */
-    public static final String TYPE_KEYINFO_KEYNAME = MORE_ALGO_NS + "KeyName";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_KEYNAME = MORE_ALGO_NS + "KeyName";
 
     /** Type - A binary X.509 CRL. */
-    public static final String TYPE_KEYINFO_RAW_X509CRL = MORE_ALGO_NS + "rawX509CRL";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RAW_X509CRL = MORE_ALGO_NS + "rawX509CRL";
 
     /** Type - A binary PGP key packet. */
-    public static final String TYPE_KEYINFO_RAW_PGP_KEYPACKET = MORE_ALGO_NS + "rawPGPKeyPacket";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RAW_PGP_KEYPACKET = MORE_ALGO_NS + "rawPGPKeyPacket";
 
     /** Type - A raw SPKI S-expression. */
-    public static final String TYPE_KEYINFO_RAW_SPKI_SEXP = MORE_ALGO_NS + "rawSPKISexp";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RAW_SPKI_SEXP = MORE_ALGO_NS + "rawSPKISexp";
 
     /** Type - A PKCS7signedData element. */
-    public static final String TYPE_KEYINFO_PKCS7_SIGNED_DATA = MORE_ALGO_NS + "PKCS7signedData";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_PKCS7_SIGNED_DATA = MORE_ALGO_NS + "PKCS7signedData";
 
     /** Type - Binary PKCS7 signed data. */
-    public static final String TYPE_KEYINFO_RAW_PKCS7_SIGNED_DATA = MORE_ALGO_NS + "rawPKCS7signedData";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_RAW_PKCS7_SIGNED_DATA =
+            MORE_ALGO_NS + "rawPKCS7signedData";
 
     // These are additional type URIs defined by XML Signature 1.1
     
     /** Type - KeyInfo ECKeyValue. */
-    public static final String TYPE_KEYINFO_ECKEYVALUE = XMLSIG11_NS + "ECKeyValue";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_ECKEYVALUE = XMLSIG11_NS + "ECKeyValue";
     
     /** Type - KeyInfo DEREncodedKeyValue. */
-    public static final String TYPE_KEYINFO_DERENCODEDKEYVALUE = XMLSIG11_NS + "DEREncodedKeyValue";
+    @Nonnull @NotEmpty public static final String TYPE_KEYINFO_DERENCODEDKEYVALUE = XMLSIG11_NS + "DEREncodedKeyValue";
     
     
     // *********************************************************
@@ -140,144 +146,153 @@ public final class SignatureConstants {
     // *********************************************************
 
     /** Canonicalization - Inclusive 1.0 WITHOUT comments. */
-    public static final String ALGO_ID_C14N_OMIT_COMMENTS = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N_OMIT_COMMENTS =
+            "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
 
     /** Canonicalization - Inclusive 1.0 WITH comments. */
-    public static final String ALGO_ID_C14N_WITH_COMMENTS = ALGO_ID_C14N_OMIT_COMMENTS + "#WithComments";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N_WITH_COMMENTS =
+            ALGO_ID_C14N_OMIT_COMMENTS + "#WithComments";
 
     /** Canonicalization - Inclusive 1.1 WITHOUT comments. */
-    public static final String ALGO_ID_C14N11_OMIT_COMMENTS = "http://www.w3.org/2006/12/xml-c14n11";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N11_OMIT_COMMENTS =
+            "http://www.w3.org/2006/12/xml-c14n11";
 
     /** Canonicalization - Inclusive 1.1 WITH comments. */
-    public static final String ALGO_ID_C14N11_WITH_COMMENTS = ALGO_ID_C14N11_OMIT_COMMENTS + "#WithComments";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N11_WITH_COMMENTS =
+            ALGO_ID_C14N11_OMIT_COMMENTS + "#WithComments";
     
     /** Canonicalization - Exclusive WITHOUT comments. */
-    public static final String ALGO_ID_C14N_EXCL_OMIT_COMMENTS = "http://www.w3.org/2001/10/xml-exc-c14n#";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N_EXCL_OMIT_COMMENTS =
+            "http://www.w3.org/2001/10/xml-exc-c14n#";
 
     /** Canonicalization - Exclusive WITH comments. */
-    public static final String ALGO_ID_C14N_EXCL_WITH_COMMENTS = ALGO_ID_C14N_EXCL_OMIT_COMMENTS + "WithComments";
+    @Nonnull @NotEmpty public static final String ALGO_ID_C14N_EXCL_WITH_COMMENTS =
+            ALGO_ID_C14N_EXCL_OMIT_COMMENTS + "WithComments";
 
     // *********************************************************
     // Transforms
     // *********************************************************
 
     /** Transform - Required Enveloped Signature. */
-    public static final String TRANSFORM_ENVELOPED_SIGNATURE = XMLSIG_NS + "enveloped-signature";
+    @Nonnull @NotEmpty public static final String TRANSFORM_ENVELOPED_SIGNATURE = XMLSIG_NS + "enveloped-signature";
 
     /** Transform - Required Inclusive c14n 1.0 WITHOUT comments. */
-    public static final String TRANSFORM_C14N_OMIT_COMMENTS = ALGO_ID_C14N_OMIT_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N_OMIT_COMMENTS = ALGO_ID_C14N_OMIT_COMMENTS;
 
     /** Transform - Recommended Inclusive c14n 1.0 WITH comments. */
-    public static final String TRANSFORM_C14N_WITH_COMMENTS = ALGO_ID_C14N_WITH_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N_WITH_COMMENTS = ALGO_ID_C14N_WITH_COMMENTS;
 
     /** Transform - Required Inclusive c14n 1.1 WITHOUT comments. */
-    public static final String TRANSFORM_C14N11_OMIT_COMMENTS = ALGO_ID_C14N11_OMIT_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N11_OMIT_COMMENTS = ALGO_ID_C14N11_OMIT_COMMENTS;
 
     /** Transform - Recommended Inclusive c14n 1.1 WITH comments. */
-    public static final String TRANSFORM_C14N11_WITH_COMMENTS = ALGO_ID_C14N11_WITH_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N11_WITH_COMMENTS = ALGO_ID_C14N11_WITH_COMMENTS;
     
     /** Transform - Required Exclusive c14n WITHOUT comments. */
-    public static final String TRANSFORM_C14N_EXCL_OMIT_COMMENTS = ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N_EXCL_OMIT_COMMENTS = ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
 
     /** Transform - Recommended Exclusive c14n WITH comments. */
-    public static final String TRANSFORM_C14N_EXCL_WITH_COMMENTS = ALGO_ID_C14N_EXCL_WITH_COMMENTS;
+    @Nonnull @NotEmpty public static final String TRANSFORM_C14N_EXCL_WITH_COMMENTS = ALGO_ID_C14N_EXCL_WITH_COMMENTS;
 
     /** Transform - Optional XSLT. */
-    public static final String TRANSFORM_XSLT = "http://www.w3.org/TR/1999/REC-xslt-19991116";
+    @Nonnull @NotEmpty public static final String TRANSFORM_XSLT = "http://www.w3.org/TR/1999/REC-xslt-19991116";
 
     /** Transform - Recommended XPath. */
-    public static final String TRANSFORM_XPATH = "http://www.w3.org/TR/1999/REC-xpath-19991116";
+    @Nonnull @NotEmpty public static final String TRANSFORM_XPATH = "http://www.w3.org/TR/1999/REC-xpath-19991116";
 
     /** Transform - Base64 Decode. */
-    public static final String TRANSFORM_BASE64_DECODE = XMLSIG_NS + "base64";
+    @Nonnull @NotEmpty public static final String TRANSFORM_BASE64_DECODE = XMLSIG_NS + "base64";
 
     /*
-     * public static final String TRANSFORM_XPOINTER = "http://www.w3.org/TR/2001/WD-xptr-20010108"; public static final
-     * String TRANSFORM_XPATH2FILTER04 = "http://www.w3.org/2002/04/xmldsig-filter2"; public static final String
-     * TRANSFORM_XPATH2FILTER = "http://www.w3.org/2002/06/xmldsig-filter2";
+     * @Nonnull @NotEmpty public static final String TRANSFORM_XPOINTER = "http://www.w3.org/TR/2001/WD-xptr-20010108";
+     * @Nonnull @NotEmpty public static final String TRANSFORM_XPATH2FILTER04 =
+     *  "http://www.w3.org/2002/04/xmldsig-filter2";
+     * @Nonnull @NotEmpty public static final String TRANSFORM_XPATH2FILTER =
+     *  "http://www.w3.org/2002/06/xmldsig-filter2";
      */
 
     // *********************************************************
     // Some additional algorithm URIs from RFC 4051
     // *********************************************************
     /** Signature - NOT Recommended RSAwithMD5. */
-    public static final String ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5 = MORE_ALGO_NS + "rsa-md5";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5 = MORE_ALGO_NS + "rsa-md5";
 
     /** Signature - Optional RSAwithRIPEMD160. */
-    public static final String ALGO_ID_SIGNATURE_RSA_RIPEMD160 = MORE_ALGO_NS + "rsa-ripemd160";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_RIPEMD160 = MORE_ALGO_NS + "rsa-ripemd160";
 
     /** Signature - Required RSAwithSHA256. */
-    public static final String ALGO_ID_SIGNATURE_RSA_SHA256 = MORE_ALGO_NS + "rsa-sha256";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_SHA256 = MORE_ALGO_NS + "rsa-sha256";
 
     /** Signature - Optional RSAwithSHA224. */
-    public static final String ALGO_ID_SIGNATURE_RSA_SHA224 = MORE_ALGO_NS + "rsa-sha224";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_SHA224 = MORE_ALGO_NS + "rsa-sha224";
 
     /** Signature - Required RSAwithSHA384. */
-    public static final String ALGO_ID_SIGNATURE_RSA_SHA384 = MORE_ALGO_NS + "rsa-sha384";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_SHA384 = MORE_ALGO_NS + "rsa-sha384";
 
     /** Signature - Required RSAwithSHA512. */
-    public static final String ALGO_ID_SIGNATURE_RSA_SHA512 = MORE_ALGO_NS + "rsa-sha512";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_RSA_SHA512 = MORE_ALGO_NS + "rsa-sha512";
 
     /** HMAC - NOT Recommended HMAC-MD5. */
-    public static final String ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5 = MORE_ALGO_NS + "hmac-md5";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5 = MORE_ALGO_NS + "hmac-md5";
 
     /** HMAC - Optional HMAC-RIPEMD160. */
-    public static final String ALGO_ID_MAC_HMAC_RIPEMD160 = MORE_ALGO_NS + "hmac-ripemd160";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_RIPEMD160 = MORE_ALGO_NS + "hmac-ripemd160";
 
     /** HMAC - Optional HMAC-SHA224. */
-    public static final String ALGO_ID_MAC_HMAC_SHA224 = MORE_ALGO_NS + "hmac-sha224";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_SHA224 = MORE_ALGO_NS + "hmac-sha224";
     
     /** HMAC - Optional HMAC-SHA256. */
-    public static final String ALGO_ID_MAC_HMAC_SHA256 = MORE_ALGO_NS + "hmac-sha256";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_SHA256 = MORE_ALGO_NS + "hmac-sha256";
 
     /** HMAC - Optional HMAC-SHA284. */
-    public static final String ALGO_ID_MAC_HMAC_SHA384 = MORE_ALGO_NS + "hmac-sha384";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_SHA384 = MORE_ALGO_NS + "hmac-sha384";
 
     /** HMAC - Optional HMAC-SHA512. */
-    public static final String ALGO_ID_MAC_HMAC_SHA512 = MORE_ALGO_NS + "hmac-sha512";
+    @Nonnull @NotEmpty public static final String ALGO_ID_MAC_HMAC_SHA512 = MORE_ALGO_NS + "hmac-sha512";
 
     /** Signature - Optional ECDSAwithSHA1. */
-    public static final String ALGO_ID_SIGNATURE_ECDSA_SHA1 = MORE_ALGO_NS + "ecdsa-sha1";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_ECDSA_SHA1 = MORE_ALGO_NS + "ecdsa-sha1";
 
     /** Signature - Optional ECDSAwithSHA224. */
-    public static final String ALGO_ID_SIGNATURE_ECDSA_SHA224 = MORE_ALGO_NS + "ecdsa-sha224";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_ECDSA_SHA224 = MORE_ALGO_NS + "ecdsa-sha224";
 
     /** Signature - Optional ECDSAwithSHA256. */
-    public static final String ALGO_ID_SIGNATURE_ECDSA_SHA256 = MORE_ALGO_NS + "ecdsa-sha256";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_ECDSA_SHA256 = MORE_ALGO_NS + "ecdsa-sha256";
 
     /** Signature - Optional ECDSAwithSHA384. */
-    public static final String ALGO_ID_SIGNATURE_ECDSA_SHA384 = MORE_ALGO_NS + "ecdsa-sha384";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_ECDSA_SHA384 = MORE_ALGO_NS + "ecdsa-sha384";
 
     /** Signature - Optional ECDSAwithSHA512. */
-    public static final String ALGO_ID_SIGNATURE_ECDSA_SHA512 = MORE_ALGO_NS + "ecdsa-sha512";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_ECDSA_SHA512 = MORE_ALGO_NS + "ecdsa-sha512";
     
     /** Digest - Optional MD5. */
-    public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 = MORE_ALGO_NS + "md5";
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 = MORE_ALGO_NS + "md5";
 
     /** Digest - Optional SHA224. */
-    public static final String ALGO_ID_DIGEST_SHA224 = MORE_ALGO_NS + "sha224";
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_SHA224 = MORE_ALGO_NS + "sha224";
 
     /** Digest - Optional SHA384. */
-    public static final String ALGO_ID_DIGEST_SHA384 = MORE_ALGO_NS + "sha384";
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_SHA384 = MORE_ALGO_NS + "sha384";
     
     // *********************************************************
     // Some additional algorithm URIs from XML Signature 1.1
     // *********************************************************
     /** Signature - Optional DSAwithSHA256 (DSS). */
-    public static final String ALGO_ID_SIGNATURE_DSA_SHA256 = XMLSIG11_NS + "dsa-sha256";
+    @Nonnull @NotEmpty public static final String ALGO_ID_SIGNATURE_DSA_SHA256 = XMLSIG11_NS + "dsa-sha256";
     
     // *********************************************************
     // Alias in some additional algorithm URI's used in XML 
     // Signature, but defined in XML Encryption.
     // *********************************************************
     /** Message Digest - SHA256 (Note: Defined by XML Encryption). */
-    public static final String ALGO_ID_DIGEST_SHA256 = EncryptionConstants.ALGO_ID_DIGEST_SHA256;
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_SHA256 = EncryptionConstants.ALGO_ID_DIGEST_SHA256;
     
     /** Message Digest - SHA512 (Note: Defined by XML Encryption). */
-    public static final String ALGO_ID_DIGEST_SHA512 = EncryptionConstants.ALGO_ID_DIGEST_SHA512;
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_SHA512 = EncryptionConstants.ALGO_ID_DIGEST_SHA512;
     
     /** Message Digest - RIPEMD-160 (Note: Defined by XML Encryption). */
-    public static final String ALGO_ID_DIGEST_RIPEMD160 = EncryptionConstants.ALGO_ID_DIGEST_RIPEMD160;
+    @Nonnull @NotEmpty public static final String ALGO_ID_DIGEST_RIPEMD160 =
+            EncryptionConstants.ALGO_ID_DIGEST_RIPEMD160;
     
     
     /** Constructor. */
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureSupport.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureSupport.java
index 602048b79..3567f813e 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureSupport.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureSupport.java
@@ -28,6 +28,7 @@ import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.core.xml.io.Marshaller;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.security.SecurityException;
+import org.opensaml.security.credential.Credential;
 import org.opensaml.xmlsec.SignatureSigningParameters;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
 import org.opensaml.xmlsec.keyinfo.KeyInfoGenerator;
@@ -35,11 +36,11 @@ import org.opensaml.xmlsec.signature.KeyInfo;
 import org.opensaml.xmlsec.signature.SignableXMLObject;
 import org.opensaml.xmlsec.signature.Signature;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -119,12 +120,13 @@ public final class SignatureSupport {
         if (signature.getSignatureAlgorithm() == null) {
             signature.setSignatureAlgorithm(parameters.getSignatureAlgorithm());
         }
-        if (signature.getSignatureAlgorithm() == null) {
+        final String alg = signature.getSignatureAlgorithm();
+        if (alg == null) {
             throw new SecurityException("No signature algorithm was available on the signing parameters or Signature");
         }
     
         // HMAC output length, if applicable
-        if (signature.getHMACOutputLength() == null &&  AlgorithmSupport.isHMAC(signature.getSignatureAlgorithm())) {
+        if (signature.getHMACOutputLength() == null &&  AlgorithmSupport.isHMAC(alg)) {
             signature.setHMACOutputLength(parameters.getSignatureHMACOutputLength());
         }
     
@@ -166,9 +168,10 @@ public final class SignatureSupport {
                     throw e;
                 }
             } else {
+                final Credential cred = signature.getSigningCredential();
                 LOG.info("No KeyInfoGenerator was supplied in parameters or resolveable " 
                         + "for credential type {}, No KeyInfo will be generated for Signature", 
-                        signature.getSigningCredential().getCredentialType().getName());
+                        cred != null ? cred.getCredentialType().getName() : "(null)");
             }
         }
     }
@@ -283,6 +286,9 @@ public final class SignatureSupport {
         SignatureSupport.prepareSignatureParams(signature, parameters);
 
         final Marshaller marshaller = XMLObjectProviderRegistrySupport.getMarshallerFactory().getMarshaller(signable);
+        if (marshaller == null) {
+            throw new MarshallingException("Unable to locate marshaller for " + signable.getClass());
+        }
         marshaller.marshall(signable);
 
         Signer.signObject(signature);
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidationParametersCriterion.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidationParametersCriterion.java
index b64cecfab..f9c13ab1b 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidationParametersCriterion.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidationParametersCriterion.java
@@ -33,7 +33,7 @@ import org.opensaml.xmlsec.SignatureValidationParameters;
 public class SignatureValidationParametersCriterion implements Criterion {
     
     /** The SignatureValidationParameters instance. */
-    private SignatureValidationParameters params;
+    @Nonnull private SignatureValidationParameters params;
     
     /**
      * Constructor.
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidator.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidator.java
index 2cec66523..323ae1919 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidator.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/SignatureValidator.java
@@ -25,7 +25,8 @@ import javax.annotation.Nonnull;
 import org.opensaml.security.credential.Credential;
 import org.opensaml.xmlsec.signature.Signature;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A service class that cryptographically validates an XML Signature {@link Signature} 
@@ -77,6 +78,7 @@ public final class SignatureValidator {
                         "Could not load a signature validation provider implementation via service API");
             }
         }
+        assert validatorInstance != null;
         return validatorInstance;
     }
 
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/Signer.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/Signer.java
index 30cda543c..12e714cce 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/Signer.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/Signer.java
@@ -25,7 +25,9 @@ import javax.annotation.Nonnull;
 
 import org.opensaml.xmlsec.signature.Signature;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A service class which is responsible for cryptographically computing and storing the 
@@ -56,10 +58,12 @@ public final class Signer {
      * @param signatures an ordered list of XMLObject to be signed
      * @throws SignatureException  thrown if there is an error computing the signature
      */
-    public static void signObjects(@Nonnull final List<Signature> signatures) throws SignatureException {
+    public static void signObjects(@Nonnull @NonnullElements final List<Signature> signatures)
+            throws SignatureException {
         final SignerProvider signer = getSignerProvider();
         LOG.debug("Using a signer of implementation: {}", signer.getClass().getName());
         for (final Signature signature : signatures) {
+            assert signature != null;
             signer.signObject(signature);
         }
     }
@@ -92,6 +96,7 @@ public final class Signer {
                 throw new SignatureException("Could not load a signer implementation via service API");
             }
         }
+        assert signerInstance != null;
         return signerInstance;
     }
 
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/URIContentReference.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/URIContentReference.java
index e7b368b5c..82ec23277 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/URIContentReference.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/URIContentReference.java
@@ -28,9 +28,8 @@ import org.apache.xml.security.signature.XMLSignatureException;
 import org.apache.xml.security.transforms.TransformationException;
 import org.apache.xml.security.transforms.Transforms;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -43,16 +42,16 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class URIContentReference implements ConfigurableContentReference, TransformsConfigurableContentReference {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(URIContentReference.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(URIContentReference.class);
 
     /** Element reference ID. */
-    private final String referenceID;
+    @Nullable private final String referenceID;
 
     /** Algorithm used to digest the content . */
-    private String digestAlgorithm;
+    @Nullable private String digestAlgorithm;
 
     /** Transforms applied to the content. */
-    private final List<String> transforms;
+    @Nonnull private final List<String> transforms;
 
     /**
      * Constructor. The anchor designator (#) must not be included in the ID.
@@ -82,9 +81,8 @@ public class URIContentReference implements ConfigurableContentReference, Transf
     }
 
     /** {@inheritDoc}. */
-    public void setDigestAlgorithm(@Nonnull final String newAlgorithm) {
-        digestAlgorithm = Constraint.isNotNull(StringSupport.trimOrNull(newAlgorithm),
-                "Digest algorithm cannot be empty or null");
+    public void setDigestAlgorithm(@Nullable final String newAlgorithm) {
+        digestAlgorithm = StringSupport.trimOrNull(newAlgorithm);
     }
 
     /** {@inheritDoc} */
@@ -101,4 +99,5 @@ public class URIContentReference implements ConfigurableContentReference, Transf
             log.error("Error while adding content reference", e);
         }
     }
+    
 }
\ No newline at end of file
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/XMLSignatureCredentialContext.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/XMLSignatureCredentialContext.java
index 5d52fc4b1..acb0b5db1 100644
--- a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/XMLSignatureCredentialContext.java
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/signature/support/XMLSignatureCredentialContext.java
@@ -29,7 +29,7 @@ import org.opensaml.xmlsec.signature.Signature;
 public class XMLSignatureCredentialContext implements CredentialContext {
 
     /** The Signature element context. */ 
-    private final Signature sig;
+    @Nonnull private final Signature sig;
     
     /**
      * Constructor.
diff --git a/opensaml-xmlsec-api/src/test/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistryTest.java b/opensaml-xmlsec-api/src/test/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistryTest.java
index 4b8c0c4e8..586bcdd5c 100644
--- a/opensaml-xmlsec-api/src/test/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistryTest.java
+++ b/opensaml-xmlsec-api/src/test/java/org/opensaml/xmlsec/agreement/KeyAgreementProcessorRegistryTest.java
@@ -19,6 +19,8 @@ package org.opensaml.xmlsec.agreement;
 
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.security.credential.Credential;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -26,10 +28,11 @@ import org.testng.annotations.Test;
 import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
- *
+ * Unit test for {@link KeyAgreementProcessorRegistry}.
  */
 public class KeyAgreementProcessorRegistryTest {
     
+    /** Basic tests */
     @Test
     public void basic() {
         KeyAgreementProcessorRegistry registry = new KeyAgreementProcessorRegistry();
@@ -69,29 +72,39 @@ public class KeyAgreementProcessorRegistryTest {
         Assert.assertNull(registry.getProcessor("urn:test:KeyAgreementProcessor:Bar"));
     }
     
+    /**
+     * Mock processor.
+     */
     public static class MockProcessorFoo implements KeyAgreementProcessor {
 
         /** {@inheritDoc} */
-        public String getAlgorithm() {
+        @Nonnull public String getAlgorithm() {
             return "urn:test:KeyAgreementProcessor:Foo";
         }
 
         /** {@inheritDoc} */
-        public KeyAgreementCredential execute(Credential publicCredential, String keyAlgorithm, KeyAgreementParameters parameters) throws KeyAgreementException {
-            return null;
+        @Nonnull public KeyAgreementCredential execute(@Nonnull final Credential publicCredential,
+                @Nonnull final String keyAlgorithm, @Nonnull final KeyAgreementParameters parameters)
+                        throws KeyAgreementException {
+            throw new UnsupportedOperationException();
         }
     }
     
+    /**
+     * Mock processor.
+     */
     public static class MockProcessorBar implements KeyAgreementProcessor {
 
         /** {@inheritDoc} */
-        public String getAlgorithm() {
+        @Nonnull public String getAlgorithm() {
             return "urn:test:KeyAgreementProcessor:Bar";
         }
 
         /** {@inheritDoc} */
-        public KeyAgreementCredential execute(Credential publicCredential, String keyAlgorithm, KeyAgreementParameters parameters) throws KeyAgreementException {
-            return null;
+        @Nonnull public KeyAgreementCredential execute(@Nonnull final Credential publicCredential,
+                @Nonnull final String keyAlgorithm, @Nonnull final KeyAgreementParameters parameters)
+                        throws KeyAgreementException {
+            throw new UnsupportedOperationException();
         }
     }
 }

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


More information about the commits mailing list