diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 18ad5747..d9097593 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,6 +1,6 @@ name: Check -on: [push, pull_request] +on: [ push, pull_request ] jobs: check: name: Check @@ -9,19 +9,26 @@ jobs: GRADLE_OPTS: "-Xmx6g -Xms4g" CI: true COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - + strategy: + fail-fast: false + matrix: + versions: + - 'check coveralls -PmicronautVersion=1.3.7 -PspockVersion=2.0-groovy-2.5 -PgroovyVersion=2.5.15 -PgrailsVersion=4.0.4 -Pgorm.version=7.0.6.RELEASE' + - 'check -x :micronaut-grails-domain-library:check -x :micronaut-grails-example:check -PmicronautVersion=2.5.13 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2' + - 'migrateImports check -PmicronautVersion=3.2.1 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2' steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - uses: eskatos/gradle-command-action@v1 - with: - arguments: check aggregateTestReports coveralls --stacktrace - - name: Show Reports - uses: actions/upload-artifact@v1 - if: failure() - with: - name: reports - path: build/reports/ + - uses: actions/checkout@v2 + - uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: zulu + cache: 'gradle' + - uses: eskatos/gradle-command-action@v2 + with: + arguments: ${{ matrix.versions }} + - name: Show Reports + uses: actions/upload-artifact@v2 + if: failure() + with: + name: reports + path: build/reports/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a61e21d2..12736894 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,14 +9,18 @@ jobs: runs-on: ubuntu-latest env: GRADLE_OPTS: "-Xmx6g -Xms4g" - GRGIT_USER: musketyr - GRGIT_PASS: ${{ secrets.GITHUB_PERSONAL_TOKEN }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} + SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} steps: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: 1.8 + java-version: '8' + distribution: zulu + cache: 'gradle' - name: Semantic Version id: version uses: ncipollo/semantic-version-action@v1 @@ -26,15 +30,24 @@ jobs: with: fileName: 'secret.pgp' encodedString: ${{ secrets.SIGNING_SECRET_KEY_BASE64 }} - - uses: eskatos/gradle-command-action@v1 + - name: Release Micronaut 1.x env: - SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} - SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} - SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }} + uses: eskatos/gradle-command-action@v2 with: - arguments: gitPublishPush publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }} -Prelease=true -Dorg.ajoberstar.grgit.auth.username=${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }} --stacktrace + arguments: -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-1.0 --stacktrace -PmicronautVersion=1.3.7 -PspockVersion=2.0-groovy-2.5 -PgroovyVersion=2.5.15 -PgrailsVersion=4.0.4 -Pgorm.version=7.0.6.RELEASE -Prelease=true + - name: Release Micronaut 2.x + env: + SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }} + uses: eskatos/gradle-command-action@v2 + with: + arguments: -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-2.0 --stacktrace -PmicronautVersion=2.5.13 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2 -Prelease=true + - name: Release Micronaut 3.x + env: + SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }} + uses: eskatos/gradle-command-action@v2 + with: + arguments: migrateImports gitPublishPush -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-3.0 --stacktrace -PmicronautVersion=3.2.3 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2 -Prelease=true -Dorg.ajoberstar.grgit.auth.username=${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }} ping: name: Notify Upstream Repositories runs-on: ubuntu-latest @@ -55,4 +68,4 @@ jobs: token: ${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }} repository: ${{ matrix.repository }} event-type: ap-new-version-released-event - client-payload: '{ "group": "com.agorapulse", "module": "micronaut-grails", "version": "${{ steps.version.outputs.tag }}", "property" : "micronaut.grails.version", "github" : ${{ toJson(github) }} }' + client-payload: '{ "group": "com.agorapulse", "module": "micronaut-grails", "version": "${{ steps.version.outputs.tag }}-micronaut-1.0", "property" : "micronaut.grails.version", "github" : ${{ toJson(github) }} }' diff --git a/build.gradle b/build.gradle index 6d01a305..717571de 100644 --- a/build.gradle +++ b/build.gradle @@ -124,6 +124,7 @@ subprojects { Project subproject -> apply plugin: 'groovy' apply plugin: 'checkstyle' apply plugin: 'codenarc' + apply plugin: 'micronaut-compatibility' configurations { optional.extendsFrom compile @@ -144,7 +145,7 @@ subprojects { Project subproject -> // Groovy compile "org.codehaus.groovy:groovy:$groovyVersion" - compile "io.micronaut:micronaut-runtime-groovy" + compile micronautMigratedDependency('micronaut-runtime-groovy') compile "io.micronaut:micronaut-inject" compile "io.micronaut:micronaut-runtime" @@ -192,7 +193,7 @@ subprojects { Project subproject -> } codenarc { - toolVersion = '1.2.1' + toolVersion = '2.1.0' } config { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 89965d24..e077b289 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -15,10 +15,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -apply plugin: 'groovy' +plugins { + id 'groovy-gradle-plugin' + id 'groovy' +} repositories { - jcenter() mavenCentral() maven { url 'https://plugins.gradle.org/m2/' } } diff --git a/buildSrc/src/main/groovy/micronaut-compatibility.gradle b/buildSrc/src/main/groovy/micronaut-compatibility.gradle new file mode 100644 index 00000000..bda3ba5b --- /dev/null +++ b/buildSrc/src/main/groovy/micronaut-compatibility.gradle @@ -0,0 +1,110 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright 2020-2021 Agorapulse. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import groovy.transform.Field + +@Field static final Map MICRONAUT_1 = [ + 'micronaut-runtime-groovy': 'io.micronaut', + 'micronaut-function-groovy': 'io.micronaut', + 'micronaut-function-aws': 'io.micronaut', + 'micronaut-aws-common': 'io.micronaut.configuration', + 'micronaut-security': 'io.micronaut', + 'micronaut-security-jwt': 'io.micronaut', + 'micronaut-jdbc-tomcat': 'io.micronaut.configuration', + 'micronaut-hibernate-gorm': 'io.micronaut.configuration', + 'micronaut-spring': 'io.micronaut', +] + +@Field static final Map MICRONAUT_2 = [ + 'micronaut-runtime-groovy': 'io.micronaut.groovy', + 'micronaut-function-groovy': 'io.micronaut.groovy', + 'micronaut-function-aws': 'io.micronaut.aws', + 'micronaut-aws-common': 'io.micronaut.aws', + 'micronaut-security': 'io.micronaut.security', + 'micronaut-security-jwt': 'io.micronaut.security', + 'micronaut-jdbc-tomcat': 'io.micronaut.sql', + 'micronaut-hibernate-gorm': 'io.micronaut.groovy', + 'micronaut-spring': 'io.micronaut.spring', +] + +@Field static final Map IMPORTS = [ + 'javax.annotation.Nullable': 'io.micronaut.core.annotation.Nullable', + 'javax.annotation.Nonnull': 'io.micronaut.core.annotation.NonNull', + 'Nonnull': 'NonNull', + 'import javax.inject': 'import jakarta.inject', + 'io.micronaut.test.annotation.MicronautTest': [ + java: 'io.micronaut.test.extensions.junit5.annotation.MicronautTest', + groovy: 'io.micronaut.test.extensions.spock.annotation.MicronautTest', + ] +] + +ext.micronautMigratedDependency = { String module -> + Map groups = project.getProperty('micronautVersion').startsWith('1') ? MICRONAUT_1 : MICRONAUT_2 + String group = groups[module] + + if (!group) { + throw new IllegalArgumentException("Cannot find group for $module. Known modules: ${groups.keySet()}") + } + + return "$group:$module" +} + +pluginManager.withPlugin('java') { + tasks.register('migrateImports') { Task task -> + File javaSources = project.file('src/main/java') + File javaTestSources = project.file('src/test/java') + File groovySources = project.file('src/main/groovy') + File groovyTestSources = project.file('src/test/groovy') + File testResources = project.file('src/test/resources') + + List dirs = [ + javaSources, + javaTestSources, + groovySources, + groovyTestSources, + testResources, + ] + + for (File dir in dirs) { + if (dir.exists()) { + task.inputs.dir dir + task.outputs.dir dir + + task.doFirst { + task.inputs.files.forEach { File file -> + String content = file.text + String newContent = content + + if (IMPORTS.keySet().any { String original -> content.contains(original) }) { + IMPORTS.each { String original, Object value -> + String replacement = value instanceof CharSequence ? value : (file.name.endsWith('.groovy') ? value['groovy'] : value['java']) + newContent = newContent.replace(original, replacement) + } + } + + if (content != newContent) { + project.logger.lifecycle("Migrated imports in $file") + file.text = newContent + } + } + } + } + } + } +} + + diff --git a/examples/micronaut-grails-domain-library/grails-app/domain/com/agorapulse/micronaut/grails/domain/Manager.groovy b/examples/micronaut-grails-domain-library/grails-app/domain/com/agorapulse/micronaut/grails/domain/Manager.groovy index 7393818a..7a03e210 100644 --- a/examples/micronaut-grails-domain-library/grails-app/domain/com/agorapulse/micronaut/grails/domain/Manager.groovy +++ b/examples/micronaut-grails-domain-library/grails-app/domain/com/agorapulse/micronaut/grails/domain/Manager.groovy @@ -19,16 +19,19 @@ package com.agorapulse.micronaut.grails.domain import grails.compiler.GrailsCompileStatic import grails.gorm.annotation.Entity +import io.micronaut.core.annotation.Introspected /** * Test entity. */ @Entity +@Introspected @GrailsCompileStatic @SuppressWarnings([ 'GrailsDomainHasEquals', 'GrailsDomainHasToString', 'FieldTypeRequired', + 'NoDef', ]) class Manager { diff --git a/examples/micronaut-grails-domain-library/micronaut-grails-domain-library.gradle b/examples/micronaut-grails-domain-library/micronaut-grails-domain-library.gradle index 538a1703..d6e01d57 100644 --- a/examples/micronaut-grails-domain-library/micronaut-grails-domain-library.gradle +++ b/examples/micronaut-grails-domain-library/micronaut-grails-domain-library.gradle @@ -37,19 +37,19 @@ dependencies { compileOnly "io.micronaut:micronaut-inject-groovy" - compile 'io.micronaut.configuration:micronaut-hibernate-gorm' + compile micronautMigratedDependency('micronaut-hibernate-gorm') compileOnly "org.grails:grails-core:$grailsVersion" compile "org.grails:grails-bootstrap:$grailsVersion" annotationProcessor "io.micronaut:micronaut-inject-java" - compile "io.micronaut:micronaut-runtime-groovy" + compile micronautMigratedDependency('micronaut-runtime-groovy') compile "io.micronaut:micronaut-validation" testCompile project(':micronaut-grails-jpa-generator') - testCompile 'com.agorapulse.testing:fixt:0.2.1.1' + testCompile 'com.agorapulse.testing:fixt:0.2.3' testCompile 'io.micronaut:micronaut-inject-groovy' testCompile 'org.mariadb.jdbc:mariadb-java-client:2.7.3' diff --git a/examples/micronaut-grails-domain-library/src/test/groovy/com/agorapulse/micronaut/grails/domain/MicronautGeneratorSpec.groovy b/examples/micronaut-grails-domain-library/src/test/groovy/com/agorapulse/micronaut/grails/domain/MicronautGeneratorSpec.groovy index fcc78b60..9c8a1b71 100644 --- a/examples/micronaut-grails-domain-library/src/test/groovy/com/agorapulse/micronaut/grails/domain/MicronautGeneratorSpec.groovy +++ b/examples/micronaut-grails-domain-library/src/test/groovy/com/agorapulse/micronaut/grails/domain/MicronautGeneratorSpec.groovy @@ -20,6 +20,7 @@ package com.agorapulse.micronaut.grails.domain // tag::body[] import com.agorapulse.micronaut.grails.jpa.generator.MicronautJpaGenerator import com.agorapulse.testing.fixt.Fixt +import groovy.transform.CompileDynamic import io.micronaut.context.ApplicationContext import org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator import org.grails.orm.hibernate.HibernateDatastore @@ -29,6 +30,7 @@ import spock.lang.Specification /** * Example specification generating JPA entities from GORM entities. */ +@CompileDynamic class MicronautGeneratorSpec extends Specification { Fixt fixt = Fixt.create(MicronautGeneratorSpec) diff --git a/examples/micronaut-grails-example/grails-app/controllers/micronaut/grails/example/TestController.groovy b/examples/micronaut-grails-example/grails-app/controllers/micronaut/grails/example/TestController.groovy index bbf4f740..ccf180f4 100644 --- a/examples/micronaut-grails-example/grails-app/controllers/micronaut/grails/example/TestController.groovy +++ b/examples/micronaut-grails-example/grails-app/controllers/micronaut/grails/example/TestController.groovy @@ -17,6 +17,7 @@ */ package micronaut.grails.example +import com.agorapulse.micronaut.grails.domain.Manager import com.agorapulse.micronaut.grails.example.DirectlyInjected import com.agorapulse.micronaut.grails.example.InjectedUsingBridge import com.agorapulse.micronaut.grails.example.InjectedUsingBridgeWithDifferentName @@ -39,6 +40,10 @@ class TestController { InjectedUsingBridge injectedUsingBridge InjectedUsingBridgeWithDifferentName otherInjected + def health() { + render "OK" + } + def index() { render([ someDirectlyInjected : someDirectlyInjected?.toString(), @@ -71,10 +76,12 @@ class TestController { } def managers() { - render([ - someDirectlyInjected: someDirectlyInjected?.managerCount, - injectedUsingBridge : injectedUsingBridge?.managerCount, - ] as JSON) + render(Manager.withNewSession { + [ + someDirectlyInjected: someDirectlyInjected?.managerCount, + injectedUsingBridge : injectedUsingBridge?.managerCount, + ] + } as JSON) } def profiles() { diff --git a/examples/micronaut-grails-example/grails-app/init/micronaut/grails/example/DefaultApplication.groovy b/examples/micronaut-grails-example/grails-app/init/micronaut/grails/example/DefaultApplication.groovy index d5d3fad1..ff32ad69 100644 --- a/examples/micronaut-grails-example/grails-app/init/micronaut/grails/example/DefaultApplication.groovy +++ b/examples/micronaut-grails-example/grails-app/init/micronaut/grails/example/DefaultApplication.groovy @@ -17,6 +17,7 @@ */ package micronaut.grails.example +import com.agorapulse.micronaut.grails.MicronautGrailsApp import com.agorapulse.micronaut.grails.domain.Manager import grails.boot.GrailsApp import grails.boot.config.GrailsAutoConfiguration @@ -39,8 +40,6 @@ import org.springframework.core.env.ConfigurableEnvironment import org.springframework.core.env.PropertyResolver import org.springframework.core.io.ResourceLoader -import javax.annotation.Nonnull - class DefaultApplication extends GrailsAutoConfiguration { static ConfigurableApplicationContext context @@ -116,13 +115,13 @@ class DefaultApplication extends GrailsAutoConfiguration { try { switch (this.webApplicationType) { case WebApplicationType.SERVLET: - contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS) + contextClass = Class.forName(MicronautGrailsApp.DEFAULT_SERVLET_WEB_CONTEXT_CLASS) break case WebApplicationType.REACTIVE: - contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS) + contextClass = Class.forName(MicronautGrailsApp.DEFAULT_REACTIVE_WEB_CONTEXT_CLASS) break default: - contextClass = Class.forName(DEFAULT_CONTEXT_CLASS) + contextClass = Class.forName(MicronautGrailsApp.DEFAULT_CONTEXT_CLASS) } } catch (ClassNotFoundException ex) { @@ -173,7 +172,7 @@ class DefaultApplication extends GrailsAutoConfiguration { def micronautContext = new DefaultApplicationContext(micronautConfiguration) { @Override - protected DefaultEnvironment createEnvironment(@Nonnull ApplicationContextConfiguration configuration) { + protected DefaultEnvironment createEnvironment(ApplicationContextConfiguration configuration) { return configureMicronautEnvironment.call(super.createEnvironment(configuration)) as DefaultEnvironment } } diff --git a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy similarity index 89% rename from examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy rename to examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy index 26b5de12..e727aae3 100644 --- a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy +++ b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/DirectlyInjected.groovy @@ -23,7 +23,6 @@ import groovy.transform.CompileStatic import io.micronaut.context.ApplicationContext import io.micronaut.context.annotation.Value -import javax.annotation.Nullable import javax.inject.Singleton @Singleton @@ -39,9 +38,9 @@ class DirectlyInjected { DirectlyInjected( ManagerService managerService, ApplicationContext micronautContext, - @Nullable @Value('${micronaut.foo.bar}') String valueWithMicronautPrefix, - @Nullable @Value('${bar.foo}') String valueWithoutPrefix, - @Nullable @Value('${ex.foo.bar}') String ignoredValue + @Value('${micronaut.foo.bar:}') String valueWithMicronautPrefix, + @Value('${bar.foo:}') String valueWithoutPrefix, + @Value('${ex.foo.bar:}') String ignoredValue ) { this.ignoredValue = ignoredValue this.valueWithoutPrefix = valueWithoutPrefix diff --git a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/ExampleConfiguration.groovy b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/ExampleConfiguration.groovy similarity index 100% rename from examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/ExampleConfiguration.groovy rename to examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/ExampleConfiguration.groovy diff --git a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy similarity index 89% rename from examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy rename to examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy index f5583119..83d58344 100644 --- a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy +++ b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedUsingBridge.groovy @@ -22,7 +22,6 @@ import groovy.transform.CompileStatic import io.micronaut.context.ApplicationContext import io.micronaut.context.annotation.Value -import javax.annotation.Nullable import javax.inject.Singleton @Singleton @@ -38,9 +37,9 @@ class InjectedUsingBridge { InjectedUsingBridge( ManagerService managerService, ApplicationContext micronautContext, - @Nullable @Value('${micronaut.foo.bar}') String valueWithMicronautPrefix, - @Nullable @Value('${bar.foo}') String valueWithoutPrefix, - @Nullable @Value('${ex.foo.bar}') String ignoredvalue + @Value('${micronaut.foo.bar:}') String valueWithMicronautPrefix, + @Value('${bar.foo:}') String valueWithoutPrefix, + @Value('${ex.foo.bar:}') String ignoredvalue ) { this.managerService = managerService diff --git a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedUsingBridgeWithDifferentName.groovy b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedUsingBridgeWithDifferentName.groovy similarity index 100% rename from examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedUsingBridgeWithDifferentName.groovy rename to examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedUsingBridgeWithDifferentName.groovy diff --git a/examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedWithQualifier.groovy b/examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedWithQualifier.groovy similarity index 100% rename from examples/micronaut-grails-example/src/main/groovy/com/agorapulse/micronaut/grails/example/InjectedWithQualifier.groovy rename to examples/micronaut-grails-example/grails-app/utils/com/agorapulse/micronaut/grails/example/InjectedWithQualifier.groovy diff --git a/examples/micronaut-grails-example/micronaut-grails-example.gradle b/examples/micronaut-grails-example/micronaut-grails-example.gradle index 96de8829..acebeea4 100644 --- a/examples/micronaut-grails-example/micronaut-grails-example.gradle +++ b/examples/micronaut-grails-example/micronaut-grails-example.gradle @@ -21,7 +21,7 @@ buildscript { } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" - classpath "org.grails.plugins:hibernate5:7.0.4" + classpath "org.grails.plugins:hibernate5:7.2.0" classpath "com.bertramlabs.plugins:asset-pipeline-gradle:3.2.4" } } @@ -38,8 +38,6 @@ apply plugin:"eclipse" apply plugin:"idea" apply plugin:"war" apply plugin:"org.grails.grails-web" -apply plugin:"com.bertramlabs.asset-pipeline" -apply plugin:"org.grails.grails-gsp" repositories { maven { url "https://repo.grails.org/grails/core" } @@ -58,6 +56,12 @@ configurations { runtimeClasspath { extendsFrom developmentOnly } + + all { + exclude group: 'org.grails', module: 'grails-taglib' + exclude group: 'org.grails', module: 'grails-web-taglib' + exclude group: 'org.grails.plugins', module: 'gsp' + } } dependencies { @@ -82,13 +86,10 @@ dependencies { compile "org.grails:grails-plugin-services" compile "org.grails:grails-plugin-url-mappings" compile "org.grails:grails-plugin-interceptors" - compile "org.grails.plugins:cache" compile "org.grails.plugins:async" - compile "org.grails.plugins:scaffolding" compile "org.grails.plugins:events" compile "org.grails.plugins:hibernate5" - compile "org.hibernate:hibernate-core:5.4.18.Final" - compile "org.grails.plugins:gsp" + compile "org.hibernate:hibernate-core:$hibernateVersion" compileOnly "io.micronaut:micronaut-inject-groovy" console "org.grails:grails-console" profile "org.grails.profiles:web" @@ -96,7 +97,6 @@ dependencies { runtime "com.h2database:h2" runtime "org.apache.tomcat:tomcat-jdbc" runtime "javax.xml.bind:jaxb-api:2.3.1" - runtime "com.bertramlabs.plugins:asset-pipeline-grails:3.2.4" testCompile project(':micronaut-grails-integration-test') testCompile project(':micronaut-grails-jpa-generator') @@ -112,7 +112,7 @@ dependencies { testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:3.14.0" testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:3.14.0" - testCompile 'com.agorapulse.testing:fixt:0.2.1.1' + testCompile 'com.agorapulse.testing:fixt:0.2.3' } bootRun { @@ -132,8 +132,3 @@ tasks.withType(GroovyCompile) { forkOptions.jvmArgs = ['-Xmx1024m'] } } - -assets { - minifyJs = true - minifyCss = true -} diff --git a/examples/micronaut-grails-example/src/integration-test/resources/GebConfig.groovy b/examples/micronaut-grails-example/src/integration-test/resources/GebConfig.groovy deleted file mode 100644 index df5c3bee..00000000 --- a/examples/micronaut-grails-example/src/integration-test/resources/GebConfig.groovy +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * - * Copyright 2020 Vladimir Orany. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import org.openqa.selenium.chrome.ChromeDriver -import org.openqa.selenium.chrome.ChromeOptions -import org.openqa.selenium.firefox.FirefoxDriver - -environments { - - // run via “./gradlew -Dgeb.env=chrome iT” - chrome { - driver = { new ChromeDriver() } - } - - // run via “./gradlew -Dgeb.env=chromeHeadless iT” - chromeHeadless { - driver = { - ChromeOptions o = new ChromeOptions() - o.addArguments('headless') - new ChromeDriver(o) - } - } - - // run via “./gradlew -Dgeb.env=firefox iT” - firefox { - driver = { new FirefoxDriver() } - } -} diff --git a/examples/micronaut-grails-example/src/test/groovy/micronaut/grails/example/IntegrationSpec.groovy b/examples/micronaut-grails-example/src/test/groovy/micronaut/grails/example/IntegrationSpec.groovy index 41698411..9dc7840d 100644 --- a/examples/micronaut-grails-example/src/test/groovy/micronaut/grails/example/IntegrationSpec.groovy +++ b/examples/micronaut-grails-example/src/test/groovy/micronaut/grails/example/IntegrationSpec.groovy @@ -29,10 +29,8 @@ class IntegrationSpec extends Specification { @Autowired MicronautJpaGenerator generator void 'application started'() { - when: - new URL("http://localhost:$serverPort").text - then: - noExceptionThrown() + expect: + new URL("http://localhost:$serverPort/test/health").text == 'OK' } } diff --git a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/ApplicationSpec/values.json b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/ApplicationSpec/values.json index 4b7880fe..10ed9a40 100644 --- a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/ApplicationSpec/values.json +++ b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/ApplicationSpec/values.json @@ -1,8 +1,8 @@ { "someDirectlyInjected": { - "valueWithMicronautPrefix": null, + "valueWithMicronautPrefix": "", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" }, "injectedUsingBridge": { "valueWithMicronautPrefix": null, diff --git a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/BridgeApplicationSpec/values.json b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/BridgeApplicationSpec/values.json index 4db242e8..54b1748c 100644 --- a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/BridgeApplicationSpec/values.json +++ b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/BridgeApplicationSpec/values.json @@ -1,12 +1,12 @@ { "someDirectlyInjected": { - "valueWithMicronautPrefix": null, + "valueWithMicronautPrefix": "", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" }, "injectedUsingBridge": { - "valueWithMicronautPrefix": null, + "valueWithMicronautPrefix": "", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" } } diff --git a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/DefaultApplicationSpec/values.json b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/DefaultApplicationSpec/values.json index 65765d48..9dbb3a5d 100644 --- a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/DefaultApplicationSpec/values.json +++ b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/DefaultApplicationSpec/values.json @@ -1,12 +1,12 @@ { "someDirectlyInjected": { - "valueWithMicronautPrefix": null, + "valueWithMicronautPrefix": "", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" }, "injectedUsingBridge": { "valueWithMicronautPrefix": "foobar", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" } } diff --git a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/LegacyApplicationSpec/values.json b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/LegacyApplicationSpec/values.json index 65765d48..9dbb3a5d 100644 --- a/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/LegacyApplicationSpec/values.json +++ b/examples/micronaut-grails-example/src/test/resources/micronaut/grails/example/LegacyApplicationSpec/values.json @@ -1,12 +1,12 @@ { "someDirectlyInjected": { - "valueWithMicronautPrefix": null, + "valueWithMicronautPrefix": "", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" }, "injectedUsingBridge": { "valueWithMicronautPrefix": "foobar", "valueWithoutPrefix": "barfoo", - "ignoredValue": null + "ignoredValue": "" } } diff --git a/gradle.properties b/gradle.properties index 85c4d5de..83e2ac0e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ slug=agorapulse/micronaut-grails group=com.agorapulse version = 3.0.0-SNAPSHOT -micronautVersion = 1.2.11 +micronautVersion = 1.3.7 grailsVersion=4.0.4 gruVersion = 0.9.4 druVersion = 0.8.1 @@ -29,11 +29,13 @@ spockVersion = 2.0-groovy-2.5 junitVersion = 5.7.2 awsSdkVersion = 1.11.656 awsSdk2Version = 2.9.24 -testcontainersVersion = 1.16.2 +testcontainersVersion = 1.16.3 dockerApiVersion = 3.2.12 -groovyClosureSupportVersion = 0.6.0 +groovyClosureSupportVersion = 0.6.3 kordampVersion=0.46.0 nexusPluginVersion=1.0.0 +grailsTestingSupportVersion=2.1.2 +hibernateVersion=5.6.3.Final # this should be aligned to Micronaut version # required for AWS CBOR marshalling diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ebc2d518..8ee5e910 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 9962514a..23228f67 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,7 +17,7 @@ */ pluginManagement { repositories { - jcenter() + mavenCentral() gradlePluginPortal() } plugins { diff --git a/subprojects/micronaut-grails-integration-test/micronaut-grails-integration-test.gradle b/subprojects/micronaut-grails-integration-test/micronaut-grails-integration-test.gradle index 21882334..216ef881 100644 --- a/subprojects/micronaut-grails-integration-test/micronaut-grails-integration-test.gradle +++ b/subprojects/micronaut-grails-integration-test/micronaut-grails-integration-test.gradle @@ -23,5 +23,6 @@ config { dependencies { api project(':micronaut-grails') - api 'org.grails:grails-testing-support:2.1.2' + api "org.grails:grails-testing-support:$grailsTestingSupportVersion" + implementation 'org.opentest4j:opentest4j:1.2.0' } diff --git a/subprojects/micronaut-grails-integration-test/src/main/groovy/com/agorapulse/micronaut/grails/test/MicronautGrailsIntegrationTestMixinTransformation.groovy b/subprojects/micronaut-grails-integration-test/src/main/groovy/com/agorapulse/micronaut/grails/test/MicronautGrailsIntegrationTestMixinTransformation.groovy index 6af44807..36eb439e 100644 --- a/subprojects/micronaut-grails-integration-test/src/main/groovy/com/agorapulse/micronaut/grails/test/MicronautGrailsIntegrationTestMixinTransformation.groovy +++ b/subprojects/micronaut-grails-integration-test/src/main/groovy/com/agorapulse/micronaut/grails/test/MicronautGrailsIntegrationTestMixinTransformation.groovy @@ -188,7 +188,7 @@ class MicronautGrailsIntegrationTestMixinTransformation implements ASTTransforma if (servletApi != null) { - if( GrailsASTUtils.findAnnotation(classNode, SpringBootTest) == null) { + if (GrailsASTUtils.findAnnotation(classNode, SpringBootTest) == null) { AnnotationNode webIntegrationTestAnnotation = GrailsASTUtils.addAnnotationOrGetExisting(classNode, SpringBootTest) webIntegrationTestAnnotation.addMember("webEnvironment", propX(classX(SpringBootTest.WebEnvironment), "RANDOM_PORT")) if(classNode.getProperty("serverPort") == null) { @@ -198,7 +198,7 @@ class MicronautGrailsIntegrationTestMixinTransformation implements ASTTransforma valueAnnotation.setMember("value", new ConstantExpression('${local.server.port}')) serverPortField.addAnnotation(valueAnnotation) - classNode.addProperty(new PropertyNode(serverPortField, Modifier.PUBLIC, null, null )) + classNode.addProperty(new PropertyNode(serverPortField, Modifier.PUBLIC, null, null)) } } } else { @@ -256,4 +256,5 @@ class MicronautGrailsIntegrationTestMixinTransformation implements ASTTransforma classNode.addMethod(method) } } + } diff --git a/subprojects/micronaut-grails-jpa-generator/micronaut-grails-jpa-generator.gradle b/subprojects/micronaut-grails-jpa-generator/micronaut-grails-jpa-generator.gradle index 6778cddd..81ce5796 100644 --- a/subprojects/micronaut-grails-jpa-generator/micronaut-grails-jpa-generator.gradle +++ b/subprojects/micronaut-grails-jpa-generator/micronaut-grails-jpa-generator.gradle @@ -22,5 +22,6 @@ config { } dependencies { - implementation 'org.grails:grails-datastore-gorm-hibernate5:7.0.4.RELEASE' + implementation platform("org.grails:grails-bom:${grailsVersion}") + implementation 'org.grails:grails-datastore-gorm-hibernate5' } diff --git a/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJdbcGenerator.groovy b/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJdbcGenerator.groovy index b494cb7a..ad088293 100644 --- a/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJdbcGenerator.groovy +++ b/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJdbcGenerator.groovy @@ -48,4 +48,5 @@ class MicronautJdbcGenerator extends MicronautDataGenerator { } """.stripIndent().trim() } + } diff --git a/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJpaGenerator.groovy b/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJpaGenerator.groovy index 0328ec0b..c3cb26ed 100644 --- a/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJpaGenerator.groovy +++ b/subprojects/micronaut-grails-jpa-generator/src/main/groovy/com/agorapulse/micronaut/grails/jpa/generator/MicronautJpaGenerator.groovy @@ -56,4 +56,5 @@ class MicronautJpaGenerator extends MicronautDataGenerator { } """.stripIndent().trim() } + } diff --git a/subprojects/micronaut-grails-web-boot/src/main/groovy/com/agorapulse/micronaut/grails/web/boot/MicronautGrailsAppServletInitializer.java b/subprojects/micronaut-grails-web-boot/src/main/groovy/com/agorapulse/micronaut/grails/web/boot/MicronautGrailsAppServletInitializer.java index 0320430e..31b82ad7 100644 --- a/subprojects/micronaut-grails-web-boot/src/main/groovy/com/agorapulse/micronaut/grails/web/boot/MicronautGrailsAppServletInitializer.java +++ b/subprojects/micronaut-grails-web-boot/src/main/groovy/com/agorapulse/micronaut/grails/web/boot/MicronautGrailsAppServletInitializer.java @@ -55,7 +55,7 @@ protected WebApplicationContext createRootApplicationContext(ServletContext serv builder.initializers(new ParentContextApplicationContextInitializer(parent)); } builder.initializers(new ServletContextApplicationContextInitializer(servletContext)); - builder.contextClass(AnnotationConfigServletWebServerApplicationContext.class); + builder.contextFactory(webApplicationType -> new AnnotationConfigServletWebServerApplicationContext()); builder = configure(builder); SpringApplication application = builder.build(); if (application.getAllSources().isEmpty() && AnnotationUtils.findAnnotation(getClass(), Configuration.class) != null) { diff --git a/subprojects/micronaut-grails-web-boot/src/main/groovy/org/grails/compiler/boot/micronaut/BootInitializerClassInjector.groovy b/subprojects/micronaut-grails-web-boot/src/main/groovy/org/grails/compiler/boot/micronaut/BootInitializerClassInjector.groovy index b1fad6bb..db846c01 100644 --- a/subprojects/micronaut-grails-web-boot/src/main/groovy/org/grails/compiler/boot/micronaut/BootInitializerClassInjector.groovy +++ b/subprojects/micronaut-grails-web-boot/src/main/groovy/org/grails/compiler/boot/micronaut/BootInitializerClassInjector.groovy @@ -85,11 +85,11 @@ class BootInitializerClassInjector extends GlobalClassInjectorAdapter { @Override void performInjectionInternal(SourceUnit source, ClassNode classNode) { // if this is a plugin source, then exit - if( classNode.getAnnotations(PLUGIN_SOURCE_ANNOTATION) ) { + if (classNode.getAnnotations(PLUGIN_SOURCE_ANNOTATION)) { return } // don't generate for plugins - if( classNode.getNodeMetaData('isPlugin') ) return + if (classNode.getNodeMetaData('isPlugin')) return if(GrailsASTUtils.isAssignableFrom(GRAILS_CONFIGURATION_CLASS_NODE, classNode) && !GrailsASTUtils.isSubclassOfOrImplementsInterface(classNode, GrailsPluginApplication.name)) { @@ -100,7 +100,7 @@ class BootInitializerClassInjector extends GlobalClassInjectorAdapter { def mainMethodBody = mn.code if(mainMethodBody instanceof BlockStatement) { BlockStatement bs = (BlockStatement)mainMethodBody - if( !bs.statements.isEmpty() ) { + if (!bs.statements.isEmpty()) { def methodCallExpression = new MethodCallExpression( new ClassExpression(ClassHelper.make(System)), @@ -124,8 +124,8 @@ class BootInitializerClassInjector extends GlobalClassInjectorAdapter { def parameter = new Parameter(springApplicationBuilder, "application") def methodBody = new BlockStatement() - methodBody.addStatement( new ExpressionStatement( new MethodCallExpression( new VariableExpression(parameter), "sources", new ClassExpression(classNode)))) - loaderClassNode.addMethod( new MethodNode("configure", Modifier.PROTECTED, springApplicationBuilder, [parameter] as Parameter[], [] as ClassNode[], methodBody)) + methodBody.addStatement(new ExpressionStatement(new MethodCallExpression(new VariableExpression(parameter), 'sources', new ClassExpression(classNode)))) + loaderClassNode.addMethod(new MethodNode("configure", Modifier.PROTECTED, springApplicationBuilder, [parameter] as Parameter[], [] as ClassNode[], methodBody)) source.getAST().addClass( loaderClassNode ) @@ -135,4 +135,5 @@ class BootInitializerClassInjector extends GlobalClassInjectorAdapter { } } } + } diff --git a/subprojects/micronaut-grails/micronaut-grails.gradle b/subprojects/micronaut-grails/micronaut-grails.gradle index ff10bc99..28947e39 100644 --- a/subprojects/micronaut-grails/micronaut-grails.gradle +++ b/subprojects/micronaut-grails/micronaut-grails.gradle @@ -22,7 +22,7 @@ config { } dependencies { - api 'io.micronaut:micronaut-spring' + api micronautMigratedDependency('micronaut-spring') compileOnly "org.grails:grails-core:$grailsVersion" @@ -31,6 +31,6 @@ dependencies { exclude group: "org.codehaus.groovy", module: "groovy-all" } - testImplementation group: 'com.agorapulse', name: 'micronaut-aws-sdk-sns', version: '1.2.10.2' - testImplementation group: 'com.agorapulse', name: 'micronaut-aws-sdk-sqs', version: '1.2.10.2' + testImplementation group: 'com.agorapulse', name: 'micronaut-amazon-awssdk-sns', version: "1.6.1-micronaut-${micronautVersion[0]}.0" + testImplementation group: 'com.agorapulse', name: 'micronaut-amazon-awssdk-sqs', version: "1.6.1-micronaut-${micronautVersion[0]}.0" } diff --git a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java index a2f34252..9478d770 100644 --- a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java +++ b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/GrailsPropertyTranslatingEnvironment.java @@ -17,9 +17,11 @@ */ package com.agorapulse.micronaut.grails; +import io.micronaut.context.ApplicationContextConfiguration; import io.micronaut.context.env.DefaultEnvironment; import io.micronaut.core.convert.ArgumentConversionContext; import io.micronaut.core.convert.ConversionService; +import io.micronaut.core.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.AbstractEnvironment; @@ -27,8 +29,17 @@ import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; +import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; class GrailsPropertyTranslatingEnvironment extends DefaultEnvironment { @@ -36,14 +47,20 @@ class GrailsPropertyTranslatingEnvironment extends DefaultEnvironment { private final Environment environment; private final PropertyTranslatingCustomizer customizer; + private final Map multilayer = new LinkedHashMap<>(); GrailsPropertyTranslatingEnvironment(Environment environment, PropertyTranslatingCustomizer customizer, List expectedMapProperties) { - super(environment.getActiveProfiles()); + super(new ApplicationContextConfiguration() { + @Nonnull + @Override + public List getEnvironments() { + return Arrays.asList(environment.getActiveProfiles()); + } + }); this.environment = environment; this.customizer = customizer; if (environment instanceof AbstractEnvironment) { - Map multilayer = new LinkedHashMap<>(); AbstractEnvironment abEnv = (AbstractEnvironment) environment; for (PropertySource source : abEnv.getPropertySources()) { if (source instanceof MapPropertySource) { @@ -128,6 +145,35 @@ public boolean containsProperties(@Nullable String name) { return containsProperty(name); } + // Added at MN 2.x + // @Override + public Collection getPropertyEntries(String name) { + if (multilayer.containsKey(name)) { + Map value = (Map) multilayer.get(name); + return value.keySet(); + } + + // taken from PropertySourcePropertyResolver 2.x + if (!StringUtils.isEmpty(name)) { + // Cannot use PropertyCatalog.NORMALIZED as it does not exist in 1.x + Map entries = resolveEntriesForKey(name, false); + if (entries != null) { + String prefix = name + '.'; + return entries.keySet().stream().filter(k -> k.startsWith(prefix)) + .map(k -> { + String withoutPrefix = k.substring(prefix.length()); + int i = withoutPrefix.indexOf('.'); + if (i > -1) { + return withoutPrefix.substring(0, i); + } + return withoutPrefix; + }) + .collect(Collectors.toSet()); + } + } + return Collections.emptySet(); + } + @Override public Optional getProperty(@Nullable String name, ArgumentConversionContext conversionContext) { Class type = conversionContext.getArgument().getType(); diff --git a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/MicronautGrailsApp.java b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/MicronautGrailsApp.java index cccf8372..c5542843 100644 --- a/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/MicronautGrailsApp.java +++ b/subprojects/micronaut-grails/src/main/groovy/com/agorapulse/micronaut/grails/MicronautGrailsApp.java @@ -48,6 +48,29 @@ public class MicronautGrailsApp extends GrailsApp { public static final String ENVIRONMENT_LEGACY = "micronaut-grails-legacy"; public static final String ENVIRONMENT = "micronaut-grails"; + + // removed from the latest SpringApplication + /** + * The class name of application context that will be used by default for non-web + * environments. + */ + public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context." + + "annotation.AnnotationConfigApplicationContext"; + + /** + * The class name of application context that will be used by default for web + * environments. + */ + public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot." + + "web.servlet.context.AnnotationConfigServletWebServerApplicationContext"; + + /** + * The class name of application context that will be used by default for reactive web + * environments. + */ + public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework." + + "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext"; + private class MicronautGrailsAppContextConfiguration implements ApplicationContextConfiguration { private final ClassLoader applicationClassLoader; private final MicronautGrailsAutoConfiguration configuration; @@ -96,7 +119,7 @@ public MicronautGrailsAppContext(MicronautGrailsAppContextConfiguration micronau @Override @Nonnull protected DefaultEnvironment createEnvironment(@Nonnull ApplicationContextConfiguration c) { - DefaultEnvironment environment = super.createEnvironment(c); + DefaultEnvironment environment = (DefaultEnvironment) super.createEnvironment(c); ((MicronautGrailsAppContextConfiguration)c).getConfiguration().configureEnvironment(environment); return environment; } diff --git a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.groovy b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.groovy index 7e8f66d2..6d533359 100644 --- a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.groovy +++ b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.groovy @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.grails +import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import io.micronaut.context.annotation.Factory import io.micronaut.context.annotation.Primary @@ -43,6 +44,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME /** * Tests for micronaut Spring bean processor. */ +@CompileDynamic @ContextConfiguration(classes = [GrailsConfig, MicronautGrailsConfiguration]) @TestPropertySource('classpath:com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.properties') class GrailsMicronautBeanProcessorSpec extends Specification { @@ -98,6 +100,7 @@ class GrailsMicronautBeanProcessorSpec extends Specification { !translatingEnvironment.containsProperty('redis.host') !translatingEnvironment.getProperty('redis.host', String).present } + } // tag::configuration[] @@ -107,7 +110,7 @@ class GrailsConfig { @Bean MicronautBeanImporter myImporter() { // <2> - MicronautBeanImporter.create() + return MicronautBeanImporter.create() .addByType(Widget) // <3> .addByType('someInterface', SomeInterface) // <4> .addByStereotype('custom', SomeCustomScope) // <5> @@ -124,20 +127,30 @@ class GrailsConfig { } // end::configuration[] -interface SomeInterface { } +@CompileStatic +interface SomeInterface { + +} @Singleton -class SomeImplementation implements SomeInterface { } +@CompileStatic +class SomeImplementation implements SomeInterface { +} + +@CompileStatic class SomeNamed { + final String name SomeNamed(String name) { this.name = name } + } @Factory +@CompileStatic class SomeNamedFactory { @io.micronaut.context.annotation.Bean @@ -158,20 +171,32 @@ class SomeNamedFactory { @Primary @Singleton -class Widget { } +@CompileStatic +class Widget { + +} @Singleton +@CompileStatic @Requires(notEnv = 'test') -class TestWidget extends Widget { } +class TestWidget extends Widget { + +} -interface Minion { } +interface Minion { + +} @Documented @Retention(RUNTIME) @Scope +@CompileStatic @io.micronaut.context.annotation.Bean -@interface SomeCustomScope { } +@interface SomeCustomScope { + +} +@CompileStatic @SomeCustomScope class CustomBean { @@ -188,15 +213,25 @@ class CustomBean { this.redisPort = redisPort this.redisTimeout = redisTimeout } + } @Singleton +@CompileStatic @Named('gadget') -class SomeGadget { } +class SomeGadget { + +} @Singleton +@CompileStatic @Named('other') -class OtherMinion implements Minion { } +class OtherMinion implements Minion { + +} @Singleton -class NormalMinion implements Minion { } +@CompileStatic +class NormalMinion implements Minion { + +} diff --git a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/LegacyGrailsMicronautBeanProcessorSpec.groovy b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/LegacyGrailsMicronautBeanProcessorSpec.groovy index 0f16558b..fdac1932 100644 --- a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/LegacyGrailsMicronautBeanProcessorSpec.groovy +++ b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/LegacyGrailsMicronautBeanProcessorSpec.groovy @@ -17,6 +17,7 @@ */ package com.agorapulse.micronaut.grails +import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import io.micronaut.inject.qualifiers.Qualifiers import org.springframework.beans.factory.annotation.Autowired @@ -31,6 +32,7 @@ import spock.lang.Specification /** * Tests for micronaut Spring bean processor. */ +@CompileDynamic @ContextConfiguration(classes = [GrailsLegacyConfig]) @TestPropertySource('classpath:com/agorapulse/micronaut/grails/GrailsMicronautBeanProcessorSpec.properties') class LegacyGrailsMicronautBeanProcessorSpec extends Specification { @@ -67,6 +69,7 @@ class LegacyGrailsMicronautBeanProcessorSpec extends Specification { prototypeBean.redisPort == REDIS_PORT prototypeBean.redisTimeout == REDIS_TIMEOUT } + } // tag::configuration[] @@ -76,7 +79,7 @@ class GrailsLegacyConfig { @Bean GrailsMicronautBeanProcessor widgetProcessor() { - GrailsMicronautBeanProcessor + return GrailsMicronautBeanProcessor .builder() .addByType(Widget) .addByType('someInterface', SomeInterface) diff --git a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/PropertyTranslatingCustomizerSpec.groovy b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/PropertyTranslatingCustomizerSpec.groovy index 8c7e9a77..77d5864c 100644 --- a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/PropertyTranslatingCustomizerSpec.groovy +++ b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/PropertyTranslatingCustomizerSpec.groovy @@ -17,11 +17,13 @@ */ package com.agorapulse.micronaut.grails +import groovy.transform.CompileDynamic import spock.lang.Specification /** * Tests for property translating customizer. */ +@CompileDynamic class PropertyTranslatingCustomizerSpec extends Specification { void 'custom replacements works'() { @@ -36,10 +38,10 @@ class PropertyTranslatingCustomizerSpec extends Specification { .build() then: - customizer.getAlternativeNames(null).isEmpty() - customizer.getAlternativeNames('').isEmpty() - customizer.getAlternativeNames('foo.bar').isEmpty() - customizer.getAlternativeNames('foo.gar').isEmpty() + customizer.getAlternativeNames(null).empty + customizer.getAlternativeNames('').empty + customizer.getAlternativeNames('foo.bar').empty + customizer.getAlternativeNames('foo.gar').empty customizer.getAlternativeNames('foo.baz') == ['bar.baz', 'baz'] as Set customizer.getAlternativeNames('baz') == ['foo.baz'] as Set } @@ -49,9 +51,9 @@ class PropertyTranslatingCustomizerSpec extends Specification { PropertyTranslatingCustomizer customizer = PropertyTranslatingCustomizer.none() then: - customizer.getAlternativeNames('foo.bar').isEmpty() - customizer.getAlternativeNames('foo.baz').isEmpty() - customizer.getAlternativeNames('baz').isEmpty() + customizer.getAlternativeNames('foo.bar').empty + customizer.getAlternativeNames('foo.baz').empty + customizer.getAlternativeNames('baz').empty } void 'standard replacements works'() { @@ -62,7 +64,7 @@ class PropertyTranslatingCustomizerSpec extends Specification { .build() then: - customizer.getAlternativeNames('redis.timeout').isEmpty() + customizer.getAlternativeNames('redis.timeout').empty customizer.getAlternativeNames('redis.port') == ['grails.redis.port'] as Set customizer.getAlternativeNames('micronaut.redis.port') == ['grails.redis.port', 'grails.micronaut.redis.port'] as Set customizer.getAlternativeNames('micronaut.server.url') == ['grails.server.url', 'grails.micronaut.server.url'] as Set diff --git a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/SimpleNotificationServiceConfigurationSpec.groovy b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/SimpleNotificationServiceConfigurationSpec.groovy index cc8958b3..2cecc333 100644 --- a/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/SimpleNotificationServiceConfigurationSpec.groovy +++ b/subprojects/micronaut-grails/src/test/groovy/com/agorapulse/micronaut/grails/SimpleNotificationServiceConfigurationSpec.groovy @@ -17,9 +17,10 @@ */ package com.agorapulse.micronaut.grails -import com.agorapulse.micronaut.aws.sns.SimpleNotificationService -import com.agorapulse.micronaut.aws.sns.SimpleNotificationServiceConfiguration -import com.agorapulse.micronaut.aws.sqs.SimpleQueueService +import com.agorapulse.micronaut.amazon.awssdk.sns.SimpleNotificationService +import com.agorapulse.micronaut.amazon.awssdk.sns.SimpleNotificationServiceConfiguration +import com.agorapulse.micronaut.amazon.awssdk.sqs.SimpleQueueService +import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import io.micronaut.inject.qualifiers.Qualifiers import org.springframework.beans.factory.annotation.Autowired @@ -33,6 +34,7 @@ import spock.lang.Specification /** * Tests for micronaut Spring bean processor. */ +@CompileDynamic @ContextConfiguration(classes = [GrailsSimpleNotificationServiceConfig, MicronautGrailsConfiguration]) @TestPropertySource('classpath:com/agorapulse/micronaut/grails/SimpleNotificationServiceConfigurationSpec.properties') class SimpleNotificationServiceConfigurationSpec extends Specification { @@ -52,6 +54,7 @@ class SimpleNotificationServiceConfigurationSpec extends Specification { configuration.android configuration.android.arn == ARN } + } @CompileStatic @@ -60,7 +63,7 @@ class GrailsSimpleNotificationServiceConfig { @Bean MicronautBeanImporter myImporter() { - MicronautBeanImporter.create() + return MicronautBeanImporter.create() .customize(PropertyTranslatingCustomizer .builder() .replacePrefix('aws.sns', 'grails.plugin.awssdk.sns')