From f2cb44b79562d65ec7c478d5f9010c431d8e8903 Mon Sep 17 00:00:00 2001 From: Joze RIHTARSIC <joze.rihtarsic@ext.ec.europa.eu> Date: Thu, 22 Nov 2018 16:45:33 +0100 Subject: [PATCH] - add conditional datasource.. --- .../edelivery/smp/config/DatabaseConfig.java | 51 +++++++++++-------- .../smp/config/JNDIDatasourceCondition.java | 17 +++++++ .../config/PropertyDatasourceCondition.java | 15 ++++++ 3 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/JNDIDatasourceCondition.java create mode 100644 smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyDatasourceCondition.java diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java index 038d2ec80..76235b737 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java @@ -17,6 +17,7 @@ import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.jndi.JndiObjectFactoryBean; @@ -63,32 +64,38 @@ public class DatabaseConfig { * * @return */ - @Bean - public DataSource dataSource() { - DataSource datasource = null; - if (url!=null) { - DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource(); - driverManagerDataSource.setDriverClassName(driver); - driverManagerDataSource.setUrl(url); - driverManagerDataSource.setUsername(username); - driverManagerDataSource.setPassword(password); - datasource = driverManagerDataSource; - } else { - JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean(); - dataSource.setJndiName(jndiDatasourceName); - try { - dataSource.afterPropertiesSet(); - } catch (IllegalArgumentException | NamingException e) { - // rethrow - throw new SMPRuntimeException(INTERNAL_ERROR, e, "while retrieving datasource: " + jndiDatasourceName, e.getMessage()); - } - datasource = (DataSource)dataSource.getObject(); + @Bean(name = "dataSource") + @Conditional(value = JNDIDatasourceCondition.class) + public DataSource jndiDataSource() { + JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean(); + dataSource.setJndiName(jndiDatasourceName); + try { + dataSource.afterPropertiesSet(); + } catch (IllegalArgumentException | NamingException e) { + // rethrow + throw new SMPRuntimeException(INTERNAL_ERROR, e, "while retrieving datasource: " + jndiDatasourceName, e.getMessage()); } - return datasource; + return (DataSource) dataSource.getObject(); + } + + /** + * Create datasource from file property configuration. If URL is null than try to get datasource from JNDI. + * + * @return + */ + @Bean(name = "dataSource") + @Conditional(value = PropertyDatasourceCondition.class) + public DataSource propertyDataSource() { + DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource(); + driverManagerDataSource.setDriverClassName(driver); + driverManagerDataSource.setUrl(url); + driverManagerDataSource.setUsername(username); + driverManagerDataSource.setPassword(password); + return driverManagerDataSource; } @Bean - public LocalContainerEntityManagerFactoryBean smpEntityManagerFactory( DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { + public LocalContainerEntityManagerFactoryBean smpEntityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { Properties prop = new Properties(); prop.setProperty("org.hibernate.envers.store_data_at_delete", "true"); LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/JNDIDatasourceCondition.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/JNDIDatasourceCondition.java new file mode 100644 index 000000000..dbc837963 --- /dev/null +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/JNDIDatasourceCondition.java @@ -0,0 +1,17 @@ +package eu.europa.ec.edelivery.smp.config; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class JNDIDatasourceCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + // urls has precedence before jndi + String jndiName = context.getEnvironment().getProperty("datasource.jndi"); + String url = context.getEnvironment().getProperty("jdbc.url"); + return StringUtils.isBlank(url) && !StringUtils.isBlank(jndiName); + } +} diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyDatasourceCondition.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyDatasourceCondition.java new file mode 100644 index 000000000..4918a10c2 --- /dev/null +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyDatasourceCondition.java @@ -0,0 +1,15 @@ +package eu.europa.ec.edelivery.smp.config; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class PropertyDatasourceCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + String url = context.getEnvironment().getProperty("jdbc.url"); + return !StringUtils.isBlank(url); + } +} -- GitLab