[java-identity-provider] branch maint-4 updated: IDP-2035 data connectors orphan connections

Daniel Fisher dfisher at vt.edu
Sun Dec 18 22:22:23 UTC 2022


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

dfisher pushed a commit to branch maint-4
in repository java-identity-provider.

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

The following commit(s) were added to refs/heads/maint-4 by this push:
     new cdd7299a5 IDP-2035 data connectors orphan connections
cdd7299a5 is described below

commit cdd7299a5a314bcf2166b6d9dd6a605a10a63a35
Author: Daniel Fisher <dfisher at vt.edu>
AuthorDate: Fri Dec 16 09:36:23 2022 -0500

    IDP-2035 data connectors orphan connections
    
    https://shibboleth.atlassian.net/browse/IDP-2035
    
    Change the LDAP and RDBMS data connectors to set the validate resource when their resource setter is invoked.
    This is a work around to prevent the spring wiring from creating 2 of each resource when it's wiring the data connector and the validator.
    Update the LDAP and RDBMS connector parsers to no longer wire the validator resource and rely on the setter.
    Remove AbstractInitializableComponent from the LDAP and RDBMS validator hierarchy.
    Change the RDBMS and LDAP data connectors to configure the validator throw property based on it's failFast setting during initialize.
    Set LDAP connection pool destroy method.
---
 .../dc/ldap/impl/ConnectionFactoryValidator.java   | 64 +++++++----------
 .../resolver/dc/ldap/impl/LDAPDataConnector.java   | 11 ++-
 .../dc/rdbms/impl/DataSourceValidator.java         | 80 +++++++++-------------
 .../resolver/dc/rdbms/impl/RDBMSDataConnector.java | 12 +++-
 .../dc/rdbms/impl/RDBMSDataConnectorTest.java      |  6 +-
 .../dc/ldap/impl/LDAPDataConnectorParser.java      | 15 ++--
 .../dc/rdbms/impl/RDBMSDataConnectorParser.java    | 26 ++++---
 .../dc/ldap/LDAPDataConnectorParserTest.java       | 16 ++++-
 .../dc/rdbms/RDBMSDataConnectorParserTest.java     | 15 ++++
 .../ldap-attribute-resolver-spring-context.xml     |  6 +-
 ...dap-attribute-resolver-spring-props-context.xml |  2 +-
 .../spring/dc/ldap/resolver/ldap-ref-beans.xml     |  2 +-
 12 files changed, 131 insertions(+), 124 deletions(-)

diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
index 9ad25e4d5..a5ac9c563 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/ConnectionFactoryValidator.java
@@ -27,16 +27,13 @@ import org.slf4j.LoggerFactory;
 
 import net.shibboleth.idp.attribute.resolver.dc.ValidationException;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
 /**
  * Validator implementation that invokes {@link Connection#open()} to determine if the ConnectionFactory is properly
  * configured.
  */
