Skip to content

Commit 1da7013

Browse files
committed
Moved away from Lambda context logger to slf4j-api. This addresses issues #21. Also removed Lambda context as a dependency from AwsServletContext to address #44.
1 parent 3a8620f commit 1da7013

File tree

21 files changed

+127
-42
lines changed

21 files changed

+127
-42
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import com.amazonaws.serverless.proxy.internal.model.ErrorModel;
1818
import com.fasterxml.jackson.core.JsonProcessingException;
1919
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
2022

2123
import javax.ws.rs.core.HttpHeaders;
2224
import javax.ws.rs.core.MediaType;
@@ -37,6 +39,8 @@
3739
public class AwsProxyExceptionHandler
3840
implements ExceptionHandler<AwsProxyResponse> {
3941

42+
private Logger log = LoggerFactory.getLogger(AwsProxyExceptionHandler.class);
43+
4044
//-------------------------------------------------------------
4145
// Constants
4246
//-------------------------------------------------------------
@@ -93,7 +97,7 @@ String getErrorJson(String message) {
9397
try {
9498
return objectMapper.writeValueAsString(new ErrorModel(message));
9599
} catch (JsonProcessingException e) {
96-
e.printStackTrace();
100+
log.error("Could not produce error JSON", e);
97101
return "{ \"message\": \"" + message + "\" }";
98102
}
99103
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
import com.amazonaws.serverless.proxy.internal.model.ContainerConfig;
1717
import com.amazonaws.services.lambda.runtime.Context;
1818

19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
1922
import javax.ws.rs.core.SecurityContext;
2023

2124
import java.util.concurrent.CountDownLatch;
@@ -49,6 +52,8 @@ public abstract class LambdaContainerHandler<RequestType, ResponseType, Containe
4952

5053
protected Context lambdaContext;
5154

55+
private Logger log = LoggerFactory.getLogger(LambdaContainerHandler.class);
56+
5257

5358
//-------------------------------------------------------------
5459
// Variables - Private - Static
@@ -65,6 +70,7 @@ protected LambdaContainerHandler(RequestReader<RequestType, ContainerRequestType
6570
ResponseWriter<ContainerResponseType, ResponseType> responseWriter,
6671
SecurityContextWriter<RequestType> securityContextWriter,
6772
ExceptionHandler<ResponseType> exceptionHandler) {
73+
log.info("Starting Lambda Container Handler");
6874
this.requestReader = requestReader;
6975
this.responseWriter = responseWriter;
7076
this.securityContextWriter = securityContextWriter;
@@ -95,6 +101,7 @@ protected abstract void handleRequest(ContainerRequestType containerRequest, Con
95101
* @param basePath The base path to be stripped from the request
96102
*/
97103
public void stripBasePath(String basePath) {
104+
log.debug("Setting framework to strip base path: " + basePath);
98105
config.setStripBasePath(true);
99106
config.setServiceBasePath(basePath);
100107
}
@@ -122,8 +129,7 @@ public ResponseType proxy(RequestType request, Context context) {
122129

123130
return responseWriter.writeResponse(containerResponse, context);
124131
} catch (Exception e) {
125-
context.getLogger().log("Error while handling request: " + e.getMessage());
126-
e.printStackTrace();
132+
log.error("Error while handling request", e);
127133

128134
return exceptionHandler.handle(e);
129135
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414

1515
import com.amazonaws.services.lambda.runtime.Context;
1616

17+
import org.slf4j.Logger;
18+
import org.slf4j.LoggerFactory;
19+
1720
import javax.servlet.AsyncContext;
1821
import javax.servlet.DispatcherType;
1922
import javax.servlet.ServletContext;
@@ -66,6 +69,8 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
6669

6770
protected DispatcherType dispatcherType;
6871

72+
private Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class);
73+
6974

7075
//-------------------------------------------------------------
7176
// Constructors
@@ -280,8 +285,7 @@ protected String generateQueryString(Map<String, String> parameters) {
280285
newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name());
281286
}
282287
} catch (UnsupportedEncodingException e) {
283-
lambdaContext.getLogger().log("Could not URLEncode: " + newKey + "\n" + e.getLocalizedMessage());
284-
e.printStackTrace();
288+
log.error("Could not URLEncode: " + newKey, e);
285289

286290
}
287291
return newKey + "=" + newValue;

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
*/
1313
package com.amazonaws.serverless.proxy.internal.servlet;
1414

15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
1518
import javax.servlet.ServletOutputStream;
1619
import javax.servlet.WriteListener;
1720
import javax.servlet.http.Cookie;
@@ -53,6 +56,8 @@ public class AwsHttpServletResponse
5356
private AwsHttpServletRequest request;
5457
private boolean isCommitted = false;
5558

59+
private Logger log = LoggerFactory.getLogger(AwsHttpServletResponse.class);
60+
5661

5762
//-------------------------------------------------------------
5863
// Constructors
@@ -275,7 +280,7 @@ public void setWriteListener(WriteListener writeListener) {
275280
try {
276281
writeListener.onWritePossible();
277282
} catch (IOException e) {
278-
e.printStackTrace();
283+
log.error("Output stream is not writable", e);
279284
}
280285

281286
listener = writeListener;
@@ -288,6 +293,7 @@ public void write(int b) throws IOException {
288293
try {
289294
bodyOutputStream.write(b);
290295
} catch (Exception e) {
296+
log.error("Cannot write to output stream", e);
291297
listener.onError(e);
292298
}
293299
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import com.amazonaws.serverless.proxy.internal.SecurityContextWriter;
2020
import com.amazonaws.services.lambda.runtime.Context;
2121

22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
2225
import javax.servlet.ServletContext;
2326
import javax.servlet.ServletException;
2427
import javax.servlet.http.HttpServletRequest;
@@ -46,6 +49,7 @@ public abstract class AwsLambdaServletContainerHandler<RequestType, ResponseType
4649
//-------------------------------------------------------------
4750

4851
protected ServletContext servletContext;
52+
private Logger log = LoggerFactory.getLogger(AwsLambdaServletContainerHandler.class);
4953

5054
//-------------------------------------------------------------
5155
// Variables - Protected
@@ -81,7 +85,7 @@ public void forward(ContainerRequestType servletRequest, ContainerResponseType s
8185
try {
8286
handleRequest(servletRequest, servletResponse, lambdaContext);
8387
} catch (Exception e) {
84-
e.printStackTrace();
88+
log.error("Could not forward request", e);
8589
throw new ServletException(e);
8690
}
8791
}
@@ -99,7 +103,7 @@ public void include(ContainerRequestType servletRequest, ContainerResponseType s
99103
try {
100104
handleRequest(servletRequest, servletResponse, lambdaContext);
101105
} catch (Exception e) {
102-
e.printStackTrace();
106+
log.error("Could not include request", e);
103107
throw new ServletException(e);
104108
}
105109
}
@@ -133,7 +137,7 @@ protected void handleRequest(ContainerRequestType containerRequest, ContainerRes
133137
// context so we only set it once.
134138
// TODO: In the future, if we decide to support multiple servlets/contexts in an instance we only need to modify this method
135139
if (getServletContext() == null) {
136-
setServletContext(new AwsServletContext(lambdaContext, this));
140+
setServletContext(new AwsServletContext(this));
137141
}
138142
}
139143

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.apache.commons.fileupload.FileUploadException;
2121
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
2222
import org.apache.commons.fileupload.servlet.ServletFileUpload;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
2325

2426
import javax.servlet.AsyncContext;
2527
import javax.servlet.ReadListener;
@@ -75,6 +77,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest {
7577
private SecurityContext securityContext;
7678
private Map<String, List<String>> urlEncodedFormParameters;
7779
private Map<String, Part> multipartFormParameters;
80+
private Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class);
7881

7982

8083
//-------------------------------------------------------------
@@ -125,7 +128,7 @@ public long getDateHeader(String s) {
125128
try {
126129
return dateFormatter.parse(dateString).getTime();
127130
} catch (ParseException e) {
128-
e.printStackTrace();
131+
log.error("Could not parse date header", e);
129132
return new Date().getTime();
130133
}
131134
}
@@ -405,7 +408,7 @@ public void setReadListener(ReadListener readListener) {
405408
try {
406409
listener.onDataAvailable();
407410
} catch (IOException e) {
408-
e.printStackTrace();
411+
log.error("Data not available on input stream", e);
409412
}
410413
}
411414

@@ -682,8 +685,7 @@ private Map<String, Part> getMultipartFormParametersMap() {
682685
output.put(item.getFieldName(), newPart);
683686
}
684687
} catch (FileUploadException e) {
685-
// TODO: Should we swallaw this?
686-
e.printStackTrace();
688+
log.error("Could not read multipart upload file", e);
687689
}
688690
return output;
689691
}
@@ -701,7 +703,7 @@ private Map<String, List<String>> getFormUrlEncodedParametersMap() {
701703
try {
702704
rawBodyContent = URLDecoder.decode(request.getBody(), DEFAULT_CHARACTER_ENCODING);
703705
} catch (UnsupportedEncodingException e) {
704-
e.printStackTrace();
706+
log.warn("Could not decode body content - proceeding as if it was already decoded", e);
705707
rawBodyContent = request.getBody();
706708
}
707709

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
1717
import com.amazonaws.services.lambda.runtime.Context;
1818

19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
1922
import javax.servlet.Filter;
2023
import javax.servlet.FilterRegistration;
2124
import javax.servlet.RequestDispatcher;
@@ -64,10 +67,10 @@ public class AwsServletContext
6467
// Variables - Private
6568
//-------------------------------------------------------------
6669
private Map<String, FilterHolder> filters;
67-
private Context lambdaContext;
6870
private Map<String, Object> attributes;
6971
private Map<String, String> initParameters;
7072
private AwsLambdaServletContainerHandler containerHandler;
73+
private Logger log = LoggerFactory.getLogger(AwsServletContext.class);
7174

7275

7376
//-------------------------------------------------------------
@@ -80,8 +83,7 @@ public class AwsServletContext
8083
// Constructors
8184
//-------------------------------------------------------------
8285

83-
public AwsServletContext(Context lambdaContext, AwsLambdaServletContainerHandler containerHandler) {
84-
this.lambdaContext = lambdaContext;
86+
public AwsServletContext(AwsLambdaServletContainerHandler containerHandler) {
8587
this.containerHandler = containerHandler;
8688
this.attributes = new HashMap<>();
8789
this.initParameters = new HashMap<>();
@@ -141,7 +143,7 @@ public String getMimeType(String s) {
141143
try {
142144
return Files.probeContentType(Paths.get(s));
143145
} catch (IOException e) {
144-
e.printStackTrace();
146+
log.warn("Could not find content type for filter", e);
145147
return null;
146148
}
147149
}
@@ -202,22 +204,20 @@ public Enumeration<String> getServletNames() {
202204

203205
@Override
204206
public void log(String s) {
205-
lambdaContext.getLogger().log(s);
207+
log.info(s);
206208
}
207209

208210

209211
@Override
210212
@Deprecated
211213
public void log(Exception e, String s) {
212-
lambdaContext.getLogger().log(s);
213-
lambdaContext.getLogger().log(e.getMessage());
214+
log.error(s, e);
214215
}
215216

216217

217218
@Override
218219
public void log(String s, Throwable throwable) {
219-
lambdaContext.getLogger().log(s);
220-
lambdaContext.getLogger().log(throwable.getMessage());
220+
log.error(s, throwable);
221221
}
222222

223223

@@ -229,7 +229,7 @@ public String getRealPath(String s) {
229229
try {
230230
absPath = new File(fileUrl.toURI()).getAbsolutePath();
231231
} catch (URISyntaxException e) {
232-
lambdaContext.getLogger().log("Error while looking for real path: " + s + "\n" + e.getMessage());
232+
log.error("Error while looking for real path: " + s, e);
233233
}
234234
}
235235
return absPath;
@@ -350,7 +350,7 @@ public FilterRegistration.Dynamic addFilter(String name, String filterClass) {
350350

351351
return addFilter(name, filterCastClass);
352352
} catch (ClassNotFoundException e) {
353-
e.printStackTrace();
353+
log.error("Could not find filter class", e);
354354
throw new IllegalStateException("Filter class " + filterClass + " not found");
355355
}
356356
}
@@ -381,7 +381,7 @@ public FilterRegistration.Dynamic addFilter(String name, Class<? extends Filter>
381381
} catch (ServletException e) {
382382
// TODO: There is no clear indication in the servlet specs on whether we should throw an exception here.
383383
// See JavaDoc here: http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContext.html#addFilter-java.lang.String-java.lang.Class-
384-
lambdaContext.getLogger().log("Could not register filter: " + e.getMessage());
384+
log.error("Could not register filter: ", e);
385385
}
386386
return null;
387387
}
@@ -392,7 +392,7 @@ public <T extends Filter> T createFilter(Class<T> aClass) throws ServletExceptio
392392
try {
393393
return aClass.newInstance();
394394
} catch (InstantiationException | IllegalAccessException e) {
395-
lambdaContext.getLogger().log("Could not initialize filter class " + aClass.getName() + "\n" + e.getMessage());
395+
log.error("Could not initialize filter class " + aClass.getName(), e);
396396
throw new ServletException();
397397
}
398398
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
*/
1313
package com.amazonaws.serverless.proxy.internal.servlet.filters;
1414

15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
1518
import javax.servlet.*;
1619
import javax.servlet.annotation.WebFilter;
1720
import javax.servlet.http.HttpServletRequest;
@@ -40,6 +43,7 @@ public class UrlPathValidator implements Filter {
4043
//-------------------------------------------------------------
4144

4245
private int invalidStatusCode;
46+
private Logger log = LoggerFactory.getLogger(UrlPathValidator.class);
4347

4448

4549
//-------------------------------------------------------------
@@ -54,7 +58,7 @@ public void init(FilterConfig filterConfig) throws ServletException {
5458
try {
5559
invalidStatusCode = Integer.parseInt(statusCode);
5660
} catch (NumberFormatException e) {
57-
// TODO: Log
61+
log.error("Could not parse status code from filter config", e);
5862
invalidStatusCode = DEFAULT_ERROR_CODE;
5963
}
6064
}

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class AwsFilterChainManagerTest {
2121

2222
@BeforeClass
2323
public static void setUp() {
24-
servletContext = new AwsServletContext(lambdaContext, null);//AwsServletContext.getInstance(lambdaContext, null);
24+
servletContext = new AwsServletContext( null);//AwsServletContext.getInstance(lambdaContext, null);
2525

2626
FilterRegistration.Dynamic reg = servletContext.addFilter("Filter1", new MockFilter());
2727
reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/first/second");

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class FilterHolderTest {
1212

1313
@Test
1414
public void annotation_filterRegistration_pathValidator() {
15-
FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(lambdaContext, null));
15+
FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(null));
1616

1717
assertTrue(holder.isAnnotated());
1818
assertNotEquals(UrlPathValidator.class.getName(), holder.getRegistration().getName());

0 commit comments

Comments
 (0)