You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/01/20 17:59:43 UTC

[isis] 04/09: ISIS-2267: wip, gonna be simplifying this I hope.

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit bf8d01c5a4f6efa7c198a12bb45720eafcdcf24f
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 20 13:45:41 2020 +0000

    ISIS-2267: wip, gonna be simplifying this I hope.
---
 .../flyway/adoc/modules/flyway/pages/about.adoc    | 39 +++++++++++++--
 extensions/core/flyway/impl/pom.xml                |  9 +++-
 .../flyway/impl/IsisModuleExtFlywayImpl.java       | 14 +++---
 ...nfigurationCustomizerFromIsisConfiguration.java | 57 ++++++----------------
 .../config/FlywayMigrationStrategyForIsis.java     | 54 ++++++++++++++++++++
 .../flyway/impl/config/JdbcConnectionParams.java   | 57 ++++++++++++++++++++++
 extensions/pom.xml                                 |  2 +-
 7 files changed, 176 insertions(+), 56 deletions(-)

diff --git a/extensions/core/flyway/adoc/modules/flyway/pages/about.adoc b/extensions/core/flyway/adoc/modules/flyway/pages/about.adoc
index bb9a492..8ef804f 100644
--- a/extensions/core/flyway/adoc/modules/flyway/pages/about.adoc
+++ b/extensions/core/flyway/adoc/modules/flyway/pages/about.adoc
@@ -4,7 +4,7 @@
 
 This module provides an very thin layer to use Spring Boot's integration with https://flywaydb.org[Flyway]
 
-== Dependencies
+== Configuration
 
 Add the following dependency:
 
@@ -16,18 +16,47 @@ Add the following dependency:
 </dependency>
 ----
 
+Also add the following module to your `AppManifest`:
+
+[source,java]
+----
+@Configuration
+@Import({
+        // ...
+        IsisModuleExtFlywayImpl.class,
+        // ...
+})
+public static class AppManifest {
+}
+----
+
 This will enable Spring Boot's integration with Flyway, and configure Flyway to pick up JDBC connection parameters from the `application.properties` (corresponding to `IsisConfiguration` class).
 
+* `isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionURL`
+* `isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName`
+* `isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName`
+* `isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword`
+
 Currently, only the form of persistence properties recognised are those of the JDO DataNucleus object store:
 
-isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionURL = jdbc:h2:mem:test
-isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionDriverName = org.h2.Driver
-isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionUserName = sa
-isis.persistence.jdo-datanucleus.impl.javax.jdo.option.ConnectionPassword =
+For backward compatibility with v1, Flyway will be automatically disabled if JDO's `autoCreateAll` option is set:
+
+* `isis.persistor.datanucleus.impl.datanucleus.schema.autoCreateAll`
+
+** If `true`, then flyway is disabled
+** If `false`, then flyway is enabled
+
+Flyway can also be explicitly disabled using the Spring Boot config property:
+
+* `spring.flyway.enabled`
 
+** If `false`, then flyway is disabled
+** If `true`, the flyway is enabled (provided also that `autoCreateAll` is set to `false`, see above)
 
 
+== Automatic schema setup
 
+TODO...
 
 == Reference
 
diff --git a/extensions/core/flyway/impl/pom.xml b/extensions/core/flyway/impl/pom.xml
index 629ae45..254566d 100644
--- a/extensions/core/flyway/impl/pom.xml
+++ b/extensions/core/flyway/impl/pom.xml
@@ -16,9 +16,8 @@
 
 	<parent>
 		<groupId>org.apache.isis.extensions</groupId>
-		<artifactId>isis-extensions</artifactId>
+		<artifactId>isis-extensions-flyway</artifactId>
 		<version>2.0.0-M3-SNAPSHOT</version>
-		<relativePath>../../../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>isis-extensions-flyway-impl</artifactId>
@@ -48,6 +47,12 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-autoconfigure</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+		</dependency>
+
+
 	</dependencies>
 
 </project>
diff --git a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/IsisModuleExtFlywayImpl.java b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/IsisModuleExtFlywayImpl.java
index ca11a61..678275d 100644
--- a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/IsisModuleExtFlywayImpl.java
+++ b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/IsisModuleExtFlywayImpl.java
@@ -27,18 +27,18 @@ import org.springframework.context.annotation.Import;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.IsisModuleCoreConfig;
 import org.apache.isis.extensions.flyway.impl.config.FlywayConfigurationCustomizerFromIsisConfiguration;
