Skip to content

Commit abaee6a

Browse files
Refactor RequestRecord Construction
1 parent 596e667 commit abaee6a

File tree

7 files changed

+158
-114
lines changed

7 files changed

+158
-114
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.sap.hcp.cf.logging.common;
2+
3+
import com.sap.hcp.cf.logging.common.RequestRecord.Direction;
4+
5+
public class RequestRecordBuilder {
6+
7+
private final RequestRecord requestRecord;
8+
9+
private RequestRecordBuilder(String layerKey) {
10+
this.requestRecord = new RequestRecord(layerKey);
11+
}
12+
13+
private RequestRecordBuilder(String layerKey, Direction direction) {
14+
this.requestRecord = new RequestRecord(layerKey, direction);
15+
}
16+
17+
public static RequestRecordBuilder requestRecord(String layerKey) {
18+
return new RequestRecordBuilder(layerKey);
19+
}
20+
21+
public static RequestRecordBuilder requestRecord(String layerKey, Direction direction) {
22+
return new RequestRecordBuilder(layerKey, direction);
23+
}
24+
25+
public RequestRecord build() {
26+
return requestRecord;
27+
}
28+
29+
public RequestRecordBuilder addTag(String fieldKey, String tag) {
30+
requestRecord.addTag(fieldKey, tag);
31+
return this;
32+
}
33+
34+
public RequestRecordBuilder addOptionalTag(boolean optionalFieldCanBeLogged, String fieldKey, String tag) {
35+
36+
if (!optionalFieldCanBeLogged && tag != null) {
37+
requestRecord.addTag(fieldKey, Defaults.REDACTED);
38+
}
39+
40+
if (!optionalFieldCanBeLogged && tag.equals(Defaults.UNKNOWN)) {
41+
requestRecord.addTag(fieldKey, tag);
42+
}
43+
44+
if (optionalFieldCanBeLogged) {
45+
requestRecord.addTag(fieldKey, tag);
46+
}
47+
return this;
48+
}
49+
50+
public RequestRecordBuilder addContextTag(String fieldKey, String tag) {
51+
requestRecord.addContextTag(fieldKey, tag);
52+
return this;
53+
}
54+
55+
public RequestRecordBuilder addValue(String fieldKey, Value value) {
56+
requestRecord.addValue(fieldKey, value);
57+
return this;
58+
}
59+
}

cf-java-logging-support-core/src/main/java/com/sap/hcp/cf/logging/common/RequestRecordConfigurator.java

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.sap.hcp.cf.logging.common;
22

3-
import static com.sap.hcp.cf.logging.common.RequestRecordConfigurator.to;
3+
import static com.sap.hcp.cf.logging.common.RequestRecordBuilder.requestRecord;
44
import static org.junit.Assert.assertEquals;
55

66
import java.io.IOException;
@@ -10,52 +10,48 @@
1010
import com.fasterxml.jackson.jr.ob.JSON;
1111
import com.fasterxml.jackson.jr.ob.JSONObjectException;
1212

