[java-identity-provider] 02/02: IDP-692 Add parser for DBCP based SimpleManagedConnection

Rod Widdowson rdw at steadingsoftware.com
Fri Aug 11 06:11:16 EDT 2017


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

rdw pushed a commit to branch master
in repository java-identity-provider.

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

commit d71523bfd4b94e017c9a676dc11551f5e15f0c60
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Fri Aug 11 11:07:52 2017 +0100

    IDP-692 Add parser for DBCP based SimpleManagedConnection
    
    https://issues.shibboleth.net/jira/browse/IDP-692
---
 idp-attribute-resolver-spring/pom.xml              |   4 +
 .../spring/dc/impl/ManagedConnectionParser.java    | 120 ++++++++++++++++-----
 .../dc/rdbms/RDBMSDataConnectorParserTest.java     |  37 ++++---
 .../rdbms/rdbms-attribute-resolver-v2-simple.xml   |  17 +--
 4 files changed, 127 insertions(+), 51 deletions(-)

diff --git a/idp-attribute-resolver-spring/pom.xml b/idp-attribute-resolver-spring/pom.xml
index a47c608..322a499 100644
--- a/idp-attribute-resolver-spring/pom.xml
+++ b/idp-attribute-resolver-spring/pom.xml
@@ -71,6 +71,10 @@
             <artifactId>c3p0</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.ldaptive</groupId>
             <artifactId>ldaptive</artifactId>
         </dependency>
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ManagedConnectionParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ManagedConnectionParser.java
index 20a708f..3168513 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ManagedConnectionParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ManagedConnectionParser.java
@@ -28,14 +28,10 @@ import javax.naming.NamingException;
 import javax.sql.DataSource;
 import javax.xml.namespace.QName;
 
-import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
-import net.shibboleth.utilities.java.support.xml.AttributeSupport;
-import net.shibboleth.utilities.java.support.xml.ElementSupport;
-
+import org.apache.commons.dbcp2.BasicDataSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.support.ManagedMap;
@@ -43,6 +39,14 @@ import org.w3c.dom.Element;
 
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 
+import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
+import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.utilities.java.support.xml.AttributeSupport;
+import net.shibboleth.utilities.java.support.xml.ElementSupport;
+
 /** Utility class for parsing v2 managed connection configuration. */
 public class ManagedConnectionParser {
 
@@ -62,13 +66,20 @@ public class ManagedConnectionParser {
     @Nonnull public static final QName APPLICATION_MANAGED_CONNECTION_RESOLVER =
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "ApplicationManagedConnection");
 
-    /** dc:ContainerManagedConnection (legacy).*/
+    /** dc:BeanManagedConnection (legacy).*/
     @Nonnull public static final QName BEAN_MANAGED_CONNECTION_DC =
             new QName(DataConnectorNamespaceHandler.NAMESPACE, "BeanManagedConnection");
     
-    /** resolver:ContainerManagedConnection.*/
+    /** resolver:BeanManagedConnection.*/
     @Nonnull public static final QName BEAN_MANAGED_CONNECTION_RESOLVER =
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "BeanManagedConnection");
+
+    /** resolver:SimpleManagedConnection.*/
+    @Nonnull public static final QName SIMPLE_MANAGED_CONNECTION_RESOLVER =
+            new QName(AttributeResolverNamespaceHandler.NAMESPACE, "SimpleManagedConnection");
+
+    /** Logger. */
+    @Nonnull private static final Logger LOG = LoggerFactory.getLogger(ManagedConnectionParser.class);
     
 
     /** Data source XML element. */
