[java-shib-attribute] 01/01: IDP-2035 data connectors orphan connections

Daniel Fisher dfisher at vt.edu
Fri Nov 18 01:53:32 UTC 2022


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

dfisher pushed a commit to branch dev/IDP-2035
in repository java-shib-attribute.

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=318ae6d7d6a0fe2fc2f78c5cbd8833cb0465c335

commit 318ae6d7d6a0fe2fc2f78c5cbd8833cb0465c335
Author: Daniel Fisher <dfisher at vt.edu>
AuthorDate: Thu Nov 17 20:12:45 2022 -0500

    IDP-2035 data connectors orphan connections
    
    https://shibboleth.atlassian.net/browse/IDP-2035
    
    Change the Validator interface to accept the data connector as a parameter.
    Update the LDAP and RDBMS connector parsers to use new validator implementations.
    Set LDAP connection factory destory method.
---
 .../resolver/dc/NonFailFastValidator.java          |   9 +-
 .../idp/attribute/resolver/dc/Validator.java       |  14 +--
 .../resolver/dc/http/impl/HTTPDataConnector.java   |   7 +-
 .../dc/impl/AbstractSearchDataConnector.java       |   9 +-
 .../dc/ldap/impl/ConnectionFactoryValidator.java   |  41 ++------
 .../resolver/dc/ldap/impl/LDAPDataConnector.java   |  15 +--
 .../dc/rdbms/impl/DataSourceValidator.java         | 104 +++++++--------------
 .../resolver/dc/rdbms/impl/RDBMSDataConnector.java |   9 +-
 .../storage/impl/StorageServiceDataConnector.java  |   6 +-
 .../dc/ldap/impl/LDAPDataConnectorTest.java        |   3 -
 .../dc/rdbms/impl/RDBMSDataConnectorTest.java      |   2 -
 .../dc/ldap/impl/LDAPDataConnectorParser.java      |  40 ++------
 .../dc/rdbms/impl/RDBMSDataConnectorParser.java    |  21 +----
 .../dc/ldap/impl/LDAPDataConnectorParserTest.java  |  10 +-
 .../rdbms/impl/RDBMSDataConnectorParserTest.java   |   1 -
 .../ldap-attribute-resolver-spring-context.xml     |   4 +-
 .../rdbms-attribute-resolver-spring-context.xml    |   2 +-
 17 files changed, 89 insertions(+), 208 deletions(-)

diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
index 90340af0a..503008fb3 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/NonFailFastValidator.java
@@ -19,13 +19,14 @@ package net.shibboleth.idp.attribute.resolver.dc;
 
 import javax.annotation.Nullable;
 
+import net.shibboleth.idp.attribute.resolver.DataConnector;
 import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.primitive.DeprecationSupport;
 import net.shibboleth.shared.primitive.DeprecationSupport.ObjectType;
 
 /** Used to determine whether a Data Connector initialized properly and continues to be fit for use. */
