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