@@ -94,19 +105,24 @@ public class ManagedConnectionParser {
                 ElementSupport.getChildElements(configElement, CONTAINER_MANAGED_CONNECTION_DC);
         containerManagedElements.addAll(
                 ElementSupport.getChildElements(configElement, CONTAINER_MANAGED_CONNECTION_RESOLVER));
-        
-        
+
         final List<Element> applicationManagedElements =
                 ElementSupport.getChildElements(configElement, APPLICATION_MANAGED_CONNECTION_DC);
         applicationManagedElements.addAll(
                 ElementSupport.getChildElements(configElement, APPLICATION_MANAGED_CONNECTION_RESOLVER));
-        
-        if ((containerManagedElements.size() + applicationManagedElements.size()) > 1) {
-            LoggerFactory.getLogger(ManagedConnectionParser.class).warn("Only one <ApplicationManagedConnection> or "+
-                                    "<ContainerManagedConnection> is allowed per DataConnector,"+
-                    " <ContainerManagedConnection> used.");
+
+        final List<Element> simpleManagedElements =
+                ElementSupport.getChildElements(configElement, SIMPLE_MANAGED_CONNECTION_RESOLVER);
+
+        if ((simpleManagedElements.size() + containerManagedElements.size() + applicationManagedElements.size()) > 1) {
+            LOG.warn("Only one <ApplicationManagedConnection>, <SimpleManagedConnection> or"
+                     +" <ContainerManagedConnection> is allowed per DataConnector");
         }
         
+        if (!simpleManagedElements.isEmpty()) {
+            return createSimpleManagedDataSource(simpleManagedElements.get(0));
+        }
+
         if (!containerManagedElements.isEmpty()) {
             return createContainerManagedDataSource(containerManagedElements.get(0));
         }
@@ -149,6 +165,53 @@ public class ManagedConnectionParser {
     }
 
     /**
+     * Creates an simple managed data source bean definition based on dbcp2.
+     *
+     * @param simpleManagedElement to parse
+     *
+     * @return data source bean definition
+     */
+
+    @Nonnull protected BeanDefinition createSimpleManagedDataSource(
+            @Nonnull final Element simpleManagedElement) {
+        Constraint.isNotNull(simpleManagedElement, "SimpleManagedConnection element cannot be null");
+        final BeanDefinitionBuilder dataSource =
+                BeanDefinitionBuilder.genericBeanDefinition(BasicDataSource.class);
+
+        final String driverName = StringSupport.trimOrNull(AttributeSupport.getAttributeValue(simpleManagedElement,
+                null, "jdbcDriver"));
+        if (driverName == null) {
+            LOG.warn("<SimpleManagedConnection> jdbcDriver attribute should be present and non empty");
+            throw new BeanCreationException("<SimpleManagedConnection> jdbcDriver attribute should be"+
+                                            " present and non empty");
+        }
+        dataSource.addPropertyValue("driverClassName", driverName);
+
+        final String url = StringSupport.trimOrNull(AttributeSupport.getAttributeValue(simpleManagedElement,
+                null, "jdbcURL"));
+        if (url == null) {
+            LOG.warn("<SimpleManagedConnection> jdbcURL attribute should be present and non empty");
+            throw new BeanCreationException("<SimpleManagedConnection> jdbcURL attribute should be present"
+                                            + " and non empty");
+        }
+        dataSource.addPropertyValue("url", url);
+
+        final String user = AttributeSupport.getAttributeValue(simpleManagedElement, null, "jdbcUserName");
+        if (user != null && !"".equals(user)) {
+            dataSource.addPropertyValue("username", user);
+        }
+
+        final String password = AttributeSupport.getAttributeValue(simpleManagedElement, null, "jdbcPassword");
+        if (password != null && !"".equals(password)) {
+            dataSource.addPropertyValue("password", password);
+        }
+        dataSource.addPropertyValue("maxTotal", "20");
+        dataSource.addPropertyValue("maxIdle", "5");
+        dataSource.addPropertyValue("maxWaitMillis", "5000");
+        return dataSource.getBeanDefinition();
+    }
+
+    /**
      * Creates an application managed data source bean definition.
      * 
      * @param applicationManagedElement to parse
@@ -156,8 +219,15 @@ public class ManagedConnectionParser {
      * @return data source bean definition
      */
     // Checkstyle: CyclomaticComplexity|MethodLength OFF
-    @Nonnull protected BeanDefinition createApplicationManagedDataSource(
+    @Deprecated @Nonnull protected BeanDefinition createApplicationManagedDataSource(
             @Nonnull final Element applicationManagedElement) {
+
+        DeprecationSupport.warn(ObjectType.ELEMENT,
+                APPLICATION_MANAGED_CONNECTION_RESOLVER.getLocalPart(),
+                null,
+                BEAN_MANAGED_CONNECTION_RESOLVER.getLocalPart() + " or " +
+                SIMPLE_MANAGED_CONNECTION_RESOLVER.getLocalPart());
+
         Constraint.isNotNull(applicationManagedElement, "ApplicationManagedConnection element cannot be null");
         final BeanDefinitionBuilder dataSource =
                 BeanDefinitionBuilder.genericBeanDefinition(ComboPooledDataSource.class);
@@ -258,8 +328,7 @@ public class ManagedConnectionParser {
             final DataSource dataSource = (DataSource) initCtx.lookup(resourceName);
             return dataSource;
         } catch (final NamingException e) {
-            final Logger log = LoggerFactory.getLogger(ManagedConnectionParser.class);
-            log.error("Managed data source '{}' could not be found", resourceName, e);
+            LOG.error("Managed data source '{}' could not be found", resourceName, e);
             return null;
         }
     }
@@ -271,14 +340,13 @@ public class ManagedConnectionParser {
      *
      * @return the jdbc driver supplied to the method
      */
-    public static String loadJdbcDriver(final String jdbcDriver) {
+    @Deprecated public static String loadJdbcDriver(final String jdbcDriver) {
         // JDBC driver must be loaded in order to register itself
         final ClassLoader classLoader = ManagedConnectionParser.class.getClassLoader();
         try {
             classLoader.loadClass(jdbcDriver);
         } catch (final ClassNotFoundException e) {
-            final Logger log = LoggerFactory.getLogger(ManagedConnectionParser.class);
-            log.error("JDBC driver '{}' could not be found", jdbcDriver, e);
+            LOG.error("JDBC driver '{}' could not be found", jdbcDriver, e);
         }
         return jdbcDriver;
     }
@@ -299,19 +367,19 @@ public class ManagedConnectionParser {
         }
         
         if (beanManagedElements.size() > 1) {
-            LoggerFactory.getLogger(ManagedConnectionParser.class).
-            warn("Only one <BeanManagedConnection> should be specified; the first one has been consulted");
+            LOG.warn("Only one <BeanManagedConnection> should be specified; the first one has been consulted");
         }
 
         final List<Element> managedElements = ElementSupport.getChildElements(config, CONTAINER_MANAGED_CONNECTION_DC);
         managedElements.addAll(ElementSupport.getChildElements(config, CONTAINER_MANAGED_CONNECTION_RESOLVER));
         managedElements.addAll(ElementSupport.getChildElements(config, APPLICATION_MANAGED_CONNECTION_DC));
         managedElements.addAll(ElementSupport.getChildElements(config, APPLICATION_MANAGED_CONNECTION_RESOLVER));
+        managedElements.addAll(ElementSupport.getChildElements(config, SIMPLE_MANAGED_CONNECTION_RESOLVER));
         
         if (managedElements.size() > 0) {
-            LoggerFactory.getLogger(ManagedConnectionParser.class).
-            warn("<BeanManagedConnection> is incompatible with <ContainerManagedConnection> "+
-                 "or <ApplicationManagedConnection>. The <BeanManagedConnection> has been used");
+            LOG.warn("<BeanManagedConnection> is incompatible with <ContainerManagedConnection>"
+                    + ", <SimpleManagedConnection> or <ApplicationManagedConnection>. The "
+                    + "<BeanManagedConnection> has been used");
         }
         
         return StringSupport.trimOrNull(ElementSupport.getElementContentAsString(beanManagedElements.get(0)));
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 e71eaba..4c4e618 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
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import javax.sql.DataSource;
 
+import org.apache.commons.dbcp2.BasicDataSource;
 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
 import org.springframework.context.support.ConversionServiceFactoryBean;
 import org.springframework.context.support.GenericApplicationContext;
@@ -102,7 +103,7 @@ public class RDBMSDataConnectorParserTest {
         Assert.assertEquals(mappingStrategy.getResultRenamingMap().get("homephone"), "phonenumber");
     }
     
-    @Test(enabled=false) public void simpleConnector() throws Exception {
+    @Test public void simpleConnector() throws Exception {
         final RDBMSDataConnector dataConnector =
                 getRdbmsDataConnector("net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-v2-simple.xml");
         Assert.assertNotNull(dataConnector);
@@ -217,18 +218,28 @@ public class RDBMSDataConnectorParserTest {
         Assert.assertEquals("myDatabase", id);
         Assert.assertEquals(300000, dataConnector.getNoRetryDelay());
 
-        final ComboPooledDataSource dataSource = (ComboPooledDataSource) dataConnector.getDataSource();
-        Assert.assertNotNull(dataSource);
-        Assert.assertEquals("jdbc:hsqldb:mem:RDBMSDataConnectorStore", dataSource.getJdbcUrl());
-        Assert.assertEquals("SA", dataSource.getUser());
-        Assert.assertEquals(3, dataSource.getAcquireIncrement());
-        Assert.assertEquals(24, dataSource.getAcquireRetryAttempts());
-        Assert.assertEquals(5000, dataSource.getAcquireRetryDelay());
-        Assert.assertEquals(true, dataSource.isBreakAfterAcquireFailure());
-        Assert.assertEquals(1, dataSource.getMinPoolSize());
-        Assert.assertEquals(5, dataSource.getMaxPoolSize());
-        Assert.assertEquals(300, dataSource.getMaxIdleTime());
-        Assert.assertEquals(360, dataSource.getIdleConnectionTestPeriod());
+        if ( dataConnector.getDataSource() instanceof ComboPooledDataSource) {
+            final ComboPooledDataSource dataSource = (ComboPooledDataSource) dataConnector.getDataSource();
+            Assert.assertNotNull(dataSource);
+            Assert.assertEquals("jdbc:hsqldb:mem:RDBMSDataConnectorStore", dataSource.getJdbcUrl());
+            Assert.assertEquals("SA", dataSource.getUser());
+            Assert.assertEquals(3, dataSource.getAcquireIncrement());
+            Assert.assertEquals(24, dataSource.getAcquireRetryAttempts());
+            Assert.assertEquals(5000, dataSource.getAcquireRetryDelay());
+            Assert.assertEquals(true, dataSource.isBreakAfterAcquireFailure());
+            Assert.assertEquals(1, dataSource.getMinPoolSize());
+            Assert.assertEquals(5, dataSource.getMaxPoolSize());
+            Assert.assertEquals(300, dataSource.getMaxIdleTime());
+            Assert.assertEquals(360, dataSource.getIdleConnectionTestPeriod());
+        } else {
+            final BasicDataSource dataSource = (BasicDataSource) dataConnector.getDataSource();
+            Assert.assertNotNull(dataSource);
+            Assert.assertEquals(dataSource.getUrl(), "jdbc:hsqldb:mem:RDBMSDataConnectorStore");
+            Assert.assertEquals(dataSource.getUsername(), "SA");
+            Assert.assertEquals(dataSource.getMaxTotal(), 20);
+            Assert.assertEquals(dataSource.getMaxIdle(), 5);
+            Assert.assertEquals(dataSource.getMaxWaitMillis(), 5000);
+        }
 
         Assert.assertFalse(dataConnector.isConnectionReadOnly());
         final DataSourceValidator validator = (DataSourceValidator) dataConnector.getValidator();
diff --git a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-v2-simple.xml b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-v2-simple.xml
index b1c4d2b..63d2a4b 100644
--- a/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-v2-simple.xml
+++ b/idp-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/rdbms/rdbms-attribute-resolver-v2-simple.xml
@@ -13,16 +13,9 @@
         jdbcURL="jdbc:hsqldb:mem:RDBMSDataConnectorStore"
         jdbcUserName="SA"
         jdbcPassword=""/>
-        <dc:QueryTemplate>
-            <![CDATA[
-                SELECT * FROM people WHERE userid='%s'
-            ]]>
-        </dc:QueryTemplate>
-        
-        <dc:Column columnName="homephone" attributeID="phonenumber" />
-        
-        <dc:ResultCache
-            elementTimeToLive="PT10S"/>
-    </resolver:DataConnector>
+        <QueryTemplate><![CDATA[SELECT * FROM people WHERE userid='%s']]></QueryTemplate>
+        <Column columnName="homephone" attributeID="phonenumber" />
+        <ResultCache elementTimeToLive="PT10S"/>
+    </DataConnector>
     
-</resolver:AttributeResolver>
+</AttributeResolver>

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


More information about the commits mailing list