diff --git a/gdk-core/build.gradle b/gdk-core/build.gradle index bd09d78..a684d28 100644 --- a/gdk-core/build.gradle +++ b/gdk-core/build.gradle @@ -44,6 +44,17 @@ dependencies { exclude group: 'org.eclipse.jgit', module: 'org.eclipse.jgit' } implementation(mnLibs.micronaut.http.client) + implementation(libs.netty.buffer) + implementation(libs.netty.codec) + implementation(libs.netty.codec.http) + implementation(libs.netty.codec.http2) + implementation(libs.netty.codec.socks) + implementation(libs.netty.common) + implementation(libs.netty.handler) + implementation(libs.netty.handler.proxy) + implementation(libs.netty.resolver) + implementation(libs.netty.transport) + implementation(libs.netty.transport.native.unix.common) } def writeVersions = tasks.register('writeVersions', cloud.graal.gdk.util.WriteVersionsTask) { diff --git a/gdk-core/src/main/java/cloud/graal/gdk/GdkProjectCreator.java b/gdk-core/src/main/java/cloud/graal/gdk/GdkProjectCreator.java index fcdbcf6..ad6d2dc 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/GdkProjectCreator.java +++ b/gdk-core/src/main/java/cloud/graal/gdk/GdkProjectCreator.java @@ -144,7 +144,7 @@ private JdkVersion jdkVersion(Integer majorVersion) { return JdkVersion.valueOf(majorVersion); } - private List derivedFeatures(List clouds, + public List derivedFeatures(List clouds, List services, List features, GdkProjectType projectType) { diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsGroovy.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsGroovy.rocker.raw index d0e9639..c84c4c9 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsGroovy.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsGroovy.rocker.raw @@ -35,16 +35,12 @@ abstract class EnforceBomDependencies implements ComponentMetadataRule { constraints.each { constraint -> String key = "${constraint.group}:${constraint.module}" if (gdkBomConstraints.containsKey(key)) { - String version = constraint.versionConstraint.requiredVersion - String gdkVersionWithoutSuffix = gdkBomConstraints.get(key).replaceAll(/-oracle-\d+$/, '') - if (version == gdkVersionWithoutSuffix) { - constraint.version { - strictly(gdkBomConstraints[key]) - } + constraint.version { + strictly(gdkBomConstraints[key]) } } } } } } -} +} \ No newline at end of file diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsKotlin.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsKotlin.rocker.raw index 46469ca..db4d643 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsKotlin.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/create/template/EnforceVersionsKotlin.rocker.raw @@ -34,14 +34,9 @@ open class EnforceBomDependencies : ComponentMetadataRule { forEach { constraint -> val key = "${constraint.group}:${constraint.module}" if (gdkBomConstraints.containsKey(key)) { - val version = constraint.versionConstraint.requiredVersion - val gdkVersionWithoutSuffix = gdkBomConstraints[key]?.replace(Regex("-oracle-\\d+$"), "") - - if (version == gdkVersionWithoutSuffix) { - constraint.version { - gdkBomConstraints[key]?.let { newVersion -> - strictly(newVersion) - } + constraint.version { + gdkBomConstraints[key]?.let { newVersion -> + strictly(newVersion) } } } @@ -50,4 +45,4 @@ open class EnforceBomDependencies : ComponentMetadataRule { } } -} +} \ No newline at end of file diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPlugin.java b/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPlugin.java new file mode 100644 index 0000000..4157b6a --- /dev/null +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPlugin.java @@ -0,0 +1,70 @@ +/* + * Copyright 2025 Oracle and/or its affiliates + * + * 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. + */ +package cloud.graal.gdk.feature.misc; + +import cloud.graal.gdk.GdkGeneratorContext; +import io.micronaut.core.annotation.NonNull; +import io.micronaut.starter.application.ApplicationType; +import io.micronaut.starter.application.generator.GeneratorContext; +import io.micronaut.starter.feature.Feature; +import io.micronaut.starter.feature.graalvm.GraalVM; +import io.micronaut.starter.options.BuildTool; +import jakarta.inject.Singleton; + +@Singleton +public class CycloneDXPlugin implements Feature { + + /** + * The feature name. + */ + public static final String NAME = "cyclone-dx-plugin"; + + private static final CycloneDXPluginPostProcessor CYCLONE_DX_POST_PROCESSOR = new CycloneDXPluginPostProcessor(BuildTool.GRADLE); + + private final GraalVM graalvm; + + public CycloneDXPlugin(GraalVM graalvm) { + this.graalvm = graalvm; + } + + @Override + public void apply(GeneratorContext ctx) { + if (ctx.getBuildTool().isGradle()) { + String template = "build"; + if (!((GdkGeneratorContext) ctx).getCloud().getModuleName().isBlank()) { + template = template + "-" + ((GdkGeneratorContext) ctx).getCloud().getModuleName(); + } + ((GdkGeneratorContext) ctx).addPostProcessor(template, CYCLONE_DX_POST_PROCESSOR); + } + } + + @NonNull + @Override + public String getName() { + return NAME; + } + + @Override + public boolean supports(ApplicationType applicationType) { + return true; + } + + @Override + public boolean isVisible() { + return false; + } + +} diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPluginPostProcessor.java b/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPluginPostProcessor.java new file mode 100644 index 0000000..9271c44 --- /dev/null +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/misc/CycloneDXPluginPostProcessor.java @@ -0,0 +1,55 @@ +/* + * Copyright 2025 Oracle and/or its affiliates + * + * 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. + */ +package cloud.graal.gdk.feature.misc; + +import cloud.graal.gdk.template.TemplatePostProcessor; +import io.micronaut.core.annotation.NonNull; +import io.micronaut.starter.options.BuildTool; + +public class CycloneDXPluginPostProcessor implements TemplatePostProcessor { + + private static final String PLUGIN_START = "plugins {"; + private static final String CYCLONE_DX_PLUGIN = "\n\tid 'org.cyclonedx.bom' version '2.1.0'"; + + private static final String CYCLONE_DX_CONFIG = """ + cyclonedxBom { + includeConfigs = ["compileClasspath", "runtimeClasspath"] + } + """; + + private final BuildTool buildTool; + + public CycloneDXPluginPostProcessor(BuildTool buildTool) { + this.buildTool = buildTool; + } + + @NonNull + @Override + public String process(@NonNull String input) { + String result = input; + if (buildTool.isGradle()) { + int start = input.indexOf(PLUGIN_START); + if (start >= 0) { + start += PLUGIN_START.length(); + String top = input.substring(0, start); + String bottom = input.substring(start); + result = top + CYCLONE_DX_PLUGIN + bottom + CYCLONE_DX_CONFIG; + } + } + return result; + } + +} diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreControllerJava.rocker.raw index bceecc4..2bfd07a 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreControllerJava.rocker.raw @@ -28,22 +28,22 @@ import java.util.Optional; import static io.micronaut.http.HttpHeaders.LOCATION; import static io.micronaut.http.HttpStatus.NO_CONTENT; -@@ExecuteOn(TaskExecutors.IO) -@@Controller("/genres") +@@ExecuteOn(TaskExecutors.IO) // <1> +@@Controller("/genres") // <2> class GenreController { private final GenreService genreService; - GenreController(GenreService genreService) { + GenreController(GenreService genreService) { // <3> this.genreService = genreService; } - @@Get("/{id}") + @@Get("/{id}") // <4> public Optional show(Long id) { return genreService.findById(id); } - @@Put("/{id}/{name}") + @@Put("/{id}/{name}") // <5> public HttpResponse update(long id, String name) { genreService.update(id, name); return HttpResponse @@ -51,12 +51,12 @@ class GenreController { .header(LOCATION, URI.create("/genres/" + id).getPath()); } - @@Get("/list") + @@Get("/list") // <6> public List list(@@Valid Pageable pageable) { return genreService.list(pageable); } - @@Post + @@Post // <7> public HttpResponse save(@@Body("name") @@NotBlank String name) { Genre genre = genreService.save(name); @@ -65,7 +65,7 @@ class GenreController { .headers(headers -> headers.location(URI.create("/genres/" + genre.getId()))); } - @@Delete("/{id}") + @@Delete("/{id}") // <8> @@Status(NO_CONTENT) public void delete(Long id) { genreService.delete(id); diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreRepositoryJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreRepositoryJava.rocker.raw index 55ebaa4..3e1ddfa 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreRepositoryJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/database/template/GenreRepositoryJava.rocker.raw @@ -15,8 +15,8 @@ import jakarta.validation.constraints.NotBlank; import static io.micronaut.data.model.query.builder.sql.Dialect.@(dialect); -@@JdbcRepository(dialect = @(dialect)) -public interface GenreRepository extends PageableRepository { +@@JdbcRepository(dialect = @(dialect)) // <1> +public interface GenreRepository extends PageableRepository { // <2> Genre save(@@NonNull @@NotBlank String name); diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsEmailSenderReplacementJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsEmailSenderReplacementJava.rocker.raw index f7e5e4d..adc9e7e 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsEmailSenderReplacementJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsEmailSenderReplacementJava.rocker.raw @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; -@@Requires(property = "spec.name", value = "MailControllerTest") +@@Requires(property = "spec.name", value = "MailControllerTest") // <1> @@Singleton @@Replaces(AsyncSesEmailSender.class) @@Named(AsyncSesEmailSender.NAME) diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerJava.rocker.raw index 1c7796a..3cb83af 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerJava.rocker.raw @@ -24,19 +24,19 @@ import software.amazon.awssdk.services.ses.model.SesResponse; import static io.micronaut.email.BodyType.HTML; import static io.micronaut.http.HttpStatus.UNPROCESSABLE_ENTITY; -@@Controller("/mail") +@@Controller("/mail") // <1> class MailController { private static final Logger LOG = LoggerFactory.getLogger(MailController.class); private final AsyncEmailSender emailSender; - MailController(AsyncEmailSender emailSender) { + MailController(AsyncEmailSender emailSender) { // <2> this.emailSender = emailSender; } - @@Post("/send") - public Publisher> send(@@Body("to") String to) { + @@Post("/send") // <3> + public Publisher> send(@@Body("to") String to) { // <4> return Mono.from(emailSender.sendAsync(Email.builder() .to(to) .subject("Sending email with Amazon SES is Fun") @@ -46,6 +46,6 @@ class MailController { LOG.info("message id: {}", ((SendEmailResponse) rsp).messageId()); } }).onErrorMap(EmailException.class, t -> new HttpStatusException(UNPROCESSABLE_ENTITY, "Email could not be sent")) - .map(rsp -> HttpResponse.accepted()); + .map(rsp -> HttpResponse.accepted()); // <5> } } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerTestJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerTestJava.rocker.raw index 99e41b5..aa6afa0 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerTestJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/AwsMailControllerTestJava.rocker.raw @@ -26,14 +26,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -@@Property(name = "spec.name", value = "MailControllerTest") +@@Property(name = "spec.name", value = "MailControllerTest") // <1> @@Property(name = "micronaut.email.from.email", value = "mo@@gdk.example") -@@MicronautTest +@@MicronautTest // <2> class MailControllerTest { @@Inject @@Client("/") - HttpClient httpClient; + HttpClient httpClient; // <3> @@Inject BeanContext beanContext; diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerJava.rocker.raw index 68c2813..05e9f4f 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerJava.rocker.raw @@ -17,28 +17,28 @@ import io.micronaut.scheduling.annotation.ExecuteOn; import static io.micronaut.email.BodyType.HTML; -@@ExecuteOn(TaskExecutors.IO) -@@Controller("/email") +@@ExecuteOn(TaskExecutors.IO) // <1> +@@Controller("/email") // <2> public class EmailController { private final EmailSender emailSender; - EmailController(EmailSender emailSender) { + EmailController(EmailSender emailSender) { // <3> this.emailSender = emailSender; } - @@Post("/send") - public HttpResponse send(@@Body("to") String to) { + @@Post("/send") // <4> + public HttpResponse send(@@Body("to") String to) { // <5> try { emailSender.send(Email.builder() .to(to) .subject("Sending email with JavaMail is Fun") - .body("and easy to do anywhere with Micronaut Email", HTML)); + .body("and easy to do anywhere with Micronaut Email", HTML)); // <6> } catch (EmailException ignored) { - return HttpResponse.unprocessableEntity(); + return HttpResponse.unprocessableEntity(); // <7> } - return HttpResponse.accepted(); + return HttpResponse.accepted(); // <8> } } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerTestJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerTestJava.rocker.raw index 8a93404..4c506db 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerTestJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/NonCloudMailControllerTestJava.rocker.raw @@ -27,14 +27,14 @@ import static io.micronaut.http.HttpStatus.ACCEPTED; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@@Property(name = "FROM_EMAIL", value = "bob@@gdk.example") +@@Property(name = "FROM_EMAIL", value = "bob@@gdk.example") // <1> @@Property(name = "FROM_PASSWORD", value = "example-password") -@@MicronautTest +@@MicronautTest // <2> public class EmailControllerTest { @@Inject @@Client("/") - HttpClient client; + HttpClient client; // <3> Email sentEmail; @@ -42,7 +42,7 @@ public class EmailControllerTest { void testSend() { var response = client.toBlocking().exchange( HttpRequest.POST("/email/send", - Map.of("to", "alice@@gdk.example"))); + Map.of("to", "alice@@gdk.example"))); // <4> assertEquals(ACCEPTED, response.status()); @@ -57,7 +57,7 @@ public class EmailControllerTest { } - @@MockBean(TransactionalEmailSender.class) + @@MockBean(TransactionalEmailSender.class) // <5> @@Named("mock") TransactionalEmailSender mockSender() { return new TransactionalEmailSender<>() { diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciEmailControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciEmailControllerJava.rocker.raw index c9be09d..a989fd4 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciEmailControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciEmailControllerJava.rocker.raw @@ -25,36 +25,36 @@ import static io.micronaut.http.MediaType.MULTIPART_FORM_DATA; import static io.micronaut.http.MediaType.TEXT_PLAIN; import static java.util.Collections.singletonMap; -@@ExecuteOn(TaskExecutors.IO) -@@Controller("/email") +@@ExecuteOn(TaskExecutors.IO) // <1> +@@Controller("/email") // <2> class OciEmailController { private final EmailSender emailSender; - OciEmailController(EmailSender emailSender) { + OciEmailController(EmailSender emailSender) { // <3> this.emailSender = emailSender; } - @@Post(uri = "/basic", produces = TEXT_PLAIN) + @@Post(uri = "/basic", produces = TEXT_PLAIN) // <4> String index() { emailSender.send(Email.builder() .to("basic@@gdk.example") .subject("Micronaut Email Basic Test: " + LocalDateTime.now()) - .body("Basic email")); + .body("Basic email")); // <5> return "Email sent."; } - @@Post(uri = "/template/{name}", produces = TEXT_PLAIN) + @@Post(uri = "/template/{name}", produces = TEXT_PLAIN) // <4> String template(String name) { emailSender.send(Email.builder() .to("template@@gdk.example") .subject("Micronaut Email Template Test: " + LocalDateTime.now()) .body(new TemplateBody<>(HTML, - new ModelAndView<>("email", singletonMap("name", name))))); + new ModelAndView<>("email", singletonMap("name", name))))); // <6> return "Email sent."; } - @@Post(uri = "/attachment", produces = TEXT_PLAIN, consumes = MULTIPART_FORM_DATA) + @@Post(uri = "/attachment", produces = TEXT_PLAIN, consumes = MULTIPART_FORM_DATA) // <7> String attachment(CompletedFileUpload file) throws IOException { emailSender.send(Email.builder() .to("attachment@@gdk.example") @@ -65,7 +65,7 @@ class OciEmailController { .contentType(file.getContentType().orElse(APPLICATION_OCTET_STREAM_TYPE).toString()) .content(file.getBytes()) .build() - )); + )); // <8> return "Email sent."; } } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciSessionProviderJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciSessionProviderJava.rocker.raw index 679eadb..d4cf308 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciSessionProviderJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/email/template/OciSessionProviderJava.rocker.raw @@ -16,7 +16,7 @@ import jakarta.mail.PasswordAuthentication; import jakarta.mail.Session; import java.util.Properties; -@@Singleton +@@Singleton // <1> class OciSessionProvider implements SessionProvider { private final Properties properties; @@ -24,8 +24,8 @@ class OciSessionProvider implements SessionProvider { private final String password; OciSessionProvider(MailPropertiesProvider provider, - @@Property(name = "smtp.user") String user, - @@Property(name = "smtp.password") String password) { + @@Property(name = "smtp.user") String user, // <2> + @@Property(name = "smtp.password") String password) { // <2> this.properties = provider.mailProperties(); this.user = user; this.password = password; @@ -37,7 +37,7 @@ class OciSessionProvider implements SessionProvider { return Session.getInstance(properties, new Authenticator() { @@Override protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(user, password); + return new PasswordAuthentication(user, password); // <3> } }); } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesApiJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesApiJava.rocker.raw index 7b47d19..ebe79d2 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesApiJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesApiJava.rocker.raw @@ -21,13 +21,13 @@ import static io.micronaut.http.MediaType.MULTIPART_FORM_DATA; public interface ProfilePicturesApi { - @@Post(uri = "/{userId}", consumes = MULTIPART_FORM_DATA) + @@Post(uri = "/{userId}", consumes = MULTIPART_FORM_DATA) // <1> HttpResponse upload(CompletedFileUpload fileUpload, String userId, HttpRequest request); - @@Get("/{userId}") + @@Get("/{userId}") // <2> Optional> download(String userId); - @@Status(NO_CONTENT) - @@Delete("/{userId}") + @@Status(NO_CONTENT) // <3> + @@Delete("/{userId}") // <4> void delete(String userId); } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesControllerJava.rocker.raw index a269798..f4a80cd 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/objectstore/template/ProfilePicturesControllerJava.rocker.raw @@ -26,14 +26,14 @@ import java.util.Optional; import static io.micronaut.http.HttpHeaders.ETAG; import static io.micronaut.http.MediaType.IMAGE_JPEG_TYPE; -@@Controller(ProfilePicturesController.PREFIX) -@@ExecuteOn(TaskExecutors.IO) +@@Controller(ProfilePicturesController.PREFIX) // <1> +@@ExecuteOn(TaskExecutors.IO) // <2> class ProfilePicturesController implements ProfilePicturesApi { static final String PREFIX = "/pictures"; - private final ObjectStorageOperations objectStorage; - private final HttpHostResolver httpHostResolver; + private final ObjectStorageOperations objectStorage; // <3> + private final HttpHostResolver httpHostResolver; // <4> ProfilePicturesController(ObjectStorageOperations objectStorage, HttpHostResolver httpHostResolver) { @@ -45,13 +45,13 @@ class ProfilePicturesController implements ProfilePicturesApi { public HttpResponse upload(CompletedFileUpload fileUpload, String userId, HttpRequest request) { - String key = buildKey(userId); - UploadRequest objectStorageUpload = UploadRequest.fromCompletedFileUpload(fileUpload, key); - UploadResponse response = objectStorage.upload(objectStorageUpload); + String key = buildKey(userId); // <1> + UploadRequest objectStorageUpload = UploadRequest.fromCompletedFileUpload(fileUpload, key); // <2> + UploadResponse response = objectStorage.upload(objectStorageUpload); // <3> return HttpResponse - .created(location(request, userId)) - .header(ETAG, response.getETag()); + .created(location(request, userId)) // <4> + .header(ETAG, response.getETag()); // <5> } private static String buildKey(String userId) { @@ -68,8 +68,8 @@ class ProfilePicturesController implements ProfilePicturesApi { @@Override public Optional> download(String userId) { String key = buildKey(userId); - return objectStorage.retrieve(key) - .map(ProfilePicturesController::buildStreamedFile); + return objectStorage.retrieve(key) // <1> + .map(ProfilePicturesController::buildStreamedFile); // <2> } private static HttpResponse buildStreamedFile(ObjectStorageEntry entry) { diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/secretmanagement/template/ClientIdControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/secretmanagement/template/ClientIdControllerJava.rocker.raw index 1e3079b..7c43bfe 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/secretmanagement/template/ClientIdControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/secretmanagement/template/ClientIdControllerJava.rocker.raw @@ -19,12 +19,12 @@ class ClientIdController { private final OauthClientConfiguration oauthClientConfiguration; - ClientIdController(@@Named("demo-oauth") OauthClientConfiguration oauthClientConfiguration) { + ClientIdController(@@Named("demo-oauth") OauthClientConfiguration oauthClientConfiguration) { // <1> this.oauthClientConfiguration = oauthClientConfiguration; } @@Secured(IS_ANONYMOUS) - @@Get(uri = "/oauth-client-id", produces = TEXT_PLAIN) + @@Get(uri = "/oauth-client-id", produces = TEXT_PLAIN) // <2> public String index() { return oauthClientConfiguration.getClientId(); } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/security/template/AuthControllerJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/security/template/AuthControllerJava.rocker.raw index ee5fbbf..cfd6b21 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/security/template/AuthControllerJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/security/template/AuthControllerJava.rocker.raw @@ -19,13 +19,13 @@ import java.util.Map; import static io.micronaut.security.rules.SecurityRule.IS_ANONYMOUS; import static io.micronaut.security.rules.SecurityRule.IS_AUTHENTICATED; -@@Controller +@@Controller // <1> class AuthController { - @@Secured(IS_ANONYMOUS) - @@View("auth") - @@Get - Map index(@@Nullable Authentication authentication) { + @@Secured(IS_ANONYMOUS) // <2> + @@View("auth") // <3> + @@Get // <4> + Map index(@@Nullable Authentication authentication) { // <5> Map model = new HashMap<>(); if (authentication != null) { model.put("username", authentication.getAttributes().get("@(nameAttr)")); @@ -35,9 +35,9 @@ class AuthController { return model; } - @@Secured(IS_AUTHENTICATED) - @@Get("/secure") + @@Secured(IS_AUTHENTICATED) // <6> + @@Get("/secure") // <7> Map secured() { - return Collections.singletonMap("secured", true); + return Collections.singletonMap("secured", true); // <8> } } diff --git a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/tracing/template/InventoryServiceJava.rocker.raw b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/tracing/template/InventoryServiceJava.rocker.raw index 617ff20..6057a52 100644 --- a/gdk-core/src/main/java/cloud/graal/gdk/feature/service/tracing/template/InventoryServiceJava.rocker.raw +++ b/gdk-core/src/main/java/cloud/graal/gdk/feature/service/tracing/template/InventoryServiceJava.rocker.raw @@ -79,7 +79,7 @@ public class InventoryService { "amount", count, "upc", getUPC(item))); - span.end(); + span.end(); // <6> } private int getUPC(String item) { diff --git a/gradle.properties b/gradle.properties index 29344e8..de42f20 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.parallel=true org.gradle.caching=true -version=4.7.3.1 +version=4.7.3.2 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c2f2a77..51b164e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ jline = '3.28.0' logback = '1.5.15' micronaut-plugins = '4.4.4' micronaut-starter = '4.7.4' +netty = "4.1.118.Final" reflections = '0.10.2' rocker = '1.4.0' shadow = '8.1.1' @@ -31,6 +32,9 @@ spotless = '6.25.0' test-logger = '4.0.0' tomlj = '1.1.1' micronaut-internal-build = '7.3.0' +micronaut-guides = '0.0.11' +micronaut-serde = '2.13.1' +micronaut-json = '1.4.0' [libraries] bouncycastle-bcpkix = { module = 'org.bouncycastle:bcpkix-jdk18on', version.ref = 'bouncycastle' } @@ -48,6 +52,17 @@ micronaut-application = { module = 'io.micronaut.gradle:micronaut-gradle-plugin' micronaut-library = { module = 'io.micronaut.gradle:micronaut-gradle-plugin', version.ref = 'micronaut-plugins' } micronaut-starter-api = { module = 'io.micronaut.starter:micronaut-starter-api', version.ref = 'micronaut-starter' } micronaut-starter-cli = { module = 'io.micronaut.starter:micronaut-cli', version.ref = 'micronaut-starter' } +netty-buffer = { module = "io.netty:netty-buffer", version.ref = "netty" } +netty-codec = { module = "io.netty:netty-codec", version.ref = "netty" } +netty-codec-http = { module = "io.netty:netty-codec-http", version.ref = "netty" } +netty-codec-http2 = { module = "io.netty:netty-codec-http2", version.ref = "netty" } +netty-codec-socks = { module = "io.netty:netty-codec-socks", version.ref = "netty" } +netty-common = { module = "io.netty:netty-common", version.ref = "netty" } +netty-handler = { module = "io.netty:netty-handler", version.ref = "netty" } +netty-handler-proxy = { module = "io.netty:netty-handler-proxy", version.ref = "netty" } +netty-resolver = { module = "io.netty:netty-resolver", version.ref = "netty" } +netty-transport = { module = "io.netty:netty-transport", version.ref = "netty" } +netty-transport-native-unix-common = { module = "io.netty:netty-transport-native-unix-common", version.ref = "netty" } reflections = { module = 'org.reflections:reflections', version.ref = 'reflections' } rocker = { module = 'com.fizzed:rocker-compiler', version.ref = 'rocker' } shadow = { module = 'com.github.johnrengelman:shadow', version.ref = 'shadow' } @@ -55,4 +70,9 @@ slf4j-nop = { module = 'org.slf4j:slf4j-nop', version.ref = 'slf4j' } spotless = { module = 'com.diffplug.spotless:spotless-plugin-gradle', version.ref = 'spotless' } test-logger = { module = 'com.adarshr:gradle-test-logger-plugin', version.ref = 'test-logger' } tomlj = { module = 'org.tomlj:tomlj', version.ref = 'tomlj' } +micronaut-guides = { module = 'io.micronaut.guides:micronaut-guides', version.ref = 'micronaut-guides' } +micronaut-serde-processor = { module = 'io.micronaut.serde:micronaut-serde-processor', version.ref = 'micronaut-serde' } +micronaut-serde-jackson = { module = 'io.micronaut.serde:micronaut-serde-jackson', version.ref = 'micronaut-serde' } +micronaut-json-processor = { module = 'io.micronaut.jsonschema:micronaut-json-schema-processor', version.ref = 'micronaut-json' } +micronaut-json-annotations = { module = 'io.micronaut.jsonschema:micronaut-json-schema-annotations', version.ref = 'micronaut-json' } micronaut-internal-build-bom = { module = 'io.micronaut.build.internal.bom:io.micronaut.build.internal.bom.gradle.plugin', version.ref = 'micronaut-internal-build' } diff --git a/gradle/templates.versions.toml b/gradle/templates.versions.toml index 1af97ea..64f8a69 100644 --- a/gradle/templates.versions.toml +++ b/gradle/templates.versions.toml @@ -36,7 +36,6 @@ dev-jna-jna = '5.14.0-oracle-00001' eclipse-angus-angus-activation = '2.0.2-oracle-00001' eclipse-angus-angus-mail = '2.0.3-oracle-00001' flipkart-zjsonpatch-zjsonpatch = '0.4.14-oracle-00002' -flyway = "10.22.0" gax = "2.59.0" gax-grpc = "2.59.0" gg-jte = '3.1.13-oracle-00001' @@ -93,7 +92,7 @@ micronaut-micrometer = "5.9.3-oracle-00001" micronaut-mongo = "5.5.0-oracle-00001" micronaut-object-storage = "2.7.0-oracle-00001" micronaut-openapi = "6.13.2-oracle-00001" -micronaut-oracle-cloud = "4.3.6-oracle-00004" +micronaut-oracle-cloud = "4.3.8-oracle-00002" micronaut-picocli = "5.6.0-oracle-00001" micronaut-platform = "4.7.3-oracle-00001" micronaut-reactor = "3.6.0-oracle-00001" @@ -104,7 +103,7 @@ micronaut-sql = "5.8.2-oracle-00001" micronaut-tracing = "6.9.0-oracle-00001" micronaut-validation = "4.8.0-oracle-00001" micronaut-views = "5.6.0-oracle-00001" -netty = "4.1.116.Final-oracle-00001" +netty = "4.1.118.Final-oracle-00001" okhttp = "4.12.0-oracle-00001" opentelemetry-instrumentation = '1.33.6-oracle-00001' opentelemetry-instrumentation-opentelemetry-instrumentation-api-semconv = '1.33.5-alpha-oracle-00001' @@ -149,6 +148,7 @@ io-micronaut-discovery-micronaut-discovery-client = { module = 'io.micronaut.dis io-micronaut-email-micronaut-email = { module = 'io.micronaut.email:micronaut-email', version.ref = 'micronaut-email'} io-micronaut-email-micronaut-email-javamail = { module = 'io.micronaut.email:micronaut-email-javamail', version.ref = 'micronaut-email'} io-micronaut-email-micronaut-email-javamail-composer = { module = 'io.micronaut.email:micronaut-email-javamail-composer', version.ref = 'micronaut-email'} +io-micronaut-email-micronaut-email-template = { module = 'io.micronaut.email:micronaut-email-template', version.ref = 'micronaut-email'} io-micronaut-flyway-micronaut-flyway-bom = { module = 'io.micronaut.flyway:micronaut-flyway-bom', version.ref = 'micronaut-flyway'} io-micronaut-jaxrs-micronaut-jaxrs-bom = { module = 'io.micronaut.jaxrs:micronaut-jaxrs-bom', version.ref = 'micronaut-jaxrs'} io-micronaut-kafka-micronaut-kafka-bom = { module = 'io.micronaut.kafka:micronaut-kafka-bom', version.ref = 'micronaut-kafka'} @@ -289,10 +289,8 @@ io-netty-netty-common = { module = "io.netty:netty-common", version.ref = "netty io-netty-netty-handler = { module = "io.netty:netty-handler", version.ref = "netty" } io-netty-netty-handler-proxy = { module = "io.netty:netty-handler-proxy", version.ref = "netty" } io-netty-netty-resolver = { module = "io.netty:netty-resolver", version.ref = "netty" } -io-netty-netty-transport-native-epoll = { module = "io.netty:netty-transport-native-epoll", version.ref = "netty" } -io-netty-netty-transport-native-kqueue = { module = "io.netty:netty-transport-native-kqueue", version.ref = "netty" } -io-netty-netty-transport-native-unix-common = { module = "io.netty:netty-transport-native-unix-common", version.ref = "netty" } io-netty-netty-transport= { module = "io.netty:netty-transport", version.ref = "netty" } +io-netty-netty-transport-native-unix-common = { module = "io.netty:netty-transport-native-unix-common", version.ref = "netty" } io-opentelemetry-instrumentation-opentelemetry-instrumentation-annotations = { module = 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations', version.ref = 'opentelemetry-instrumentation' } io-opentelemetry-instrumentation-opentelemetry-instrumentation-api = { module = 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-api', version.ref = 'opentelemetry-instrumentation' } io-opentelemetry-instrumentation-opentelemetry-instrumentation-api-semconv = { module = 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv', version.ref = 'opentelemetry-instrumentation-opentelemetry-instrumentation-api-semconv' } @@ -344,6 +342,7 @@ org-eclipse-angus-angus-activation = { module = 'org.eclipse.angus:angus-activat org-eclipse-angus-angus-mail = { module = 'org.eclipse.angus:angus-mail', version.ref = 'eclipse-angus-angus-mail' } org-flywaydb-flyway-core = { module = 'org.flywaydb:flyway-core', version.ref = 'org-flywaydb' } org-flywaydb-flyway-database-oracle = { module = 'org.flywaydb:flyway-database-oracle', version.ref = 'org-flywaydb' } +org-flywaydb-flyway-mysql = { module = 'org.flywaydb:flyway-mysql', version.ref = 'org-flywaydb' } org-hdrhistogram-HdrHistogram = { module = 'org.hdrhistogram:HdrHistogram', version.ref = 'org-hdrhistogram-HdrHistogram' } org-jetbrains-annotations = { module = 'org.jetbrains:annotations', version.ref = 'org-jetbrains-annotations' } org-jetbrains-intellij-deps-trove4j = { module = 'org.jetbrains.intellij.deps:trove4j', version.ref = 'intellij-deps-trove4j' }