Skip to content

Commit 3f1973a

Browse files
authored
Kora S3 Client Standardized (#626)
* Kora S3 Client Standardized * Fixed refactoring * Minor cleanup * Standardized telemetry
1 parent 803a6a1 commit 3f1973a

117 files changed

Lines changed: 1238 additions & 857 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

experimental/s3-client-annotation-processor/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ dependencies {
33
implementation project(":kora-app-annotation-processor")
44

55
testImplementation testFixtures(project(":annotation-processor-common"))
6-
testImplementation project(":experimental:s3-client")
6+
testImplementation project(":experimental:s3-client-kora")
77
}
88

99
apply from: "${project.rootDir}/gradle/in-test-generated.gradle"

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/S3ClassNames.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/S3ClassNames.java

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.koraframework.s3.client.annotation.processor;
1+
package io.koraframework.s3.client.kora.annotation.processor;
22

33
import com.palantir.javapoet.ArrayTypeName;
44
import com.palantir.javapoet.ClassName;
@@ -10,42 +10,42 @@
1010

1111
public class S3ClassNames {
1212
public static class Annotation {
13-
public static final ClassName CLIENT = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Client");
14-
public static final ClassName BUCKET = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Bucket");
15-
public static final ClassName GET = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Get");
16-
public static final ClassName LIST = ClassName.get("io.koraframework.s3.client.annotation", "S3", "List");
17-
public static final ClassName PUT = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Put");
18-
public static final ClassName DELETE = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Delete");
19-
public static final ClassName HEAD = ClassName.get("io.koraframework.s3.client.annotation", "S3", "Head");
13+
public static final ClassName CLIENT = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Client");
14+
public static final ClassName BUCKET = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Bucket");
15+
public static final ClassName GET = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Get");
16+
public static final ClassName LIST = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "List");
17+
public static final ClassName PUT = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Put");
18+
public static final ClassName DELETE = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Delete");
19+
public static final ClassName HEAD = ClassName.get("io.koraframework.s3.client.kora.annotation", "S3", "Head");
2020

2121
public static final Set<ClassName> OPERATIONS = Set.of(GET, LIST, PUT, DELETE, HEAD);
2222
}
2323

2424

25-
public static final ClassName CLIENT = ClassName.get("io.koraframework.s3.client", "S3Client");
26-
public static final ClassName AWS_CREDENTIALS = ClassName.get("io.koraframework.s3.client", "AwsCredentials");
27-
public static final ClassName CLIENT_FACTORY = ClassName.get("io.koraframework.s3.client", "S3ClientFactory");
28-
public static final ClassName CONFIG = ClassName.get("io.koraframework.s3.client", "S3ClientConfig");
29-
public static final ClassName CONFIG_WITH_CREDS = ClassName.get("io.koraframework.s3.client", "S3ClientConfigWithCredentials");
25+
public static final ClassName CLIENT = ClassName.get("io.koraframework.s3.client.kora", "S3Client");
26+
public static final ClassName S3_CREDENTIALS = ClassName.get("io.koraframework.s3.client.kora", "S3Credentials");
27+
public static final ClassName CLIENT_FACTORY = ClassName.get("io.koraframework.s3.client.kora", "S3ClientFactory");
28+
public static final ClassName CONFIG = ClassName.get("io.koraframework.s3.client.kora", "S3ClientConfig");
29+
public static final ClassName CONFIG_WITH_CREDS = ClassName.get("io.koraframework.s3.client.kora", "S3ClientConfigWithCredentials");
3030

3131
public static final ClassName CONTENT_WRITER = CLIENT.nestedClass("ContentWriter");
3232

33-
public static final ClassName PUT_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "PutObjectArgs");
34-
public static final ClassName GET_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "GetObjectArgs");
35-
public static final ClassName DELETE_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "DeleteObjectArgs");
36-
public static final ClassName HEAD_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "HeadObjectArgs");
37-
public static final ClassName LIST_OBJECTS_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "ListObjectsArgs");
38-
public static final ClassName CREATE_MULTIPART_UPLOAD_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "CreateMultipartUploadArgs");
39-
public static final ClassName COMPLETE_MULTIPART_UPLOAD_ARGS = ClassName.get("io.koraframework.s3.client.model.request", "CompleteMultipartUploadArgs");
33+
public static final ClassName PUT_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "PutObjectArgs");
34+
public static final ClassName GET_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "GetObjectArgs");
35+
public static final ClassName DELETE_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "DeleteObjectArgs");
36+
public static final ClassName HEAD_OBJECT_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "HeadObjectArgs");
37+
public static final ClassName LIST_OBJECTS_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "ListObjectsArgs");
38+
public static final ClassName CREATE_MULTIPART_UPLOAD_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "CreateMultipartUploadArgs");
39+
public static final ClassName COMPLETE_MULTIPART_UPLOAD_ARGS = ClassName.get("io.koraframework.s3.client.kora.model.request", "CompleteMultipartUploadArgs");
4040
public static final Set<TypeName> ARGS = Set.of(PUT_OBJECT_ARGS, GET_OBJECT_ARGS, DELETE_OBJECT_ARGS, HEAD_OBJECT_ARGS, LIST_OBJECTS_ARGS);
4141