13-
public class RequestRecordConfiguratorTest {
13+
public class RequestRecordBuilderTest {
1414

1515
@Test
1616
public void testAddingSingleActivatedOptionalTagToRequestRecord() throws JSONObjectException, IOException {
17-
RequestRecord requestRecord = new RequestRecord("TEST");
1817
boolean canBeLogged = true;
1918
String key = "TestKey";
2019
String tag = "TestTag";
2120

22-
to(requestRecord).addOptionalTag(canBeLogged, key, tag);
21+
RequestRecord requestRecord = requestRecord("TEST").addOptionalTag(canBeLogged, key, tag).build();
2322

2423
assertEquals(tag, getFieldFromRequestRecord(requestRecord, key));
2524
}
2625

2726
@Test
2827
public void testAddingSingleForbiddenOptionalTagToRequestRecord() throws JSONObjectException, IOException {
29-
RequestRecord requestRecord = new RequestRecord("TEST");
3028
boolean canBeLogged = false;
3129
String key = "TestKey";
3230
String tag = "TestTag";
3331

34-
to(requestRecord).addOptionalTag(canBeLogged, key, tag);
32+
RequestRecord requestRecord = requestRecord("TEST").addOptionalTag(canBeLogged, key, tag).build();
3533

3634
assertEquals(Defaults.REDACTED, getFieldFromRequestRecord(requestRecord, key));
3735
}
3836

3937
@Test
4038
public void testAddingSingleForbiddenOptionalNullTagToRequestRecord() throws JSONObjectException, IOException {
41-
RequestRecord requestRecord = new RequestRecord("TEST");
4239
boolean canBeLogged = false;
4340
String key = "TestKey";
4441
String tag = Defaults.UNKNOWN;
4542

46-
to(requestRecord).addOptionalTag(canBeLogged, key, tag);
43+
RequestRecord requestRecord = requestRecord("TEST").addOptionalTag(canBeLogged, key, tag).build();
4744

4845
assertEquals(Defaults.UNKNOWN, getFieldFromRequestRecord(requestRecord, key));
4946
}
5047

5148
@Test
5249
public void testAddingSingleActivatedOptionalNullTagToRequestRecord() throws JSONObjectException, IOException {
53-
RequestRecord requestRecord = new RequestRecord("TEST");
5450
boolean canBeLogged = true;
5551
String key = "TestKey";
5652
String tag = Defaults.UNKNOWN;
5753

58-
to(requestRecord).addOptionalTag(canBeLogged, key, tag);
54+
RequestRecord requestRecord = requestRecord("TEST").addOptionalTag(canBeLogged, key, tag).build();
5955

6056
assertEquals(Defaults.UNKNOWN, getFieldFromRequestRecord(requestRecord, key));
6157
}

cf-java-logging-support-jersey/src/main/java/com/sap/hcp/cf/logging/jersey/filter/RequestHandler.java

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.sap.hcp.cf.logging.jersey.filter;
22

3-
import static com.sap.hcp.cf.logging.common.RequestRecordConfigurator.to;
4-
53
import java.net.URI;
64

75
import com.sap.hcp.cf.logging.common.Defaults;
@@ -11,6 +9,7 @@
119
import com.sap.hcp.cf.logging.common.LogOptionalFieldsSettings;
1210
import com.sap.hcp.cf.logging.common.LongValue;
1311
import com.sap.hcp.cf.logging.common.RequestRecord;
12+
import com.sap.hcp.cf.logging.common.RequestRecordBuilder;
1413

1514
public class RequestHandler {
1615
final LogOptionalFieldsSettings logOptionalFieldsSettings;
@@ -38,38 +37,28 @@ public RequestRecord handle(RequestContextAdapter adapter) {
3837
}
3938
}
4039

41-
RequestRecord lrec = new RequestRecord(adapter.getName(), adapter.getDirection());
42-
lrec.start();
43-
44-
addHeaders(adapter, lrec);
45-
40+
boolean isSensitiveConnectionData = logOptionalFieldsSettings.isLogSensitiveConnectionData();
41+
boolean isLogRemoteUserField = logOptionalFieldsSettings.isLogRemoteUserField();
42+
boolean isLogRefererField = logOptionalFieldsSettings.isLogRefererField();
43+
RequestRecord lrec = RequestRecordBuilder.requestRecord(adapter.getName(), adapter.getDirection())
44+
.addTag(Fields.REQUEST, getValue(getRequestUri(adapter)))
45+
.addTag(Fields.METHOD, getValue(adapter.getMethod()))
46+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_IP, getValue(adapter.getUri().getAuthority()))
47+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_HOST, getValue(adapter.getUri().getHost()))
48+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_PORT,
49+
Integer.toString(adapter.getUri().getPort()))
50+
.addOptionalTag(isSensitiveConnectionData, Fields.X_FORWARDED_FOR,
51+
getHeader(adapter, HttpHeaders.X_FORWARDED_FOR))
52+
.addOptionalTag(isLogRemoteUserField, Fields.REMOTE_USER, getValue(adapter.getUser()))
53+
.addOptionalTag(isLogRefererField, Fields.REFERER, getHeader(adapter, HttpHeaders.REFERER))
54+
.addContextTag(Fields.REQUEST_ID, getHeader(adapter, HttpHeaders.X_VCAP_REQUEST_ID))
55+
.addValue(Fields.REQUEST_SIZE_B, new LongValue(adapter.getRequestSize())).build();
56+
57+
lrec.start();
4658
return lrec;
4759

4860
}
4961

50-
private void addHeaders(RequestContextAdapter adapter, RequestRecord lrec) {
51-
52-
lrec.addTag(Fields.REQUEST, getValue(getRequestUri(adapter)));
53-
lrec.addTag(Fields.METHOD, getValue(adapter.getMethod()));
54-
55-
boolean isSensitiveConnectionData = logOptionalFieldsSettings.isLogSensitiveConnectionData();
56-
57-
to(lrec).addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_IP, getValue(adapter.getUri().getAuthority()))
58-
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_HOST, getValue(adapter.getUri().getHost()))
59-
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_PORT, Integer.toString(adapter.getUri()
60-
.getPort()))
61-
.addOptionalTag(isSensitiveConnectionData, Fields.X_FORWARDED_FOR, getHeader(adapter,
62-
HttpHeaders.X_FORWARDED_FOR))
63-
.addOptionalTag(logOptionalFieldsSettings.isLogRemoteUserField(), Fields.REMOTE_USER, getValue(adapter
64-
.getUser()))
65-
.addOptionalTag(logOptionalFieldsSettings.isLogRefererField(), Fields.REFERER, getHeader(adapter,
66-
HttpHeaders.REFERER));
67-
lrec.addContextTag(Fields.REQUEST_ID, getHeader(adapter, HttpHeaders.X_VCAP_REQUEST_ID));
68-
69-
lrec.addValue(Fields.REQUEST_SIZE_B, new LongValue(adapter.getRequestSize()));
70-
71-
}
72-
7362
private String getValue(String value) {
7463
return value != null ? value : Defaults.UNKNOWN;
7564
}