-public class ConnectionFactoryValidator extends AbstractInitializableComponent implements Validator {
+public class ConnectionFactoryValidator implements Validator {
 
     /** Class logger. */
     private final Logger log = LoggerFactory.getLogger(ConnectionFactoryValidator.class);
@@ -47,31 +44,15 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
     /** Whether validate should throw, default value is <code>true</code>. */
     private boolean throwOnValidateError;
        
-    /**
-     * Constructor.  
-     *
-     */
-    public ConnectionFactoryValidator() {  
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doInitialize() throws ComponentInitializationException {
-        Constraint.isNotNull(connectionFactory, "Connection factory must be non-null");
-        super.doInitialize();
-    }
-    
     /**
      * Sets the connection factory.
      *
      * @param factory the connection factory
      */
     @Nonnull public void setConnectionFactory(@Nonnull final ConnectionFactory factory) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         connectionFactory = Constraint.isNotNull(factory, "Connection factory must be non-null");
     }
 
-
     /**
      * Returns the connection factory.
      *
@@ -83,7 +64,6 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
 
     /** {@inheritDoc} */
     public void setThrowValidateError(final boolean what) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         throwOnValidateError = what;
     }
 
@@ -94,25 +74,33 @@ public class ConnectionFactoryValidator extends AbstractInitializableComponent i
 
     /** {@inheritDoc} */
     @Override public void validate() throws ValidationException {
-        Connection connection = null;
-        try {
-            connection = connectionFactory.getConnection();
-            if (connection == null) {
-                log.error("Unable to retrieve connections from configured connection factory");
-                if (isThrowValidateError()) {
-                    throw new LdapException("Unable to retrieve connection from connection factory");
-                }
-            } else {
-                connection.open();
-            }
-        } catch (final LdapException e) {
-            log.error("Connection factory validation failed", e);
+        if (connectionFactory == null) {
+            log.error("No connection factory installed");
             if (isThrowValidateError()) {
-                throw new ValidationException(e);
+                throw new ValidationException("Connection factory is not set");
             }
-        } finally {
-            if (connection != null) {
-                connection.close();
+        } else {
+            assert connectionFactory != null;
+            Connection connection = null;
+            try {
+                connection = connectionFactory.getConnection();
+                if (connection == null) {
+                    log.error("Unable to retrieve connections from configured connection factory");
+                    if (isThrowValidateError()) {
+                        throw new LdapException("Unable to retrieve connection from connection factory");
+                    }
+                } else {
+                    connection.open();
+                }
+            } catch (final LdapException e) {
+                log.error("Connection factory validation failed", e);
+                if (isThrowValidateError()) {
+                    throw new ValidationException(e);
+                }
+            } finally {
+                if (connection != null) {
+                    connection.close();
+                }
             }
         }
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
index 60eee60c7..12f3cb00b 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/ldap/impl/LDAPDataConnector.java
@@ -121,6 +121,9 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
     /** {@inheritDoc} */
     @Override public void setValidator(@Nonnull final Validator validator) {
         super.setValidator(validator);
+        if (validator instanceof ConnectionFactoryValidator && connectionFactory != null) {
+            ((ConnectionFactoryValidator) validator).setConnectionFactory(connectionFactory);
+        }
         defaultValidator = false;
     }
 
@@ -144,13 +147,15 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
             validator.setConnectionFactory(connectionFactory);
             super.setValidator(validator);
         }
-        getValidator().setThrowValidateError(isFailFastInitialize());
         if (defaultMappingStrategy) {
             super.setMappingStrategy(new StringAttributeValueMappingStrategy());
         }
         super.doInitialize();
 
+        // validator should defer to data connector fail-fast-initialize during #initialize
+        final boolean throwValidateError = getValidator().isThrowValidateError();
         try {
+            getValidator().setThrowValidateError(isFailFastInitialize());
             getValidator().validate();
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
@@ -158,6 +163,8 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
                 // Should always follow this leg.
                 throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
             }
+        } finally {
+            getValidator().setThrowValidateError(throwValidateError);
         }
         policeForJVMTrust();
     }
@@ -240,4 +247,4 @@ public class LDAPDataConnector extends AbstractSearchDataConnector<ExecutableSea
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
index 1ecdfbfb1..eccaca393 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/DataSourceValidator.java
@@ -29,16 +29,13 @@ import org.slf4j.LoggerFactory;
 import net.shibboleth.idp.attribute.resolver.dc.ValidationException;
 import net.shibboleth.idp.attribute.resolver.dc.Validator;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.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 {
 
     /** Class logger. */
     private final Logger log = LoggerFactory.getLogger(DataSourceValidator.class);
@@ -46,37 +43,18 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
     /** JDBC data source to validate. */
     @NonnullAfterInit private DataSource dataSource;
 
-    /** Whether validate should throw, default value is <code>true</code>. */
+    /** Whether validate should throw. */
     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) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         dataSource =  Constraint.isNotNull(source, "Data Source should not be null");
     }
 
