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/LambdaHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java index 16a53717f..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,51 +1,45 @@ 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.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/"; - 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(LambdaApplicationHelper.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); } @@ -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(); } } @@ -166,27 +160,8 @@ 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){ + 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/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java new file mode 100644 index 000000000..77b7e7693 --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java @@ -0,0 +1,82 @@ +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.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; + +public class LambdaHttpApiHandler implements RequestHandler { + private static final String BASE_REST_PATH = "/rest/"; + 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"); + logger = LogManager.initialize(".", LambdaHandler.class); + LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaApplicationHelper.initialize()); + + if (jerseyApplication.getClasses().size() == 0) { + logger.error("No HTTP endpoints found for this application"); + } + + handler = GxJerseyLambdaContainerHandlerFactory.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication); + } + } + + @Override + public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Context context) { + if (logger.isDebugEnabled()) { + dumpRequest(awsProxyRequest); + } + + String path = awsProxyRequest.getRawPath(); + prepareRequest(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 <= 599) { + logger.warn(String.format("Request could not be handled (%d): %s", response.getStatusCode(), path)); + } + return response; + } + + private void prepareRequest(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/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 new file mode 100644 index 000000000..25702a008 --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java @@ -0,0 +1,107 @@ +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.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +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 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 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") + .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()); + } + +} 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..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,10 +18,8 @@ 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.serverless.proxy.model.HttpApiV2ProxyRequest; 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 +28,6 @@ import org.junit.Ignore; import org.junit.Test; -import java.io.IOException; - import static org.junit.Assert.*; /** @@ -82,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/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 */ 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; + } + +} +