cf-java-logging-support-servlet/src/main/java/com/sap/hcp/cf/logging/servlet/filter/RequestLoggingFilter.java

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.sap.hcp.cf.logging.servlet.filter;
22

3-
import static com.sap.hcp.cf.logging.common.RequestRecordConfigurator.to;
4-
53
import java.io.IOException;
64

75
import javax.servlet.Filter;
@@ -15,8 +13,6 @@
1513

1614
import org.slf4j.MDC;
1715

18-
import com.sap.hcp.cf.logging.common.Defaults;
19-
import com.sap.hcp.cf.logging.common.Fields;
2016
import com.sap.hcp.cf.logging.common.HttpHeaders;
2117
import com.sap.hcp.cf.logging.common.LogContext;
2218
import com.sap.hcp.cf.logging.common.LogOptionalFieldsSettings;
@@ -38,12 +34,21 @@ public class RequestLoggingFilter implements Filter {
3834
private boolean wrapRequest = true;
3935
private DynLogEnvironment dynLogEnvironment;
4036
private DynamicLogLevelProcessor dynamicLogLevelProcessor;
41-
protected LogOptionalFieldsSettings logOptionalFieldsSettings;
37+
private RequestRecordFactory requestRecordFactory;
4238

4339
public RequestLoggingFilter() {
44-
String invokingClass = this.getClass().getName().toString();
45-
logOptionalFieldsSettings = new LogOptionalFieldsSettings(invokingClass);
46-
dynLogEnvironment = new DynLogEnvironment();
40+
this(createRequestRecordFactory());
41+
}
42+
43+
private static RequestRecordFactory createRequestRecordFactory() {
44+
String invokingClass = RequestLoggingFilter.class.getName();
45+
LogOptionalFieldsSettings logOptionalFieldsSettings = new LogOptionalFieldsSettings(invokingClass);
46+
return new RequestRecordFactory(logOptionalFieldsSettings);
47+
}
48+
49+
RequestLoggingFilter(RequestRecordFactory requestRecordFactory) {
50+
this.requestRecordFactory = requestRecordFactory;
51+
this.dynLogEnvironment = new DynLogEnvironment();
4752
if (dynLogEnvironment.getRsaPublicKey() != null) {
4853
dynamicLogLevelProcessor = new DynamicLogLevelProcessor(dynLogEnvironment);
4954
}
@@ -88,9 +93,9 @@ private void doFilterRequest(HttpServletRequest httpRequest, HttpServletResponse
8893
LogContext.initializeContext(getCorrelationIdFromHeader(httpRequest));
8994

9095
try {
91-
RequestRecord rr = new RequestRecord(LOG_PROVIDER);
96+
97+
RequestRecord rr = requestRecordFactory.create(httpRequest);
9298
ContentLengthTrackingResponseWrapper responseWrapper = null;
93-
ContentLengthTrackingRequestWrapper requestWrapper = null;
9499

95100
/*
96101
* -- we essentially do three things here: -- a) we create a log
@@ -106,11 +111,10 @@ private void doFilterRequest(HttpServletRequest httpRequest, HttpServletResponse
106111
RequestLoggingVisitor loggingVisitor = new RequestLoggingVisitor(rr, responseWrapper);
107112

108113
if (wrapRequest) {
109-
httpRequest = new LoggingContextRequestWrapper(httpRequest, loggingVisitor);
110114
httpRequest = new ContentLengthTrackingRequestWrapper(httpRequest);
115+
httpRequest = new LoggingContextRequestWrapper(httpRequest, loggingVisitor);
111116
}
112117

113-
addHeaders(httpRequest, rr);
114118
httpRequest.setAttribute(MDC.class.getName(), MDC.getCopyOfContextMap());
115119

116120

@@ -141,32 +145,4 @@ private String getCorrelationIdFromHeader(HttpServletRequest httpRequest) {
141145
return cId;
142146
}
143147

144-
private String getHeader(HttpServletRequest request, String headerName) {
145-
return getValue(request.getHeader(headerName));
146-
}
147-
148-
private String getValue(String value) {
149-
return value != null ? value : Defaults.UNKNOWN;
150-
}
151-
152-
private void addHeaders(HttpServletRequest request, RequestRecord lrec) {
153-
lrec.addTag(Fields.REQUEST, request.getQueryString() != null
154-
? request.getRequestURI() + "?" + request.getQueryString() : request.getRequestURI());
155-
lrec.addTag(Fields.METHOD, request.getMethod());
156-
lrec.addTag(Fields.PROTOCOL, getValue(request.getProtocol()));
157-
158-
boolean isSensitiveConnectionData = logOptionalFieldsSettings.isLogSensitiveConnectionData();
159-
160-
to(lrec).addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_IP, getValue(request.getRemoteAddr()))
161-
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_HOST, getValue(request.getRemoteHost()))
162-
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_PORT,
163-
Integer.toString(request.getRemotePort()))
164-
.addOptionalTag(isSensitiveConnectionData, Fields.X_FORWARDED_FOR,
165-
getHeader(request, HttpHeaders.X_FORWARDED_FOR))
166-
.addOptionalTag(logOptionalFieldsSettings.isLogRemoteUserField(), Fields.REMOTE_USER,
167-
getValue(request.getRemoteUser()))
168-
.addOptionalTag(logOptionalFieldsSettings.isLogRefererField(), Fields.REFERER,
169-
getHeader(request, HttpHeaders.REFERER));
170-
lrec.addContextTag(Fields.REQUEST_ID, getHeader(request, HttpHeaders.X_VCAP_REQUEST_ID));
171-
}
172148
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.sap.hcp.cf.logging.servlet.filter;
2+
3+
import static com.sap.hcp.cf.logging.common.RequestRecordBuilder.requestRecord;
4+
5+
import javax.servlet.http.HttpServletRequest;
6+
7+
import com.sap.hcp.cf.logging.common.Defaults;
8+
import com.sap.hcp.cf.logging.common.Fields;
9+
import com.sap.hcp.cf.logging.common.HttpHeaders;
10+
import com.sap.hcp.cf.logging.common.LogOptionalFieldsSettings;
11+
import com.sap.hcp.cf.logging.common.RequestRecord;
12+
13+
public class RequestRecordFactory {
14+
15+
private final LogOptionalFieldsSettings logOptionalFieldsSettings;
16+
17+
public RequestRecordFactory(LogOptionalFieldsSettings logOptionalFieldsSettings) {
18+
this.logOptionalFieldsSettings = logOptionalFieldsSettings;
19+
}
20+
21+
public RequestRecord create(HttpServletRequest request) {
22+
boolean isSensitiveConnectionData = logOptionalFieldsSettings.isLogSensitiveConnectionData();
23+
boolean isLogRemoteUserField = logOptionalFieldsSettings.isLogRemoteUserField();
24+
boolean isLogRefererField = logOptionalFieldsSettings.isLogRefererField();
25+
return requestRecord("[SERVLET]").addTag(Fields.REQUEST, getFullRequestUri(request))
26+
.addTag(Fields.METHOD, request.getMethod())
27+
.addTag(Fields.PROTOCOL, getValue(request.getProtocol()))
28+
.addContextTag(Fields.REQUEST_ID, getHeader(request, HttpHeaders.X_VCAP_REQUEST_ID))
29+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_IP, getValue(request.getRemoteAddr()))
30+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_HOST, getValue(request.getRemoteHost()))
31+
.addOptionalTag(isSensitiveConnectionData, Fields.REMOTE_PORT,
32+
Integer.toString(request.getRemotePort()))
33+
.addOptionalTag(isSensitiveConnectionData, Fields.X_FORWARDED_FOR,
34+
getHeader(request, HttpHeaders.X_FORWARDED_FOR))
35+
.addOptionalTag(isLogRemoteUserField, Fields.REMOTE_USER, getValue(request.getRemoteUser()))
36+
.addOptionalTag(isLogRefererField, Fields.REFERER, getHeader(request, HttpHeaders.REFERER))
37+
.build();
38+
}
39+
40+
private String getFullRequestUri(HttpServletRequest request) {
41+
String queryString = request.getQueryString();
42+
String requestURI = request.getRequestURI();
43+
return queryString != null ? requestURI + "?" + queryString : requestURI;
44+
}
45+
46+
private String getHeader(HttpServletRequest request, String headerName) {
47+
return getValue(request.getHeader(headerName));
48+
}
49+
50+
private String getValue(String value) {
51+
return value != null ? value : Defaults.UNKNOWN;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)