42-
public static final ClassName GET_OBJECT_RESULT = ClassName.get("io.koraframework.s3.client.model.response", "GetObjectResult");
43-
public static final ClassName HEAD_OBJECT_RESULT = ClassName.get("io.koraframework.s3.client.model.response", "HeadObjectResult");
44-
public static final ClassName LIST_BUCKET_RESULT = ClassName.get("io.koraframework.s3.client.model.response", "ListBucketResult");
45-
public static final ClassName UPLOADED_PART = ClassName.get("io.koraframework.s3.client.model.response", "UploadedPart");
42+
public static final ClassName GET_OBJECT_RESULT = ClassName.get("io.koraframework.s3.client.kora.model.response", "GetObjectResult");
43+
public static final ClassName HEAD_OBJECT_RESULT = ClassName.get("io.koraframework.s3.client.kora.model.response", "HeadObjectResult");
44+
public static final ClassName LIST_BUCKET_RESULT = ClassName.get("io.koraframework.s3.client.kora.model.response", "ListBucketResult");
45+
public static final ClassName UPLOADED_PART = ClassName.get("io.koraframework.s3.client.kora.model.response", "UploadedPart");
4646
public static final ClassName LIST_BUCKET_RESULT_ITEM = LIST_BUCKET_RESULT.nestedClass("ListBucketItem");
4747

48-
public static final ClassName UNKNOWN_EXCEPTION = ClassName.get("io.koraframework.s3.client.exception", "S3ClientUnknownException");
48+
public static final ClassName UNKNOWN_EXCEPTION = ClassName.get("io.koraframework.s3.client.kora.exception", "S3ClientUnknownException");
4949