+import org.apache.isis.extensions.flyway.impl.config.FlywayMigrationStrategyForIsis;
 
 @Configuration
 @Import({
-        IsisModuleCoreConfig.class
+        // dependencies
+        IsisModuleCoreConfig.class,
+
+//        // @Component's
+        FlywayConfigurationCustomizerFromIsisConfiguration.class,
+//        FlywayMigrationStrategyForIsis.class,
 })
-@ComponentScan
 public class IsisModuleExtFlywayImpl {
 
-    @Bean
-    public FlywayConfigurationCustomizer flywayConfigurationCustomizer(final IsisConfiguration isisConfiguration) {
-        return new FlywayConfigurationCustomizerFromIsisConfiguration(isisConfiguration);
-    }
-
 
 }
diff --git a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayConfigurationCustomizerFromIsisConfiguration.java b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayConfigurationCustomizerFromIsisConfiguration.java
index f3b80c3..c270f4f 100644
--- a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayConfigurationCustomizerFromIsisConfiguration.java
+++ b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayConfigurationCustomizerFromIsisConfiguration.java
@@ -1,5 +1,7 @@
 package org.apache.isis.extensions.flyway.impl.config;
 
+import java.util.Properties;
+
 import javax.sql.DataSource;
 
 import org.flywaydb.core.api.configuration.FluentConfiguration;
@@ -10,12 +12,13 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.config.IsisConfiguration.Persistence.JdoDatanucleus.Impl.Javax.Jdo;
 
 import lombok.Value;
 import lombok.val;
 
 @Component
-@Order(OrderPrecedence.HIGH)
+@Order(OrderPrecedence.EARLY)
 public class FlywayConfigurationCustomizerFromIsisConfiguration implements FlywayConfigurationCustomizer {
 
     private final IsisConfiguration isisConfiguration;
@@ -27,47 +30,19 @@ public class FlywayConfigurationCustomizerFromIsisConfiguration implements Flywa
 
     @Override
     public void customize(final FluentConfiguration configuration) {
-        val params = obtainParams(isisConfiguration);
-        val datasource = params.createDatasource();
-
-        configuration.dataSource(datasource);
-    }
-
-    /**
-     * Searches for JDO connection params.
-     *
-     * <p>
-     *     In the future, could also search for JPA etc.
-     * </p>
-     */
-    private static JdbcConnectionParams obtainParams(final IsisConfiguration isisConfiguration) {
-
-        val javaxJdoOption = isisConfiguration.getPersistence().getJdoDatanucleus().getImpl().getJavax().getJdo().getOption();
-
-        val connectionDriverName = javaxJdoOption.getConnectionDriverName();
-        val connectionUrl = javaxJdoOption.getConnectionUrl();
-        val connectionUserName = javaxJdoOption.getConnectionUserName();
-        val connectionPassword = javaxJdoOption.getConnectionPassword();
 
-        return new JdbcConnectionParams(connectionDriverName, connectionUrl, connectionUserName, connectionPassword);
-    }
-
-    @Value
-    static class JdbcConnectionParams {
-        private final String connectionDriverName;
-        private final String connectionUrl;
-        private final String connectionUserName;
-        private final String connectionPassword;
-
-        public DataSource createDatasource() {
-            val dataSourceBuilder = DataSourceBuilder.create();
-            dataSourceBuilder.driverClassName(connectionDriverName);
-            dataSourceBuilder.url(connectionUrl);
-            dataSourceBuilder.username(connectionUserName);
-            dataSourceBuilder.password(connectionPassword);
-            return dataSourceBuilder.build();
+        final boolean autoCreate =
+                isisConfiguration.getPersistence().getJdoDatanucleus().getImpl().getDatanucleus().getSchema().isAutoCreateAll();
+        if (autoCreate) {
+            Properties props = new Properties();
+            props.setProperty("spring.flyway.enabled", "false");
+            configuration.configuration(props);
+            return;
         }
-    }
-
 
+//        // else
+//        JdbcConnectionParams.from(isisConfiguration)
+//                .map(JdbcConnectionParams::createDatasource)
+//                .ifPresent(configuration::dataSource);
+    }
 }
