From 0d983482714261f1471b4ce53c0073d93cf28482 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 28 Jul 2022 15:28:31 -0300 Subject: [PATCH 1/8] Support Lambda Http APIs Function URLS --- .../aws/handler/LambdaHttpApiHandler.java | 103 ++++++++++++++++ .../jersey/GeneXusAppAwsHttpApiProxyTest.java | 113 ++++++++++++++++++ .../test/jersey/GeneXusAppAwsProxyTest.java | 5 - .../proxy/test/jersey/JerseyAwsProxyTest.java | 11 -- 4 files changed, 216 insertions(+), 16 deletions(-) create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java create mode 100644 gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java new file mode 100644 index 000000000..4604a553b --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -0,0 +1,103 @@ +package com.genexus.cloud.serverless.aws.handler; + +import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.genexus.ApplicationContext; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.Connect; +import com.genexus.specific.java.LogManager; +import com.genexus.util.IniFile; +import org.glassfish.jersey.server.ResourceConfig; + +import javax.ws.rs.core.Application; +import java.util.Map; + +public class LambdaHttpApiHandler implements RequestHandler { + private static final String BASE_REST_PATH = "/rest/"; + private static final String GX_APPLICATION_CLASS = "GXApplication"; + public static JerseyLambdaContainerHandler handler = null; + private static ILogger logger = null; + private static ResourceConfig jerseyApplication = null; + + public LambdaHttpApiHandler() throws Exception { + if (LambdaHttpApiHandler.jerseyApplication == null) { + JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); + LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(initialize()); + if (jerseyApplication.getClasses().size() == 0) { + String errMsg = "No endpoints found for this application"; + logger.error(errMsg); + throw new Exception(errMsg); + } + LambdaHttpApiHandler.handler = JerseyLambdaContainerHandler.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication); + } + } + + private static Application initialize() throws Exception { + logger = LogManager.initialize(".", LambdaHttpApiHandler.class); + Connect.init(); + IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); + String className = config.getProperty("Client", "PACKAGE", null); + Class cls; + try { + cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", className, GX_APPLICATION_CLASS)); + Application app = (Application) cls.getDeclaredConstructor().newInstance(); + ApplicationContext appContext = ApplicationContext.getInstance(); + appContext.setServletEngine(true); + appContext.setServletEngineDefaultPath(""); + com.genexus.Application.init(cls); + return app; + } catch (Exception e) { + logger.error("Failed to initialize App", e); + throw e; + } + } + + @Override + public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Context context) { + if (logger.isDebugEnabled()) { + dumpRequest(awsProxyRequest); + } + String path = awsProxyRequest.getRawPath(); + prepareSpecialMethods(awsProxyRequest); + dumpRequest(awsProxyRequest); + + logger.debug("Before handle Request"); + + awsProxyRequest.setRawPath(path.replace(BASE_REST_PATH, "/")); + AwsProxyResponse response = handler.proxy(awsProxyRequest, context); + + int statusCode = response.getStatusCode(); + logger.debug("After handle Request - Status Code: " + statusCode); + + if (statusCode >= 404 && statusCode <= 499) { + logger.warn(String.format("Request could not be handled (%d): %s", response.getStatusCode(), path)); + } + return response; + } + + private void prepareSpecialMethods(HttpApiV2ProxyRequest awsProxyRequest) { + Map headers = awsProxyRequest.getHeaders(); + + if (headers == null) { + return; + } + + // In Jersey lambda context, the Referer Header has a special meaning. So we copy it to another Header. + String referer = headers.get("Referer"); + if (referer != null && !referer.isEmpty()) { + headers.put("GX-Referer", referer); + } + } + + private void dumpRequest(HttpApiV2ProxyRequest awsProxyRequest) { + String lineSeparator = System.lineSeparator(); + String reqData = String.format("Path: %s", awsProxyRequest.getRawPath()) + lineSeparator; + reqData += String.format("Method: %s", awsProxyRequest.getRequestContext().getHttp().getMethod()) + lineSeparator; + reqData += String.format("QueryString: %s", awsProxyRequest.getRawQueryString()) + lineSeparator; + reqData += String.format("Body: %sn", awsProxyRequest.getBody()) + lineSeparator; + logger.debug(reqData); + } +} \ No newline at end of file diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java new file mode 100644 index 000000000..f6eed1c32 --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java @@ -0,0 +1,113 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.genexus.serverless.proxy.test.jersey; + + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.cloud.serverless.aws.handler.LambdaHttpApiHandler; +import com.genexus.specific.java.Connect; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Unit test class for the Jersey AWS_PROXY default implementation + */ +public class GeneXusAppAwsHttpApiProxyTest { + private static final String CUSTOM_HEADER_KEY = "x-custom-header"; + private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; + + private JerseyLambdaContainerHandler handler = null; + private static ObjectMapper objectMapper = new ObjectMapper(); + private static Context lambdaContext = new MockLambdaContext(); + + private ResourceConfig app; + private LambdaHttpApiHandler l; + + @Before + public void setUpStreams() { + Connect.init(); + + try { + System.setProperty("LAMBDA_TASK_ROOT", "."); + l = new LambdaHttpApiHandler(); + handler = LambdaHttpApiHandler.handler; + } catch (Exception e) { + e.printStackTrace(); + } + } + + public GeneXusAppAwsHttpApiProxyTest() { + + } + + @Test + public void testGXDataProvider() { + HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test", "GET") + .queryString("Itemnumber", "9") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .toHttpApiV2Request(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("{\"ItemId\":9,\"ItemName\":\"9 Item\"}", output.getBody()); + } + + @Test + public void testGXDataProviderWithParams() { + HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test/12", "GET") + .queryString("Itemnumber", "9") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .toHttpApiV2Request(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("{\"ItemId\":12,\"ItemName\":\"12 Item\"}", output.getBody()); + } + + @Test + public void testGxMultiCall() { + HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/gxmulticall", "POST") + .queryString("", "receivenumber") + .body("[[\"5\"],[\"6\"]]") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .toHttpApiV2Request(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + } + + @Test + public void testUpload() { + HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test/gxobject", "POST") + .body("iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAkFBMVEVHcEzxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzX////94Nf/+PX5vKj3oITybEH0flf708f6ybn96uP2lnbzdUz1iWb4qpH83NH+8ez4sZnxYzScvitNAAAAHXRSTlMAR/DQIvbKjAjcVQS2/Oet1kyRG0IphxbBoT9taYkD32YAAAQCSURBVHhevNKLlYQgEETRVuQrKOCwzpwJovLPbhNYXcHGm0HVedRkSl+9vuMyyhDkuMT3qr9pokdsLiuJP40qu416MkO2ABBwzObBUBdz+oy4ZPykmbhNekGF5Ye3iJdHNf8iLk6giUjEIQk0UwPdVTxu8YXuMDrgpqANNRssGNjWGk0Gk9x0QolgIxpKcBKMpKM6cwYzTTWMB7u1IoRdoAO100WbRRdxo0smi07sVLefn73wwW7RUfy3AyPQlTJ0avbobKVTGd1pOuHwAEeHisQDZKEDJuIRwlQF8Eus3egmDsMAADalP+L6B1zFlW2YtrCNsQ2//9uddDfJ0hqxJE7rPMFHQ5z45xBw0f+1BeNakAWgHwIAqDFuwMoG0GEfALAybUJGNoAj4vEsBtDOcAJKWwB272JAOT4JBVkDEJ/PQgAVo/yHXADYDUIAfc+Zlm4AxJc3GSAdxWBHAHYXEYA2ow/gCEDsfQDmT9CQDwCPVwGAHoBX4QdA7AUAPggQky8AP87eAIo5CPoDEN99ARwO80oCwOc3T0CVcxCSAPBz8AJwMNoLAByVPAD7r3s4EgPw8+IDiHJ+iAgBiP3JEcB7sA0CwNerG4Cf6CsZgNfNGbD+l4xSKAB+XB0B9IcvQgHAPioZk5StAOAalYx5WhoUgN3gAmgBIAkLQHw52QMigJhCA/D1Yg2gGDYhARyVbAELeAwK4KhkCXiCbBIA4s0OkEEdGsBvJQvAoYZ2GoA5gyPDOVxPA+AM7j5gCZUE4BKVzIAKIgnAJSqZAREkEwE4Kp3uARIoJwYgDvcAJZS6X6CERPc/kECkewoiqHTjQAXrKSMh0c+BqFW9C6iFWvc2rCHTfQ9k8Kj7InqCje6bcAExab6K6TdApJkXRACQamZGLadmOrlhxsmpTnb8K2h6fjuQT3oOK70KyZpLNDo1ooyLVPIqGXkAGi7TqdQJo5wLlSqV0j2XalVqxbSQFas59kiL1bDT6RfsZA0L7pjIGxZQaPSMCmnTin++vGkFy/n7humocyvonMobl5DO3TtOR+MT83bPqfFt33/lXFJALRhgCDFBUcamEY75Zkho5z3E0g+HqYZYoKG55ojoQXmQKXOaJQwPWOaWw2zhAX+Lt6MUhkEgiqJjIo44gIZYlZA9uP/dFSjFr6bFaN/ZgPgjAu++PmIP+JzvAtfpEl0RD550kjWYUWuTA2bWix8246fdzR4w4/YmG8y8v7EeGziQjH+REjZyWVxH5rOOzHywoRML9YljUq+Dutl0P3ZLFpr7eU13KVO7mUgjbKbz+A0bvR40kk6g7LcR9Xv4rISmEMWhfhE4Cs2UHZflw80Lu0x/odXJvqzv/H8tnk+1U48n5FeadykPy1kAAAAASUVORK5CYII=") + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .toHttpApiV2Request(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(201, output.getStatusCode()); + System.out.println(output.getBody()); + } + +} diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java index 797992e31..f2c1d730d 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java @@ -18,10 +18,7 @@ import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel; -import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.cloud.serverless.aws.LambdaHandler; import com.genexus.specific.java.Connect; @@ -30,8 +27,6 @@ import org.junit.Ignore; import org.junit.Test; -import java.io.IOException; - import static org.junit.Assert.*; /** diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java index ce572407f..4f4164441 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java @@ -17,18 +17,14 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import com.genexus.specific.java.Connect; -import com.genexus.webpanels.GXObjectUploadServices; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -40,13 +36,6 @@ import com.genexus.cloud.serverless.aws.LambdaHandler; import org.junit.*; - -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletResponse; -import java.util.Enumeration; -import java.util.concurrent.CountDownLatch; -import javax.servlet.*; - /** * Unit test class for the Jersey AWS_PROXY default implementation */ From 22b69045b0c6396d25adb7a7e1d90a68f7a81692 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 28 Jul 2022 15:36:06 -0300 Subject: [PATCH 2/8] Refactoring --- .../cloud/serverless/aws/LambdaHandler.java | 26 +++------------ .../serverless/aws/handler/LambdaHelper.java | 32 +++++++++++++++++++ .../aws/handler/LambdaHttpApiHandler.java | 24 ++------------ 3 files changed, 40 insertions(+), 42 deletions(-) create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java index 16a53717f..ff3e3c4a5 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java @@ -10,6 +10,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.genexus.cloud.serverless.aws.handler.AwsGxServletResponse; +import com.genexus.cloud.serverless.aws.handler.LambdaHelper; import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; import com.genexus.webpanels.GXWebObjectStub; @@ -36,12 +37,13 @@ public class LambdaHandler implements RequestHandler handler = null; private static ResourceConfig jerseyApplication = null; private static final String BASE_REST_PATH = "/rest/"; - private static final String GX_APPLICATION_CLASS = "GXApplication"; + public LambdaHandler() throws Exception { if (LambdaHandler.jerseyApplication == null) { JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); - LambdaHandler.jerseyApplication = ResourceConfig.forApplication(initialize()); + logger = LogManager.initialize(".", LambdaHandler.class); + LambdaHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); if (jerseyApplication.getClasses().size() == 0) { String errMsg = "No endpoints found for this application"; logger.error(errMsg); @@ -166,25 +168,7 @@ private GXWebObjectStub resolveServlet(AwsProxyRequest awsProxyRequest) { return handler; } - private static Application initialize() throws Exception { - logger = LogManager.initialize(".", LambdaHandler.class); - Connect.init(); - IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); - String className = config.getProperty("Client", "PACKAGE", null); - Class cls; - try { - cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS: String.format("%s.%s", className, GX_APPLICATION_CLASS)); - Application app = (Application) cls.getDeclaredConstructor().newInstance(); - ApplicationContext appContext = ApplicationContext.getInstance(); - appContext.setServletEngine(true); - appContext.setServletEngineDefaultPath(""); - com.genexus.Application.init(cls); - return app; - } catch (Exception e) { - logger.error("Failed to initialize App", e); - throw e; - } - } + private void dumpRequest(AwsProxyRequest awsProxyRequest){ String lineSeparator = System.lineSeparator(); diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java new file mode 100644 index 000000000..6b91479ce --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java @@ -0,0 +1,32 @@ +package com.genexus.cloud.serverless.aws.handler; + +import com.genexus.ApplicationContext; +import com.genexus.cloud.serverless.aws.LambdaHandler; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.Connect; +import com.genexus.specific.java.LogManager; +import com.genexus.util.IniFile; + +import javax.ws.rs.core.Application; + +public class LambdaHelper { + private static final String GX_APPLICATION_CLASS = "GXApplication"; + + public static Application initialize() throws Exception { + Connect.init(); + IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); + String className = config.getProperty("Client", "PACKAGE", null); + Class cls; + try { + cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS: String.format("%s.%s", className, GX_APPLICATION_CLASS)); + Application app = (Application) cls.getDeclaredConstructor().newInstance(); + ApplicationContext appContext = ApplicationContext.getInstance(); + appContext.setServletEngine(true); + appContext.setServletEngineDefaultPath(""); + com.genexus.Application.init(cls); + return app; + } catch (Exception e) { + throw e; + } + } +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java index 4604a553b..813773b3a 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -6,6 +6,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.genexus.ApplicationContext; +import com.genexus.cloud.serverless.aws.LambdaHandler; import com.genexus.diagnostics.core.ILogger; import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; @@ -25,7 +26,8 @@ public class LambdaHttpApiHandler implements RequestHandler cls; - try { - cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", className, GX_APPLICATION_CLASS)); - Application app = (Application) cls.getDeclaredConstructor().newInstance(); - ApplicationContext appContext = ApplicationContext.getInstance(); - appContext.setServletEngine(true); - appContext.setServletEngineDefaultPath(""); - com.genexus.Application.init(cls); - return app; - } catch (Exception e) { - logger.error("Failed to initialize App", e); - throw e; - } - } - @Override public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Context context) { if (logger.isDebugEnabled()) { From 8667da972a2247054f02e5e46ed0effa75b895cd Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 28 Jul 2022 15:37:52 -0300 Subject: [PATCH 3/8] Remove outPrintLn --- .../proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java index f6eed1c32..5525b9151 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java @@ -107,7 +107,6 @@ public void testUpload() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(201, output.getStatusCode()); - System.out.println(output.getBody()); } } From 98cdff88bf09d65f5f7b53e904d044cbb750ca9f Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 28 Jul 2022 16:13:39 -0300 Subject: [PATCH 4/8] Remove unused imports --- .../genexus/cloud/serverless/aws/LambdaHandler.java | 4 +--- .../serverless/aws/handler/LambdaHttpApiHandler.java | 10 +--------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java index ff3e3c4a5..fa5fb5c6a 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java @@ -45,9 +45,7 @@ public LambdaHandler() throws Exception { logger = LogManager.initialize(".", LambdaHandler.class); LambdaHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); if (jerseyApplication.getClasses().size() == 0) { - String errMsg = "No endpoints found for this application"; - logger.error(errMsg); - throw new Exception(errMsg); + logger.error("No HTTP endpoints found for this application"); } LambdaHandler.handler = JerseyLambdaContainerHandler.getAwsProxyHandler(LambdaHandler.jerseyApplication); } diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java index 813773b3a..1ecc0290f 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -5,20 +5,14 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.genexus.ApplicationContext; import com.genexus.cloud.serverless.aws.LambdaHandler; import com.genexus.diagnostics.core.ILogger; -import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; -import com.genexus.util.IniFile; import org.glassfish.jersey.server.ResourceConfig; - -import javax.ws.rs.core.Application; import java.util.Map; public class LambdaHttpApiHandler implements RequestHandler { private static final String BASE_REST_PATH = "/rest/"; - private static final String GX_APPLICATION_CLASS = "GXApplication"; public static JerseyLambdaContainerHandler handler = null; private static ILogger logger = null; private static ResourceConfig jerseyApplication = null; @@ -29,9 +23,7 @@ public LambdaHttpApiHandler() throws Exception { logger = LogManager.initialize(".", LambdaHandler.class); LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); if (jerseyApplication.getClasses().size() == 0) { - String errMsg = "No endpoints found for this application"; - logger.error(errMsg); - throw new Exception(errMsg); + logger.error("No HTTP endpoints found for this application"); } LambdaHttpApiHandler.handler = JerseyLambdaContainerHandler.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication); } From 70040162c847a1cb950e7bbfc3ac88675cab1bd0 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 9 Aug 2022 17:39:38 -0300 Subject: [PATCH 5/8] - Local Session not working on AWS Lambda Http function. - Added UnitTests - Bump SDK version --- gxawsserverless/GXApplicationClasses.txt | 1 + gxawsserverless/pom.xml | 2 +- .../aws/handler/LambdaHttpApiHandler.java | 27 ++++++-- ...xAwsHttpApiV2HttpServletRequestReader.java | 46 +++++++++++++ ...GxJerseyLambdaContainerHandlerFactory.java | 24 +++++++ .../jersey/GeneXusAppAwsHttpApiProxyTest.java | 15 +++- .../test/jersey/GeneXusAppAwsProxyTest.java | 14 ++++ .../com/gx/serverless/test/GXApplication.java | 8 --- .../java/com/gx/serverless/test/GXcfg.java | 13 ---- .../com/gx/serverless/test/sessionset.java | 64 +++++++++++++++++ .../test/sessionset_RESTInterfaceIN.java | 68 +++++++++++++++++++ .../test/sessionset_services_rest.java | 51 ++++++++++++++ 12 files changed, 304 insertions(+), 29 deletions(-) create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java create mode 100644 gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java create mode 100644 gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java create mode 100644 gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java diff --git a/gxawsserverless/GXApplicationClasses.txt b/gxawsserverless/GXApplicationClasses.txt index d3c59b5ca..954124b6b 100644 --- a/gxawsserverless/GXApplicationClasses.txt +++ b/gxawsserverless/GXApplicationClasses.txt @@ -1,3 +1,4 @@ com.gx.serverless.test.test_services_rest com.gx.serverless.test.receivenumber_services_rest +com.gx.serverless.test.sessionset_services_rest com.genexus.serverless.proxy.test.jersey.EchoJerseyResource \ No newline at end of file diff --git a/gxawsserverless/pom.xml b/gxawsserverless/pom.xml index 454db26b4..975ae5a7d 100644 --- a/gxawsserverless/pom.xml +++ b/gxawsserverless/pom.xml @@ -46,7 +46,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.6 + 1.8.2 diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java index 1ecc0290f..ce58a557d 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -3,13 +3,17 @@ import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.genexus.cloud.serverless.aws.LambdaHandler; +import com.genexus.cloud.serverless.aws.handler.internal.GxJerseyLambdaContainerHandlerFactory; import com.genexus.diagnostics.core.ILogger; import com.genexus.specific.java.LogManager; import org.glassfish.jersey.server.ResourceConfig; + import java.util.Map; +import java.util.UUID; public class LambdaHttpApiHandler implements RequestHandler { private static final String BASE_REST_PATH = "/rest/"; @@ -22,10 +26,12 @@ public LambdaHttpApiHandler() throws Exception { JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); logger = LogManager.initialize(".", LambdaHandler.class); LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); + if (jerseyApplication.getClasses().size() == 0) { logger.error("No HTTP endpoints found for this application"); } - LambdaHttpApiHandler.handler = JerseyLambdaContainerHandler.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication); + + handler = GxJerseyLambdaContainerHandlerFactory.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication); } } @@ -34,9 +40,9 @@ public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Con if (logger.isDebugEnabled()) { dumpRequest(awsProxyRequest); } + String path = awsProxyRequest.getRawPath(); - prepareSpecialMethods(awsProxyRequest); - dumpRequest(awsProxyRequest); + prepareRequest(awsProxyRequest); logger.debug("Before handle Request"); @@ -46,13 +52,23 @@ public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Con int statusCode = response.getStatusCode(); logger.debug("After handle Request - Status Code: " + statusCode); - if (statusCode >= 404 && statusCode <= 499) { + if (statusCode >= 404 && statusCode <= 599) { logger.warn(String.format("Request could not be handled (%d): %s", response.getStatusCode(), path)); } return response; } - private void prepareSpecialMethods(HttpApiV2ProxyRequest awsProxyRequest) { + private void prepareRequest(HttpApiV2ProxyRequest awsProxyRequest) { + + if (awsProxyRequest.getRequestContext() == null) { + logger.info("setRequestContext was null. Creating NEW"); + awsProxyRequest.setRequestContext(new HttpApiV2ProxyRequestContext() {{ + setRequestId(UUID.randomUUID().toString()); + }}); + } + + logger.info("getRequestId: " + awsProxyRequest.getRequestContext().getRequestId()); + Map headers = awsProxyRequest.getHeaders(); if (headers == null) { @@ -74,4 +90,5 @@ private void dumpRequest(HttpApiV2ProxyRequest awsProxyRequest) { reqData += String.format("Body: %sn", awsProxyRequest.getBody()) + lineSeparator; logger.debug(reqData); } + } \ No newline at end of file diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java new file mode 100644 index 000000000..38154a38c --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java @@ -0,0 +1,46 @@ +package com.genexus.cloud.serverless.aws.handler.internal; + +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpApiV2ProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.SecurityContext; + +public class GxAwsHttpApiV2HttpServletRequestReader extends RequestReader { + static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid HTTP API v2 proxy request"; + + @Override + public HttpServletRequest readRequest(HttpApiV2ProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException { + if (request.getRequestContext() == null || request.getRequestContext().getHttp().getMethod() == null || request.getRequestContext().getHttp().getMethod().equals("")) { + throw new InvalidRequestEventException(INVALID_REQUEST_ERROR); + } + + // clean out the request path based on the container config + request.setRawPath(stripBasePath(request.getRawPath(), config)); + + AwsHttpApiV2ProxyHttpServletRequest servletRequest = new AwsHttpApiV2ProxyHttpServletRequest(request, lambdaContext, securityContext, config); + + AwsProxyRequestContext rContext = new AwsProxyRequestContext(); + rContext.setRequestId(request.getRequestContext().getRequestId()); + servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, rContext); + servletRequest.setAttribute(HTTP_API_CONTEXT_PROPERTY, request.getRequestContext()); + servletRequest.setAttribute(HTTP_API_STAGE_VARS_PROPERTY, request.getStageVariables()); + servletRequest.setAttribute(HTTP_API_EVENT_PROPERTY, request); + servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext); + servletRequest.setAttribute(JAX_SECURITY_CONTEXT_PROPERTY, securityContext); + + return servletRequest; + } + + @Override + protected Class getRequestClass() { + return HttpApiV2ProxyRequest.class; + } +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java new file mode 100644 index 000000000..9ace4d926 --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java @@ -0,0 +1,24 @@ +package com.genexus.cloud.serverless.aws.handler.internal; + +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; + +import javax.ws.rs.core.Application; + +public class GxJerseyLambdaContainerHandlerFactory { + public static JerseyLambdaContainerHandler getHttpApiV2ProxyHandler(Application jaxRsApplication) { + JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>( + HttpApiV2ProxyRequest.class, + AwsProxyResponse.class, + new GxAwsHttpApiV2HttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(true), + new AwsHttpApiV2SecurityContextWriter(), + new AwsProxyExceptionHandler(), + jaxRsApplication); + newHandler.initialize(); + return newHandler; + } +} diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java index 5525b9151..d1f323a9f 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.cloud.serverless.aws.handler.LambdaHttpApiHandler; import com.genexus.specific.java.Connect; -import org.glassfish.jersey.server.ResourceConfig; import org.junit.Before; import org.junit.Test; @@ -39,7 +38,6 @@ public class GeneXusAppAwsHttpApiProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static Context lambdaContext = new MockLambdaContext(); - private ResourceConfig app; private LambdaHttpApiHandler l; @Before @@ -72,6 +70,19 @@ public void testGXDataProvider() { assertEquals("{\"ItemId\":9,\"ItemName\":\"9 Item\"}", output.getBody()); } + @Test + public void testSessionSet() { + HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/SessionSet", "POST") + .body("{\"SessionName\":\"Name\",\"SessionValue\":\"SetValueSession\"}") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .toHttpApiV2Request(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + + } + @Test public void testGXDataProviderWithParams() { HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test/12", "GET") diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java index f2c1d730d..02776cad3 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.cloud.serverless.aws.LambdaHandler; @@ -77,6 +78,19 @@ public void testGXDataProvider() { assertEquals("{\"ItemId\":9,\"ItemName\":\"9 Item\"}", output.getBody()); } + @Test + public void testSessionSet() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/SessionSet", "POST") + .body("{\"SessionName\":\"Name\",\"SessionValue\":\"SetValueSession\"}") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + + } + @Test public void testGXDataProviderWithParams() { AwsProxyRequest request = new AwsProxyRequestBuilder("/Test/12", "GET") diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java b/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java index 854fa68d9..1239caa71 100644 --- a/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java +++ b/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java @@ -1,11 +1,3 @@ -/* - File: GXApplication - Description: No description for object - Author: GeneXus Java Generator version 15_0_11-123400 - Generated on: July 19, 2018 16:10:34.62 - Program type: Callable routine - Main DBMS: SQL Server -*/ package com.gx.serverless.test; import java.util.*; diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java b/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java index 07c1321fb..2e686dc3a 100644 --- a/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java +++ b/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java @@ -1,19 +1,6 @@ -/* - File: GXcfg - Description: No description for object - Author: GeneXus Java Generator version 15_0_11-123400 - Generated on: July 19, 2018 16:10:34.58 - Program type: Callable routine - Main DBMS: SQL Server -*/ package com.gx.serverless.test; -import com.gx.serverless.*; import com.genexus.*; -import com.genexus.db.*; -import com.genexus.search.*; - -import java.sql.*; public final class GXcfg { public static int strcmp(String Left, diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java new file mode 100644 index 000000000..a0ae31a01 --- /dev/null +++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java @@ -0,0 +1,64 @@ +package com.gx.serverless.test; + +import com.genexus.*; + +public final class sessionset extends GXProcedure +{ + public sessionset( int remoteHandle ) + { + super( remoteHandle , new ModelContext( sessionset.class ), "" ); + } + + public sessionset( int remoteHandle , + ModelContext context ) + { + super( remoteHandle , context, "" ); + } + + public void execute( String aP0 , + String aP1 ) + { + execute_int(aP0, aP1); + } + + private void execute_int( String aP0 , + String aP1 ) + { + sessionset.this.AV8SessionName = aP0; + sessionset.this.AV9SessionValue = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + private void privateExecute( ) + { + AV10WebSession.setValue(AV8SessionName, AV9SessionValue); + cleanup(); + } + + protected void cleanup( ) + { + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors( ) + { + } + + /* Aggregate/select formulas */ + public void initialize( ) + { + AV10WebSession = httpContext.getWebSession(); + /* GeneXus formulas. */ + Gx_err = (short)(0) ; + } + + private short Gx_err ; + private String AV8SessionName ; + private String AV9SessionValue ; + private com.genexus.webpanels.WebSession AV10WebSession ; +} + diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java new file mode 100644 index 000000000..dd72eb9ee --- /dev/null +++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java @@ -0,0 +1,68 @@ +package com.gx.serverless.test; +import com.genexus.*; +import com.fasterxml.jackson.annotation.*; + +@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.NONE) +@javax.xml.bind.annotation.XmlType(name = "sessionset_RESTInterfaceIN", namespace ="http://tempuri.org/") +@JsonPropertyOrder(alphabetic=true) +@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE, getterVisibility=JsonAutoDetect.Visibility.NONE, isGetterVisibility=JsonAutoDetect.Visibility.NONE) +public final class sessionset_RESTInterfaceIN +{ + String AV8SessionName; + @JsonProperty("SessionName") + public String getSessionName( ) + { + if ( GXutil.strcmp(AV8SessionName, null) == 0 ) + { + return "" ; + } + else + { + return AV8SessionName ; + } + } + + @JsonProperty("SessionName") + public void setSessionName( String Value ) + { + if ( Value == null ) + { + AV8SessionName = "" ; + } + else + { + AV8SessionName= Value; + } + } + + + String AV9SessionValue; + @JsonProperty("SessionValue") + public String getSessionValue( ) + { + if ( GXutil.strcmp(AV9SessionValue, null) == 0 ) + { + return "" ; + } + else + { + return AV9SessionValue ; + } + } + + @JsonProperty("SessionValue") + public void setSessionValue( String Value ) + { + if ( Value == null ) + { + AV9SessionValue = "" ; + } + else + { + AV9SessionValue= Value; + } + } + + +} + diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java new file mode 100644 index 000000000..4e4323fe4 --- /dev/null +++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java @@ -0,0 +1,51 @@ +package com.gx.serverless.test; + +import com.genexus.*; +import com.genexus.ws.rs.core.*; + +@javax.ws.rs.Path("/SessionSet") +public final class sessionset_services_rest extends GxRestService +{ + @javax.ws.rs.POST + @javax.ws.rs.Consumes({javax.ws.rs.core.MediaType.APPLICATION_JSON}) + @javax.ws.rs.Produces({javax.ws.rs.core.MediaType.APPLICATION_JSON + ";charset=UTF-8"}) + public javax.ws.rs.core.Response execute( com.gx.serverless.test.sessionset_RESTInterfaceIN entity ) throws Exception + { + super.init( "POST" ); + String AV8SessionName; + AV8SessionName = entity.getSessionName() ; + String AV9SessionValue; + AV9SessionValue = entity.getSessionValue() ; + if ( ! processHeaders("sessionset",myServletRequestWrapper,myServletResponseWrapper) ) + { + builder = Response.notModifiedWrapped(); + cleanup(); + return (javax.ws.rs.core.Response) builder.build() ; + } + try + { + com.gx.serverless.test.sessionset worker = new com.gx.serverless.test.sessionset(remoteHandle, context); + worker.execute(AV8SessionName,AV9SessionValue ); + builder = Response.okWrapped(); + cleanup(); + return (javax.ws.rs.core.Response) builder.build() ; + } + catch ( Exception e ) + { + cleanup(); + throw e; + } + } + + protected boolean IntegratedSecurityEnabled( ) + { + return false; + } + + protected int IntegratedSecurityLevel( ) + { + return 0; + } + +} + From 81a11075d35e9e076d4f7cdcedf10abbe0539b79 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 9 Aug 2022 17:41:18 -0300 Subject: [PATCH 6/8] Remove comment --- .../jersey/GeneXusAppAwsHttpApiProxyTest.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java index d1f323a9f..25702a008 100644 --- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java @@ -1,18 +1,5 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ package com.genexus.serverless.proxy.test.jersey; - import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; @@ -27,9 +14,6 @@ import static org.junit.Assert.assertEquals; -/** - * Unit test class for the Jersey AWS_PROXY default implementation - */ public class GeneXusAppAwsHttpApiProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; From dbc464a85420d19eb7e2b2a9c237f94b438f91dd Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Mon, 15 Aug 2022 13:49:05 -0300 Subject: [PATCH 7/8] Remove unneeded code --- .../serverless/aws/handler/LambdaHttpApiHandler.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java index ce58a557d..2c2ca7496 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -13,7 +13,6 @@ import org.glassfish.jersey.server.ResourceConfig; import java.util.Map; -import java.util.UUID; public class LambdaHttpApiHandler implements RequestHandler { private static final String BASE_REST_PATH = "/rest/"; @@ -59,16 +58,6 @@ public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Con } private void prepareRequest(HttpApiV2ProxyRequest awsProxyRequest) { - - if (awsProxyRequest.getRequestContext() == null) { - logger.info("setRequestContext was null. Creating NEW"); - awsProxyRequest.setRequestContext(new HttpApiV2ProxyRequestContext() {{ - setRequestId(UUID.randomUUID().toString()); - }}); - } - - logger.info("getRequestId: " + awsProxyRequest.getRequestContext().getRequestId()); - Map headers = awsProxyRequest.getHeaders(); if (headers == null) { From e1502b4e343f18b4ba7ec0d30f90aa5a084bde37 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Mon, 29 Aug 2022 15:31:09 -0300 Subject: [PATCH 8/8] Address @iroqueta review --- .../cloud/serverless/aws/LambdaHandler.java | 39 ++++++++----------- .../aws/handler/LambdaApplicationHelper.java | 25 ++++++++++++ .../serverless/aws/handler/LambdaHelper.java | 32 --------------- .../aws/handler/LambdaHttpApiHandler.java | 3 +- 4 files changed, 42 insertions(+), 57 deletions(-) create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java index fa5fb5c6a..59ebf3cf7 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java @@ -1,49 +1,43 @@ package com.genexus.cloud.serverless.aws; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.ws.rs.core.Application; - import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; -import com.genexus.cloud.serverless.aws.handler.AwsGxServletResponse; -import com.genexus.cloud.serverless.aws.handler.LambdaHelper; -import com.genexus.specific.java.Connect; -import com.genexus.specific.java.LogManager; -import com.genexus.webpanels.GXWebObjectStub; -import org.glassfish.jersey.server.ResourceConfig; - import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.genexus.ApplicationContext; +import com.genexus.cloud.serverless.aws.handler.AwsGxServletResponse; +import com.genexus.cloud.serverless.aws.handler.LambdaApplicationHelper; import com.genexus.diagnostics.core.ILogger; -import com.genexus.util.IniFile; -import com.genexus.webpanels.*; +import com.genexus.specific.java.LogManager; +import com.genexus.webpanels.GXOAuthAccessToken; +import com.genexus.webpanels.GXOAuthLogout; +import com.genexus.webpanels.GXOAuthUserInfo; +import com.genexus.webpanels.GXWebObjectStub; +import org.glassfish.jersey.server.ResourceConfig; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; import java.util.Enumeration; import java.util.List; import java.util.concurrent.CountDownLatch; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; - public class LambdaHandler implements RequestHandler { private static ILogger logger = null; public static JerseyLambdaContainerHandler handler = null; private static ResourceConfig jerseyApplication = null; private static final String BASE_REST_PATH = "/rest/"; - public LambdaHandler() throws Exception { if (LambdaHandler.jerseyApplication == null) { JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); logger = LogManager.initialize(".", LambdaHandler.class); - LambdaHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); + LambdaHandler.jerseyApplication = ResourceConfig.forApplication(LambdaApplicationHelper.initialize()); if (jerseyApplication.getClasses().size() == 0) { logger.error("No HTTP endpoints found for this application"); } @@ -61,7 +55,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c dumpRequest(awsProxyRequest); logger.debug("Before handle Request"); - + awsProxyRequest.setPath(path.replace(BASE_REST_PATH, "/")); AwsProxyResponse response = this.handler.proxy(awsProxyRequest, context); @@ -70,7 +64,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c awsProxyRequest.setPath(path); logger.debug("Trying servlet request: " + path); AwsGxServletResponse servletResponse = handleServletRequest(awsProxyRequest, context); - if (servletResponse.wasHandled()){ + if (servletResponse.wasHandled()) { response = servletResponse.getAwsProxyResponse(); } } @@ -167,8 +161,7 @@ private GXWebObjectStub resolveServlet(AwsProxyRequest awsProxyRequest) { } - - private void dumpRequest(AwsProxyRequest awsProxyRequest){ + private void dumpRequest(AwsProxyRequest awsProxyRequest) { String lineSeparator = System.lineSeparator(); String reqData = String.format("Path: %s", awsProxyRequest.getPath()) + lineSeparator; reqData += String.format("Method: %s", awsProxyRequest.getHttpMethod()) + lineSeparator; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java new file mode 100644 index 000000000..0a77e67ab --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java @@ -0,0 +1,25 @@ +package com.genexus.cloud.serverless.aws.handler; + +import com.genexus.ApplicationContext; +import com.genexus.specific.java.Connect; +import com.genexus.util.IniFile; + +import javax.ws.rs.core.Application; + +public class LambdaApplicationHelper { + private static final String GX_APPLICATION_CLASS = "GXApplication"; + private static final String GX_APPLICATION_CONFIG = "client.cfg"; + + public static Application initialize() throws Exception { + Connect.init(); + IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, GX_APPLICATION_CONFIG, null); + String className = config.getProperty("Client", "PACKAGE", null); + Class cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", className, GX_APPLICATION_CLASS)); + Application app = (Application) cls.getDeclaredConstructor().newInstance(); + ApplicationContext appContext = ApplicationContext.getInstance(); + appContext.setServletEngine(true); + appContext.setServletEngineDefaultPath(""); + com.genexus.Application.init(cls); + return app; + } +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java deleted file mode 100644 index 6b91479ce..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHelper.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.genexus.cloud.serverless.aws.handler; - -import com.genexus.ApplicationContext; -import com.genexus.cloud.serverless.aws.LambdaHandler; -import com.genexus.diagnostics.core.ILogger; -import com.genexus.specific.java.Connect; -import com.genexus.specific.java.LogManager; -import com.genexus.util.IniFile; - -import javax.ws.rs.core.Application; - -public class LambdaHelper { - private static final String GX_APPLICATION_CLASS = "GXApplication"; - - public static Application initialize() throws Exception { - Connect.init(); - IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); - String className = config.getProperty("Client", "PACKAGE", null); - Class cls; - try { - cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS: String.format("%s.%s", className, GX_APPLICATION_CLASS)); - Application app = (Application) cls.getDeclaredConstructor().newInstance(); - ApplicationContext appContext = ApplicationContext.getInstance(); - appContext.setServletEngine(true); - appContext.setServletEngineDefaultPath(""); - com.genexus.Application.init(cls); - return app; - } catch (Exception e) { - throw e; - } - } -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java index 2c2ca7496..77b7e7693 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -3,7 +3,6 @@ import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.genexus.cloud.serverless.aws.LambdaHandler; @@ -24,7 +23,7 @@ public LambdaHttpApiHandler() throws Exception { if (LambdaHttpApiHandler.jerseyApplication == null) { JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); logger = LogManager.initialize(".", LambdaHandler.class); - LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaHelper.initialize()); + LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaApplicationHelper.initialize()); if (jerseyApplication.getClasses().size() == 0) { logger.error("No HTTP endpoints found for this application");