Skip to content

Commit 5ed088b

Browse files
authored
Declarative logging module (#139)
1 parent 1248459 commit 5ed088b

File tree

56 files changed

+2621
-135
lines changed

Some content is hidden

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

56 files changed

+2621
-135
lines changed

annotation-processor-common/src/testFixtures/java/ru/tinkoff/kora/annotation/processor/common/AbstractAnnotationProcessorTest.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.jupiter.api.BeforeEach;
66
import org.junit.jupiter.api.TestInfo;
77
import org.junit.jupiter.api.TestInstance;
8+
import reactor.core.publisher.Mono;
89
import ru.tinkoff.kora.annotation.processor.common.compile.ByteArrayJavaFileObject;
910
import ru.tinkoff.kora.annotation.processor.common.compile.KoraCompileTestJavaFileManager;
1011
import ru.tinkoff.kora.application.graph.*;
@@ -16,11 +17,13 @@
1617
import javax.tools.ToolProvider;
1718
import java.io.IOException;
1819
import java.io.StringWriter;
19-
import java.lang.reflect.Method;
20+
import java.lang.reflect.InvocationTargetException;
2021
import java.nio.charset.StandardCharsets;
2122
import java.nio.file.Files;
2223
import java.nio.file.Paths;
2324
import java.util.*;
25+
import java.util.concurrent.ExecutionException;
26+
import java.util.concurrent.Future;
2427
import java.util.function.Function;
2528
import java.util.function.Supplier;
2629
import java.util.stream.IntStream;
@@ -125,6 +128,7 @@ public Object newObject(String className, Object... params) {
125128
throw new RuntimeException(e);
126129
}
127130
}
131+
128132
public Object invoke(Object target, String name, Object... params) {
129133
try {
130134
for (var method : target.getClass().getMethods()) {
@@ -227,4 +231,42 @@ public <T> PromiseOf<T> promiseOf(Node<T> node) {
227231
return graph.promiseOf(node);
228232
}
229233
}
234+
235+
protected static class TestObject {
236+
public final Class<?> objectClass;
237+
private final Object object;
238+
239+
public TestObject(Class<?> objectClass, Object object) {
240+
this.objectClass = objectClass;
241+
this.object = object;
242+
}
243+
244+
@SuppressWarnings("unchecked")
245+
public <T> T invoke(String methodName, Object... args) {
246+
for (var method : objectClass.getDeclaredMethods()) {
247+
if (method.getName().equals(methodName) && method.getParameters().length == args.length) {
248+
method.setAccessible(true);
249+
try {
250+
var result = method.invoke(this.object, args);
251+
if (result instanceof Mono<?> mono) {
252+
return (T) mono.block();
253+
}
254+
if (result instanceof Future<?> future) {
255+
return (T) future.get();
256+
}
257+
return (T) result;
258+
} catch (InvocationTargetException e) {
259+
if (e.getTargetException() instanceof RuntimeException re) {
260+
throw re;
261+
} else {
262+
throw new RuntimeException(e);
263+
}
264+
} catch (IllegalAccessException | ExecutionException | InterruptedException e) {
265+
throw new RuntimeException(e);
266+
}
267+
}
268+
}
269+
throw new IllegalArgumentException();
270+
}
271+
}
230272
}

annotation-processors/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ dependencies {
1313
api project(':cache:cache-annotation-processor')
1414
api project(':validation:validation-annotation-processor')
1515
api project(':mapstruct:mapstruct-java-extension')
16+
api project(':logging:declarative-logging:declarative-logging-annotation-processor')
1617
}

aop/aop-symbol-processor/src/main/kotlin/ru/tinkoff/kora/aop/symbol/processor/AopProcessor.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package ru.tinkoff.kora.aop.symbol.processor
22

3-
import com.google.devtools.ksp.*
3+
import com.google.devtools.ksp.isConstructor
4+
import com.google.devtools.ksp.isProtected
5+
import com.google.devtools.ksp.isPublic
46
import com.google.devtools.ksp.processing.Resolver
57
import com.google.devtools.ksp.symbol.KSClassDeclaration
68
import com.google.devtools.ksp.symbol.KSType
@@ -9,14 +11,12 @@ import com.squareup.kotlinpoet.*
911
import com.squareup.kotlinpoet.ksp.toClassName
1012
import com.squareup.kotlinpoet.ksp.toTypeName
1113
import com.squareup.kotlinpoet.ksp.toTypeVariableName
12-
import ru.tinkoff.kora.common.Component
1314
import ru.tinkoff.kora.ksp.common.*
1415
import ru.tinkoff.kora.ksp.common.AnnotationUtils.isAnnotationPresent
1516
import ru.tinkoff.kora.ksp.common.KspCommonUtils.generated
1617
import ru.tinkoff.kora.ksp.common.exception.ProcessingErrorException
1718
import kotlin.reflect.KClass
1819

19-
@KspExperimental
2020
class AopProcessor(private val aspects: List<KoraAspect>, private val resolver: Resolver) {
2121

2222
private class TypeFieldFactory(private val resolver: Resolver) : KoraAspect.FieldFactory {
@@ -227,8 +227,8 @@ class AopProcessor(private val aspects: List<KoraAspect>, private val resolver:
227227

228228
typeBuilder.generated(generatedClasses)
229229

230-
if (classDeclaration.isAnnotationPresent(Component::class)) {
231-
typeBuilder.addAnnotation(Component::class)
230+
if (classDeclaration.isAnnotationPresent(CommonClassNames.component)) {
231+
typeBuilder.addAnnotation(CommonClassNames.component)
232232
}
233233

234234
val constructorBuilder = FunSpec.constructorBuilder()

aop/aop-symbol-processor/src/main/kotlin/ru/tinkoff/kora/aop/symbol/processor/AopSymbolProcessor.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package ru.tinkoff.kora.aop.symbol.processor
22

3-
import com.google.devtools.ksp.*
3+
import com.google.devtools.ksp.getClassDeclarationByName
4+
import com.google.devtools.ksp.isAbstract
5+
import com.google.devtools.ksp.isOpen
46
import com.google.devtools.ksp.processing.*
57
import com.google.devtools.ksp.symbol.*
8+
import com.google.devtools.ksp.validate
69
import com.squareup.kotlinpoet.FileSpec
710
import com.squareup.kotlinpoet.TypeSpec
811
import com.squareup.kotlinpoet.ksp.writeTo
9-
import ru.tinkoff.kora.common.AopAnnotation
1012
import ru.tinkoff.kora.ksp.common.*
13+
import ru.tinkoff.kora.ksp.common.AnnotationUtils.isAnnotationPresent
1114
import ru.tinkoff.kora.ksp.common.exception.ProcessingError
1215
import ru.tinkoff.kora.ksp.common.exception.ProcessingErrorException
1316
import java.util.*
1417

15-
@KspExperimental
1618
class AopSymbolProcessor(
1719
environment: SymbolProcessorEnvironment,
1820
) : BaseSymbolProcessor(environment) {
@@ -32,7 +34,7 @@ class AopSymbolProcessor(
3234
aopProcessor = AopProcessor(aspects, resolver)
3335
annotations = aspects.asSequence().map { it.getSupportedAnnotationTypes() }.flatten().mapNotNull { resolver.getClassDeclarationByName(it) }.toList()
3436

35-
val noAopAnnotation = annotations.filter { !it.isAnnotationPresent(AopAnnotation::class) }
37+
val noAopAnnotation = annotations.filter { !it.isAnnotationPresent(CommonClassNames.aopAnnotation) }
3638

3739
noAopAnnotation.forEach { noAop ->
3840
KoraSymbolProcessingEnv.logger.warn("Annotation ${noAop.simpleName.asString()} has no @AopAnnotation marker, it will not be handled by some util methods" )
@@ -146,7 +148,6 @@ class AopSymbolProcessor(
146148
}
147149

148150

149-
@KspExperimental
150151
class AopSymbolProcessorProvider : SymbolProcessorProvider {
151152

152153
override fun create(

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ tasks.register("other-test") {
346346
if (p.depth == 2) {
347347
name = p.parent.name + ":" + name
348348
}
349+
if (p.depth == 3) {
350+
name = p.parent.parent.name + ":" + p.parent.name + ":" + name
351+
}
349352
dependsOn(":" + name + ":test")
350353
})
351354
}

database/database-annotation-processor/src/test/java/ru/tinkoff/kora/database/common/annotation/processor/AbstractRepositoryTest.java

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,13 @@
22

33
import org.assertj.core.api.Assertions;
44
import org.intellij.lang.annotations.Language;
5-
import reactor.core.publisher.Mono;
65
import ru.tinkoff.kora.annotation.processor.common.AbstractAnnotationProcessorTest;
76
import ru.tinkoff.kora.database.annotation.processor.RepositoryAnnotationProcessor;
87

98
import java.lang.reflect.InvocationTargetException;
109
import java.util.List;
11-
import java.util.concurrent.ExecutionException;
12-
import java.util.concurrent.Future;
1310

1411
public abstract class AbstractRepositoryTest extends AbstractAnnotationProcessorTest {
15-
protected static class TestRepository {
16-
public final Class<?> repositoryClass;
17-
private final Object repositoryObject;
18-
19-
protected TestRepository(Class<?> repositoryClass, Object repositoryObject) {
20-
this.repositoryClass = repositoryClass;
21-
this.repositoryObject = repositoryObject;
22-
}
23-
24-
@SuppressWarnings("unchecked")
25-
public <T> T invoke(String method, Object... args) {
26-
for (var repositoryClassMethod : repositoryClass.getDeclaredMethods()) {
27-
if (repositoryClassMethod.getName().equals(method) && repositoryClassMethod.getParameters().length == args.length) {
28-
try {
29-
repositoryClassMethod.setAccessible(true);
30-
var result = repositoryClassMethod.invoke(this.repositoryObject, args);
31-
if (result instanceof Mono<?> mono) {
32-
return (T) mono.block();
33-
}
34-
if (result instanceof Future<?> future) {
35-
return (T) future.get();
36-
}
37-
return (T) result;
38-
} catch (InvocationTargetException e) {
39-
if (e.getTargetException() instanceof RuntimeException re) {
40-
throw re;
41-
} else {
42-
throw new RuntimeException(e);
43-
}
44-
} catch (IllegalAccessException | ExecutionException | InterruptedException e) {
45-
throw new RuntimeException(e);
46-
}
47-
}
48-
}
49-
throw new IllegalArgumentException();
50-
}
51-
}
52-
5312
@Override
5413
protected String commonImports() {
5514
return super.commonImports() + """
@@ -58,7 +17,7 @@ protected String commonImports() {
5817
""";
5918
}
6019

61-
protected TestRepository compile(Object connectionFactory, List<?> arguments, @Language("java") String... sources) {
20+
protected TestObject compile(Object connectionFactory, List<?> arguments, @Language("java") String... sources) {
6221
var compileResult = compile(List.of(new RepositoryAnnotationProcessor()), sources);
6322
if (compileResult.isFailed()) {
6423
throw compileResult.compilationException();
@@ -77,13 +36,13 @@ protected TestRepository compile(Object connectionFactory, List<?> arguments, @L
7736
}
7837
}
7938
var repository = repositoryClass.getConstructors()[0].newInstance(realArgs);
80-
return new TestRepository(repositoryClass, repository);
39+
return new TestObject(repositoryClass, repository);
8140
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
8241
throw new RuntimeException(e);
8342
}
8443
}
8544

86-
protected TestRepository compileForArgs(List<?> arguments, @Language("java") String... sources) {
45+
protected TestObject compileForArgs(List<?> arguments, @Language("java") String... sources) {
8746
var compileResult = compile(List.of(new RepositoryAnnotationProcessor()), sources);
8847
if (compileResult.isFailed()) {
8948
throw compileResult.compilationException();
@@ -95,7 +54,7 @@ protected TestRepository compileForArgs(List<?> arguments, @Language("java") Str
9554
var repositoryClass = compileResult.loadClass("$TestRepository_Impl");
9655
var realArgs = arguments.toArray();
9756
var repository = repositoryClass.getConstructors()[0].newInstance(realArgs);
98-
return new TestRepository(repositoryClass, repository);
57+
return new TestObject(repositoryClass, repository);
9958
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
10059
throw new RuntimeException(e);
10160
}

database/database-annotation-processor/src/test/java/ru/tinkoff/kora/database/common/annotation/processor/cassandra/AbstractCassandraRepositoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ protected String commonImports() {
2323
""";
2424
}
2525

26-
protected TestRepository compileCassandra(List<?> arguments, @Language("java") String... sources) {
26+
protected TestObject compileCassandra(List<?> arguments, @Language("java") String... sources) {
2727
return this.compile(this.executor, arguments, sources);
2828
}
2929
}

database/database-annotation-processor/src/test/java/ru/tinkoff/kora/database/common/annotation/processor/cassandra/CassandraParametersTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ public interface TestRepository extends CassandraRepository {
403403
verify(executor.boundStatementBuilder).setLong(0, 42L);
404404
verify(mapper).apply(any(), eq(1), eq("test-value"));
405405

406-
var mapperConstructorParameter = repository.repositoryClass.getConstructors()[0].getParameters()[1];
406+
var mapperConstructorParameter = repository.objectClass.getConstructors()[0].getParameters()[1];
407407
assertThat(mapperConstructorParameter.getType()).isEqualTo(CassandraParameterColumnMapper.class);
408408
var tag = mapperConstructorParameter.getAnnotation(Tag.class);
409409
assertThat(tag).isNotNull();
@@ -425,7 +425,7 @@ public interface TestRepository extends CassandraRepository {
425425

426426
verify(mapper).apply(any(), eq(0), eq("test-value"));
427427

428-
var mapperConstructorParameter = repository.repositoryClass.getConstructors()[0].getParameters()[1];
428+
var mapperConstructorParameter = repository.objectClass.getConstructors()[0].getParameters()[1];
429429
assertThat(mapperConstructorParameter.getType()).isEqualTo(CassandraParameterColumnMapper.class);
430430
var tag = mapperConstructorParameter.getAnnotation(Tag.class);
431431
assertThat(tag).isNotNull();
@@ -445,7 +445,7 @@ public interface TestRepository extends CassandraRepository {
445445
public record TestRecord(String value){}
446446
""");
447447

448-
var mapperConstructorParameter = repository.repositoryClass.getConstructors()[0].getParameters()[1];
448+
var mapperConstructorParameter = repository.objectClass.getConstructors()[0].getParameters()[1];
449449
assertThat(mapperConstructorParameter.getType()).isEqualTo(CassandraParameterColumnMapper.class);
450450
var tag = mapperConstructorParameter.getAnnotation(Tag.class);
451451
assertThat(tag).isNotNull();

database/database-annotation-processor/src/test/java/ru/tinkoff/kora/database/common/annotation/processor/cassandra/CassandraResultsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public interface TestRepository extends CassandraRepository {
184184
verify(executor.mockSession).execute(any(Statement.class));
185185
verify(mapper).apply(executor.resultSet);
186186

187-
var mapperConstructorParameter = repository.repositoryClass.getConstructors()[0].getParameters()[1];
187+
var mapperConstructorParameter = repository.objectClass.getConstructors()[0].getParameters()[1];
188188
assertThat(mapperConstructorParameter.getType()).isEqualTo(CassandraResultSetMapper.class);
189189
var tag = mapperConstructorParameter.getAnnotation(Tag.class);
190190
assertThat(tag).isNotNull();

database/database-annotation-processor/src/test/java/ru/tinkoff/kora/database/common/annotation/processor/jdbc/AbstractJdbcRepositoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ protected String commonImports() {
2323
""";
2424
}
2525

26-
protected TestRepository compileJdbc(List<?> arguments, @Language("java") String... sources) {
26+
protected TestObject compileJdbc(List<?> arguments, @Language("java") String... sources) {
2727
return this.compile(this.executor, arguments, sources);
2828
}
2929
}

0 commit comments

Comments
 (0)