-
     /**
      * Returns the data source.
      *
@@ -88,11 +66,9 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
 
     /** {@inheritDoc} */
     public void setThrowValidateError(final boolean value) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         throwOnValidateError = value;
     }
 
-
     /** {@inheritDoc} */
     public boolean isThrowValidateError() {
         return throwOnValidateError;
@@ -100,35 +76,41 @@ public class DataSourceValidator extends AbstractInitializableComponent implemen
 
     /** {@inheritDoc} */
     @Override public void validate() throws ValidationException {
-        ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
-        
-        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);
-            }
+        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/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
index 75ae12f42..02e9551bd 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnector.java
@@ -89,6 +89,9 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
     /** {@inheritDoc} */
     @Override public void setValidator(@Nonnull final Validator validator) {
         super.setValidator(validator);
+        if (validator instanceof DataSourceValidator && dataSource != null) {
+            ((DataSourceValidator) validator).setDataSource(dataSource);
+        }
         defaultValidator = false;
     }
 
@@ -107,8 +110,6 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
         if (defaultValidator) {
             final DataSourceValidator validator = new DataSourceValidator();
             validator.setDataSource(dataSource);
-            validator.setThrowValidateError(isFailFastInitialize());
-            validator.initialize();
             super.setValidator(validator);
         }
         if (defaultMappingStrategy) {
@@ -116,13 +117,18 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
         }
         super.doInitialize();
 
+        // validator should defer to data connector fail-fast-initialize during #initialize
+        final boolean throwValidateError = getValidator().isThrowValidateError();
         try {
+            getValidator().setThrowValidateError(isFailFastInitialize());
             getValidator().validate();
         } catch (final ValidationException e) {
             log.error("{} Invalid connector configuration", getLogPrefix(), e);
             if (isFailFastInitialize()) {
                 throw new ComponentInitializationException(getLogPrefix() + " Invalid connector configuration", e);
             }
+        } finally {
+            getValidator().setThrowValidateError(throwValidateError);
         }
     }
 
@@ -164,4 +170,4 @@ public class RDBMSDataConnector extends AbstractSearchDataConnector<ExecutableSt
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
index a4de29f5b..f5359a8bd 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/rdbms/impl/RDBMSDataConnectorTest.java
@@ -191,11 +191,7 @@ public class RDBMSDataConnectorTest {
             // OK
         }
 
-        final DataSourceValidator validator = new DataSourceValidator();
-        validator.setDataSource(datasource);
-        validator.setThrowValidateError(false);
-        validator.initialize();
-        connector.setValidator(validator);
+        connector.setFailFastInitialize(false);
         connector.initialize();
     }
 
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
index 9dc500f24..d73db8f65 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/impl/LDAPDataConnectorParser.java
@@ -201,12 +201,8 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         } else {
             if (connectionFactoryID != null) {
                 builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactoryID));
-            }
-            else if (pooledConnectionFactory != null) {
-                builder.addPropertyValue("validator",
-                        v2Parser.createValidator(pooledConnectionFactory.getBeanDefinition()));
             } else {
-                builder.addPropertyValue("validator", v2Parser.createValidator(connectionFactory.getBeanDefinition()));
+                builder.addPropertyValue("validator", v2Parser.createValidator());
             }
         }
         
@@ -673,6 +669,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
                         StringSupport.trimOrNull(configElement.getAttributeNS(null, ATTR_FAIL_FAST)));
             }
             pool.setInitMethodName("initialize");
+            pool.setDestroyMethodName("close");
             return pool.getBeanDefinition();
         }
 
