Skip to content

Commit 278d2e8

Browse files
authored
Add @SdkImport annotation to simplify importing an SDK client (#1165)
Adds a new `@SdkImport` annotation that lets the user easily import an SDK client built with SDK v3 but not compiled with Micronaut.
1 parent e1d813d commit 278d2e8

File tree

11 files changed

+435
-4
lines changed

11 files changed

+435
-4
lines changed

buildSrc/src/main/groovy/io.micronaut.build.internal.ocisdk-metadata-module.gradle

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ sourceSets {
2121
}
2222
}
2323

24+
2425
if (!project.name.contains("circuitbreaker")) {
2526
var generateClientFactories = tasks.register("generateClientFactories", GenerateClientFactories) {
2627
sources = sourceSets.main.java
@@ -39,6 +40,16 @@ if (!project.name.contains("circuitbreaker")) {
3940
generatedCompileOnly(mn.reactor)
4041
generatedCompileOnly(mnReactor.micronaut.reactor)
4142
}
43+
44+
tasks.named("compileGeneratedJava") {
45+
options.fork = true
46+
options.forkOptions.jvmArgs.add("-Doci.sdk.visitor.enabled")
47+
}
48+
49+
tasks.named("compileJava") {
50+
options.fork = true
51+
options.forkOptions.jvmArgs.add("-Doci.sdk.visitor.enabled")
52+
}
4253
}
4354

4455
def metadataJar = tasks.register("metadataJar", Jar) {
@@ -95,6 +106,11 @@ tasks.named("compileTestJava") {
95106
enabled = false
96107
}
97108

109+
tasks.named("compileJava") {
110+
options.fork = true
111+
options.forkOptions.jvmArgs.add("-Doci.sdk.visitor.enabled")
112+
}
113+
98114
tasks.configureEach {
99115
if (name.startsWith("spotless")) {
100116
// The license and checkstyle rules differ from ours

gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ micronaut-reactor = "3.8.0"
2727
micronaut-rxjava2 = "2.8.0"
2828
micronaut-serde = "2.15.1"
2929
micronaut-servlet = "5.4.0"
30+
micronaut-sourcegen = "1.8.2"
3031
micronaut-sql = "6.2.1"
3132
micronaut-test = "4.8.1"
3233
micronaut-logging = "1.7.0"
@@ -54,6 +55,7 @@ micronaut-rxjava2 = { module = "io.micronaut.rxjava2:micronaut-rxjava2-bom", ver
5455
micronaut-serde = { module = "io.micronaut.serde:micronaut-serde-bom", version.ref = "micronaut-serde" }
5556
micronaut-servlet = { module = "io.micronaut.servlet:micronaut-servlet-bom", version.ref = "micronaut-servlet" }
5657
micronaut-sql = { module = "io.micronaut.sql:micronaut-sql-bom", version.ref = "micronaut-sql" }
58+
micronaut-sourcegen = { module = "io.micronaut.sourcegen:micronaut-sourcegen-bom", version.ref = "micronaut-sourcegen" }
5759
micronaut-docs = { module = "io.micronaut.docs:micronaut-docs-asciidoc-config-props", version.ref = "micronaut-docs" }
5860
micronaut-validation = { module = "io.micronaut.validation:micronaut-validation-bom", version.ref = "micronaut-validation" }
5961
micronaut-discovery-client = { module = "io.micronaut.discovery:micronaut-discovery-client-bom", version.ref = "micronaut-discovery-client" }
@@ -78,6 +80,7 @@ oci-common = { module = 'com.oracle.oci.sdk:oci-java-sdk-common', version.ref =
7880
oci-common-httpclient = { module = 'com.oracle.oci.sdk:oci-java-sdk-common-httpclient', version.ref = "oci" }
7981
oci-common-httpclient-jersey3 = { module = 'com.oracle.oci.sdk:oci-java-sdk-common-httpclient-jersey3', version.ref = "oci" }
8082
oci-objectstorage = { module = 'com.oracle.oci.sdk:oci-java-sdk-objectstorage', version.ref = "oci" }
83+
oci-disasterrecovery = { module = 'com.oracle.oci.sdk:oci-java-sdk-disasterrecovery', version.ref = "oci" }
8184
oci-encryption = { module = 'com.oracle.oci.sdk:oci-java-sdk-encryption', version.ref = "oci" }
8285
oci-oke-workload-identity = { module = 'com.oracle.oci.sdk:oci-java-sdk-addons-oke-workload-identity', version.ref = "oci" }
8386
oci-graalvm = { module = 'com.oracle.oci.sdk:oci-java-sdk-addons-graalvm', version.ref = "oci" }
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright 2017-2025 original authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.micronaut.oraclecloud.core.sdk;
17+
18+
/**
19+
* Annotation used to import an SDK if it is generated with OCI SDK v3, but without Micronaut compatibility.
20+
*/
21+
public @interface SdkImport {
22+
/**
23+
* The type of the client. This should reference a type that extends from either
24+
* {@link com.oracle.bmc.http.internal.BaseAsyncClient} or {@link com.oracle.bmc.http.internal.BaseSyncClient}.
25+
*
26+
* @return The type of a client to import.
27+
*/
28+
Class<?> value();
29+
}

oraclecloud-httpclient-netty/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dependencies {
2525

2626
testAnnotationProcessor mn.micronaut.inject.java
2727
testAnnotationProcessor projects.micronautOraclecloudSerdeProcessor
28+
testAnnotationProcessor(mnSourcegen.micronaut.sourcegen.generator.java)
2829
testCompileOnly mn.micronaut.jackson.databind
2930
testRuntimeOnly mn.micronaut.runtime
3031

@@ -35,7 +36,9 @@ dependencies {
3536
testImplementation mn.micronaut.context
3637
testImplementation projects.micronautOraclecloudCommon
3738
testImplementation projects.testSuiteHttpClient
38-
39+
testImplementation(libs.oci.disasterrecovery) {
40+
exclude(group: "com.oracle.oci.sdk", module: "oci-java-sdk-common")
41+
}
3942
[projects.micronautOraclecloudBmcMonitoring,
4043
projects.micronautOraclecloudBmcIdentity,
4144
projects.micronautOraclecloudBmcObjectstorage,
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package io.micronaut.oraclecloud.httpclient.netty;
2+
3+
import com.oracle.bmc.Region;
4+
import com.oracle.bmc.auth.RegionProvider;
5+
import com.oracle.bmc.disasterrecovery.DisasterRecoveryClient;
6+
import com.oracle.bmc.disasterrecovery.model.CreateDrPlanDetails;
7+
import com.oracle.bmc.disasterrecovery.model.DrPlan;
8+
import com.oracle.bmc.disasterrecovery.model.DrPlanType;
9+
import com.oracle.bmc.disasterrecovery.requests.CreateDrPlanRequest;
10+
import com.oracle.bmc.disasterrecovery.responses.CreateDrPlanResponse;
11+
import io.micronaut.context.annotation.Property;
12+
import io.micronaut.context.event.BeanCreatedEventListener;
13+
import io.micronaut.http.HttpResponse;
14+
import io.micronaut.http.annotation.Body;
15+
import io.micronaut.http.annotation.Controller;
16+
import io.micronaut.http.annotation.Post;
17+
import io.micronaut.oraclecloud.core.sdk.SdkImport;
18+
import io.micronaut.runtime.server.EmbeddedServer;
19+
import io.micronaut.test.annotation.MockBean;
20+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
21+
import jakarta.inject.Inject;
22+
import org.junit.jupiter.api.Assertions;
23+
import org.junit.jupiter.api.Test;
24+
25+
@SdkImport(DisasterRecoveryClient.class)
26+
@MicronautTest
27+
@Property(name = "oci.config.path", value = "") // Disable reading config file
28+
public class SdkImportTest {
29+
30+
@Inject
31+
DisasterRecoveryClient disasterRecoveryClient;
32+
33+
@Test
34+
void testImport() {
35+
Assertions.assertNotNull(disasterRecoveryClient);
36+
CreateDrPlanResponse drPlan = disasterRecoveryClient.createDrPlan(
37+
CreateDrPlanRequest.builder()
38+
.body$(CreateDrPlanDetails.builder()
39+
.type(DrPlanType.Failover)
40+
.drProtectionGroupId("mygroup")
41+
.sourcePlanId("myplan")
42+
.build())
43+
.build()
44+
);
45+
DrPlan dp = drPlan.getDrPlan();
46+
Assertions.assertNotNull(dp);
47+
Assertions.assertEquals(DrPlanType.Failover, drPlan.getDrPlan().getType());
48+
}
49+
50+
@MockBean(RegionProvider.class)
51+
RegionProvider mockRegionProvider() {
52+
return () -> Region.AF_JOHANNESBURG_1;
53+
}
54+
55+
@MockBean
56+
BeanCreatedEventListener<DisasterRecoveryClient.Builder> setEndpoint(EmbeddedServer embeddedServer) {
57+
return event -> event.getBean().endpoint("http://localhost:" + embeddedServer.getPort());
58+
}
59+
60+
@MockBean
61+
@Controller
62+
static class TestController {
63+
@Post("/20220125/drPlans")
64+
HttpResponse<DrPlan> createDrPlan(@Body CreateDrPlanDetails createDrPlanRequest) {
65+
return HttpResponse.created(DrPlan.builder()
66+
.sourcePlanId(createDrPlanRequest.getSourcePlanId())
67+
.drProtectionGroupId(createDrPlanRequest.getDrProtectionGroupId())
68+
.type(createDrPlanRequest.getType())
69+
.build());
70+
}
71+
}
72+
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
plugins {
22
id 'io.micronaut.build.internal.common'
3-
id 'io.micronaut.build.internal.oraclecloud-base'
3+
id 'io.micronaut.build.internal.oraclecloud-module'
44
}
55

66
dependencies {
77
// Transitive dependencies
88
implementation mn.micronaut.inject
99
implementation mn.micronaut.inject.java
10+
implementation mnSourcegen.micronaut.sourcegen.annotations
11+
implementation mnSourcegen.micronaut.sourcegen.generator
1012
implementation mnSerde.micronaut.serde.processor
1113
implementation mnSerde.micronaut.serde.api
1214

15+
testImplementation(libs.oci.objectstorage)
1316
testImplementation mn.micronaut.inject.java.test
14-
testImplementation libs.oci.common
17+
testImplementation(mnSourcegen.micronaut.sourcegen.generator.java)
18+
testImplementation(projects.micronautOraclecloudCommon)
19+
}
20+
21+
micronautBuild {
22+
binaryCompatibility.enabled = false
1523
}

0 commit comments

Comments
 (0)