Skip to content

Commit d48e165

Browse files
committed
address comments by @ikhoon
1 parent 4a887c0 commit d48e165

File tree

12 files changed

+206
-113
lines changed

12 files changed

+206
-113
lines changed

core/src/main/java/com/linecorp/armeria/common/logging/ContentSanitizer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.util.function.BiFunction;
2020

21+
import com.fasterxml.jackson.databind.JsonNode;
22+
2123
import com.linecorp.armeria.common.RequestContext;
2224
import com.linecorp.armeria.common.annotation.UnstableApi;
2325

@@ -46,4 +48,18 @@ public interface ContentSanitizer<T> extends BiFunction<RequestContext, Object,
4648
static ContentSanitizerBuilder builder() {
4749
return new ContentSanitizerBuilder();
4850
}
51+
52+
/**
53+
* Returns a {@link ContentSanitizer} instance which doesn't mask fields.
54+
*/
55+
static ContentSanitizer<String> forText() {
56+
return new ContentSanitizerBuilder().buildForText();
57+
}
58+
59+
/**
60+
* Returns a {@link ContentSanitizer} instance which doesn't mask fields.
61+
*/
62+
static ContentSanitizer<JsonNode> forJson() {
63+
return new ContentSanitizerBuilder().buildForJson();
64+
}
4965
}

core/src/main/java/com/linecorp/armeria/common/logging/JsonLogFormatterBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.linecorp.armeria.common.RequestContext;
2929
import com.linecorp.armeria.common.annotation.UnstableApi;
3030
import com.linecorp.armeria.internal.common.JacksonUtil;
31+
import com.linecorp.armeria.internal.server.annotation.AnnotatedServiceLogUtil;
3132