@@ -835,16 +832,13 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
         /**
          * 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) {
+        @Nullable public BeanDefinition createValidator() {
 
             final BeanDefinitionBuilder validator =
                     BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
-
-            validator.addPropertyValue("connectionFactory", connectionFactory);
+            validator.addPropertyValue("throwValidateError", false);
             return validator.getBeanDefinition();
         }
 
@@ -860,6 +854,7 @@ public class LDAPDataConnectorParser extends AbstractDataConnectorParser {
             final BeanDefinitionBuilder validator =
                     BeanDefinitionBuilder.genericBeanDefinition(ConnectionFactoryValidator.class);
 
+            validator.addPropertyValue("throwValidateError", false);
             validator.addPropertyReference("connectionFactory", connectionFactoryId);
             return validator.getBeanDefinition();
         }
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
index 4d1215a51..b47c50943 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/impl/RDBMSDataConnectorParser.java
@@ -115,7 +115,7 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
             if (dataSourceID != null) {
                 builder.addPropertyValue("validator", v2Parser.createValidator(dataSourceID));
             } else {
-                builder.addPropertyValue("validator", v2Parser.createValidator(dataSource));
+                builder.addPropertyValue("validator", v2Parser.createValidator());
             }
         }
 
@@ -287,6 +287,18 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
             return AttributeSupport.getAttributeValue(configElement, null, "validatorRef");
         }
         
+        /**
+         * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
+         *
+         * @return validator
+         */
+        @Nullable public BeanDefinition createValidator() {
+            final BeanDefinitionBuilder validator =
+                    BeanDefinitionBuilder.genericBeanDefinition(DataSourceValidator.class);
+            validator.addPropertyValue("throwValidateError", true);
+            return validator.getBeanDefinition();
+        }
+
         /**
          * Create the validator. See {@link net.shibboleth.idp.attribute.resolver.dc.Validator}.
          * 
@@ -294,16 +306,10 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
          *
          * @return validator
          */
-        @Nullable public BeanDefinition createValidator(final Object dataSource) {            
+        @Nullable public BeanDefinition createValidator(final String dataSource) {
             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);
-            }
+            validator.addPropertyReference("dataSource", dataSource);
             validator.addPropertyValue("throwValidateError", true);
             return validator.getBeanDefinition();
         }
@@ -328,4 +334,4 @@ public class RDBMSDataConnectorParser extends AbstractDataConnectorParser {
         }
     }
     
-}
\ No newline at end of file
+}
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
index a078ffe45..6a1641a01 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/LDAPDataConnectorParserTest.java
@@ -21,6 +21,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
@@ -36,6 +37,7 @@ import java.util.stream.Collectors;
 
 import org.ldaptive.BindConnectionInitializer;
 import org.ldaptive.ConnectionConfig;
+import org.ldaptive.ConnectionFactory;
 import org.ldaptive.DefaultConnectionFactory;
 import org.ldaptive.RandomConnectionStrategy;
 import org.ldaptive.SearchExecutor;
