[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