diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewAutoConfiguration.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewAutoConfiguration.java new file mode 100644 index 00000000..fc264e63 --- /dev/null +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewAutoConfiguration.java @@ -0,0 +1,50 @@ +// Copyright (c) 2025, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package com.oracle.spring.json.duality.builder; + +import com.oracle.spring.json.duality.annotation.JsonRelationalDualityView; +import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.data.util.AnnotatedTypeScanner; +import org.springframework.util.StringUtils; + +@AutoConfiguration +@EnableConfigurationProperties(DualityViewConfigurationProperties.class) +public class DualityViewAutoConfiguration { + @Bean + @Qualifier("jsonRelationalDualityViewScanner") + public AnnotatedTypeScanner scanner(ResourceLoader resourceLoader, Environment environment) { + AnnotatedTypeScanner dvScanner = new AnnotatedTypeScanner(JsonRelationalDualityView.class); + + dvScanner.setResourceLoader(resourceLoader); + dvScanner.setEnvironment(environment); + return dvScanner; + } + + @Bean + DualityViewBuilder dualityViewBuilder(DataSource dataSource, + JpaProperties jpaProperties, + HibernateProperties hibernateProperties, + DualityViewConfigurationProperties dvProperties) { + boolean isShowSQL = dvProperties != null && dvProperties.isShowSql() != null ? + dvProperties.isShowSql() : + jpaProperties.isShowSql(); + String ddlAuto = dvProperties != null && StringUtils.hasText(dvProperties.getDdlAuto()) ? + dvProperties.getDdlAuto() : + hibernateProperties.getDdlAuto(); + + return new DualityViewBuilder( + dataSource, + isShowSQL, + ddlAuto + ); + } +} diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewBuilder.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewBuilder.java index 5d4e8fb3..7da48edd 100644 --- a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewBuilder.java +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewBuilder.java @@ -20,7 +20,6 @@ import static com.oracle.spring.json.duality.builder.Annotations.getAccessModeStr; import static com.oracle.spring.json.duality.builder.Annotations.getViewName; -@Component public final class DualityViewBuilder implements DisposableBean { private static final String PREFIX = "JSON Relational Duality Views: "; private static final int TABLE_OR_VIEW_DOES_NOT_EXIST = 942; @@ -31,13 +30,11 @@ public final class DualityViewBuilder implements DisposableBean { private final Map dualityViews = new HashMap<>(); public DualityViewBuilder(DataSource dataSource, - JpaProperties jpaProperties, - HibernateProperties hibernateProperties) { + boolean isShowSql, + String ddlAuto) { this.dataSource = dataSource; - this.isShowSql = jpaProperties.isShowSql(); - this.rootSnippet = RootSnippet.fromDdlAuto( - hibernateProperties.getDdlAuto() - ); + this.isShowSql = isShowSql; + this.rootSnippet = RootSnippet.fromDdlAuto(ddlAuto); } void apply() { diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewConfigurationProperties.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewConfigurationProperties.java new file mode 100644 index 00000000..c9b01dfc --- /dev/null +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/DualityViewConfigurationProperties.java @@ -0,0 +1,28 @@ +// Copyright (c) 2025, Oracle and/or its affiliates. +// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +package com.oracle.spring.json.duality.builder; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("spring.jpa.dv") +public class DualityViewConfigurationProperties { + private Boolean showSql; + private String ddlAuto; + + public Boolean isShowSql() { + return showSql; + } + + public void setShowSql(boolean showSql) { + this.showSql = showSql; + } + + public String getDdlAuto() { + return ddlAuto; + } + + public void setDdlAuto(String ddlAuto) { + this.ddlAuto = ddlAuto; + } +} diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/RootSnippet.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/RootSnippet.java index 63f714ea..5a8fa125 100644 --- a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/RootSnippet.java +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/RootSnippet.java @@ -27,9 +27,9 @@ public static RootSnippet fromDdlAuto(String ddlAuto) { return switch (ddlAuto) { case "none" -> NONE; case "validate" -> VALIDATE; - case "create" -> CREATE; + case "create-only" -> CREATE; case "create-drop" -> CREATE_DROP; - case "update" -> UPDATE; + case "create", "update" -> UPDATE; default -> throw new IllegalStateException("Unexpected value: " + ddlAuto); }; } diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/ScannerConfiguration.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/ScannerConfiguration.java deleted file mode 100644 index ab12886a..00000000 --- a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/java/com/oracle/spring/json/duality/builder/ScannerConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2025, Oracle and/or its affiliates. -// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -package com.oracle.spring.json.duality.builder; - -import com.oracle.spring.json.duality.annotation.JsonRelationalDualityView; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.core.io.ResourceLoader; -import org.springframework.data.util.AnnotatedTypeScanner; - -@Configuration -public class ScannerConfiguration { - @Bean - @Qualifier("jsonRelationalDualityViewScanner") - public AnnotatedTypeScanner scanner(ResourceLoader resourceLoader, Environment environment) { - AnnotatedTypeScanner dvScanner = new AnnotatedTypeScanner(JsonRelationalDualityView.class); - - dvScanner.setResourceLoader(resourceLoader); - dvScanner.setEnvironment(environment); - return dvScanner; - } -} diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 00000000..aecfaf38 --- /dev/null +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,39 @@ +{ + "groups": [], + "properties": [], + "hints": [ + { + "name": "spring.jpa.dv.ddl-auto", + "values": [ + { + "value": "create", + "description": "Create the duality view, overwriting the existing view if necessary." + }, + { + "value": "create-drop", + "description": "Create and then destroy the duality view at the end of the session." + }, + { + "value": "create-only", + "description": "Create the duality view." + }, + { + "value": "drop", + "description": "Drop the duality view." + }, + { + "value": "none", + "description": "Disable DDL handling." + }, + { + "value": "update", + "description": "Update the duality view if necessary." + }, + { + "value": "validate", + "description": "Validate the duality view, make no changes to the database." + } + ] + } + ] +} \ No newline at end of file diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..15816d1a --- /dev/null +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.oracle.spring.json.duality.builder.DualityViewAutoConfiguration diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/builder/DualityViewBuilderTest.java b/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/builder/DualityViewBuilderTest.java index c477ec21..64eb8a46 100644 --- a/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/builder/DualityViewBuilderTest.java +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/java/com/oracle/spring/json/duality/builder/DualityViewBuilderTest.java @@ -14,8 +14,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import static com.oracle.spring.json.duality.SpringBootDualityTest.readViewFile; import static org.assertj.core.api.Assertions.assertThat; @@ -24,11 +22,11 @@ public class DualityViewBuilderTest { public static @NotNull Stream entityClasses() { return Stream.of( Arguments.of(Student.class, "student-update.sql", "update"), - Arguments.of(Student.class, "student-create.sql", "create"), - Arguments.of(Actor.class, "actor-create.sql", "create"), - Arguments.of(Order.class, "order-create.sql", "create"), + Arguments.of(Student.class, "student-create.sql", "create-only"), + Arguments.of(Actor.class, "actor-create.sql", "create-only"), + Arguments.of(Order.class, "order-create.sql", "create-only"), Arguments.of(Member.class, "member-create-drop.sql", "create-drop"), - Arguments.of(Employee.class, "employee-create.sql", "create") + Arguments.of(Employee.class, "employee-create.sql", "create-only") ); } @@ -43,12 +41,10 @@ public void buildViews(Class entity, String viewFile, String ddlAuto) { } private DualityViewBuilder getDualityViewBuilder(String ddlAuto) { - HibernateProperties hibernateProperties = new HibernateProperties(); - hibernateProperties.setDdlAuto(ddlAuto); return new DualityViewBuilder( null, - new JpaProperties(), - hibernateProperties + false, + ddlAuto ); } } diff --git a/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/resources/application.yaml b/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/resources/application.yaml index 64c69a27..b7a1784b 100644 --- a/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/resources/application.yaml +++ b/database/starters/oracle-spring-boot-json-relational-duality-views/src/test/resources/application.yaml @@ -14,4 +14,7 @@ spring: jpa: hibernate: ddl-auto: create-drop - show-sql: true + show-sql: false + dv: + ddl-auto: create-drop + show-sql: false