@@ -258,7 +260,7 @@ public class LDAPDataConnectorParserTest {
 
         final ConnectionFactoryValidator validator = (ConnectionFactoryValidator) dataConnector.getValidator();
         assertNotNull(validator);
-        assertTrue(validator.isThrowValidateError());
+        assertFalse(validator.isThrowValidateError());
         assertNotNull(validator.getConnectionFactory());
 
         final ExecutableSearchBuilder<?> searchBuilder = dataConnector.getExecutableSearchBuilder();
@@ -499,7 +501,6 @@ public class LDAPDataConnectorParserTest {
         assertNotNull(attrs);
     }
 
-
     @Test public void springPropsConfig() throws Exception,
             ResolutionException {
         final Resource props = new ClassPathResource("net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-v3.properties");
@@ -574,6 +575,17 @@ public class LDAPDataConnectorParserTest {
         assertNotNull(attrs.get("entryDN"));
     }
 
+    @Test public void connectionFactorySingleton() throws Exception {
+        final LDAPDataConnector dataConnector =
+            getLdapDataConnector(new String[] {"net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-attribute-resolver-v2.xml"});
+        assertNotNull(dataConnector);
+        doTest(dataConnector);
+        dataConnector.initialize();
+        final ConnectionFactory connFactory1 = dataConnector.getConnectionFactory();
+        final ConnectionFactory connFactory2 = ((ConnectionFactoryValidator) dataConnector.getValidator()).getConnectionFactory();
+        assertSame(connFactory1, connFactory2);
+    }
+
     protected LDAPDataConnector getLdapDataConnector(final Resource properties, final String[] beanDefinitions) throws IOException {
 
         final ResourceLoader loader = new PreferFileSystemResourceLoader();
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/RDBMSDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/RDBMSDataConnectorParserTest.java
index f29f867e4..bcfcee19a 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/RDBMSDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/RDBMSDataConnectorParserTest.java
@@ -20,6 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.dc.rdbms;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
@@ -34,7 +35,10 @@ import java.util.stream.Collectors;
 
 import javax.sql.DataSource;
 
+import net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator;
+import net.shibboleth.idp.attribute.resolver.dc.ldap.impl.LDAPDataConnector;
 import org.apache.commons.dbcp2.BasicDataSource;
+import org.ldaptive.ConnectionFactory;
 import org.springframework.context.support.GenericApplicationContext;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
@@ -158,6 +162,17 @@ public class RDBMSDataConnectorParserTest {
         doTest(dataConnector);
     }
 
+    @Test public void dataSourceSingleton() throws Exception {
+        final RDBMSDataConnector dataConnector =
+            getRdbmsDataConnector(new String[] {"net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/resolver/rdbms-attribute-resolver-v2.xml"});
+        assertNotNull(dataConnector);
+        doTest(dataConnector);
+        dataConnector.initialize();
+        final DataSource dataSource1 = dataConnector.getDataSource();
+        final DataSource dataSource2 = ((DataSourceValidator) dataConnector.getValidator()).getDataSource();
+        assertSame(dataSource1, dataSource2);
+    }
+
     protected RDBMSDataConnector getRdbmsDataConnector(final String... beanDefinitions) throws IOException {
         return getRdbmsDataConnector(null, beanDefinitions);
     }
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
index 932903987..64971e7a6 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-context.xml
@@ -4,7 +4,7 @@
     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.pool.PooledConnectionFactory">
         <property name="connectionPool">
-            <bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" p:blockWaitTime="PT5S" p:failFastInitialize="false" p:name="resolver-pool">
+            <bean class="org.ldaptive.pool.BlockingConnectionPool" init-method="initialize" destroy-method="close" p:blockWaitTime="PT5S" p:failFastInitialize="false" p:name="resolver-pool">
                 <constructor-arg index="0">
                     <bean class="org.ldaptive.pool.PoolConfig" p:minPoolSize="5" p:maxPoolSize="10"
                         p:validatePeriodically="true" p:validatePeriod="PT15M" />
@@ -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" />
-</beans>
\ No newline at end of file
+      p:connectionFactory-ref="connectionFactory" p:throwValidateError="false" />
+</beans>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-props-context.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-props-context.xml
index c2fd91d9a..3afa5f164 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-props-context.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/ldap-attribute-resolver-spring-props-context.xml
@@ -71,6 +71,6 @@
         </property>
     </bean>
         <bean id="validator" class="net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator"
-              p:connectionFactory-ref="connectionFactory" p:throwValidateError="true" />
+              p:connectionFactory-ref="connectionFactory" p:throwValidateError="false" />
     
 </beans>
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
index 00af4a8eb..31f4e7938 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/ldap/resolver/ldap-ref-beans.xml
@@ -62,5 +62,5 @@
         </property>
     </bean>
     <bean id="LDAPTESTvalidator" class="net.shibboleth.idp.attribute.resolver.dc.ldap.impl.ConnectionFactoryValidator"
-      p:connectionFactory-ref="LDAPTESTconnectionFactory" p:throwValidateError="true" />
+      p:connectionFactory-ref="LDAPTESTconnectionFactory" p:throwValidateError="false" />
 </beans>
\ No newline at end of file

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


More information about the commits mailing list