Skip to content

Commit

Permalink
Generate client factories for each client
Browse files Browse the repository at this point in the history
  • Loading branch information
andriy-dmytruk committed Nov 17, 2023
1 parent 9374e7c commit 1d17a35
Show file tree
Hide file tree
Showing 17 changed files with 338 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import io.micronaut.oraclecloud.gradle.GenerateClientFactories

plugins {
id "io.micronaut.build.internal.module"
id 'io.micronaut.build.internal.ocisdk-metadata-published'
Expand All @@ -13,6 +15,32 @@ repositories {
mavenCentral()
}

sourceSets {
generated {
java {}
}
}

if (!project.name.contains("circuitbreaker")) {
var generateClientFactories = tasks.register("generateClientFactories", GenerateClientFactories) {
sources = sourceSets.main.java
packageName.convention("io.micronaut.oraclecloud.clients")
baseOutputDirectory.convention(layout.buildDirectory.dir("generatedClientFactories"))
}

sourceSets.generated.java.srcDir(generateClientFactories)

dependencies {
generatedAnnotationProcessor(projects.micronautOraclecloudSdkProcessor)
generatedCompileOnly(sourceSets.main.output)
generatedCompileOnly(projects.micronautOraclecloudCommon)
generatedCompileOnly(projects.micronautOraclecloudSdkBase)
generatedCompileOnly(mnRxjava2.rxjava2)
generatedCompileOnly(mn.reactor)
generatedCompileOnly(mnReactor.micronaut.reactor)
}
}

def metadataJar = tasks.register("metadataJar", Jar) {
archiveClassifier = "metadata"
from(sourceSets.main.output) {
Expand All @@ -25,6 +53,9 @@ def metadataJar = tasks.register("metadataJar", Jar) {
return fn.contains('$Introspection')
}
}
from(sourceSets.generated.output) {
exclude("**/SdkProcessorDummy**")
}
}

configurations.all {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,5 @@ configurations.all {

dependencies {
metadataElements projects.micronautOraclecloudHttpclientNetty
metadataElements projects.micronautOraclecloudCommon
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package io.micronaut.oraclecloud.gradle;

import org.gradle.api.DefaultTask;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.CacheableTask;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.PathSensitive;
import org.gradle.api.tasks.PathSensitivity;
import org.gradle.api.tasks.TaskAction;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.stream.Collectors;

@CacheableTask
public abstract class GenerateClientFactories extends DefaultTask {

private static final String TEMPLATE = """
package {{package}};
import io.micronaut.oraclecloud.clients.SdkClients;
import io.micronaut.core.annotation.Internal;
@Internal
final class SdkProcessorDummy {
@SdkClients(value = SdkClients.Kind.ASYNC, clientClasses = {{clientClassNames}})
final static class SdkAsyncProcessorDummy {
}
@SdkClients(value = SdkClients.Kind.REACTOR, clientClasses = {{clientClassNames}})
final static class SdkReactorProcessorDummy {
}
@SdkClients(value = SdkClients.Kind.RXJAVA2, clientClasses = {{clientClassNames}})
final static class SdkRxProcessorDummy {
}
}
""";

@PathSensitive(PathSensitivity.NONE)
@InputFiles
public abstract ConfigurableFileCollection getSources();

@Input
public abstract Property<String> getPackageName();

@Internal
public abstract DirectoryProperty getBaseOutputDirectory();

@OutputDirectory
public Provider<Directory> getOutputDirectory() {
return getBaseOutputDirectory();
}

@TaskAction
public void generateClientFactories() {
String clientNames = getSources().getAsFileTree()
.matching((filterable) ->
filterable.include("com/oracle/bmc/*/*Client.java")
)
.getFiles()
.stream()
.map(f -> '"' + getPackage(f) + "." + getClientName(f) + '"')
.collect(Collectors.joining(", "));

String pack = getPackageName().get();

if (!clientNames.isEmpty()) {
String a = "3";
File outputFile = getOutputDirectory().get()
.file(pack.replace('.', File.separatorChar) + "/SdkProcessorDummy.java")
.getAsFile();

String content = TEMPLATE.replace("{{package}}", pack)
.replace("{{clientClassNames}}", "{" + clientNames + "}");
writeToFile(outputFile, content);
}
}

private void writeToFile(File file, String content) {
file.getParentFile().mkdirs();
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write(content);
} catch (IOException e) {
getLogger().error("Failed to write to file", e);
}
}

private String getClientName(File file) {
String name = file.getName();
if (name.endsWith(".java")) {
name = name.substring(0, name.length() - ".java".length());
}
return name;
}

private String getPackage(File file) {
String path = file.getParentFile().getAbsolutePath();
return path.substring(path.indexOf("com/oracle/bmc")).replace(File.separatorChar, '.');
}
}
6 changes: 6 additions & 0 deletions oraclecloud-common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ dependencies {
compileOnly mn.micronaut.context
compileOnly mn.micronaut.discovery.core
compileOnly mn.micronaut.jackson.databind

compileOnly mn.reactor
compileOnly mnReactor.micronaut.reactor
compileOnly mnRxjava2.rxjava2
compileOnly("com.oracle.oci.sdk:oci-java-sdk-common:$gradle.ociVersion")

runtimeOnly libs.slf4j.jcl
testImplementation libs.mockito
testImplementation mn.micronaut.context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,16 @@
package io.micronaut.oraclecloud.clients.reactor;

import com.oracle.bmc.responses.AsyncHandler;
import io.micronaut.oraclecloud.clients.SdkClients;
import reactor.core.publisher.MonoSink;

/**
* Bridges the {@link com.oracle.bmc.responses.AsyncHandler} interface to an RxJava {@link reactor.core.publisher.MonoSink}.
* Bridges the {@link AsyncHandler} interface to an RxJava {@link reactor.core.publisher.MonoSink}.
*
* @param <Req> The request type
* @param <Res> The response type
* @author graemerocher
* @since 2.0.0
*/
@SdkClients(SdkClients.Kind.REACTOR)
public class AsyncHandlerSink<Req, Res> implements AsyncHandler<Req, Res> {
private final MonoSink<Res> emitter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package io.micronaut.oraclecloud.clients.rxjava2;

import com.oracle.bmc.responses.AsyncHandler;
import io.micronaut.oraclecloud.clients.SdkClients;
import io.reactivex.SingleEmitter;

/**
Expand All @@ -27,7 +26,6 @@
* @author graemerocher
* @since 1.0.0
*/
@SdkClients(SdkClients.Kind.RXJAVA2)
public class AsyncHandlerEmitter<Req, Res> implements AsyncHandler<Req, Res> {
private final SingleEmitter<Res> emitter;

Expand Down
4 changes: 1 addition & 3 deletions oraclecloud-httpclient-netty/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ dependencies {
testImplementation(mn.micronaut.http.server.netty)
// for self-signed certs
testImplementation("org.bouncycastle:bcpkix-jdk15on:1.70")
testImplementation(projects.micronautOraclecloudSdk) {
exclude group: 'com.oracle.oci.sdk'
}

testAnnotationProcessor mn.micronaut.inject.java
testAnnotationProcessor projects.micronautOraclecloudSerdeProcessor
Expand All @@ -34,6 +31,7 @@ dependencies {
testImplementation projects.micronautOraclecloudSerdeProcessor
testImplementation mn.micronaut.management
testImplementation mn.micronaut.context
testImplementation projects.micronautOraclecloudCommon

[projects.micronautOraclecloudBmcMonitoring,
projects.micronautOraclecloudBmcIdentity,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package io.micronaut.oraclecloud.factory;

import com.oracle.bmc.objectstorage.ObjectStorageAsyncClient
import com.oracle.bmc.objectstorage.ObjectStorageClient
import io.micronaut.context.event.BeanCreatedEvent
import io.micronaut.context.event.BeanCreatedEventListener
import io.micronaut.core.annotation.NonNull
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import jakarta.inject.Inject
import jakarta.inject.Singleton
import spock.lang.Specification


@MicronautTest
class ObjectStorageFactorySpec extends Specification {

public static final String ENDPOINT = "http://my_endpoint"
public static final String ASYNC_ENDPOINT = "http://my_endpoint_async"

@Inject
ObjectStorageClient client

@Inject
ObjectStorageAsyncClient asyncClient

void "test database client configuration"() {
when:
client

then:
client != null
client.endpoint == ENDPOINT
}

void "test database async client configuration"() {
when:
asyncClient

then:
asyncClient != null
asyncClient.endpoint == ASYNC_ENDPOINT
}

@Singleton
static class DatabaseClientBuilderListener
implements BeanCreatedEventListener<ObjectStorageClient.Builder> {
@Override
ObjectStorageClient.Builder onCreated(
@NonNull BeanCreatedEvent<ObjectStorageClient.Builder> event
) {
var builder = event.bean
builder.endpoint(ENDPOINT)
return builder
}
}

@Singleton
static class DatabaseAsyncClientBuilderListener
implements BeanCreatedEventListener<ObjectStorageAsyncClient.Builder> {
@Override
ObjectStorageAsyncClient.Builder onCreated(
@NonNull BeanCreatedEvent<ObjectStorageAsyncClient.Builder> event
) {
var builder = event.bean
builder.endpoint(ASYNC_ENDPOINT)
return builder
}
}

}
8 changes: 8 additions & 0 deletions oraclecloud-sdk-base/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
plugins {
id 'io.micronaut.build.internal.oraclecloud-module'
id("io.micronaut.build.internal.oraclecloud-bom")
}

spotlessJavaMiscCheck.enabled = false
compileJava.options.fork = true

Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
*/
Kind value() default Kind.ASYNC;

/**
* @return The OCI SDK client class names to process.
*/
String[] clientClasses() default {};

/**
* the type of client to generate.
*/
Expand Down
Loading

0 comments on commit 1d17a35

Please sign in to comment.