5050
public static final Set<TypeName> BODY_TYPES = Set.of(
5151
ArrayTypeName.of(TypeName.BYTE),

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/S3ClientAnnotationProcessor.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/S3ClientAnnotationProcessor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package io.koraframework.s3.client.annotation.processor;
1+
package io.koraframework.s3.client.kora.annotation.processor;
22

33
import com.palantir.javapoet.ClassName;
44
import com.palantir.javapoet.JavaFile;
55
import io.koraframework.annotation.processor.common.AbstractKoraProcessor;
66
import io.koraframework.annotation.processor.common.ProcessingErrorException;
7-
import io.koraframework.s3.client.annotation.processor.gen.BucketsConfigGenerator;
8-
import io.koraframework.s3.client.annotation.processor.gen.ClientGenerator;
9-
import io.koraframework.s3.client.annotation.processor.gen.ModuleGenerator;
7+
import io.koraframework.s3.client.kora.annotation.processor.gen.BucketsConfigGenerator;
8+
import io.koraframework.s3.client.kora.annotation.processor.gen.ClientGenerator;
9+
import io.koraframework.s3.client.kora.annotation.processor.gen.ModuleGenerator;
1010

1111
import javax.annotation.processing.RoundEnvironment;
1212
import javax.lang.model.element.TypeElement;

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/S3ClientUtils.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/S3ClientUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.koraframework.s3.client.annotation.processor;
1+
package io.koraframework.s3.client.kora.annotation.processor;
22

33
import com.palantir.javapoet.TypeName;
44
import org.jspecify.annotations.Nullable;
@@ -61,7 +61,7 @@ public static VariableElement credentialsParameter(ExecutableElement method) {
6161
VariableElement foundParam = null;
6262
for (var param : method.getParameters()) {
6363
var typeName = TypeName.get(param.asType());
64-
if (S3ClassNames.AWS_CREDENTIALS.equals(typeName)) {
64+
if (S3ClassNames.S3_CREDENTIALS.equals(typeName)) {
6565
if (foundParam != null) {
6666
throw new ProcessingErrorException("Multiple AwsCredentials parameters found", method, null);
6767
}

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/gen/BucketsConfigGenerator.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/BucketsConfigGenerator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package io.koraframework.s3.client.annotation.processor.gen;
1+
package io.koraframework.s3.client.kora.annotation.processor.gen;
22

33
import com.palantir.javapoet.*;
44
import io.koraframework.annotation.processor.common.AnnotationUtils;
55
import io.koraframework.annotation.processor.common.CommonClassNames;
66
import io.koraframework.annotation.processor.common.NameUtils;
7-
import io.koraframework.s3.client.annotation.processor.S3ClassNames;
8-
import io.koraframework.s3.client.annotation.processor.S3ClientAnnotationProcessor;
9-
import io.koraframework.s3.client.annotation.processor.S3ClientUtils;
7+
import io.koraframework.s3.client.kora.annotation.processor.S3ClassNames;
8+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientAnnotationProcessor;
9+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientUtils;
1010

1111
import javax.annotation.processing.ProcessingEnvironment;
1212
import javax.lang.model.element.Modifier;

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/gen/ClientGenerator.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ClientGenerator.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package io.koraframework.s3.client.annotation.processor.gen;
1+
package io.koraframework.s3.client.kora.annotation.processor.gen;
22

33
import com.palantir.javapoet.*;
44
import io.koraframework.annotation.processor.common.AnnotationUtils;
55
import io.koraframework.annotation.processor.common.CommonUtils;
66
import io.koraframework.annotation.processor.common.NameUtils;
77
import io.koraframework.annotation.processor.common.ProcessingErrorException;
8-
import io.koraframework.s3.client.annotation.processor.S3ClassNames;
9-
import io.koraframework.s3.client.annotation.processor.S3ClientAnnotationProcessor;
10-
import io.koraframework.s3.client.annotation.processor.S3ClientUtils;
8+
import io.koraframework.s3.client.kora.annotation.processor.S3ClassNames;
9+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientAnnotationProcessor;
10+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientUtils;
1111

1212
import javax.annotation.processing.ProcessingEnvironment;
1313
import javax.lang.model.element.*;
@@ -31,15 +31,16 @@ public static TypeSpec generate(ProcessingEnvironment processingEnv, TypeElement
3131
var configType = credsRequired
3232
? S3ClassNames.CONFIG_WITH_CREDS
3333
: S3ClassNames.CONFIG;
34-
var b = CommonUtils.extendsKeepAop(s3client, NameUtils.generatedType(s3client, "ClientImpl"))
34+
var b = CommonUtils.extendsKeepAop(s3client, NameUtils.generatedType(s3client, "S3ClientImpl"))
3535
.addAnnotation(AnnotationUtils.generated(S3ClientAnnotationProcessor.class))
3636
.addField(S3ClassNames.CLIENT, "client", Modifier.PRIVATE, Modifier.FINAL)
3737
.addField(configType, "config", Modifier.PRIVATE, Modifier.FINAL);
3838
var constructor = MethodSpec.constructorBuilder()
3939
.addModifiers(Modifier.PUBLIC)
40+
.addParameter(String.class, "configPath")
4041
.addParameter(S3ClassNames.CLIENT_FACTORY, "clientFactory")
4142
.addParameter(configType, "clientConfig")
42-
.addStatement("this.client = clientFactory.create(clientConfig)")
43+
.addStatement("this.client = clientFactory.create(configPath, $T.class, clientConfig)", s3client)
4344
.addStatement("this.config = clientConfig");
4445
if (!bucketsPath.isEmpty()) {
4546
constructor.addParameter(bucketsType, "bucketsConfig");
@@ -358,7 +359,7 @@ private static CodeBlock generateKey(ExecutableElement method, AnnotationMirror
358359
.filter(p -> {
359360
var parameterTypeName = TypeName.get(p.asType());
360361
return !AnnotationUtils.isAnnotationPresent(p, S3ClassNames.Annotation.BUCKET)
361-
&& !S3ClassNames.AWS_CREDENTIALS.equals(parameterTypeName)
362+
&& !S3ClassNames.S3_CREDENTIALS.equals(parameterTypeName)
362363
&& !S3ClassNames.ARGS.contains(parameterTypeName)
363364
&& !S3ClassNames.BODY_TYPES.contains(parameterTypeName)
364365
;

experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/annotation/processor/gen/ModuleGenerator.java renamed to experimental/s3-client-annotation-processor/src/main/java/io/koraframework/s3/client/kora/annotation/processor/gen/ModuleGenerator.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.koraframework.s3.client.annotation.processor.gen;
1+
package io.koraframework.s3.client.kora.annotation.processor.gen;
22

33
import com.palantir.javapoet.ClassName;
44
import com.palantir.javapoet.MethodSpec;
@@ -7,9 +7,9 @@
77
import io.koraframework.annotation.processor.common.AnnotationUtils;
88
import io.koraframework.annotation.processor.common.CommonClassNames;
99
import io.koraframework.annotation.processor.common.NameUtils;
10-
import io.koraframework.s3.client.annotation.processor.S3ClassNames;
11-
import io.koraframework.s3.client.annotation.processor.S3ClientAnnotationProcessor;
12-
import io.koraframework.s3.client.annotation.processor.S3ClientUtils;
10+
import io.koraframework.s3.client.kora.annotation.processor.S3ClassNames;
11+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientAnnotationProcessor;
12+
import io.koraframework.s3.client.kora.annotation.processor.S3ClientUtils;
1313

1414
import javax.annotation.processing.ProcessingEnvironment;
1515
import javax.lang.model.element.ElementKind;
@@ -21,8 +21,8 @@ public class ModuleGenerator {
2121
public static TypeSpec generate(ProcessingEnvironment processingEnv, TypeElement s3client) {
2222
var packageName = processingEnv.getElementUtils().getPackageOf(s3client).getQualifiedName().toString();
2323
var bucketsType = ClassName.get(packageName, NameUtils.generatedType(s3client, "BucketsConfig"));
24-
var clientType = ClassName.get(packageName, NameUtils.generatedType(s3client, "ClientImpl"));
25-
var b = TypeSpec.interfaceBuilder(NameUtils.generatedType(s3client, "Module"))
24+
var clientType = ClassName.get(packageName, NameUtils.generatedType(s3client, "S3ClientImpl"));
25+
var b = TypeSpec.interfaceBuilder(NameUtils.generatedType(s3client, "S3Module"))
2626
.addModifiers(Modifier.PUBLIC)
2727
.addAnnotation(CommonClassNames.module)
2828
.addAnnotation(AnnotationUtils.generated(S3ClientAnnotationProcessor.class))
@@ -71,10 +71,10 @@ public static TypeSpec generate(ProcessingEnvironment processingEnv, TypeElement
7171
.addParameter(configType, "clientConfig");
7272
if (paths.isEmpty()) {
7373
clientImpl
74-
.addStatement("return new $T(clientFactory, clientConfig)", clientType);
74+
.addStatement("return new $T($S, clientFactory, clientConfig)", clientType, s3ClientConfigPath);
7575
} else {
7676
clientImpl.addParameter(bucketsType, "bucketsConfig")
77-
.addStatement("return new $T(clientFactory, clientConfig, bucketsConfig)", clientType);
77+
.addStatement("return new $T($S, clientFactory, clientConfig, bucketsConfig)", clientType, s3ClientConfigPath);
7878
}
7979
b.addMethod(clientImpl.build());
8080

Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
io.koraframework.s3.client.annotation.processor.S3ClientAnnotationProcessor
1+
io.koraframework.s3.client.kora.annotation.processor.S3ClientAnnotationProcessor

experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/annotation/processor/S3ClientAnnotationProcessorTest.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/annotation/processor/AbstractS3ClientTest.java renamed to experimental/s3-client-annotation-processor/src/test/java/io/koraframework/s3/client/kora/annotation/processor/AbstractS3ClientTest.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package io.koraframework.s3.client.annotation.processor;
1+
package io.koraframework.s3.client.kora.annotation.processor;
22

33
import io.koraframework.annotation.processor.common.AbstractAnnotationProcessorTest;
44
import io.koraframework.aop.annotation.processor.AopAnnotationProcessor;
5-
import io.koraframework.s3.client.S3Client;
6-
import io.koraframework.s3.client.S3ClientConfigWithCredentials;
7-
import io.koraframework.s3.client.S3ClientFactory;
5+
import io.koraframework.s3.client.kora.S3Client;
6+
import io.koraframework.s3.client.kora.S3ClientConfigWithCredentials;
7+
import io.koraframework.s3.client.kora.S3ClientFactory;
88
import org.intellij.lang.annotations.Language;
99
import org.mockito.Mockito;
1010

@@ -21,12 +21,12 @@ protected String commonImports() {
2121
import java.util.Iterator;
2222
import java.util.Collection;
2323
import java.util.Optional;
24-
import io.koraframework.s3.client.annotation.*;
25-
import io.koraframework.s3.client.annotation.S3.*;
26-
import io.koraframework.s3.client.model.request.*;
27-
import io.koraframework.s3.client.model.response.*;
28-
import io.koraframework.s3.client.*;
29-
import io.koraframework.s3.client.S3Client.*;
24+
import io.koraframework.s3.client.kora.annotation.*;
25+
import io.koraframework.s3.client.kora.annotation.S3.*;
26+
import io.koraframework.s3.client.kora.model.request.*;
27+
import io.koraframework.s3.client.kora.model.response.*;
28+
import io.koraframework.s3.client.kora.*;
29+
import io.koraframework.s3.client.kora.S3Client.*;
3030
""";
3131
}
3232

@@ -38,9 +38,10 @@ protected AbstractAnnotationProcessorTest.TestObject compile(@Language("java") S
3838
result.assertSuccess();
3939
var clientFactory = (S3ClientFactory) config -> s3Client;
4040
var args = new ArrayList<Object>(2 + addArgs.length);
41+
args.add("config.dummy");
4142
args.add(clientFactory);
4243
args.add(config);
4344
args.addAll(List.of(addArgs));
44-
return new AbstractAnnotationProcessorTest.TestObject(loadClass("$Client_ClientImpl"), args);
45+
return new AbstractAnnotationProcessorTest.TestObject(loadClass("$Client_S3ClientImpl"), args);
4546
}
4647
}

0 commit comments

Comments
 (0)