Skip to content

Commit c6a9a46

Browse files
committed
Use latest available Apache Struts2 GA version 6.0.3
#471
1 parent cd60e6d commit c6a9a46

File tree

9 files changed

+85
-55
lines changed

9 files changed

+85
-55
lines changed

aws-serverless-java-container-struts/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
</parent>
1616

1717
<properties>
18-
<struts.version>2.5.30</struts.version>
18+
<struts.version>6.0.3</struts.version>
1919
</properties>
2020

2121
<dependencies>

aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected void handleRequest(HttpServletRequest httpServletRequest,
121121

122122
@Override
123123
public void initialize() throws ContainerInitializationException {
124-
log.info("Initialize Struts2 Lambda Application ...");
124+
log.info("Initialize Struts Lambda Application ...");
125125
Timer.start(TIMER_STRUTS_COLD_START_INIT);
126126
try {
127127
if (this.startupHandler != null) {

aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import com.fasterxml.jackson.core.type.TypeReference;
2525
import com.fasterxml.jackson.databind.ObjectMapper;
2626
import org.apache.commons.codec.binary.Base64;
27-
import org.apache.struts2.StrutsJUnit4TestCase;
27+
import org.apache.struts2.StrutsRestTestCase;
2828
import org.junit.Test;
2929
import org.junit.runner.RunWith;
3030
import org.junit.runners.Parameterized;
@@ -49,24 +49,25 @@
4949
* Unit test class for the Struts2 AWS_PROXY default implementation
5050
*/
5151
@RunWith(Parameterized.class)
52-
public class StrutsAwsProxyTest extends StrutsJUnit4TestCase<EchoAction> {
52+
public class StrutsAwsProxyTest extends StrutsRestTestCase<EchoAction> {
5353
private static final String CUSTOM_HEADER_KEY = "x-custom-header";
5454
private static final String CUSTOM_HEADER_VALUE = "my-custom-value";
5555
private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString();
56+
private static final String HTTP_METHOD_GET = "GET";
57+
private static final String QUERY_STRING_MODE = "mode";
5658
private static final String QUERY_STRING_KEY = "message";
5759
private static final String QUERY_STRING_ENCODED_VALUE = "Hello Struts2";
5860
private static final String USER_PRINCIPAL = "user1";
5961
private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json; charset=UTF-8";
6062

6163

62-
private static ObjectMapper objectMapper = new ObjectMapper();
64+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
6365
private final StrutsLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = StrutsLambdaContainerHandler
6466
.getAwsProxyHandler();
6567
private final StrutsLambdaContainerHandler<HttpApiV2ProxyRequest, AwsProxyResponse> httpApiHandler = StrutsLambdaContainerHandler
6668
.getHttpApiV2ProxyHandler();
67-
private static Context lambdaContext = new MockLambdaContext();
68-
69-
private String type;
69+
private final Context lambdaContext = new MockLambdaContext();
70+
private final String type;
7071

7172
public StrutsAwsProxyTest(String reqType) {
7273
type = reqType;
@@ -92,8 +93,8 @@ private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, C
9293

9394
@Test
9495
public void headers_getHeaders_echo() {
95-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
96-
.queryString("mode", "headers")
96+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
97+
.queryString(QUERY_STRING_MODE, "headers")
9798
.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
9899
.json();
99100

@@ -106,7 +107,7 @@ public void headers_getHeaders_echo() {
106107

107108
@Test
108109
public void context_servletResponse_setCustomHeader() {
109-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET")
110+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET)
110111
.queryString("customHeader", "true")
111112
.json();
112113

@@ -118,7 +119,7 @@ public void context_servletResponse_setCustomHeader() {
118119
@Test
119120
public void context_serverInfo_correctContext() {
120121
assumeTrue("API_GW".equals(type));
121-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET")
122+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET)
122123
.queryString(QUERY_STRING_KEY, "Hello Struts2")
123124
.header("Content-Type", "application/json")
124125
.queryString("contentType", "true");
@@ -131,8 +132,8 @@ public void context_serverInfo_correctContext() {
131132

132133
@Test
133134
public void queryString_uriInfo_echo() {
134-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
135-
.queryString("mode", "query-string")
135+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
136+
.queryString(QUERY_STRING_MODE, "query-string")
136137
.queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
137138
.json();
138139

@@ -146,8 +147,8 @@ public void queryString_uriInfo_echo() {
146147

147148
@Test
148149
public void requestScheme_valid_expectHttps() {
149-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
150-
.queryString("mode", "scheme")
150+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
151+
.queryString(QUERY_STRING_MODE, "scheme")
151152
.queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE)
152153
.json();
153154

@@ -161,8 +162,8 @@ public void requestScheme_valid_expectHttps() {
161162
@Test
162163
public void authorizer_securityContext_customPrincipalSuccess() {
163164
assumeTrue("API_GW".equals(type));
164-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
165-
.queryString("mode", "principal")
165+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
166+
.queryString(QUERY_STRING_MODE, "principal")
166167
.json()
167168
.authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID);
168169

@@ -175,7 +176,7 @@ public void authorizer_securityContext_customPrincipalSuccess() {
175176

176177
@Test
177178
public void errors_unknownRoute_expect404() {
178-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", "GET");
179+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", HTTP_METHOD_GET);
179180

180181
AwsProxyResponse output = executeRequest(request, lambdaContext);
181182
assertEquals(404, output.getStatusCode());
@@ -184,7 +185,7 @@ public void errors_unknownRoute_expect404() {
184185
@Test
185186
public void error_contentType_invalidContentType() {
186187
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST")
187-
.queryString("mode", "content-type")
188+
.queryString(QUERY_STRING_MODE, "content-type")
188189
.header("Content-Type", "application/octet-stream")
189190
.body("asdasdasd");
190191

@@ -195,7 +196,7 @@ public void error_contentType_invalidContentType() {
195196
@Test
196197
public void error_statusCode_methodNotAllowed() {
197198
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST")
198-
.queryString("mode", "not-allowed")
199+
.queryString(QUERY_STRING_MODE, "not-allowed")
199200
.json();
200201

201202
AwsProxyResponse output = executeRequest(request, lambdaContext);
@@ -209,7 +210,7 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti
209210
value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE);
210211
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "POST")
211212
.json()
212-
.body(objectMapper.writeValueAsString(value));
213+
.body(OBJECT_MAPPER.writeValueAsString(value));
213214

214215
AwsProxyResponse output = executeRequest(request, lambdaContext);
215216
assertEquals(200, output.getStatusCode());
@@ -220,8 +221,8 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti
220221

221222
@Test
222223
public void statusCode_responseStatusCode_customStatusCode() {
223-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
224-
.queryString("mode", "custom-status-code")
224+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
225+
.queryString(QUERY_STRING_MODE, "custom-status-code")
225226
.queryString("status", "201")
226227
.json();
227228

@@ -231,7 +232,7 @@ public void statusCode_responseStatusCode_customStatusCode() {
231232

232233
@Test
233234
public void base64_binaryResponse_base64Encoding() {
234-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET");
235+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET);
235236

236237
AwsProxyResponse response = executeRequest(request, lambdaContext);
237238
assertNotNull(response.getBody());
@@ -241,7 +242,7 @@ public void base64_binaryResponse_base64Encoding() {
241242
@Test
242243
public void exception_mapException_mapToNotImplemented() {
243244
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST")
244-
.queryString("mode", "not-implemented");
245+
.queryString(QUERY_STRING_MODE, "not-implemented");
245246

246247
AwsProxyResponse response = executeRequest(request, lambdaContext);
247248
assertNotNull(response.getBody());
@@ -251,7 +252,7 @@ public void exception_mapException_mapToNotImplemented() {
251252

252253
@Test
253254
public void stripBasePath_route_shouldRouteCorrectly() {
254-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", "GET")
255+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", HTTP_METHOD_GET)
255256
.json()
256257
.queryString(QUERY_STRING_KEY, "stripped");
257258
handler.stripBasePath("/custompath");
@@ -263,7 +264,7 @@ public void stripBasePath_route_shouldRouteCorrectly() {
263264

264265
@Test
265266
public void stripBasePath_route_shouldReturn404() {
266-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET")
267+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", HTTP_METHOD_GET)
267268
.json()
268269
.queryString("status", "201");
269270
handler.stripBasePath("/custom");
@@ -275,8 +276,8 @@ public void stripBasePath_route_shouldReturn404() {
275276
@Test
276277
public void securityContext_injectPrincipal_expectPrincipalName() {
277278
assumeTrue("API_GW".equals(type));
278-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET")
279-
.queryString("mode", "principal")
279+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET)
280+
.queryString(QUERY_STRING_MODE, "principal")
280281
.authorizerPrincipal(USER_PRINCIPAL);
281282

282283
AwsProxyResponse resp = executeRequest(request, lambdaContext);
@@ -295,7 +296,7 @@ public void queryParam_encoding_expectUnencodedParam() {
295296
e.printStackTrace();
296297
fail("Could not decode parameter");
297298
}
298-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, decodedParam);
299+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, decodedParam);
299300

300301
AwsProxyResponse resp = executeRequest(request, lambdaContext);
301302
assertEquals(200, resp.getStatusCode());
@@ -306,7 +307,7 @@ public void queryParam_encoding_expectUnencodedParam() {
306307
public void queryParam_encoding_expectEncodedParam() {
307308
assumeTrue("API_GW".equals(type));
308309
String paramValue = "p%2Fz%2B3";
309-
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, paramValue);
310+
AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, paramValue);
310311

311312
AwsProxyResponse resp = executeRequest(request, lambdaContext);
312313
assertEquals(200, resp.getStatusCode());
@@ -323,7 +324,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin
323324
TypeReference<HashMap<String, Object>> typeRef
324325
= new TypeReference<HashMap<String, Object>>() {
325326
};
326-
HashMap<String, Object> response = objectMapper.readValue(output.getBody(), typeRef);
327+
HashMap<String, Object> response = OBJECT_MAPPER.readValue(output.getBody(), typeRef);
327328
assertNotNull(response.get(key));
328329
assertEquals(value, response.get(key));
329330
} catch (IOException e) {
@@ -335,7 +336,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin
335336
private void validateSingleValueModel(AwsProxyResponse output, String value) {
336337
try {
337338
assertNotNull(output.getBody());
338-
assertEquals(value, objectMapper.readerFor(String.class).readValue(output.getBody()));
339+
assertEquals(value, OBJECT_MAPPER.readerFor(String.class).readValue(output.getBody()));
339340
} catch (Exception e) {
340341
e.printStackTrace();
341342
fail("Exception while parsing response body: " + e.getMessage());
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2.LambdaAppender">
3+
<Appenders>
4+
<Lambda name="Lambda">
5+
<PatternLayout>
6+
<pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern>
7+
</PatternLayout>
8+
</Lambda>
9+
</Appenders>
10+
<Loggers>
11+
<Logger name="com.opensymphony.xwork2" level="warn"/>
12+
<Logger name="org.apache.struts2" level="warn"/>
13+
<Root level="info">
14+
<AppenderRef ref="Lambda"/>
15+
</Root>
16+
</Loggers>
17+
</Configuration>

aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,30 @@ dependencies {
1818
exclude group: 'org.apache.logging.log4j', module: 'log4j-api'
1919
exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
2020
}
21-
implementation ('org.apache.struts:struts2-convention-plugin:2.5.30') {
21+
implementation ('org.apache.struts:struts2-convention-plugin:6.0.3') {
2222
exclude group: 'org.apache.struts', module: 'struts2-core'
2323
}
24-
implementation ('org.apache.struts:struts2-rest-plugin:2.5.30') {
24+
implementation ('org.apache.struts:struts2-rest-plugin:6.0.3') {
2525
exclude group: 'org.apache.struts', module: 'struts2-core'
2626
}
27-
implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.30') {
27+
implementation ('org.apache.struts:struts2-bean-validation-plugin:6.0.3') {
2828
exclude group: 'org.apache.struts', module: 'struts2-core'
2929
}
30-
implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') {
30+
implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0') {
3131
exclude group: 'org.apache.struts', module: 'struts2-core'
3232
}
33-
implementation ('org.apache.struts:struts2-core:2.5.30') {
33+
implementation ('org.apache.struts:struts2-core:6.0.3') {
3434
exclude group: 'org.apache.logging.log4j', module: 'log4j-api'
3535
}
36-
implementation ('org.hibernate:hibernate-validator:5.4.3.Final')
36+
implementation ('org.hibernate:hibernate-validator:6.1.7.Final')
3737
implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3')
3838
implementation ('org.apache.logging.log4j:log4j-core:2.17.2')
3939
implementation ('org.apache.logging.log4j:log4j-api:2.17.2')
4040
implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2')
4141
implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1')
4242

4343
testImplementation('junit:junit:4.13.2')
44-
testImplementation('org.apache.struts:struts2-junit-plugin:2.5.30') {
44+
testImplementation('org.apache.struts:struts2-junit-plugin:6.0.3') {
4545
exclude group: 'org.apache.struts', module: 'struts2-core'
4646
}
4747
}

aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@
1515
<properties>
1616
<maven.compiler.source>1.8</maven.compiler.source>
1717
<maven.compiler.target>1.8</maven.compiler.target>
18-
<struts.version>2.5.30</struts.version>
18+
<struts.version>6.0.3</struts.version>
1919
<jackson.version>2.13.3</jackson.version>
2020
<junit.version>4.13.2</junit.version>
21-
<log4j.version>2.17.2</log4j.version>
21+
<log4j.version>2.18.0</log4j.version>
2222
</properties>
2323

24+
<repositories>
25+
<repository>
26+
<id>struts-staging</id>
27+
<url>https://repository.apache.org/content/repositories/staging/</url>
28+
</repository>
29+
</repositories>
30+
2431
<dependencies>
2532
<dependency>
2633
<groupId>com.amazonaws.serverless</groupId>
@@ -63,14 +70,14 @@
6370
<dependency>
6471
<groupId>com.jgeppert.struts2</groupId>
6572
<artifactId>struts2-aws-lambda-support-plugin</artifactId>
66-
<version>1.3.0</version>
73+
<version>1.4.0</version>
6774
</dependency>
6875

6976
<!-- bean validation based on hibernate validators-->
7077
<dependency>
7178
<groupId>org.hibernate</groupId>
7279
<artifactId>hibernate-validator</artifactId>
73-
<version>5.4.3.Final</version>
80+
<version>6.1.7.Final</version>
7481
</dependency>
7582

7683
<dependency>
@@ -88,6 +95,11 @@
8895
<artifactId>jackson-databind</artifactId>
8996
<version>\${jackson.version}</version>
9097
</dependency>
98+
<dependency>
99+
<groupId>com.fasterxml.jackson.dataformat</groupId>
100+
<artifactId>jackson-dataformat-xml</artifactId>
101+
<version>\${jackson.version}</version>
102+
</dependency>
91103

92104
<dependency>
93105
<groupId>org.apache.logging.log4j</groupId>

aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
<!-- Use Jackson lib as content handler for all JSON requests -->
2626
<bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson"
27-
class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
27+
class="org.apache.struts2.rest.handler.JacksonJsonHandler"/>
2828
<constant name="struts.rest.handlerOverride.json" value="jackson"/>
2929

3030
<!-- Set to false if the json content can be returned for any kind of http method -->

samples/struts/pet-store/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ configurations {
1414
dependencies {
1515
implementation (
1616
'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)',
17-
'org.apache.struts:struts2-convention-plugin:2.5.30',
18-
'org.apache.struts:struts2-rest-plugin:2.5.30',
19-
'org.apache.struts:struts2-bean-validation-plugin:2.5.30',
20-
'org.apache.struts:struts2-junit-plugin:2.5.30',
21-
'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0',
22-
'org.hibernate:hibernate-validator:5.4.3.Final',
17+
'org.apache.struts:struts2-convention-plugin:6.0.3',
18+
'org.apache.struts:struts2-rest-plugin:6.0.3',
19+
'org.apache.struts:struts2-bean-validation-plugin:6.0.3',
20+
'org.apache.struts:struts2-junit-plugin:6.0.3',
21+
'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0',
22+
'org.hibernate:hibernate-validator:6.1.7.Final',
2323
'com.fasterxml.jackson.core:jackson-databind:2.13.3',
2424
'org.apache.logging.log4j:log4j-core:2.17.2',
2525
'org.apache.logging.log4j:log4j-api:2.17.2',

0 commit comments

Comments
 (0)