[java-opensaml] branch main updated: IDP-2069 - Null Handling Task
Scott Cantor
cantor.2 at osu.edu
Tue Mar 14 21:28:24 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=4cd93fe71b823c75c184353da340efb691f904c1
The following commit(s) were added to refs/heads/main by this push:
new 4cd93fe71 IDP-2069 - Null Handling Task
4cd93fe71 is described below
commit 4cd93fe71b823c75c184353da340efb691f904c1
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Mar 14 17:28:21 2023 -0400
IDP-2069 - Null Handling Task
https://shibboleth.atlassian.net/browse/IDP-2069
Add more annotations to undocumented interfaces.
Add an ensure getter method to ConfigurationService.
---
.../org/opensaml/core/config/Configuration.java | 6 ++--
.../core/config/ConfigurationPropertiesSource.java | 6 ++--
.../opensaml/core/config/ConfigurationService.java | 34 +++++++++++++++++-----
.../core/config/InitializationService.java | 5 ++--
...actFilesystemConfigurationPropertiesSource.java | 11 ++++---
.../ClasspathConfigurationPropertiesSource.java | 13 +++++----
.../config/provider/MapBasedConfiguration.java | 11 ++++---
...ystemPropertyConfigurationPropertiesSource.java | 4 ++-
...rtyFilesystemConfigurationPropertiesSource.java | 3 +-
.../ThreadLocalConfigurationPropertiesHolder.java | 5 ++--
.../ThreadLocalConfigurationPropertiesSource.java | 4 ++-
.../core/metrics/LoggerDrivenMetricFilter.java | 6 ++--
.../AbstractXMLObjectProviderInitializer.java | 9 ++++--
.../xml/config/GlobalParserPoolInitializer.java | 6 ++--
.../opensaml/core/xml/config/XMLConfigurator.java | 25 ++++++++++------
.../xml/config/XMLObjectProviderInitializer.java | 8 +++--
.../core/xml/config/XMLObjectProviderRegistry.java | 31 ++++++++++----------
.../config/XMLObjectProviderRegistrySupport.java | 28 +++++++++---------
.../core/config/ConfigurationServiceTest.java | 4 +--
...ClasspathConfigurationPropertiesSourceTest.java | 4 +--
...ilesystemConfigurationPropertiesSourceTest.java | 4 +--
...readLocalConfigurationPropertiesSourceTest.java | 6 ++--
22 files changed, 145 insertions(+), 88 deletions(-)
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/Configuration.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/Configuration.java
index 2c1823716..162c47651 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/Configuration.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/Configuration.java
@@ -17,6 +17,8 @@
package org.opensaml.core.config;
+import javax.annotation.Nullable;
+
/**
* A component which provides for the registration, retrieval and deregistration of objects
* related to library module configuration.
@@ -38,7 +40,7 @@ public interface Configuration {
*
* @return the instance of the registered configuration interface, or null
*/
- public <T extends Object> T get(Class<T> configClass, String partitionName);
+ @Nullable public <T extends Object> T get(Class<T> configClass, String partitionName);
/**
* Register a configuration instance.
@@ -62,6 +64,6 @@ public interface Configuration {
*
* @return the configuration implementation instance which was deregistered, or null
*/
- public <T extends Object> T deregister(Class<T> configClass, String partitionName);
+ @Nullable public <T extends Object> T deregister(Class<T> configClass, String partitionName);
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationPropertiesSource.java
index eb04c9446..ced1c02f2 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationPropertiesSource.java
@@ -19,6 +19,8 @@ package org.opensaml.core.config;
import java.util.Properties;
+import javax.annotation.Nullable;
+
/**
* An interface for a component which exposes a property set from a source.
*/
@@ -27,8 +29,8 @@ public interface ConfigurationPropertiesSource {
/**
* Get the property set exposed by the source.
*
- * @return the properties set
+ * @return the properties set or null
*/
- public Properties getProperties();
+ @Nullable Properties getProperties();
}
\ No newline at end of file
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationService.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationService.java
index 331fb69c8..037c2e624 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationService.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/ConfigurationService.java
@@ -26,11 +26,11 @@ import javax.annotation.Nullable;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
import org.opensaml.core.config.provider.MapBasedConfiguration;
import org.opensaml.core.config.provider.SystemPropertyConfigurationPropertiesSource;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* A service which provides for the registration, retrieval and deregistration of objects
@@ -59,10 +59,10 @@ import org.slf4j.LoggerFactory;
public class ConfigurationService {
/** The default storage partition name, if none is specified using configuration properties. */
- @Nonnull public static final String DEFAULT_PARTITION_NAME = "default";
+ @Nonnull @NotEmpty public static final String DEFAULT_PARTITION_NAME = "default";
/** The configuration property name for the storage partition name to use. */
- @Nonnull public static final String PROPERTY_PARTITION_NAME = "opensaml.config.partitionName";
+ @Nonnull @NotEmpty public static final String PROPERTY_PARTITION_NAME = "opensaml.config.partitionName";
/** Logger. */
@Nonnull private static final Logger LOG = LoggerFactory.getLogger(ConfigurationService.class);
@@ -72,7 +72,7 @@ public class ConfigurationService {
ServiceLoader.load(ConfigurationPropertiesSource.class) ;
/** The configuration instance to use. */
- private static Configuration configuration;
+ @Nullable private static Configuration configuration;
/** Constructor. */
protected ConfigurationService() { }
@@ -86,11 +86,28 @@ public class ConfigurationService {
*
* @return the instance of the registered configuration object, or null
*/
- public static <T extends Object> T get(@Nonnull final Class<T> configClass) {
+ @Nullable public static <T extends Object> T get(@Nonnull final Class<T> configClass) {
final String partitionName = getPartitionName();
return getConfiguration().get(configClass, partitionName);
}
-
+
+ /**
+ * Obtain the registered configuration instance, raising an exception if absent.
+ *
+ * @param <T> the type of configuration being retrieved
+ *
+ * @param configClass the configuration class identifier
+ *
+ * @return the instance of the registered configuration object
+ *
+ * @since 5.0.0
+ */
+ @Nonnull public static <T extends Object> T ensure(@Nonnull final Class<T> configClass) {
+ final String partitionName = getPartitionName();
+ return Constraint.isNotNull(getConfiguration().get(configClass, partitionName),
+ "Configuration instance of type " + configClass.getName() + " was unavailable");
+ }
+
/**
* Register a configuration instance.
*
@@ -115,7 +132,7 @@ public class ConfigurationService {
*
* @return the configuration object instance which was deregistered, or null
*/
- public static <T extends Object> T deregister(@Nonnull final Class<T> configClass) {
+ @Nullable public static <T extends Object> T deregister(@Nonnull final Class<T> configClass) {
final String partitionName = getPartitionName();
return getConfiguration().deregister(configClass, partitionName);
}
@@ -197,6 +214,7 @@ public class ConfigurationService {
partitionName = DEFAULT_PARTITION_NAME;
}
LOG.trace("Resolved effective configuration partition name '{}'", partitionName);
+ assert partitionName != null;
return partitionName;
}
@@ -224,6 +242,8 @@ public class ConfigurationService {
}
}
}
+
+ assert configuration != null;
return configuration;
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/InitializationService.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/InitializationService.java
index f623774fe..5f254896b 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/InitializationService.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/InitializationService.java
@@ -23,7 +23,8 @@ import java.util.ServiceLoader;
import javax.annotation.Nonnull;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.primitive.LoggerFactory;
/**
* Service which initializes OpenSAML library modules using the Java Services API.
@@ -67,7 +68,7 @@ public class InitializationService {
*
* @return the service loader instance to use
*/
- private static ServiceLoader<Initializer> getServiceLoader() {
+ @Nonnull private static ServiceLoader<Initializer> getServiceLoader() {
// TODO ideally would store off loader and reuse on subsequent calls,
// so inited state in providers would be persisted across calls,
// avoiding re-initing problems
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/AbstractFilesystemConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/AbstractFilesystemConfigurationPropertiesSource.java
index 853e56378..7196ab8f8 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/AbstractFilesystemConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/AbstractFilesystemConfigurationPropertiesSource.java
@@ -24,10 +24,13 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import org.opensaml.core.config.ConfigurationPropertiesSource;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.primitive.StringSupport;
/**
@@ -44,10 +47,10 @@ public abstract class AbstractFilesystemConfigurationPropertiesSource implements
private Properties cachedProperties;
/** Logger. */
- private Logger log = LoggerFactory.getLogger(AbstractFilesystemConfigurationPropertiesSource.class);
+ @Nonnull private Logger log = LoggerFactory.getLogger(AbstractFilesystemConfigurationPropertiesSource.class);
/** {@inheritDoc} */
- public Properties getProperties() {
+ @Nullable public Properties getProperties() {
final String fileName = StringSupport.trimOrNull(getFilename());
if (fileName == null) {
log.warn("No filename was supplied, unable to load properties");
@@ -82,5 +85,5 @@ public abstract class AbstractFilesystemConfigurationPropertiesSource implements
*
* @return the absolute filename
*/
- protected abstract String getFilename();
+ @Nullable protected abstract String getFilename();
}
\ No newline at end of file
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSource.java
index 71732fd37..36598148e 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSource.java
@@ -22,10 +22,13 @@ import java.io.InputStream;
import java.util.Properties;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import org.opensaml.core.config.ConfigurationPropertiesSource;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.primitive.LoggerFactory;
/**
* A configuration properties source implementation which obtains the properties set
@@ -34,19 +37,19 @@ import org.slf4j.LoggerFactory;
public class ClasspathConfigurationPropertiesSource implements ConfigurationPropertiesSource {
/** Configuration properties resource name. */
- @Nonnull private static final String RESOURCE_NAME = "opensaml-config.properties";
+ @Nonnull @NotEmpty private static final String RESOURCE_NAME = "opensaml-config.properties";
/** Logger. */
@Nonnull private Logger log = LoggerFactory.getLogger(ClasspathConfigurationPropertiesSource.class);
/** Cache of properties. */
- private Properties cachedProperties;
+ @Nullable private Properties cachedProperties;
/** {@inheritDoc} */
- public Properties getProperties() {
+ @Nullable public Properties getProperties() {
synchronized (this) {
if (cachedProperties == null) {
- try (InputStream is =
+ try (final InputStream is =
Thread.currentThread().getContextClassLoader().getResourceAsStream(RESOURCE_NAME)) {
// NOTE: in this invocation style via class loader, resource should NOT have a leading slash
// because all names are absolute. This is unlike Class.getResourceAsStream
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/MapBasedConfiguration.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/MapBasedConfiguration.java
index d5dc36916..6c26847f8 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/MapBasedConfiguration.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/MapBasedConfiguration.java
@@ -20,6 +20,9 @@ package org.opensaml.core.config.provider;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import org.opensaml.core.config.Configuration;
/**
@@ -29,7 +32,7 @@ import org.opensaml.core.config.Configuration;
public class MapBasedConfiguration implements Configuration {
/** Storage for registered configuration objects. */
- private Map<String, Map<String, Object>> storage;
+ @Nonnull private final Map<String, Map<String, Object>> storage;
/** Constructor. */
public MapBasedConfiguration() {
@@ -46,7 +49,7 @@ public class MapBasedConfiguration implements Configuration {
*
* @return the instance of the registered configuration interface, or null
*/
- public <T extends Object> T get(final Class<T> configClass, final String partitionName) {
+ @Nullable public <T extends Object> T get(final Class<T> configClass, final String partitionName) {
final Map<String, Object> partition = getPartition(partitionName);
return configClass.cast(partition.get(configClass.getName()));
}
@@ -77,7 +80,7 @@ public class MapBasedConfiguration implements Configuration {
*
* @return the configuration implementation instance which was deregistered, or null
*/
- public <T extends Object> T deregister(final Class<T> configClass, final String partitionName) {
+ @Nullable public <T extends Object> T deregister(final Class<T> configClass, final String partitionName) {
final Map<String, Object> partition = getPartition(partitionName);
synchronized (partition) {
final T old = configClass.cast(partition.get(configClass.getName()));
@@ -93,7 +96,7 @@ public class MapBasedConfiguration implements Configuration {
*
* @return the Map corresponding to the partition name. A new empty Map will be created if necessary
*/
- private synchronized Map<String, Object> getPartition(final String partitionName) {
+ @Nonnull private synchronized Map<String, Object> getPartition(final String partitionName) {
Map<String, Object> partition = storage.get(partitionName);
if (partition == null) {
partition = new ConcurrentHashMap<>();
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyConfigurationPropertiesSource.java
index c6afd9e1c..be4afbcc7 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyConfigurationPropertiesSource.java
@@ -19,6 +19,8 @@ package org.opensaml.core.config.provider;
import java.util.Properties;
+import javax.annotation.Nullable;
+
import org.opensaml.core.config.ConfigurationPropertiesSource;
/**
@@ -27,7 +29,7 @@ import org.opensaml.core.config.ConfigurationPropertiesSource;
public class SystemPropertyConfigurationPropertiesSource implements ConfigurationPropertiesSource {
/** {@inheritDoc} */
- public Properties getProperties() {
+ @Nullable public Properties getProperties() {
return System.getProperties();
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyFilesystemConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyFilesystemConfigurationPropertiesSource.java
index 9d0ac9c64..34eb24d30 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyFilesystemConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/SystemPropertyFilesystemConfigurationPropertiesSource.java
@@ -18,6 +18,7 @@
package org.opensaml.core.config.provider;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
@@ -33,7 +34,7 @@ public class SystemPropertyFilesystemConfigurationPropertiesSource extends
/** {@inheritDoc} */
@Override
- protected String getFilename() {
+ @Nullable protected String getFilename() {
return System.getProperty(PROPERTY_FILE_NAME);
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesHolder.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesHolder.java
index cff77eb02..147a2c63a 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesHolder.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesHolder.java
@@ -20,6 +20,7 @@ package org.opensaml.core.config.provider;
import java.util.Properties;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
/**
* A container class for holding a {link {@link ThreadLocal} copy of a {@link Properties} instance.
@@ -37,7 +38,7 @@ public final class ThreadLocalConfigurationPropertiesHolder {
*
* @return the thread-local Properties
*/
- public static Properties getProperties() {
+ @Nullable public static Properties getProperties() {
return properties.get();
}
@@ -46,7 +47,7 @@ public final class ThreadLocalConfigurationPropertiesHolder {
*
* @param newProperties the new thread-local Properties instance
*/
- public static void setProperties(final Properties newProperties) {
+ public static void setProperties(@Nullable final Properties newProperties) {
properties.set(newProperties);
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSource.java b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSource.java
index e0521a240..5955c6a9f 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSource.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSource.java
@@ -19,6 +19,8 @@ package org.opensaml.core.config.provider;
import java.util.Properties;
+import javax.annotation.Nullable;
+
import org.opensaml.core.config.ConfigurationPropertiesSource;
/**
@@ -48,7 +50,7 @@ import org.opensaml.core.config.ConfigurationPropertiesSource;
public class ThreadLocalConfigurationPropertiesSource implements ConfigurationPropertiesSource {
/** {@inheritDoc} */
- public Properties getProperties() {
+ @Nullable public Properties getProperties() {
return ThreadLocalConfigurationPropertiesHolder.getProperties();
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/metrics/LoggerDrivenMetricFilter.java b/opensaml-core-api/src/main/java/org/opensaml/core/metrics/LoggerDrivenMetricFilter.java
index 871bc117e..906c3ae64 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/metrics/LoggerDrivenMetricFilter.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/metrics/LoggerDrivenMetricFilter.java
@@ -17,7 +17,6 @@
package org.opensaml.core.metrics;
-import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -27,6 +26,7 @@ import javax.annotation.Nullable;
import net.shibboleth.shared.annotation.ParameterName;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.StringSupport;
@@ -75,7 +75,7 @@ public class LoggerDrivenMetricFilter implements MetricFilter {
* @param prefix prefix to attach to metric name before evaluating
*/
public LoggerDrivenMetricFilter(@Nonnull @NotEmpty @ParameterName(name="prefix") final String prefix) {
- this(prefix, Collections.<String,Level>emptyMap());
+ this(prefix, CollectionSupport.emptyMap());
}
/**
@@ -89,7 +89,7 @@ public class LoggerDrivenMetricFilter implements MetricFilter {
loggerPrefix = Constraint.isNotNull(StringSupport.trimOrNull(prefix), "Prefix cannot be null or empty.");
if (map == null || map.isEmpty()) {
- levelMap = Collections.emptyMap();
+ levelMap = CollectionSupport.emptyMap();
} else {
levelMap = new HashMap<>(map.size());
for (final Map.Entry<String,Level> entry : map.entrySet()) {
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/AbstractXMLObjectProviderInitializer.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/AbstractXMLObjectProviderInitializer.java
index 6321cc64a..28a0538cc 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/AbstractXMLObjectProviderInitializer.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/AbstractXMLObjectProviderInitializer.java
@@ -20,10 +20,13 @@ package org.opensaml.core.xml.config;
import java.io.IOException;
import java.io.InputStream;
+import javax.annotation.Nonnull;
+
import org.opensaml.core.config.InitializationException;
import org.opensaml.core.config.Initializer;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.primitive.LoggerFactory;
/**
* Reads in an XML configuration and configures the XMLTooling library accordingly.
@@ -31,7 +34,7 @@ import org.slf4j.LoggerFactory;
public abstract class AbstractXMLObjectProviderInitializer implements Initializer {
/** Class logger. */
- private final Logger log = LoggerFactory.getLogger(AbstractXMLObjectProviderInitializer.class);
+ @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractXMLObjectProviderInitializer.class);
/** {@inheritDoc} */
public void init() throws InitializationException {
@@ -72,6 +75,6 @@ public abstract class AbstractXMLObjectProviderInitializer implements Initialize
*
* @return the list of configuration file resources
*/
- protected abstract String[] getConfigResources();
+ @Nonnull protected abstract String[] getConfigResources();
}
\ No newline at end of file
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/GlobalParserPoolInitializer.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/GlobalParserPoolInitializer.java
index 3fd5d4754..e4cf26d2a 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/GlobalParserPoolInitializer.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/GlobalParserPoolInitializer.java
@@ -18,13 +18,15 @@
package org.opensaml.core.xml.config;
import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.xml.impl.BasicParserPool;
+import javax.annotation.Nonnull;
+
import org.opensaml.core.config.ConfigurationService;
import org.opensaml.core.config.InitializationException;
import org.opensaml.core.config.Initializer;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* An initializer for the global parser pool held by the {@link XMLObjectProviderRegistry}.
@@ -47,7 +49,7 @@ import org.slf4j.LoggerFactory;
public class GlobalParserPoolInitializer implements Initializer {
/** Logger. */
- private Logger log = LoggerFactory.getLogger(GlobalParserPoolInitializer.class);
+ @Nonnull private Logger log = LoggerFactory.getLogger(GlobalParserPoolInitializer.class);
/** {@inheritDoc} */
public void init() throws InitializationException {
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLConfigurator.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLConfigurator.java
index 50cb8a32f..43b268708 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLConfigurator.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLConfigurator.java
@@ -35,6 +35,7 @@ import javax.xml.validation.SchemaFactory;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.primitive.StringSupport;
import net.shibboleth.shared.xml.AttributeSupport;
import net.shibboleth.shared.xml.ElementSupport;
@@ -47,7 +48,7 @@ import org.opensaml.core.xml.XMLObjectBuilder;
import org.opensaml.core.xml.io.Marshaller;
import org.opensaml.core.xml.io.Unmarshaller;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -75,10 +76,10 @@ public class XMLConfigurator {
@Nonnull private final Logger log = LoggerFactory.getLogger(XMLConfigurator.class);
/** Pool of parsers used to read and validate configurations. */
- private BasicParserPool parserPool;
+ @Nonnull private BasicParserPool parserPool;
/** Schema used to validate configuration files. */
- private Schema configurationSchema;
+ @Nonnull private Schema configurationSchema;
/** The provider registry instance to use. */
@Nonnull private final XMLObjectProviderRegistry registry;
@@ -225,7 +226,7 @@ public class XMLConfigurator {
*
* @throws XMLConfigurationException thrown if the configuration elements are invalid
*/
- protected void initializeObjectProviders(final Element objectProviders) throws XMLConfigurationException {
+ protected void initializeObjectProviders(@Nonnull final Element objectProviders) throws XMLConfigurationException {
final NodeList providerList = objectProviders.getElementsByTagNameNS(XMLTOOLING_CONFIG_NS, "ObjectProvider");
for (int i = 0; i < providerList.getLength(); i++) {
@@ -245,14 +246,17 @@ public class XMLConfigurator {
Element configuration =
(Element) objectProvider.getElementsByTagNameNS(XMLTOOLING_CONFIG_NS, "BuilderClass").item(0);
+ assert configuration != null;
final XMLObjectBuilder<?> builder = (XMLObjectBuilder<?>) createClassInstance(configuration);
configuration = (Element) objectProvider
.getElementsByTagNameNS(XMLTOOLING_CONFIG_NS, "MarshallingClass").item(0);
+ assert configuration != null;
final Marshaller marshaller = (Marshaller) createClassInstance(configuration);
configuration = (Element) objectProvider
.getElementsByTagNameNS(XMLTOOLING_CONFIG_NS, "UnmarshallingClass").item(0);
+ assert configuration != null;
final Unmarshaller unmarshaller = (Unmarshaller) createClassInstance(configuration);
getRegistry().registerObjectProvider(objectProviderName, builder, marshaller, unmarshaller);
@@ -276,7 +280,7 @@ public class XMLConfigurator {
*
* @throws XMLConfigurationException thrown if there is a problem with a parsing or registering the ID attribute
*/
- protected void initializeIDAttributes(final Element idAttributesElement) throws XMLConfigurationException {
+ protected void initializeIDAttributes(@Nonnull final Element idAttributesElement) throws XMLConfigurationException {
Element idAttributeElement;
QName attributeQName;
@@ -285,6 +289,7 @@ public class XMLConfigurator {
for (int i = 0; i < idAttributeList.getLength(); i++) {
idAttributeElement = (Element) idAttributeList.item(i);
+ assert idAttributeElement != null;
attributeQName = ElementSupport.getElementContentAsQName(idAttributeElement);
if (attributeQName == null) {
log.debug("IDAttribute element was empty, no registration performed");
@@ -304,11 +309,12 @@ public class XMLConfigurator {
*
* @throws XMLConfigurationException thrown if the class can not be instantiated
*/
- protected Object createClassInstance(final Element configuration) throws XMLConfigurationException {
+ @Nonnull protected Object createClassInstance(@Nonnull final Element configuration)
+ throws XMLConfigurationException {
final String className = StringSupport.trimOrNull(configuration.getAttributeNS(null, "className"));
if (className == null) {
- return null;
+ throw new XMLConfigurationException("No className attribute in configuration element");
}
try {
@@ -336,7 +342,7 @@ public class XMLConfigurator {
*
* @throws XMLConfigurationException thrown if the configuration is not schema-valid
*/
- protected void validateConfiguration(final Document configuration) throws XMLConfigurationException {
+ protected void validateConfiguration(@Nonnull final Document configuration) throws XMLConfigurationException {
try {
final javax.xml.validation.Validator schemaValidator = configurationSchema.newValidator();
schemaValidator.validate(new DOMSource(configuration));
@@ -357,7 +363,8 @@ public class XMLConfigurator {
*
* @return the registry instance
*/
- protected XMLObjectProviderRegistry getRegistry() {
+ @Nonnull protected XMLObjectProviderRegistry getRegistry() {
return registry;
}
+
}
\ No newline at end of file
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderInitializer.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderInitializer.java
index fd8d6eb23..992885e88 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderInitializer.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderInitializer.java
@@ -17,6 +17,7 @@
package org.opensaml.core.xml.config;
+import javax.annotation.Nonnull;
import javax.xml.namespace.QName;
import org.opensaml.core.config.ConfigurationService;
@@ -28,14 +29,14 @@ import org.opensaml.core.config.InitializationException;
public class XMLObjectProviderInitializer extends AbstractXMLObjectProviderInitializer {
/** Config resources. */
- private static String[] configs = {
+ @Nonnull private static String[] configs = {
"/default-config.xml",
"/schema-config.xml",
};
/** {@inheritDoc} */
@Override
- protected String[] getConfigResources() {
+ @Nonnull protected String[] getConfigResources() {
return configs;
}
@@ -45,6 +46,9 @@ public class XMLObjectProviderInitializer extends AbstractXMLObjectProviderIniti
super.init();
final XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
+ if (registry == null) {
+ throw new InitializationException("XMLObjectProviderRegistry was not available");
+ }
registry.registerIDAttribute(new QName(javax.xml.XMLConstants.XML_NS_URI, "id"));
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistry.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistry.java
index d531fbe05..d1977f0ec 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistry.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistry.java
@@ -33,9 +33,10 @@ import org.opensaml.core.xml.io.MarshallerFactory;
import org.opensaml.core.xml.io.Unmarshaller;
import org.opensaml.core.xml.io.UnmarshallerFactory;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
import org.w3c.dom.Element;
+import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.xml.ParserPool;
/** Configuration registry component for registering and retrieving implementation instances
@@ -51,29 +52,29 @@ import net.shibboleth.shared.xml.ParserPool;
public class XMLObjectProviderRegistry {
/** Default object provider. */
- private static QName defaultProvider = new QName(XMLConfigurator.XMLTOOLING_CONFIG_NS,
+ @Nonnull private static QName defaultProvider = new QName(XMLConfigurator.XMLTOOLING_CONFIG_NS,
XMLConfigurator.XMLTOOLING_DEFAULT_OBJECT_PROVIDER);
/** Logger. */
- private Logger log = LoggerFactory.getLogger(XMLObjectProviderRegistry.class);
+ @Nonnull private Logger log = LoggerFactory.getLogger(XMLObjectProviderRegistry.class);
/** Object provider configuration elements indexed by QName. */
@Nonnull private final Map<QName, Element> configuredObjectProviders;
/** Configured XMLObject builder factory. */
- private XMLObjectBuilderFactory builderFactory;
+ @Nonnull private XMLObjectBuilderFactory builderFactory;
/** Configured XMLObject marshaller factory. */
- private MarshallerFactory marshallerFactory;
+ @Nonnull private MarshallerFactory marshallerFactory;
/** Configured XMLObject unmarshaller factory. */
- private UnmarshallerFactory unmarshallerFactory;
+ @Nonnull private UnmarshallerFactory unmarshallerFactory;
/** Configured set of attribute QNames which have been globally registered as having an ID type. */
@Nonnull private final Set<QName> idAttributeNames;
/** Configured parser pool. */
- private ParserPool parserPool;
+ @Nullable private ParserPool parserPool;
/** Constructor. */
public XMLObjectProviderRegistry() {
@@ -91,7 +92,7 @@ public class XMLObjectProviderRegistry {
*
* @return the currently ParserPool
*/
- public ParserPool getParserPool() {
+ @Nullable public ParserPool getParserPool() {
return parserPool;
}
@@ -110,7 +111,7 @@ public class XMLObjectProviderRegistry {
*
* @return the QName for the default object provider
*/
- public QName getDefaultProviderQName() {
+ @Nonnull public QName getDefaultProviderQName() {
return defaultProvider;
}
@@ -149,7 +150,7 @@ public class XMLObjectProviderRegistry {
*
* @return the XMLObject builder factory
*/
- public XMLObjectBuilderFactory getBuilderFactory() {
+ @Nonnull public XMLObjectBuilderFactory getBuilderFactory() {
return builderFactory;
}
@@ -158,7 +159,7 @@ public class XMLObjectProviderRegistry {
*
* @return the XMLObject marshaller factory
*/
- public MarshallerFactory getMarshallerFactory() {
+ @Nonnull public MarshallerFactory getMarshallerFactory() {
return marshallerFactory;
}
@@ -168,7 +169,7 @@ public class XMLObjectProviderRegistry {
*
* @return the XMLObject unmarshaller factory
*/
- public UnmarshallerFactory getUnmarshallerFactory() {
+ @Nonnull public UnmarshallerFactory getUnmarshallerFactory() {
return unmarshallerFactory;
}
@@ -177,7 +178,7 @@ public class XMLObjectProviderRegistry {
*
* @param attributeName the QName of the ID attribute to be registered
*/
- public void registerIDAttribute(final QName attributeName) {
+ public void registerIDAttribute(@Nonnull final QName attributeName) {
if (!idAttributeNames.contains(attributeName)) {
idAttributeNames.add(attributeName);
}
@@ -188,7 +189,7 @@ public class XMLObjectProviderRegistry {
*
* @param attributeName the QName of the ID attribute to be de-registered
*/
- public void deregisterIDAttribute(final QName attributeName) {
+ public void deregisterIDAttribute(@Nonnull final QName attributeName) {
if (idAttributeNames.contains(attributeName)) {
idAttributeNames.remove(attributeName);
}
@@ -200,7 +201,7 @@ public class XMLObjectProviderRegistry {
* @param attributeName the QName of the attribute to be checked for ID type.
* @return true if attribute is registered as having an ID type.
*/
- public boolean isIDAttribute(final QName attributeName) {
+ public boolean isIDAttribute(@Nonnull final QName attributeName) {
return idAttributeNames.contains(attributeName);
}
diff --git a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistrySupport.java b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistrySupport.java
index 66962947d..7dd55b4f0 100644
--- a/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistrySupport.java
+++ b/opensaml-core-api/src/main/java/org/opensaml/core/xml/config/XMLObjectProviderRegistrySupport.java
@@ -45,7 +45,7 @@ public class XMLObjectProviderRegistrySupport {
* @return the currently ParserPool
*/
@Nullable public static ParserPool getParserPool() {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).getParserPool();
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).getParserPool();
}
/**
@@ -54,7 +54,7 @@ public class XMLObjectProviderRegistrySupport {
* @param newParserPool the new ParserPool instance to configure
*/
public static void setParserPool(@Nullable final ParserPool newParserPool) {
- ConfigurationService.get(XMLObjectProviderRegistry.class).setParserPool(newParserPool);
+ ConfigurationService.ensure(XMLObjectProviderRegistry.class).setParserPool(newParserPool);
}
/**
@@ -64,7 +64,7 @@ public class XMLObjectProviderRegistrySupport {
* @return the QName for the default object provider
*/
public static QName getDefaultProviderQName() {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).getDefaultProviderQName();
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).getDefaultProviderQName();
}
/**
@@ -79,7 +79,7 @@ public class XMLObjectProviderRegistrySupport {
public static void registerObjectProvider(@Nonnull final QName providerName,
@Nonnull final XMLObjectBuilder<?> builder, @Nonnull final Marshaller marshaller,
@Nonnull final Unmarshaller unmarshaller) {
- final XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
+ final XMLObjectProviderRegistry registry = ConfigurationService.ensure(XMLObjectProviderRegistry.class);
registry.getBuilderFactory().registerBuilder(providerName, builder);
registry.getMarshallerFactory().registerMarshaller(providerName, marshaller);
@@ -92,7 +92,7 @@ public class XMLObjectProviderRegistrySupport {
* @param key the key of the builder, marshaller, and unmarshaller to be removed
*/
public static void deregisterObjectProvider(@Nonnull final QName key) {
- final XMLObjectProviderRegistry registry = ConfigurationService.get(XMLObjectProviderRegistry.class);
+ final XMLObjectProviderRegistry registry = ConfigurationService.ensure(XMLObjectProviderRegistry.class);
registry.getBuilderFactory().deregisterBuilder(key);
registry.getMarshallerFactory().deregisterMarshaller(key);
registry.getUnmarshallerFactory().deregisterUnmarshaller(key);
@@ -104,7 +104,7 @@ public class XMLObjectProviderRegistrySupport {
* @return the XMLObject builder factory
*/
public static XMLObjectBuilderFactory getBuilderFactory() {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).getBuilderFactory();
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).getBuilderFactory();
}
/**
@@ -113,7 +113,7 @@ public class XMLObjectProviderRegistrySupport {
* @return the XMLObject marshaller factory
*/
public static MarshallerFactory getMarshallerFactory() {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).getMarshallerFactory();
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).getMarshallerFactory();
}
/**
@@ -123,7 +123,7 @@ public class XMLObjectProviderRegistrySupport {
* @return the XMLObject unmarshaller factory
*/
public static UnmarshallerFactory getUnmarshallerFactory() {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).getUnmarshallerFactory();
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).getUnmarshallerFactory();
}
/**
@@ -131,8 +131,8 @@ public class XMLObjectProviderRegistrySupport {
*
* @param attributeName the QName of the ID attribute to be registered
*/
- public static void registerIDAttribute(final QName attributeName) {
- ConfigurationService.get(XMLObjectProviderRegistry.class).registerIDAttribute(attributeName);
+ public static void registerIDAttribute(@Nonnull final QName attributeName) {
+ ConfigurationService.ensure(XMLObjectProviderRegistry.class).registerIDAttribute(attributeName);
}
/**
@@ -140,8 +140,8 @@ public class XMLObjectProviderRegistrySupport {
*
* @param attributeName the QName of the ID attribute to be de-registered
*/
- public static void deregisterIDAttribute(final QName attributeName) {
- ConfigurationService.get(XMLObjectProviderRegistry.class).deregisterIDAttribute(attributeName);
+ public static void deregisterIDAttribute(@Nonnull final QName attributeName) {
+ ConfigurationService.ensure(XMLObjectProviderRegistry.class).deregisterIDAttribute(attributeName);
}
/**
@@ -150,8 +150,8 @@ public class XMLObjectProviderRegistrySupport {
* @param attributeName the QName of the attribute to be checked for ID type.
* @return true if attribute is registered as having an ID type.
*/
- public static boolean isIDAttribute(final QName attributeName) {
- return ConfigurationService.get(XMLObjectProviderRegistry.class).isIDAttribute(attributeName);
+ public static boolean isIDAttribute(@Nonnull final QName attributeName) {
+ return ConfigurationService.ensure(XMLObjectProviderRegistry.class).isIDAttribute(attributeName);
}
}
\ No newline at end of file
diff --git a/opensaml-core-api/src/test/java/org/opensaml/core/config/ConfigurationServiceTest.java b/opensaml-core-api/src/test/java/org/opensaml/core/config/ConfigurationServiceTest.java
index 48d843f69..4727ab700 100644
--- a/opensaml-core-api/src/test/java/org/opensaml/core/config/ConfigurationServiceTest.java
+++ b/opensaml-core-api/src/test/java/org/opensaml/core/config/ConfigurationServiceTest.java
@@ -38,7 +38,7 @@ public class ConfigurationServiceTest {
ConfigurationService.register(BasicTestConfig.class, config);
Assert.assertNotNull(ConfigurationService.get(BasicTestConfig.class));
- BasicTestConfig retrievedConfig = ConfigurationService.get(BasicTestConfig.class);
+ BasicTestConfig retrievedConfig = ConfigurationService.ensure(BasicTestConfig.class);
Assert.assertEquals(retrievedConfig.getValue(), "test-value");
ConfigurationService.deregister(BasicTestConfig.class);
@@ -58,7 +58,7 @@ public class ConfigurationServiceTest {
ConfigurationService.register(TestConfig.class, config);
Assert.assertNotNull(ConfigurationService.get(TestConfig.class));
- TestConfig retrievedConfig = ConfigurationService.get(TestConfig.class);
+ TestConfig retrievedConfig = ConfigurationService.ensure(TestConfig.class);
Assert.assertEquals(retrievedConfig.getValue(), "test-value");
ConfigurationService.deregister(TestConfig.class);
diff --git a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSourceTest.java b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSourceTest.java
index a44307539..a95185e35 100644
--- a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSourceTest.java
+++ b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ClasspathConfigurationPropertiesSourceTest.java
@@ -51,8 +51,8 @@ public class ClasspathConfigurationPropertiesSourceTest {
@Test
public void testSource() {
source = new ClasspathConfigurationPropertiesSource();
- Properties props = source.getProperties();
- Assert.assertNotNull(props, "Properties was null");
+ final Properties props = source.getProperties();
+ assert props != null;
Assert.assertEquals(props.getProperty("opensaml.config.partitionName"), "myapp", "Incorrect property value");
Assert.assertEquals(props.getProperty("opensaml.initializer.foo.flag"), "true", "Incorrect property value");
diff --git a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/FilesystemConfigurationPropertiesSourceTest.java b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/FilesystemConfigurationPropertiesSourceTest.java
index d961ca2bc..8afbe206d 100644
--- a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/FilesystemConfigurationPropertiesSourceTest.java
+++ b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/FilesystemConfigurationPropertiesSourceTest.java
@@ -73,8 +73,8 @@ public class FilesystemConfigurationPropertiesSourceTest {
@Test
public void testSource() {
source = new TestFilesystemConfigurationPropertiesSource();
- Properties props = source.getProperties();
- Assert.assertNotNull(props, "Properties was null");
+ final Properties props = source.getProperties();
+ assert props != null;
Assert.assertEquals(props.getProperty("opensaml.config.partitionName"), "myapp", "Incorrect property value");
Assert.assertEquals(props.getProperty("opensaml.initializer.foo.flag"), "true", "Incorrect property value");
diff --git a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSourceTest.java b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSourceTest.java
index af893b90d..7027817a9 100644
--- a/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSourceTest.java
+++ b/opensaml-core-api/src/test/java/org/opensaml/core/config/provider/ThreadLocalConfigurationPropertiesSourceTest.java
@@ -35,7 +35,7 @@ public class ThreadLocalConfigurationPropertiesSourceTest {
@BeforeMethod
protected void setUp() throws Exception {
- Properties props = new Properties();
+ final Properties props = new Properties();
props.setProperty("opensaml.config.partitionName", "myapp-threadlocal");
props.setProperty("opensaml.initializer.foo.flag", "false");
@@ -54,8 +54,8 @@ public class ThreadLocalConfigurationPropertiesSourceTest {
@Test
public void testSource() {
source = new ThreadLocalConfigurationPropertiesSource();
- Properties props = source.getProperties();
- Assert.assertNotNull(props, "Properties was null");
+ final Properties props = source.getProperties();
+ assert props != null;
Assert.assertEquals(props.getProperty("opensaml.config.partitionName"), "myapp-threadlocal", "Incorrect property value");
Assert.assertEquals(props.getProperty("opensaml.initializer.foo.flag"), "false", "Incorrect property value");
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list