3233
/**
3334
* A builder implementation for {@link JsonLogFormatter}.
@@ -42,6 +43,7 @@ public final class JsonLogFormatterBuilder
4243
objectMapper = JacksonUtil.newDefaultObjectMapper();
4344
// AnnotatedService can easily have parameters that are not readily serializable
4445
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
46+
AnnotatedServiceLogUtil.customize(objectMapper);
4547
}
4648

4749
/**

core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedBeanFieldInfo.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.util.function.Function;
2323
import java.util.stream.Collectors;
2424

25+
import com.google.common.base.MoreObjects;
26+
2527
import com.linecorp.armeria.common.annotation.Nullable;
2628
import com.linecorp.armeria.common.logging.BeanFieldInfo;
2729

@@ -61,4 +63,13 @@ public <T extends Annotation> T getFieldAnnotation(Class<T> annotationClass) {
6163
public <T extends Annotation> T getClassAnnotation(Class<T> annotationClass) {
6264
return (T) typeMap.get(annotationClass);
6365
}
66+
67+
@Override
68+
public String toString() {
69+
return MoreObjects.toStringHelper(this)
70+
.add("httpElementName", httpElementName)
71+
.add("typeElementMap", typeElementMap)
72+
.add("typeMap", typeMap)
73+
.toString();
74+
}
6475
}

core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedRequest.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.linecorp.armeria.internal.server.annotation;
1818

19+
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.Collections;
2122
import java.util.List;
@@ -27,27 +28,41 @@
2728

2829
final class AnnotatedRequest {
2930

30-
private final List<@Nullable Object> parameters;
31+
private final List<@Nullable Object> rawParameters;
3132
private final List<BeanFieldInfo> beanFieldInfos;
3233

33-
AnnotatedRequest(Object[] parameters, List<BeanFieldInfo> beanFieldInfos) {
34-
assert parameters.length == beanFieldInfos.size();
35-
this.parameters = Collections.unmodifiableList(Arrays.asList(parameters));
34+
AnnotatedRequest(Object[] rawParameters, List<BeanFieldInfo> beanFieldInfos) {
35+
assert rawParameters.length == beanFieldInfos.size();
36+
this.rawParameters = Collections.unmodifiableList(Arrays.asList(rawParameters));
3637
this.beanFieldInfos = beanFieldInfos;
3738
}
3839

39-
public List<@Nullable Object> parameters() {
40-
return parameters;
40+
List<@Nullable Object> rawParameters() {
41+
return rawParameters;
42+
}
43+
44+
@Nullable
45+
Object getParameter(int index) {
46+
final Object o = rawParameters.get(index);
47+
return AnnotatedServiceLogUtil.maybeUnwrapFuture(o);
4148
}
4249

43-
public List<BeanFieldInfo> beanFieldInfos() {
50+
List<BeanFieldInfo> beanFieldInfos() {
4451
return beanFieldInfos;
4552
}
4653

54+
private List<Object> parameters() {
55+
final ArrayList<Object> parameters = new ArrayList<>();
56+
for (int i = 0; i < rawParameters.size(); i++) {
57+
parameters.add(getParameter(i));
58+
}
59+
return parameters;
60+
}
61+
4762
@Override
4863
public String toString() {
4964
return MoreObjects.toStringHelper(this)
50-
.add("parameters", parameters)
65+
.add("parameters", parameters())
5166
.toString();
5267
}
5368
}

core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedRequestJsonSerializer.java

Lines changed: 12 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,26 @@
1616

1717
package com.linecorp.armeria.internal.server.annotation;
1818

19-
import java.io.File;
2019
import java.io.IOException;
21-
import java.nio.file.Path;
22-
import java.util.concurrent.CompletableFuture;
20+
import java.util.function.BiFunction;
2321

2422
import com.fasterxml.jackson.core.JsonGenerator;
2523
import com.fasterxml.jackson.databind.JsonSerializer;
2624
import com.fasterxml.jackson.databind.SerializerProvider;
2725

28-
import com.linecorp.armeria.common.AggregatedHttpObject;
29-
import com.linecorp.armeria.common.Cookies;
30-
import com.linecorp.armeria.common.HttpHeaders;
31-
import com.linecorp.armeria.common.HttpRequest;
32-
import com.linecorp.armeria.common.HttpResponse;
33-
import com.linecorp.armeria.common.QueryParams;
34-
import com.linecorp.armeria.common.RequestContext;
3526
import com.linecorp.armeria.common.annotation.Nullable;
3627
import com.linecorp.armeria.common.logging.BeanFieldInfo;
37-
import com.linecorp.armeria.common.logging.FieldMasker;
38-
import com.linecorp.armeria.common.multipart.Multipart;
39-
import com.linecorp.armeria.common.multipart.MultipartFile;
4028

4129
final class AnnotatedRequestJsonSerializer extends JsonSerializer<AnnotatedRequest> {
4230

43-
private final BeanFieldMaskerCache fieldMaskerCache;
31+
private final BiFunction<BeanFieldInfo, Object, @Nullable Object> masker;
4432

4533
AnnotatedRequestJsonSerializer(BeanFieldMaskerCache fieldMaskerCache) {
46-
this.fieldMaskerCache = fieldMaskerCache;
34+
masker = (info, o) -> fieldMaskerCache.fieldMasker(info).mask(o);
35+
}
36+
37+
AnnotatedRequestJsonSerializer() {
38+
masker = (info, o) -> o;
4739
}
4840

4941
@Override
@@ -57,60 +49,21 @@ public void serialize(AnnotatedRequest value, JsonGenerator gen, SerializerProvi
5749
gen.writeStartObject();
5850
gen.writeFieldName("params");
5951
gen.writeStartArray();
60-
for (int i = 0; i < value.parameters().size(); i++) {
61-
Object parameter = value.parameters().get(i);
62-
parameter = maybeUnwrapFuture(parameter);
52+
for (int i = 0; i < value.rawParameters().size(); i++) {
53+
Object parameter = value.getParameter(i);
6354
if (parameter == null) {
64-
serializers.defaultSerializeNull(gen);
55+
gen.writeNull();
6556
continue;
6657
}
6758
final BeanFieldInfo beanFieldInfo = value.beanFieldInfos().get(i);
68-
final FieldMasker fieldMasker = fieldMaskerCache.fieldMasker(beanFieldInfo);
69-
parameter = fieldMasker.mask(parameter);
70-
parameter = handleInternalTypes(parameter);
59+
parameter = masker.apply(beanFieldInfo, parameter);
7160
if (parameter == null) {
72-
serializers.defaultSerializeNull(gen);
61+
gen.writeNull();
7362
continue;
7463
}
7564
gen.writeObject(parameter);
7665
}
7766
gen.writeEndArray();
7867
gen.writeEndObject();
7968
}
80-
81-
@Nullable
82-
static Object handleInternalTypes(@Nullable Object param) {
83-
if (param == null) {
84-
return null;
85-
}
86-
if (param instanceof HttpRequest ||
87-
param instanceof AggregatedHttpObject ||
88-
param instanceof HttpResponse ||
89-
param instanceof RequestContext ||
90-
param instanceof MultipartFile ||
91-
param instanceof File ||
92-
param instanceof Path ||
93-
param instanceof Multipart ||
94-
param instanceof QueryParams ||
95-
param instanceof Cookies ||
96-
param instanceof HttpHeaders) {
97-
return param.toString();
98-
}
99-
return param;
100-
}
101-
102-
@Nullable
103-
static Object maybeUnwrapFuture(@Nullable Object param) {
104-
if (param == null) {
105-
return null;
106-
}
107-
if (param instanceof CompletableFuture) {
108-
final CompletableFuture<?> future = (CompletableFuture<?>) param;
109-
if (!future.isDone() || future.isCompletedExceptionally()) {
110-
return null;
111-
}
112-
return future.join();
113-
}
114-
return param;
115-
}
11669
}

core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedResponse.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.linecorp.armeria.internal.server.annotation;
1818

19+
import static com.linecorp.armeria.internal.server.annotation.AnnotatedServiceLogUtil.maybeUnwrapFuture;
20+
1921
import com.google.common.base.MoreObjects;
2022

2123
import com.linecorp.armeria.common.annotation.Nullable;
@@ -24,27 +26,32 @@
2426
final class AnnotatedResponse {
2527

2628
@Nullable
27-
private final Object value;
29+
private final Object rawValue;
2830
private final BeanFieldInfo beanFieldInfo;
2931

30-
AnnotatedResponse(@Nullable Object value, BeanFieldInfo beanFieldInfo) {
31-
this.value = value;
32+
AnnotatedResponse(@Nullable Object rawValue, BeanFieldInfo beanFieldInfo) {
33+
this.rawValue = rawValue;
3234
this.beanFieldInfo = beanFieldInfo;
3335
}
3436

3537
@Nullable
36-
public Object value() {
37-
return value;
38+
Object rawValue() {
39+
return rawValue;
40+
}
41+
42+
@Nullable
43+
Object value() {
44+
return maybeUnwrapFuture(rawValue);
3845
}
3946

40-
public BeanFieldInfo beanFieldInfo() {
47+
BeanFieldInfo beanFieldInfo() {
4148
return beanFieldInfo;
4249
}
4350

4451
@Override
4552
public String toString() {
4653
return MoreObjects.toStringHelper(this)
47-
.add("value", value)
54+
.add("value", value())
4855
.toString();
4956
}
5057
}

core/src/main/java/com/linecorp/armeria/internal/server/annotation/AnnotatedResponseJsonSerializer.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,26 @@
1616

1717
package com.linecorp.armeria.internal.server.annotation;
1818

19-
import static com.linecorp.armeria.internal.server.annotation.AnnotatedRequestJsonSerializer.handleInternalTypes;
20-
import static com.linecorp.armeria.internal.server.annotation.AnnotatedRequestJsonSerializer.maybeUnwrapFuture;
21-
2219
import java.io.IOException;
20+
import java.util.function.BiFunction;
2321

2422
import com.fasterxml.jackson.core.JsonGenerator;
2523
import com.fasterxml.jackson.databind.JsonSerializer;
2624
import com.fasterxml.jackson.databind.SerializerProvider;
2725

28-
import com.linecorp.armeria.common.logging.FieldMasker;
26+
import com.linecorp.armeria.common.annotation.Nullable;
27+
import com.linecorp.armeria.common.logging.BeanFieldInfo;
2928

3029
final class AnnotatedResponseJsonSerializer extends JsonSerializer<AnnotatedResponse> {
3130

32-
private final BeanFieldMaskerCache fieldMaskerCache;
31+
private final BiFunction<BeanFieldInfo, Object, @Nullable Object> masker;
3332

3433
AnnotatedResponseJsonSerializer(BeanFieldMaskerCache fieldMaskerCache) {
35-
this.fieldMaskerCache = fieldMaskerCache;
34+
masker = (info, o) -> fieldMaskerCache.fieldMasker(info).mask(o);
35+
}
36+
37+
AnnotatedResponseJsonSerializer() {
38+
masker = (info, o) -> o;
3639
}
3740

3841
@Override
@@ -46,18 +49,15 @@ public void serialize(AnnotatedResponse value, JsonGenerator gen, SerializerProv
4649
gen.writeStartObject();
4750
gen.writeFieldName("value");
4851
Object retValue = value.value();
49-
retValue = maybeUnwrapFuture(retValue);
5052
if (retValue == null) {
51-
serializers.defaultSerializeNull(gen);
53+
gen.writeNull();
5254
gen.writeEndObject();
5355
return;
5456
}
5557

56-
final FieldMasker fieldMasker = fieldMaskerCache.fieldMasker(value.beanFieldInfo());
57-
retValue = fieldMasker.mask(retValue);
58-
retValue = handleInternalTypes(retValue);
58+
retValue = masker.apply(value.beanFieldInfo(), retValue);
5959
if (retValue == null) {
60-
serializers.defaultSerializeNull(gen);
60+
gen.writeNull();
6161
gen.writeEndObject();
6262
return;
6363
}

0 commit comments

Comments
 (0)