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>