diff --git a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayMigrationStrategyForIsis.java b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayMigrationStrategyForIsis.java
new file mode 100644
index 0000000..47af679
--- /dev/null
+++ b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/FlywayMigrationStrategyForIsis.java
@@ -0,0 +1,54 @@
+package org.apache.isis.extensions.flyway.impl.config;
+
+import java.util.Optional;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.flywaydb.core.Flyway;
+import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.config.IsisConfiguration;
+
+import lombok.val;
+
+@Component
+@Order(OrderPrecedence.EARLY)
+public class FlywayMigrationStrategyForIsis implements FlywayMigrationStrategy {
+
+    private final IsisConfiguration isisConfiguration;
+    private final Optional<JdbcConnectionParams> jdbcConnectionParams;
+
+    public FlywayMigrationStrategyForIsis(IsisConfiguration isisConfiguration) {
+        this.isisConfiguration = isisConfiguration;
+
+        org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType x;
+
+        final boolean autoCreate =
+                isisConfiguration.getPersistence().getJdoDatanucleus().getImpl().getDatanucleus().getSchema().isAutoCreateAll();
+        if(autoCreate) {
+            jdbcConnectionParams = Optional.empty();
+            return;
+        }
+
+        // else
+        jdbcConnectionParams = JdbcConnectionParams.from(isisConfiguration);
+    }
+
+
+    @Override
+    public void migrate(Flyway flyway) {
+        jdbcConnectionParams.ifPresent(
+                jdbcConnectionParams1 -> {
+                    jdbcConnectionParams1.createDatasource();
+                    flyway.migrate();
+                }
+        );
+    }
+
+
+}
diff --git a/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/JdbcConnectionParams.java b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/JdbcConnectionParams.java
new file mode 100644
index 0000000..235eaef
--- /dev/null
+++ b/extensions/core/flyway/impl/src/main/java/org/apache/isis/extensions/flyway/impl/config/JdbcConnectionParams.java
@@ -0,0 +1,57 @@
+package org.apache.isis.extensions.flyway.impl.config;
+
+import java.util.Optional;
+
+import javax.sql.DataSource;
+
+import org.springframework.boot.jdbc.DataSourceBuilder;
+
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.config.IsisConfiguration;
+
+import lombok.Value;
+import lombok.val;
+
+@Value
+class JdbcConnectionParams {
+
+    /**
+     * Searches for JDO connection params.
+     *
+     * <p>
+     *     In the future, could also search for JPA etc.
+     * </p>
+     */
+    static Optional<JdbcConnectionParams> from(final IsisConfiguration isisConfiguration) {
+
+        IsisConfiguration.Persistence.JdoDatanucleus.Impl.Javax.Jdo.Option javaxJdoOption =
+                isisConfiguration.getPersistence().getJdoDatanucleus().getImpl().getJavax().getJdo().getOption();
+
+        val connectionDriverName = javaxJdoOption.getConnectionDriverName();
+        val connectionUrl = javaxJdoOption.getConnectionUrl();
+        val connectionUserName = javaxJdoOption.getConnectionUserName();
+        val connectionPassword = javaxJdoOption.getConnectionPassword();
+
+        if(_Strings.isNullOrEmpty(connectionDriverName) ||
+                _Strings.isNullOrEmpty(connectionUrl) ||
+                _Strings.isNullOrEmpty(connectionUserName) ||
+                _Strings.isNullOrEmpty(connectionPassword)) {
+            return Optional.empty();
+        }
+        return Optional.of(new JdbcConnectionParams(connectionDriverName, connectionUrl, connectionUserName, connectionPassword));
+    }
+
+    private final String connectionDriverName;
+    private final String connectionUrl;
+    private final String connectionUserName;
+    private final String connectionPassword;
+
+    public DataSource createDatasource() {
+        val dataSourceBuilder = DataSourceBuilder.create();
+        dataSourceBuilder.driverClassName(connectionDriverName);
+        dataSourceBuilder.url(connectionUrl);
+        dataSourceBuilder.username(connectionUserName);
+        dataSourceBuilder.password(connectionPassword);
+        return dataSourceBuilder.build();
+    }
+}
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 6aa9306..f0c4e2c 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -152,7 +152,7 @@
 	</dependencies>
 
 	<modules>
-		<module>core/flyway/impl</module>
+		<module>core/flyway</module>
 		<module>security/secman</module>
 		<module>security/shiro-realm-ldap</module>