-public class NonFailFastValidator implements Validator {
+public class NonFailFastValidator<T extends DataConnector> implements Validator<T> {
 
     /** Embedded validator to run. */
     @Nullable private final Validator embeddedValidator;
@@ -40,7 +41,7 @@ public class NonFailFastValidator implements Validator {
      * 
      * @param validator validator to run but trap exceptions from
      */
-    public NonFailFastValidator(@Nullable final Validator validator) {
+    public NonFailFastValidator(@Nullable final Validator<T> validator) {
         // V4 deprecation.  Remove the class in V5
         DeprecationSupport.warnOnce(ObjectType.CLASS, "NonFailFastValidator", null, 
                 "failFastInitialize on DataConnector or p:throwValidateError on the contained Validator");
@@ -52,10 +53,10 @@ public class NonFailFastValidator implements Validator {
     
     /** {@inheritDoc} */
     @Override
-    public void validate() throws ValidationException {
+    public void validate(final T dataConnector) throws ValidationException {
         if (embeddedValidator != null) {
             try {
-                embeddedValidator.validate();
+                embeddedValidator.validate(dataConnector);
             } catch (final ValidationException e) {
                 LoggerFactory.getLogger(NonFailFastValidator.class).warn(
                         "Non-fail-fast validator trapped an error from its embedded validator", e);
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
index 13f6adcb8..9f9599d2e 100644
--- a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/dc/Validator.java
@@ -17,27 +17,29 @@
 
 package net.shibboleth.idp.attribute.resolver.dc;
 
+import net.shibboleth.idp.attribute.resolver.DataConnector;
+
 /** Used to determine whether a Data Connector initialized properly and continues to be fit for use. */
-public interface Validator {
+public interface Validator<T extends DataConnector> {
 
     /**
      * Probe the data connector and conditionally fails if it is not valid and ready for use.
      * 
      * @throws ValidationException thrown if validation fails and {@link #isThrowValidateError()} is true
      */
-    void validate() throws ValidationException;
+    void validate(T dataConnector) throws ValidationException;
     
     /**
-     * Sets whether {@link #validate()} should throw or log errors.
+     * Sets whether {@link #validate(DataConnector)}  should throw or log errors.
      *
-     * @param what whether {@link #validate()} should throw or log errors
+     * @param what whether {@link #validate(DataConnector)} should throw or log errors
      */
     void setThrowValidateError(final boolean what);
 
     /**
-     * Returns whether {@link #validate()} should throw or log errors.
+     * Returns whether {@link #validate(DataConnector)} should throw or log errors.
      *
-     * @return whether {@link #validate()} should throw or log errors
+     * @return whether {@link #validate(DataConnector)} should throw or log errors
      */
     boolean isThrowValidateError();
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
index 3fcd0b87d..06b16c38b 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/http/impl/HTTPDataConnector.java
@@ -45,7 +45,8 @@ import net.shibboleth.shared.logic.Constraint;
  * This class implements a {@link net.shibboleth.idp.attribute.resolver.DataConnector}
  * that obtains data from an HTTP service.
  */
-public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HTTPResponseMappingStrategy> {
+public class HTTPDataConnector
+    extends AbstractSearchDataConnector<HTTPSearch, HTTPResponseMappingStrategy, HTTPDataConnector> {
 
     /** The {@link HttpClient} to use. */
     @NonnullAfterInit private HttpClient httpClient;
@@ -55,8 +56,8 @@ public class HTTPDataConnector extends AbstractSearchDataConnector<HTTPSearch,HT
     
     /** Constructor. */
     public HTTPDataConnector() {
-        setValidator(new Validator() {
-            public void validate() throws ValidationException {
+        setValidator(new Validator<>() {
+            public void validate(final HTTPDataConnector dataConnector) throws ValidationException {
             }
 
             public void setThrowValidateError(final boolean what) {
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index b4c9abe37..c5d955ab9 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.idp.attribute.resolver.DataConnector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,7 +52,7 @@ import net.shibboleth.shared.logic.Constraint;
  * @param <T1> type of executable search
  * @param <T2> type of mapping strategy
  */
-public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2 extends MappingStrategy<?>>
+public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2 extends MappingStrategy<?>, T3 extends DataConnector>
     extends AbstractDataConnector {
 
     /** Class logger. */
@@ -61,7 +62,7 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
     @NonnullAfterInit private ExecutableSearchBuilder<T1> searchBuilder;
 
     /** Validator for validating this data connector. */
-    @NonnullAfterInit private Validator connectorValidator;
+    @NonnullAfterInit private Validator<T3> connectorValidator;
 
     /** Strategy for mapping search results to a collection of {@link IdPAttribute}s. */
     @NonnullAfterInit private T2 mappingStrategy;
@@ -96,7 +97,7 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
      * 
      * @return validator used to validate this connector
      */
-    @NonnullAfterInit public Validator getValidator() {
+    @NonnullAfterInit public Validator<T3> getValidator() {
         return connectorValidator;
     }
 
@@ -105,7 +106,7 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
      * 
      * @param validator used to validate this connector
      */
-    public void setValidator(@Nonnull final Validator validator) {
+    public void setValidator(@Nonnull final Validator<T3> validator) {
         checkSetterPreconditions();
         connectorValidator = Constraint.isNotNull(validator, "Validator cannot be null");
     }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
index 4c37eec95..78d7d34d4 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
@@ -18,7 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.dc.ldap.impl;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.ldaptive.Connection;
 import org.ldaptive.ConnectionFactory;
@@ -28,62 +27,34 @@ import org.slf4j.LoggerFactory;
 
 import net.shibboleth.idp.attribute.resolver.dc.ValidationException;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
-import net.shibboleth.shared.logic.Constraint;
 
 /**
  * Validator implementation that invokes {@link Connection#open()} to determine if the ConnectionFactory is properly
  * configured.
  */
-public class ConnectionFactoryValidator implements Validator {
+public class ConnectionFactoryValidator implements Validator<LDAPDataConnector> {
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(ConnectionFactoryValidator.class);
 
-    /** Connection factory to validate. */
-    @Nullable private ConnectionFactory connectionFactory;
-    
-    /** Whether validate should throw, default value is <code>true</code>. */
+    /** Whether validate should throw. */
     private boolean throwOnValidateError;
-       
-    /**
-     * Constructor.  
-     *
-     */
-    public ConnectionFactoryValidator() {  
-    }
-    
-    /**
-     * Sets the connection factory.
-     *
-     * @param factory the connection factory
-     */
-    public void setConnectionFactory(@Nonnull final ConnectionFactory factory) {
-        connectionFactory = Constraint.isNotNull(factory, "Connection factory must be non-null");
-    }
-
-
-    /**
-     * Returns the connection factory.
-     *
-     * @return connection factory
-     */
-    @Nullable public ConnectionFactory getConnectionFactory() {
-        return connectionFactory;
-    }
 
     /** {@inheritDoc} */
+    @Override
     public void setThrowValidateError(final boolean what) {
         throwOnValidateError = what;
     }
 
     /** {@inheritDoc} */
+    @Override
     public boolean isThrowValidateError() {
         return throwOnValidateError;
     }
 
     /** {@inheritDoc} */
-    @Override public void validate() throws ValidationException {
-        
+    @Override public void validate(final LDAPDataConnector dataConnector) throws ValidationException {
+        final ConnectionFactory connectionFactory = dataConnector.getConnectionFactory();
         if (connectionFactory == null) {
             log.error("No connection factory installed");
             if (isThrowValidateError()) {
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
index f786684ad..d5f05a08a 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
@@ -50,7 +50,7 @@ import net.shibboleth.shared.logic.Constraint;
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} that queries an LDAP in order to retrieve attribute
  * data.
  */
-public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSearchFilter,SearchResultMappingStrategy> {
+public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSearchFilter,SearchResultMappingStrategy, LDAPDataConnector> {
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(LDAPDataConnector.class);
@@ -134,9 +134,9 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
 
         if (defaultValidator) {
             final ConnectionFactoryValidator validator = new ConnectionFactoryValidator();
-            validator.setConnectionFactory(connectionFactory);
             super.setValidator(validator);
         }
+        // TODO should the LDAP validator always default to this?
         getValidator().setThrowValidateError(isFailFastInitialize());
         if (defaultMappingStrategy) {
             super.setMappingStrategy(new StringAttributeValueMappingStrategy());
@@ -144,7 +144,7 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
         super.doInitialize();
 
         try {
-            getValidator().validate();
+            getValidator().validate(this);
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
             if (isFailFastInitialize()) {
@@ -155,14 +155,6 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
         policeForJVMTrust();
     }
     
-    /** {@inheritDoc} */
-    @Override protected void doDestroy() {
-        if (connectionFactory != null) {
-            log.info("{} Closing LDAP connection factory", getLogPrefix());
-            connectionFactory.close();
-        }
-    }
-
 // CheckStyle: CyclomaticComplexity OFF
     /** Police TLS for JVM trust.
      * @throws ComponentInitializationException if we detect an SSL issue
@@ -215,5 +207,4 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
             throw new ResolutionException(getLogPrefix() + " Unable to execute LDAP search", e);
         }
     }
-
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
index 13ce2f326..ae4e3c649 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.attribute.resolver.dc.rdbms.impl;
 import java.sql.Connection;
 import java.sql.SQLException;
 
-import javax.annotation.Nonnull;
 import javax.sql.DataSource;
 
 import org.slf4j.Logger;
@@ -28,106 +27,69 @@ import org.slf4j.LoggerFactory;
 
 import net.shibboleth.idp.attribute.resolver.dc.ValidationException;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
-import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.component.AbstractInitializableComponent;
-import net.shibboleth.shared.component.ComponentInitializationException;
-import net.shibboleth.shared.logic.Constraint;
 
 /**
  * Validator implementation that invokes {@link DataSource#getConnection()} to determine if the DataSource is properly
  * configured.
  */
-public class DataSourceValidator extends AbstractInitializableComponent implements Validator {
+public class DataSourceValidator implements Validator<RDBMSDataConnector> {
 
     /** Class logger. */
     private final Logger log = LoggerFactory.getLogger(DataSourceValidator.class);
 
-    /** JDBC data source to validate. */
-    @NonnullAfterInit private DataSource dataSource;
-
     /** Whether validate should throw, default value is <code>true</code>. */
     private boolean throwOnValidateError;
 
-    /**
-     * Constructor.
-     *
-     */
-    public DataSourceValidator() {
-    }
-
     /** {@inheritDoc} */
     @Override
-    protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-        
-        if (null == dataSource) {
-            throw new  ComponentInitializationException("DataSourceValidator: Data Source should not be null");
-        }
-    }
-    
-    /**
-     * Sets the data source.
-     *
-     * @param source the data source
-     */
-    public void setDataSource(@Nonnull final DataSource source) {
-        checkSetterPreconditions();
-        dataSource =  Constraint.isNotNull(source, "Data Source should not be null");
-    }
-
-
-    /**
-     * Returns the data source.
-     *
-     * @return data source
-     */
-    public DataSource getDataSource() {
-        return dataSource;
-    }
-
-    /** {@inheritDoc} */
     public void setThrowValidateError(final boolean value) {
-        checkSetterPreconditions();
         throwOnValidateError = value;
     }
 
-
     /** {@inheritDoc} */
+    @Override
     public boolean isThrowValidateError() {
         return throwOnValidateError;
     }
 
     /** {@inheritDoc} */
-    @Override public void validate() throws ValidationException {
-        checkComponentActive();
-        
-        Connection connection = null;
-        try {
-            connection = dataSource.getConnection();
-            if (connection == null) {
-                log.error("Unable to retrieve connections from configured data source");
-                if (isThrowValidateError()) {
-                    throw new ValidationException("Unable to retrieve connections from configured data source");
-                }
-            }
-        } catch (final SQLException e) {
-            if (e.getSQLState() != null) {
-                log.error("Datasource validation failed with SQL state: {}, SQL Code: {}",
-                        new Object[] {e.getSQLState(), e.getErrorCode(), e});
-            } else {
-                log.error("Datasource validation failed", e);
-            }
+    @Override public void validate(final RDBMSDataConnector dataConnector) throws ValidationException {
+        final DataSource dataSource = dataConnector.getDataSource();
+        if (dataSource == null) {
+            log.error("No datasource installed");
             if (isThrowValidateError()) {
-                throw new ValidationException("Invalid connector configuration", e);
+                throw new ValidationException("Datasource is not set");
             }
-        } finally {
+        } else {
+            assert dataSource != null;
+            Connection connection = null;
             try {
-                if (connection != null && !connection.isClosed()) {
-                    connection.close();
+                connection = dataSource.getConnection();
+                if (connection == null) {
+                    log.error("Unable to retrieve connections from configured data source");
+                    if (isThrowValidateError()) {
+                        throw new ValidationException("Unable to retrieve connections from configured data source");
+                    }
                 }
             } catch (final SQLException e) {
-                log.error("Error closing database connection; SQL State: {}, SQL Code: {}",
+                if (e.getSQLState() != null) {
+                    log.error("Datasource validation failed with SQL state: {}, SQL Code: {}",
                         new Object[] {e.getSQLState(), e.getErrorCode(), e});
+                } else {
+                    log.error("Datasource validation failed", e);
+                }
+                if (isThrowValidateError()) {
+                    throw new ValidationException("Invalid connector configuration", e);
+                }
+            } finally {
+                try {
+                    if (connection != null && !connection.isClosed()) {
+                        connection.close();
+                    }
+                } catch (final SQLException e) {
+                    log.error("Error closing database connection; SQL State: {}, SQL Code: {}",
+                        new Object[] {e.getSQLState(), e.getErrorCode(), e});
+                }
             }
         }
     }
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
index 39566950c..2ce31b865 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
@@ -45,7 +45,7 @@ import net.shibboleth.shared.logic.Constraint;
  * A {@link net.shibboleth.idp.attribute.resolver.DataConnector} that queries a relation database in order to retrieve
  * attribute data.
  */
-public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableStatement,ResultMappingStrategy> {
+public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableStatement,ResultMappingStrategy, RDBMSDataConnector> {
 
     /** Class logger. */
     @Nonnull private final Logger log = LoggerFactory.getLogger(RDBMSDataConnector.class);
@@ -107,10 +107,8 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
 
         if (defaultValidator) {
             final DataSourceValidator validator = new DataSourceValidator();
-            assert dataSource != null;
-            validator.setDataSource(dataSource);
+            // TODO should the default RDBMS validator always default to this?
             validator.setThrowValidateError(isFailFastInitialize());
-            validator.initialize();
             super.setValidator(validator);
         }
         if (defaultMappingStrategy) {
@@ -119,7 +117,7 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
         super.doInitialize();
 
         try {
-            getValidator().validate();
+            getValidator().validate(this);
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
             if (isFailFastInitialize()) {
@@ -167,5 +165,4 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
             }
         }
     }
-
 }
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
index 21eef1de0..382cec30d 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/storage/impl/StorageServiceDataConnector.java
@@ -51,7 +51,7 @@ import net.shibboleth.shared.primitive.StringSupport;
  * @since 4.1.0
  */
 public class StorageServiceDataConnector
-        extends AbstractSearchDataConnector<StorageServiceSearch,StorageMappingStrategy> {
+    extends AbstractSearchDataConnector<StorageServiceSearch, StorageMappingStrategy, StorageServiceDataConnector> {
     
     /** The {@link StorageService} to use. */
     @NonnullAfterInit private StorageService storageService;
@@ -64,8 +64,8 @@ public class StorageServiceDataConnector
     
     /** Constructor. */
     public StorageServiceDataConnector() {
-        setValidator(new Validator() {
-            public void validate() throws ValidationException {
+        setValidator(new Validator<>() {
+            public void validate(final StorageServiceDataConnector dataConnector) throws ValidationException {
             }
 
             public void setThrowValidateError(final boolean what) {
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
index 3d954f48f..8faa93340 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnectorTest.java
@@ -581,15 +581,12 @@ public class LDAPDataConnectorTest {
     
     public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory, final boolean throwValidateError) throws ComponentInitializationException {
         final ConnectionFactoryValidator validator = new ConnectionFactoryValidator();
-        
-        validator.setConnectionFactory(connectionFactory);
         validator.setThrowValidateError(throwValidateError);
         return validator;
     }
 
     public static ConnectionFactoryValidator newConnectionFactoryValidator(final ConnectionFactory connectionFactory) throws ComponentInitializationException {
         final ConnectionFactoryValidator validator = new ConnectionFactoryValidator();
-        validator.setConnectionFactory(connectionFactory);
         return validator;
     }
 }
diff --git a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
index 8d1218d3d..2d52ec082 100644
--- a/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
+++ b/shib-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
@@ -192,9 +192,7 @@ public class RDBMSDataConnectorTest {
         }
 
         final DataSourceValidator validator = new DataSourceValidator();
-        validator.setDataSource(datasource);
         validator.setThrowValidateError(false);
-        validator.initialize();
         connector.setValidator(validator);
         connector.initialize();
     }
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index facd9b633..3b8c64636 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -164,8 +164,8 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         }
 
         final String connectionFactoryID = v2Parser.getBeanConnectionFactoryID();
-        BeanDefinition pooledConnectionFactory = null;
-        BeanDefinitionBuilder connectionFactory = null;
+        BeanDefinition pooledConnectionFactory;
+        BeanDefinitionBuilder connectionFactory;
         if (connectionFactoryID != null) {
             builder.addPropertyReference("connectionFactory", connectionFactoryID);
         } else {
@@ -202,14 +202,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         if (validatorID != null) {
             builder.addPropertyReference("validator", validatorID);
         } else {
-            if (connectionFactoryID != null) {
-                builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactoryID));
-            }
-            else if (pooledConnectionFactory != null) {
-                builder.addPropertyValue("validator", v2Parser.createValidator(pooledConnectionFactory));
-            } else if (connectionFactory != null) {
-                builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactory.getBeanDefinition()));
-            }
+            builder.addPropertyValue("validator", v2Parser.createValidator());
         }
         
         final String resultCacheBeanID = CacheConfigParser.getBeanResultCacheID(config);
@@ -696,6 +689,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
                         StringSupport.trimOrNull(configElement.getAttributeNS(null, ATTR_FAIL_FAST)));
             }
             connectionFactory.setInitMethodName("initialize");
+            connectionFactory.setDestroyMethodName("close");
             return connectionFactory.getBeanDefinition();
         }
 
@@ -811,32 +805,12 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         /**
          * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
          *
-         * @param connectionFactoryId reference to provide to the validator
-         *
          * @return validator
          */
-        @Nullable public BeanDefinition createValidator(@Nonnull @NotEmpty final String connectionFactoryId) {
-
+        @Nullable public BeanDefinition createValidator() {
             final BeanDefinitionBuilder validator =
-                    BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
-
-            validator.addPropertyReference("connectionFactory", connectionFactoryId);
-            return validator.getBeanDefinition();
-        }
-
-        /**
-         * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
-         * 
-         * @param connectionFactory to provide to the validator
-         * 
-         * @return validator
-         */
-        @Nullable public BeanDefinition createValidator(final BeanDefinition connectionFactory) {
-
-            final BeanDefinitionBuilder validator =
-                    BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
-
-            validator.addPropertyValue("connectionFactory", connectionFactory);
+                BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
+            validator.addPropertyValue("throwValidateError", false);
             return validator.getBeanDefinition();
         }
 
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
index f545a5714..93b61be75 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
@@ -114,16 +114,12 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
                 builder.addPropertyValue("mappingStrategy", def);
             }
         }
-        
+
         final String validatorID = v2Parser.getBeanValidatorID();
         if (validatorID != null) {
             builder.addPropertyReference("validator", validatorID);
         } else {
-            if (dataSourceID != null) {
-                builder.addPropertyValue("validator", v2Parser.createValidator(dataSourceID));
-            } else {
-                builder.addPropertyValue("validator", v2Parser.createValidator(dataSource));
-            }
+            builder.addPropertyValue("validator", v2Parser.createValidator());
         }
 
         final String resultCacheBeanID = CacheConfigParser.getBeanResultCacheID(config);
@@ -294,21 +290,12 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
         
         /**
          * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
-         * 
-         * @param dataSource to provide to the validator
          *
          * @return validator
          */
-        @Nullable public BeanDefinition createValidator(final Object dataSource) {            
+        @Nullable public BeanDefinition createValidator() {
             final BeanDefinitionBuilder validator =
-                    BeanDefinitionBuilder.genericBeanDefinition(DataSourceValidator.class);
-            validator.setInitMethodName("initialize");
-            validator.setDestroyMethodName("destroy");
-            if (dataSource instanceof String) {
-                validator.addPropertyReference("dataSource", (String) dataSource); 
-            } else {
-                validator.addPropertyValue("dataSource", dataSource);
-            }
+                BeanDefinitionBuilder.genericBeanDefinition(DataSourceValidator.class);
             validator.addPropertyValue("throwValidateError", true);
             return validator.getBeanDefinition();
         }
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
index 7e8ac5ab0..136b23e6a 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParserTest.java
@@ -135,11 +135,14 @@ public class LDAPDataConnectorParserTest {
      * Shutdown the in-memory directory server.
      * @throws InterruptedException 
      */
-    @AfterClass public void teardownDirectoryServer() throws InterruptedException {
+    @AfterClass public void teardownDirectoryServer() throws Exception {
         if (directoryServer != null) {
+            if (directoryServer.openConnectionCount() > 0) {
+                Thread.sleep(100);
+            }
+            assertEquals(directoryServer.openConnectionCount(), 0);
             directoryServer.stop(true);
         }
-
         System.clearProperty("org.ldaptive.sasl.defaultSaslClient");
     }
 
@@ -226,7 +229,6 @@ public class LDAPDataConnectorParserTest {
         final ConnectionFactoryValidator validator = (ConnectionFactoryValidator) dataConnector.getValidator();
         assertNotNull(validator);
         assertTrue(validator.isThrowValidateError());
-        assertNotNull(validator.getConnectionFactory());
 
         final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
@@ -295,7 +297,6 @@ public class LDAPDataConnectorParserTest {
         final ConnectionFactoryValidator validator = (ConnectionFactoryValidator) dataConnector.getValidator();
         assertNotNull(validator);
         assertFalse(validator.isThrowValidateError());
-        assertNotNull(validator.getConnectionFactory());
 
         final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
@@ -582,7 +583,6 @@ public class LDAPDataConnectorParserTest {
         final ConnectionFactoryValidator validator = (ConnectionFactoryValidator) dataConnector.getValidator();
         assertNotNull(validator);
         assertFalse(validator.isThrowValidateError());
-        assertNotNull(validator.getConnectionFactory());
 
         final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
index 01c03bcf0..a0241d602 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParserTest.java
@@ -184,7 +184,6 @@ public class RDBMSDataConnectorParserTest {
         final DataSourceValidator validator = (DataSourceValidator) dataConnector.getValidator();
         assertNotNull(validator);
         assertTrue(validator.isThrowValidateError());
-        assertNotNull(validator.getDataSource());
 
         final ExecutableSearchBuilder<ExecutableStatement> searchBuilder = dataConnector.getExecutableSearchBuilder();
         assertNotNull(searchBuilder);
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
index f49b24598..c86c4af71 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
@@ -2,7 +2,7 @@
 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
-    <bean id="connectionFactory" class="org.ldaptive.PooledConnectionFactory" init-method="initialize"
+    <bean id="connectionFactory" class="org.ldaptive.PooledConnectionFactory" init-method="initialize" destroy-method="close"
           p:blockWaitTime="PT5S"
           p:failFastInitialize="false"
           p:name="resolver-pool"
@@ -62,5 +62,5 @@
         </property>
     </bean>
     <bean id="validator" class="net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator"
-        p:connectionFactory-ref="connectionFactory" p:throwValidateError="true" />
+        p:throwValidateError="true" />
 </beans>
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-spring-context.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-spring-context.xml
index aa78c493f..8218789e9 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-spring-context.xml
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-spring-context.xml
@@ -27,7 +27,7 @@
             </map>
         </property>
     </bean> 
-    <bean id="validator" class="net.shibboleth.idp.attribute.resolver.dc.rdbms.impl.DataSourceValidator" p:dataSource-ref="dataSource" p:throwValidateError="true" />
+    <bean id="validator" class="net.shibboleth.idp.attribute.resolver.dc.rdbms.impl.DataSourceValidator" p:throwValidateError="true" />
     
     <util:map id="computedIdExceptions">
         <entry key="*"> <!-- all users -->

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


More information about the commits mailing list