From 7f8563af8b76fe6f49b4670be3445ba2a59f8f99 Mon Sep 17 00:00:00 2001 From: sjuarezgx Date: Fri, 5 Jul 2024 17:16:35 -0300 Subject: [PATCH 01/16] Java Azure functions --- .../serverless/{model => }/EventMessage.java | 2 +- .../serverless/EventMessageProperty.java | 17 +++ .../serverless/EventMessageResponse.java | 28 +++++ .../serverless/EventMessageSourceType.java | 8 ++ .../serverless/{model => }/EventMessages.java | 2 +- .../cloud/serverless/GXProcedureExecutor.java | 2 - .../com/genexus/cloud/serverless/Helper.java | 2 - .../aws/handler/LambdaBaseEventHandler.java | 4 +- .../aws/handler/LambdaEventBridgeHandler.java | 8 +- .../aws/handler/LambdaSQSHandler.java | 10 +- gxazureserverless/pom.xml | 91 +++++++++++++++ .../azure/handler/AzureEventHandler.java | 62 ++++++++++ .../handler/AzureFunctionConfiguration.java | 54 +++++++++ .../AzureFunctionConfigurationHelper.java | 51 ++++++++ .../azure/handler/AzureQueueHandler.java | 86 ++++++++++++++ .../FunctionConfigurationException.java | 7 ++ .../exception/FunctionRuntimeException.java | 9 ++ gxserverlesscommon/pom.xml | 61 ++++++++++ .../cloud/serverless/GXProcedureExecutor.java | 110 ++++++++++++++++++ .../com/genexus/cloud/serverless/Helper.java | 27 +++++ .../ServerlessBaseEventHandler.java | 92 +++++++++++++++ .../ServerlessFunctionConfiguration.java | 10 ++ .../FunctionConfigurationException.java | 7 ++ .../cloud/serverless/model/EventMessage.java | 73 ++++++++++++ .../model/EventMessageProperty.java | 0 .../model/EventMessageResponse.java | 0 .../model/EventMessageSourceType.java | 0 .../cloud/serverless/model/EventMessages.java | 16 +++ pom.xml | 2 + 29 files changed, 824 insertions(+), 17 deletions(-) rename gxawsserverless/src/main/java/com/genexus/cloud/serverless/{model => }/EventMessage.java (97%) create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java create mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java rename gxawsserverless/src/main/java/com/genexus/cloud/serverless/{model => }/EventMessages.java (86%) create mode 100644 gxazureserverless/pom.xml create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java create mode 100644 gxserverlesscommon/pom.xml create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java rename {gxawsserverless => gxserverlesscommon}/src/main/java/com/genexus/cloud/serverless/model/EventMessageProperty.java (100%) rename {gxawsserverless => gxserverlesscommon}/src/main/java/com/genexus/cloud/serverless/model/EventMessageResponse.java (100%) rename {gxawsserverless => gxserverlesscommon}/src/main/java/com/genexus/cloud/serverless/model/EventMessageSourceType.java (100%) create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java similarity index 97% rename from gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java rename to gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java index bdbdc5b84..86d1ca305 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java @@ -1,4 +1,4 @@ -package com.genexus.cloud.serverless.model; +package com.genexus.cloud.serverless; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java new file mode 100644 index 000000000..6f08eefd6 --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java @@ -0,0 +1,17 @@ +package com.genexus.cloud.serverless; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class EventMessageProperty { + + public EventMessageProperty(String pId, String pValue) { + propertyId = pId; + propertyValue = pValue; + } + + @JsonProperty("PropertyId") + private String propertyId; + + @JsonProperty("PropertyValue") + private String propertyValue; +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java new file mode 100644 index 000000000..dc58130d8 --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java @@ -0,0 +1,28 @@ +package com.genexus.cloud.serverless; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class EventMessageResponse { + @JsonProperty("HandleFailure") + private boolean hasFailed = false; + + @JsonProperty("ErrorMessage") + private String errorMessage = ""; + + public boolean hasFailed() { + return hasFailed; + } + + public void setAsFailed(boolean hasFailed) { + this.hasFailed = hasFailed; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java new file mode 100644 index 000000000..c2cc1f75c --- /dev/null +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java @@ -0,0 +1,8 @@ +package com.genexus.cloud.serverless; + +public class EventMessageSourceType { + public static String QUEUE_MESSAGE = "QueueMessage"; + public static String SERVICE_BUS_MESSAGE = "ServiceBusMessage"; + public static String TIMER = "Timer"; + public static String STREAM_MESSAGE = "StreamMessage"; +} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java similarity index 86% rename from gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java rename to gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java index c2d31c84e..0bf1c6cad 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java @@ -1,4 +1,4 @@ -package com.genexus.cloud.serverless.model; +package com.genexus.cloud.serverless; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java index 0825efd0a..15249b36e 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -5,8 +5,6 @@ import com.genexus.GXProcedure; import com.genexus.GxUserType; import com.genexus.ModelContext; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessages; import com.genexus.db.DynamicExecute; import org.apache.commons.lang.NotImplementedException; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java index 1f86e4c0b..a1cbb160c 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java @@ -1,8 +1,6 @@ package com.genexus.cloud.serverless; import com.fasterxml.jackson.databind.ObjectMapper; -import com.genexus.cloud.serverless.model.EventMessage; -import com.genexus.cloud.serverless.model.EventMessageProperty; import com.genexus.diagnostics.core.ILogger; import com.genexus.diagnostics.core.LogManager; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java index c7a4f82b8..c9d472d64 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java @@ -3,8 +3,8 @@ import com.genexus.ApplicationContext; import com.genexus.ModelContext; import com.genexus.cloud.serverless.*; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.EventMessageResponse; +import com.genexus.cloud.serverless.EventMessages; import com.genexus.diagnostics.core.ILogger; import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java index 4ef04e940..32851a211 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java @@ -4,10 +4,10 @@ import com.amazonaws.services.lambda.runtime.RequestHandler; import com.genexus.cloud.serverless.Helper; import com.genexus.cloud.serverless.exception.FunctionRuntimeException; -import com.genexus.cloud.serverless.model.EventMessage; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessageSourceType; -import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.EventMessage; +import com.genexus.cloud.serverless.EventMessageResponse; +import com.genexus.cloud.serverless.EventMessageSourceType; +import com.genexus.cloud.serverless.EventMessages; import json.org.json.JSONObject; import org.apache.http.client.utils.DateUtils; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java index ef90bbb98..fec33a3c1 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java @@ -6,11 +6,11 @@ import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; import com.genexus.cloud.serverless.*; -import com.genexus.cloud.serverless.model.EventMessageProperty; -import com.genexus.cloud.serverless.model.EventMessage; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessageSourceType; -import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.EventMessageProperty; +import com.genexus.cloud.serverless.EventMessage; +import com.genexus.cloud.serverless.EventMessageResponse; +import com.genexus.cloud.serverless.EventMessageSourceType; +import com.genexus.cloud.serverless.EventMessages; import java.util.ArrayList; import java.util.Date; diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml new file mode 100644 index 000000000..e943e0bc4 --- /dev/null +++ b/gxazureserverless/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + + com.genexus + parent + ${revision}${changelist} + + + gxazureserverless + GeneXus Azure Functions Handler + + + 1.8 + 1.8 + + + + + ${project.groupId} + gxclassR + ${project.version} + + + + ${project.groupId} + gxcommon + ${project.version} + + + + ${project.groupId} + gxserverlesscommon + ${project.version} + + + + com.microsoft.azure.functions + azure-functions-java-library + 3.1.0 + + + + com.microsoft.azure + azure-functions-maven-plugin + 1.35.0 + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + org.glassfish.jersey.core + jersey-server + ${jersey.javax.version} + + + com.genexus + gxserverlesscommon + 4.7-SNAPSHOT + compile + + + com.genexus + gxserverlesscommon + 4.7-SNAPSHOT + compile + + + + + + gx-azure-serverless + + + + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.10 + + + + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java new file mode 100644 index 000000000..2ee8229c6 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java @@ -0,0 +1,62 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; +import com.genexus.cloud.serverless.GXProcedureExecutor; +import com.genexus.cloud.serverless.ServerlessBaseEventHandler; + +import java.util.List; + +public class AzureEventHandler extends ServerlessBaseEventHandler { + public AzureEventHandler() throws Exception { + super(); + } + protected void SetupServerlessMappings(String functionName) throws Exception { + logger.debug("Initializing Function configuration"); + try { + if ((functionConfiguration == null) || (!functionConfiguration.isValidConfiguration())) { + functionConfiguration = getFunctionConfiguration(functionName); + } + if (functionConfiguration != null && functionConfiguration.isValidConfiguration()) + entryPointClass = Class.forName(functionConfiguration.getGXClassName()); + + } catch (Exception e) { + logger.error(String.format("Failed to initialize Application"), e); + throw e; + } + if (entryPointClass != null) + executor = new GXProcedureExecutor(entryPointClass); + else + { + logger.error(String.format("Invalid EntryPoint Class for function")); + throw new Exception("Failed to initialize Application. Check whether gxazmappings.json is located in the right place, with the correct format, and specifies an entry point for your function."); + } + + } + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { + return new AzureFunctionConfiguration(functionName,className); + } + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String className) { + return new AzureFunctionConfiguration("",className); + } + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration() { + + return new AzureFunctionConfiguration(); + } + @Override + protected AzureFunctionConfiguration getFunctionConfiguration(String functionName) throws FunctionConfigurationException { + List mappings = AzureFunctionConfigurationHelper.getFunctionsMapConfiguration(); + if (mappings != null) + return AzureFunctionConfigurationHelper.getAzureFunctionConfiguration(functionName,mappings); + return null; + } + @Override + protected void InitializeServerlessConfig() throws Exception { + } + +} + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java new file mode 100644 index 000000000..bde7259db --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java @@ -0,0 +1,54 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.genexus.cloud.serverless.ServerlessFunctionConfiguration; +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.LogManager; + +import java.util.List; +import java.util.Optional; + +public class AzureFunctionConfiguration extends ServerlessFunctionConfiguration { + private final static ILogger logger = LogManager.initialize(".", AzureFunctionConfiguration.class); + private final static String FUNCTION_CONFIG_PATH = "gxazmappings.json"; + @JsonProperty("FunctionName") + private String functionName; + @JsonProperty("GXEntrypoint") + private String gxEntrypoint; + + public AzureFunctionConfiguration() + { + } + public AzureFunctionConfiguration(String functionName, String gxEntrypoint) + { + this.functionName = functionName; + this.gxEntrypoint = gxEntrypoint; + } + public void setFunctionName(String functionName) { + + this.functionName = functionName; + } + public void setGXEntrypoint(String gxEntrypoint) { + + this.gxEntrypoint = gxEntrypoint; + } + + public String getFunctionName() { + return functionName; + } + public String getGXEntrypoint() { + + return gxEntrypoint; + } + @Override + public boolean isValidConfiguration () { + return functionName != null && !functionName.trim().isEmpty() && gxEntrypoint != null && !gxEntrypoint.trim().isEmpty(); + } + + @Override + public String getGXClassName() { + return getGXEntrypoint(); + } + +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java new file mode 100644 index 000000000..f2d4fedcc --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java @@ -0,0 +1,51 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.LogManager; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; + +public class AzureFunctionConfigurationHelper { + private final static ILogger logger = LogManager.initialize(".", AzureFunctionConfiguration.class); + private final static String FUNCTION_CONFIG_PATH = "gxazmappings.json"; + public static List getFunctionsMapConfiguration() throws FunctionConfigurationException { + + File configFile = new File(FUNCTION_CONFIG_PATH); + + if (configFile.exists()) { + try { + String jsonConfig = new String(Files.readAllBytes(Paths.get(FUNCTION_CONFIG_PATH))); + List mappings = new ObjectMapper().readValue(jsonConfig, new TypeReference>(){}); + return mappings; + } catch (IOException e) { + logger.error(String.format("Invalid Azure function configuration file: %s. Please check json content.", FUNCTION_CONFIG_PATH), e); + throw new FunctionConfigurationException(String.format("Please check function configuration. File '%s' should be present", FUNCTION_CONFIG_PATH)); + } + } + return null; + } + + public static String getFunctionConfigurationEntryPoint(String functionName, AzureFunctionConfiguration functionConfiguration) + { + return functionConfiguration.getGXClassName(); + } + + public static AzureFunctionConfiguration getAzureFunctionConfiguration(String functionName, List mappings) throws FunctionConfigurationException + { + Optional config = mappings.stream() + .filter(c -> functionName.equals(c.getFunctionName())) + .findFirst(); + AzureFunctionConfiguration configuration = config.orElseThrow(() -> new FunctionConfigurationException(String.format("Configuration not found for Azure function %s at gxazmappings.json.",functionName))); + return configuration; + } + +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java new file mode 100644 index 000000000..a8b623ab8 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -0,0 +1,86 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.genexus.cloud.serverless.model.*; + +import com.microsoft.azure.functions.annotation.*; +import com.microsoft.azure.functions.ExecutionContext; + +import java.time.Instant; +import java.util.List; +import java.util.*; + +/** + * Azure Functions with Azure Storage Queue Trigger Handler. + * https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger?tabs=java + */ +public class AzureQueueHandler extends AzureEventHandler { + public AzureQueueHandler() throws Exception { + super(); + } + public void run( + @QueueTrigger(name = "message", queueName = "%queue_name%") String message, + @BindingName("Id") final String id, + @BindingName("DequeueCount") final long dequeCount, + @BindingName("ExpirationTime") final String expirationTime, + @BindingName("InsertionTime") final String insertionTime, + @BindingName("NextVisibleTime") final String nextVisibleTime, + @BindingName("PopReceipt") final String popReceipt, + final ExecutionContext context) throws Exception { + + context.getLogger().info("GeneXus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + EventMessages msgs = new EventMessages(); + EventMessage msg = new EventMessage(); + msg.setMessageId(id); + msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); + + Instant nowUtc = Instant.now(); + msg.setMessageDate(Date.from(nowUtc)); + msg.setMessageData(message); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", id)); + msgAtts.add(new EventMessageProperty("DequeueCount", Long.toString(dequeCount))); + msgAtts.add(new EventMessageProperty("ExpirationTime", expirationTime)); + msgAtts.add(new EventMessageProperty("InsertionTime", insertionTime)); + msgAtts.add(new EventMessageProperty("NextVisibleTime", nextVisibleTime)); + msgAtts.add(new EventMessageProperty("PopReceipt", popReceipt)); + + msgs.add(msg); + + boolean wasHandled = false; + String errorMessage; + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(msgs, message); + wasHandled = !response.hasFailed(); + errorMessage = response.getErrorMessage(); + } catch (Exception e) { + errorMessage = "HandleRequest execution error"; + logger.error(errorMessage, e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + } + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { + return null; + } + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String className) { + return null; + } + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration() { + return null; + } +} + + + + + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java new file mode 100644 index 000000000..c4e395ca2 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java @@ -0,0 +1,7 @@ +package com.genexus.cloud.serverless.exception; + +public class FunctionConfigurationException extends Exception { + public FunctionConfigurationException(String exceptionMessage) { + super(exceptionMessage); + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java new file mode 100644 index 000000000..83849cc79 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java @@ -0,0 +1,9 @@ +package com.genexus.cloud.serverless.exception; + +public class FunctionRuntimeException extends RuntimeException { + + public FunctionRuntimeException(String errorMessage, Throwable e) { + super(errorMessage, e); + } + +} diff --git a/gxserverlesscommon/pom.xml b/gxserverlesscommon/pom.xml new file mode 100644 index 000000000..4b236d0b8 --- /dev/null +++ b/gxserverlesscommon/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + + com.genexus + parent + ${revision}${changelist} + + + gxserverlesscommon + GeneXus Serverless Common + + + 1.8 + 1.8 + + + + + ${project.groupId} + gxclassR + ${project.version} + + + + ${project.groupId} + gxcommon + ${project.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + org.glassfish.jersey.core + jersey-server + ${jersey.javax.version} + + + + + + gx-serverless-common + + + + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.10 + + + + diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java new file mode 100644 index 000000000..075f5464e --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -0,0 +1,110 @@ +package com.genexus.cloud.serverless; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.GXProcedure; +import com.genexus.GxUserType; +import com.genexus.ModelContext; +import com.genexus.cloud.serverless.model.EventMessageResponse; +import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.db.DynamicExecute; +import org.apache.commons.lang.NotImplementedException; + +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Optional; + +public class GXProcedureExecutor { + protected Class entryPointClass; + + private Class[][] supportedMethodSignatures = new Class[5][]; + private int methodSignatureIdx = -1; + + protected static final String MESSAGE_COLLECTION_INPUT_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessages"; + protected static final String MESSAGE_OUTPUT_COLLECTION_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessageResponse"; + + public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundException, NotImplementedException { + entryPointClass = entryPointClassParms; + supportedMethodSignatures[0] = new Class[]{Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME), Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; + supportedMethodSignatures[1] = new Class[]{String.class, Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; + supportedMethodSignatures[2] = new Class[]{String.class}; + supportedMethodSignatures[3] = new Class[]{Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; + supportedMethodSignatures[4] = new Class[]{}; //No inputs, no outputs + + Optional executeMethodOpt = Arrays.stream(this.entryPointClass.getDeclaredMethods()).filter(m -> m.getName() == DynamicExecute.METHOD_EXECUTE).findFirst(); + + if (!executeMethodOpt.isPresent()) { + throw new NotImplementedException(String.format("EXECUTE Method not implemented on Class '%s'", entryPointClass.getName())); + } + + Method executeMethod = executeMethodOpt.get(); + Class[] parametersTypes = executeMethod.getParameterTypes(); + + for (int i = 0; i < supportedMethodSignatures.length && methodSignatureIdx < 0; i++) { + if (supportedMethodSignatures[i].length != parametersTypes.length) { + continue; + } + Class[] listParameters = (Class[]) supportedMethodSignatures[i]; + boolean isMatch = true; + for (int j = 0; j < listParameters.length && isMatch; j++) { + isMatch = listParameters[j] == parametersTypes[j] || listParameters[j] == parametersTypes[j].getComponentType(); + } + if (isMatch) { + methodSignatureIdx = i; + } + } + if (methodSignatureIdx < 0) { + throw new NotImplementedException("Expected signature method did not match"); + } + + } + + public EventMessageResponse execute(ModelContext modelContext, EventMessages msgs, String rawJsonEvent) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, JsonProcessingException { + EventMessageResponse response = new EventMessageResponse(); + + Object[] parameters; + boolean returnsValue = true; + switch (methodSignatureIdx) { + case 0: + Class inputClass = Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME); + Object msgsInput = inputClass.getConstructor().newInstance(); + if (GxUserType.class.isAssignableFrom(inputClass)) { + ((GxUserType) msgsInput).fromJSonString(Helper.toJSONString(msgs)); + } + parameters = new Object[]{msgsInput, new Object[]{}}; + break; + case 1: + parameters = new Object[]{rawJsonEvent, new Object[]{}}; + break; + case 2: + parameters = new Object[]{rawJsonEvent}; + returnsValue = false; + break; + case 3: + parameters = new Object[]{new Object[]{}}; + break; + default: + parameters = new Object[]{}; + returnsValue = false; + break; + } + + Object[] paramOutArray = null; + if (returnsValue) { + parameters[parameters.length - 1] = (Object[]) Array.newInstance(Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME), 1); + paramOutArray = (Object[]) parameters[parameters.length - 1]; + paramOutArray[0] = Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME).getConstructor(int.class, ModelContext.class).newInstance(-1, modelContext); + } + + DynamicExecute.dynamicExecute(modelContext, -1, entryPointClass, "", entryPointClass.getName(), parameters); + + if (paramOutArray != null) { + GxUserType handlerOutput = (GxUserType) paramOutArray[0]; + String jsonResponse = handlerOutput.toJSonString(false); + response = new ObjectMapper().readValue(jsonResponse, EventMessageResponse.class); + } + return response; + } +} diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java new file mode 100644 index 000000000..035a62b3a --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java @@ -0,0 +1,27 @@ +package com.genexus.cloud.serverless; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.cloud.serverless.model.EventMessage; +import com.genexus.cloud.serverless.model.EventMessageProperty; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; + +public class Helper { + + private static final ILogger logger = LogManager.getLogger(Helper.class); + + public static String toJSONString(Object dtoObject) { + try { + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(dtoObject); + } + catch (Exception e) { + logger.error("Failed to serialize object to jsonString", e); + } + return ""; + } + + public static void addEventMessageProperty(EventMessage msg, String key, String value) { + msg.getMessageProperties().add(new EventMessageProperty(key, value)); + } +} diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java new file mode 100644 index 000000000..220b6f092 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -0,0 +1,92 @@ +package com.genexus.cloud.serverless; + +import com.genexus.ApplicationContext; +import com.genexus.ModelContext; +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; +import com.genexus.cloud.serverless.model.EventMessageResponse; +import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.Connect; +import com.genexus.specific.java.LogManager; +import com.genexus.util.IniFile; + +public abstract class ServerlessBaseEventHandler { + + protected T functionConfiguration; + protected static ILogger logger = null; + protected static Class entryPointClass = null; + protected static GXProcedureExecutor executor; + private static final String GX_APPLICATION_CLASS = "GXcfg"; + private static String packageName = null; + + + protected abstract T createFunctionConfiguration(); + protected abstract T createFunctionConfiguration(String className); + protected abstract T createFunctionConfiguration(String functionName, String className); + protected abstract T getFunctionConfiguration(String functionName) throws FunctionConfigurationException; + protected abstract void InitializeServerlessConfig() throws Exception; + public ServerlessBaseEventHandler() throws Exception { + this.functionConfiguration = createFunctionConfiguration(); + initialize(); + } + public ServerlessBaseEventHandler(String className) throws Exception { + this.functionConfiguration = createFunctionConfiguration(className); + initialize(); + } + public ServerlessBaseEventHandler(String functionName, String className) throws Exception { + this.functionConfiguration = createFunctionConfiguration(functionName,className); + initialize(); + } + private void initialize() throws Exception { + logger = LogManager.initialize(".", ServerlessBaseEventHandler.class); + Connect.init(); + + IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); + packageName = config.getProperty("Client", "PACKAGE", null); + Class cfgClass; + + String cfgClassName = packageName.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", packageName, GX_APPLICATION_CLASS); + + try { + cfgClass = Class.forName(cfgClassName); + logger.debug("Finished loading cfgClassName " + cfgClassName); + com.genexus.Application.init(cfgClass); + ApplicationContext.getInstance().setPoolConnections(true); + } catch (ClassNotFoundException e) { + logger.error(String.format("Failed to initialize GX AppConfig Class: %s", cfgClassName), e); + throw e; + } catch (Exception e) { + logger.error(String.format("Failed to initialize GX AppConfig Class: %s", cfgClassName), e); + throw e; + } + + InitializeServerlessConfig(); + } + + protected EventMessageResponse dispatchEvent(EventMessages eventMessages, String lambdaRawMessageBody) throws Exception { + String jsonStringMessages = Helper.toJSONString(eventMessages); + + if (logger.isDebugEnabled()) { + logger.debug(String.format("dispatchEventMessages (%s) - serialized messages: %s", functionConfiguration.getGXClassName(), jsonStringMessages)); + } + + ModelContext modelContext = new ModelContext(entryPointClass); + EventMessageResponse response = null; + + try { + response = executor.execute(modelContext, eventMessages, lambdaRawMessageBody); + } catch (Exception e) { + logger.error(String.format("dispatchEventmessages - program '%s' execution error", entryPointClass.getName()), e); + throw e; + } + + if (response.hasFailed()) { + logger.info("dispatchEventmessages - messages not handled with success: " + response.getErrorMessage()); + } else { + logger.debug("dispatchEventmessages - message handled with success"); + } + return response; + + } +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java new file mode 100644 index 000000000..d066ea2a0 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java @@ -0,0 +1,10 @@ +package com.genexus.cloud.serverless; + +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; + +public abstract class ServerlessFunctionConfiguration { + + public ServerlessFunctionConfiguration() {} + public abstract boolean isValidConfiguration(); + public abstract String getGXClassName(); +} diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java new file mode 100644 index 000000000..c4e395ca2 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/exception/FunctionConfigurationException.java @@ -0,0 +1,7 @@ +package com.genexus.cloud.serverless.exception; + +public class FunctionConfigurationException extends Exception { + public FunctionConfigurationException(String exceptionMessage) { + super(exceptionMessage); + } +} diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java new file mode 100644 index 000000000..3dbd4a078 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java @@ -0,0 +1,73 @@ +package com.genexus.cloud.serverless.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class EventMessage { + @JsonProperty("EventMessageId") + private String messageId; + + @JsonProperty("EventMessageDate") + private Date messageDate; + + @JsonProperty("EventMessageSourceType") + private String messageSourceType; + + @JsonProperty("EventMessageData") + private String messageData; + + @JsonProperty("EventMessageVersion") + private String messageVersion = "1.0"; + + @JsonProperty("EventMessageProperties") + private List messageProperties = new ArrayList<>(); + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + public Date getMessageDate() { + return messageDate; + } + + public void setMessageDate(Date messageDate) { + this.messageDate = messageDate; + } + + public String getMessageSourceType() { + return messageSourceType; + } + + public void setMessageSourceType(String messageSourceType) { + this.messageSourceType = messageSourceType; + } + + public String getMessageData() { + return messageData; + } + + public void setMessageData(String messageData) { + this.messageData = messageData; + } + + public String getMessageVersion() { + return messageVersion; + } + + public void setMessageVersion(String messageVersion) { + this.messageVersion = messageVersion; + } + + public List getMessageProperties() { + return messageProperties; + } + +} + diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageProperty.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageProperty.java similarity index 100% rename from gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageProperty.java rename to gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageProperty.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageResponse.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageResponse.java similarity index 100% rename from gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageResponse.java rename to gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageResponse.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageSourceType.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageSourceType.java similarity index 100% rename from gxawsserverless/src/main/java/com/genexus/cloud/serverless/model/EventMessageSourceType.java rename to gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessageSourceType.java diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java new file mode 100644 index 000000000..a135a11e0 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java @@ -0,0 +1,16 @@ +package com.genexus.cloud.serverless.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.genexus.cloud.serverless.model.EventMessage; + +import java.util.ArrayList; +import java.util.List; + +public class EventMessages { + @JsonProperty("EventMessage") + List eventMessages = new ArrayList<>(); + + public void add(EventMessage msg) { + eventMessages.add(msg); + } +} diff --git a/pom.xml b/pom.xml index d14528e41..c18631fd4 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,8 @@ gxwebsocket gxwebsocketjakarta gxawsserverless + gxserverlesscommon + gxazureserverless androidreports gxqueue gxqueue-awssqs From 21da70e74e161efa02e4c31e9764be61e6a6d03e Mon Sep 17 00:00:00 2001 From: sjuarezgx Date: Sun, 7 Jul 2024 16:38:14 -0300 Subject: [PATCH 02/16] Use a singleton to access configuration file once and try to guarantee thread safety. First try to read Env VAR to avoid concurrency failures. --- .../azure/handler/AzureEventHandler.java | 43 +++++++-------- .../AzureFunctionConfigurationHelper.java | 7 ++- .../azure/handler/AzureQueueHandler.java | 1 + .../helpers/GlobalConfigurationCache.java | 54 +++++++++++++++++++ .../ServerlessBaseEventHandler.java | 9 ++-- 5 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java index 2ee8229c6..6db61dc9c 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java @@ -3,6 +3,7 @@ import com.genexus.cloud.serverless.exception.FunctionConfigurationException; import com.genexus.cloud.serverless.GXProcedureExecutor; import com.genexus.cloud.serverless.ServerlessBaseEventHandler; +import com.genexus.cloud.serverless.helpers.GlobalConfigurationCache; import java.util.List; @@ -12,25 +13,32 @@ public AzureEventHandler() throws Exception { } protected void SetupServerlessMappings(String functionName) throws Exception { logger.debug("Initializing Function configuration"); - try { - if ((functionConfiguration == null) || (!functionConfiguration.isValidConfiguration())) { - functionConfiguration = getFunctionConfiguration(functionName); - } - if (functionConfiguration != null && functionConfiguration.isValidConfiguration()) - entryPointClass = Class.forName(functionConfiguration.getGXClassName()); - } catch (Exception e) { - logger.error(String.format("Failed to initialize Application"), e); - throw e; + //First use Environment variable, then try reading from the gxazmappings.json file + + String envvar = String.format("GX_AZURE_%s_CLASS",functionName.trim().toUpperCase()); + if (System.getenv(envvar) != null) { + String gxObjectClassName = System.getenv(envvar); + entryPointClass = Class.forName(gxObjectClassName); + functionConfiguration = new AzureFunctionConfiguration(functionName,gxObjectClassName); + } + if (entryPointClass == null) + { + try { + functionConfiguration = GlobalConfigurationCache.getInstance().getAzureFunctionConfiguration(functionName); + entryPointClass = Class.forName(functionConfiguration.getGXClassName()); + } + catch (Exception e) { + logger.error(String.format("Failed to initialize Application configuration for %s",functionName), e); + throw e; + } } if (entryPointClass != null) executor = new GXProcedureExecutor(entryPointClass); - else - { - logger.error(String.format("Invalid EntryPoint Class for function")); - throw new Exception("Failed to initialize Application. Check whether gxazmappings.json is located in the right place, with the correct format, and specifies an entry point for your function."); + else { + logger.error(String.format("GeneXus Entry point class for function %s was not specified. Set %s Environment Variable.",functionName,envvar)); + throw new Exception(String.format("GeneXus Entry point class for function %s was not specified. Set %s Environment Variable.",functionName,envvar)); } - } @Override protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { @@ -48,13 +56,6 @@ protected AzureFunctionConfiguration createFunctionConfiguration() { return new AzureFunctionConfiguration(); } @Override - protected AzureFunctionConfiguration getFunctionConfiguration(String functionName) throws FunctionConfigurationException { - List mappings = AzureFunctionConfigurationHelper.getFunctionsMapConfiguration(); - if (mappings != null) - return AzureFunctionConfigurationHelper.getAzureFunctionConfiguration(functionName,mappings); - return null; - } - @Override protected void InitializeServerlessConfig() throws Exception { } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java index f2d4fedcc..f85f6317c 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java @@ -28,10 +28,13 @@ public static List getFunctionsMapConfiguration() th return mappings; } catch (IOException e) { logger.error(String.format("Invalid Azure function configuration file: %s. Please check json content.", FUNCTION_CONFIG_PATH), e); - throw new FunctionConfigurationException(String.format("Please check function configuration. File '%s' should be present", FUNCTION_CONFIG_PATH)); + throw new FunctionConfigurationException(String.format("JSON contents of file '%s' are not valid.", FUNCTION_CONFIG_PATH)); } } - return null; + else { + logger.error(String.format("Failure while trying to read Azure function configuration file: %s.", FUNCTION_CONFIG_PATH)); + throw new FunctionConfigurationException(String.format("File %s not found. The file is attempted to be read when there is no GX_AZURE__CLASS environment variable pointing to the GeneXus class associated with the function.", FUNCTION_CONFIG_PATH)); + } } public static String getFunctionConfigurationEntryPoint(String functionName, AzureFunctionConfiguration functionConfiguration) diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index a8b623ab8..10eae2e43 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -1,5 +1,6 @@ package com.genexus.cloud.serverless.azure.handler; +import com.genexus.cloud.serverless.Helper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.annotation.*; diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java new file mode 100644 index 000000000..b13a10698 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java @@ -0,0 +1,54 @@ +package com.genexus.cloud.serverless.helpers; + +import com.genexus.cloud.serverless.azure.handler.AzureFunctionConfiguration; +import com.genexus.cloud.serverless.azure.handler.AzureFunctionConfigurationHelper; +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; +import com.genexus.diagnostics.core.ILogger; +import com.genexus.specific.java.LogManager; + +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +public class GlobalConfigurationCache { + + private final static ILogger logger = LogManager.initialize(".", GlobalConfigurationCache.class); + private static final ConcurrentHashMap functionConfigCache = new ConcurrentHashMap<>(); + private static boolean initialized = false; + private static volatile GlobalConfigurationCache CONFIGURATION_CACHE; + + private GlobalConfigurationCache() throws FunctionConfigurationException { + initializeCache(); + } + + public static GlobalConfigurationCache getInstance() throws FunctionConfigurationException { + GlobalConfigurationCache globalConfigurationCache = CONFIGURATION_CACHE; + if (globalConfigurationCache == null) { + synchronized (GlobalConfigurationCache.class) { + if (globalConfigurationCache == null) { + CONFIGURATION_CACHE = globalConfigurationCache = new GlobalConfigurationCache(); + } + } + } + return globalConfigurationCache; + } + private synchronized void initializeCache() throws FunctionConfigurationException { + if (!initialized) { + List mappings = AzureFunctionConfigurationHelper.getFunctionsMapConfiguration(); + if (mappings != null) { + for (AzureFunctionConfiguration azureFunctionConfiguration : mappings) + functionConfigCache.put(azureFunctionConfiguration.getFunctionName(), azureFunctionConfiguration.getGXClassName()); + initialized = true; + } + else + { + logger.error(String.format("Global configuration cache could not be initialized.")); + } + } + } + public String getData(String functionName) { + return functionConfigCache.get(functionName); + } + public AzureFunctionConfiguration getAzureFunctionConfiguration(String functionName) { + return new AzureFunctionConfiguration(functionName,functionConfigCache.get(functionName)); + } +} diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java index 220b6f092..c4488b45f 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -14,7 +14,7 @@ public abstract class ServerlessBaseEventHandler Date: Sun, 14 Jul 2024 17:20:16 -0300 Subject: [PATCH 03/16] Add Azure Timer Trigger --- .../azure/handler/AzureTimerHandler.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java new file mode 100644 index 000000000..f53c4e94a --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java @@ -0,0 +1,158 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import com.genexus.cloud.serverless.model.*; + +import com.microsoft.azure.functions.annotation.*; +import com.microsoft.azure.functions.ExecutionContext; + +import java.time.Instant; +import java.util.List; +import java.util.*; + + +public class AzureTimerHandler extends AzureEventHandler { + + public AzureTimerHandler() throws Exception { + } + + public void run( + @TimerTrigger(name = "TimerInfo", schedule = "%timer_schedule%") String TimerInfo, + final ExecutionContext context) throws Exception { + + context.getLogger().info("GeneXus Timer trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + try { + TimerObject timerObject = new ObjectMapper().readValue(TimerInfo, new TypeReference(){}); + EventMessages msgs = new EventMessages(); + EventMessage msg = new EventMessage(); + msg.setMessageId(context.getInvocationId()); + msg.setMessageSourceType(EventMessageSourceType.TIMER); + + Instant nowUtc = Instant.now(); + msg.setMessageDate(Date.from(nowUtc)); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); + boolean adjustForSDT = timerObject.timerSchedule.getAdjustForDST(); + msgAtts.add(new EventMessageProperty("AdjustForDST", Boolean.toString(adjustForSDT))); + + msgAtts.add(new EventMessageProperty("Next", timerObject.timerScheduleStatus.getNext())); + msgAtts.add(new EventMessageProperty("Last", timerObject.timerScheduleStatus.getLast())); + msgAtts.add(new EventMessageProperty("LastUpdated", timerObject.timerScheduleStatus.getLastUpdated())); + + boolean isPastDue = timerObject.getIsPastDue(); + msgAtts.add(new EventMessageProperty("IsPastDue", Boolean.toString(isPastDue))); + + msgs.add(msg); + + String errorMessage; + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(msgs, TimerInfo); + errorMessage = response.getErrorMessage(); + } catch (Exception e) { + errorMessage = "HandleRequest execution error"; + //logger.error(errorMessage, e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + } + catch (Exception e) { + throw e; + } + } + + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { + return null; + } + @Override + protected AzureFunctionConfiguration createFunctionConfiguration(String className) { + return null; + } + + @Override + protected AzureFunctionConfiguration createFunctionConfiguration() { + return null; + } + private static class TimerObject{ + + @JsonProperty("ScheduleStatus") + TimerScheduleStatus timerScheduleStatus; + + @JsonProperty("IsPastDue") + boolean IsPastDue; + + @JsonProperty("Schedule") + TimerSchedule timerSchedule; + + protected TimerObject() { + } + + protected TimerObject(TimerScheduleStatus timerScheduleStatus, boolean IsPastDue,TimerSchedule timerSchedule) { + this.timerScheduleStatus = timerScheduleStatus; + this.IsPastDue = IsPastDue; + this.timerSchedule = timerSchedule; + } + + protected boolean getIsPastDue() { + return IsPastDue; + } + } + + private static class TimerSchedule{ + + @JsonProperty("AdjustForDST") + boolean AdjustForDST; + + public TimerSchedule() {} + + public TimerSchedule(boolean AdjustForDST) { + this.AdjustForDST = AdjustForDST; + } + protected boolean getAdjustForDST() { + return AdjustForDST; + } + } + + private static class TimerScheduleStatus { + + @JsonProperty("Last") + String Last; + + @JsonProperty("Next") + String Next; + + @JsonProperty("LastUpdated") + String LastUpdated; + + public TimerScheduleStatus() {} + + protected void setLast(String last) { + Last = last; + } + protected void setNext(String next) { + Next = next; + } + protected void setLastUpdated(String lastUpdated) { + LastUpdated = lastUpdated; + } + + protected String getLastUpdated() { + return LastUpdated; + } + protected String getNext() { + return Next; + } + protected String getLast() { + return Last; + } + } +} From 7f88c2b7ed866a907eaddc575bdc4b1be86c50d3 Mon Sep 17 00:00:00 2001 From: sabrina juarez Date: Mon, 15 Jul 2024 16:25:47 -0300 Subject: [PATCH 04/16] fix POM error --- gxazureserverless/pom.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index e943e0bc4..7f556fc0d 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -54,25 +54,6 @@ jackson-databind ${jackson.version} - - - org.glassfish.jersey.core - jersey-server - ${jersey.javax.version} - - - com.genexus - gxserverlesscommon - 4.7-SNAPSHOT - compile - - - com.genexus - gxserverlesscommon - 4.7-SNAPSHOT - compile - - From beac028ea72c469625e63763d3bd4eb8bc8d4ccb Mon Sep 17 00:00:00 2001 From: sabrina juarez Date: Thu, 25 Jul 2024 17:30:44 -0300 Subject: [PATCH 05/16] Add CosmosDB, EventGrid, Service Bus triggered functions. --- gxazureserverless/pom.xml | 30 +++++++ .../handler/AzureBlobStorageHandler.java | 52 +++++++++++ .../azure/handler/AzureCosmosDBHandler.java | 89 +++++++++++++++++++ .../handler/AzureEventGridCloudHandler.java | 63 +++++++++++++ .../azure/handler/AzureEventGridHandler.java | 56 ++++++++++++ .../azure/handler/AzureEventHandler.java | 39 ++++---- .../handler/AzureFunctionConfiguration.java | 12 +-- .../AzureFunctionConfigurationHelper.java | 22 ++--- .../azure/handler/AzureQueueHandler.java | 42 ++------- .../handler/AzureServiceBusQueueHandler.java | 40 +++++++++ .../handler/AzureServiceBusTopicHandler.java | 40 +++++++++ .../azure/handler/AzureTimerHandler.java | 29 ++---- .../helpers/BuildServiceBusMessages.java | 58 ++++++++++++ .../helpers/GlobalConfigurationCache.java | 6 +- .../cloud/serverless/GXProcedureExecutor.java | 25 ++++-- .../ServerlessBaseEventHandler.java | 19 ++-- .../model/EventMessageSourceType.java | 2 + .../serverless/model/EventMessagesList.java | 15 ++++ 18 files changed, 521 insertions(+), 118 deletions(-) create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessagesList.java diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index 7f556fc0d..483af4bf9 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -49,6 +49,36 @@ 1.35.0 + + io.cloudevents + cloudevents-api + 2.5.0 + + + + io.cloudevents + cloudevents-core + 2.3.0 + + + + io.cloudevents + cloudevents-json-jackson + 4.0.1 + + + + com.azure + azure-messaging-servicebus + 7.17.1 + + + + com.azure + azure-messaging-eventgrid + 4.22.3 + + com.fasterxml.jackson.core jackson-databind diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java new file mode 100644 index 000000000..637ea9c20 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java @@ -0,0 +1,52 @@ +package com.genexus.cloud.serverless.azure.handler; +import com.genexus.cloud.serverless.model.*; + +import com.microsoft.azure.functions.annotation.*; +import com.microsoft.azure.functions.ExecutionContext; + +import java.time.Instant; +import java.util.List; +import java.util.*; + +public class AzureBlobStorageHandler extends AzureEventHandler{ + public AzureBlobStorageHandler() throws Exception { + super(); + } + public void run( + @BlobTrigger(name = "content", path = "%blob_path%", dataType = "binary") byte[] content, + @BindingName("name") String name, + final ExecutionContext context + ) throws Exception { + context.getLogger().info("GeneXus Blob Storage trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + EventMessages msgs = new EventMessages(); + EventMessage msg = new EventMessage(); + msg.setMessageId(context.getInvocationId()); + msg.setMessageSourceType(EventMessageSourceType.BLOB); + + Instant nowUtc = Instant.now(); + msg.setMessageDate(Date.from(nowUtc)); + msg.setMessageData(Base64.getEncoder().encodeToString(content)); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); + msgAtts.add(new EventMessageProperty("name", name)); + + msgs.add(msg); + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(msgs, Base64.getEncoder().encodeToString(content)); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java new file mode 100644 index 000000000..617a735c1 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java @@ -0,0 +1,89 @@ +package com.genexus.cloud.serverless.azure.handler; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.model.*; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.CosmosDBTrigger; +import com.sun.jna.platform.win32.Guid; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class AzureCosmosDBHandler extends AzureEventHandler{ + + public AzureCosmosDBHandler() throws Exception { + super(); + } + public void run( + @CosmosDBTrigger(name = "itemIn", databaseName = "%CosmosDB_Database_Name%", containerName = "%Container_Name%", leaseContainerName = "%lease_Container_Name%", connection = "%CosmosDB_Connection%") List> items , + final ExecutionContext context) throws Exception { + + context.getLogger().info("GeneXus CosmosDB trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + Guid.GUID eventId = new Guid.GUID(context.getInvocationId()); + + EventMessages msgs = new EventMessages(); + EventMessagesList eventMessagesList = new EventMessagesList(); + + switch (executor.methodSignatureIdx) { + case 0: + msgs = setupEventMessages(eventId,items); + break; + case 4: + eventMessagesList = setupEventMessagesList(items); + break; + default: + break; + } + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, Helper.toJSONString(items)); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + + } + private EventMessagesList setupEventMessagesList(List> jsonList) + { + EventMessagesList messagesList = new EventMessagesList(); + for (Map json : jsonList) { + messagesList.addItem(Helper.toJSONString(json)); + } + return messagesList; + } + private EventMessages setupEventMessages(Guid.GUID eventId, List> jsonList) + { + EventMessages msgs = new EventMessages(); + + for (Map json : jsonList) { + + String idValue = ""; + EventMessage msg = new EventMessage(); + msg.setMessageDate(new Date()); + msg.setMessageSourceType(EventMessageSourceType.COSMOSDB); + + List msgAtts = msg.getMessageProperties(); + + for (Map.Entry entry : json.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue().toString(); + + msgAtts.add(new EventMessageProperty(key, value)); + + if (key.equals("id")) + idValue = value; + } + String messageId = eventId.toString() + "_" + idValue; + msg.setMessageId(messageId); + msgs.add(msg); + } + return msgs; + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java new file mode 100644 index 000000000..1aae91100 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java @@ -0,0 +1,63 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.cloud.serverless.model.EventMessage; +import com.genexus.cloud.serverless.model.EventMessageProperty; +import com.genexus.cloud.serverless.model.EventMessageResponse; +import com.genexus.cloud.serverless.model.EventMessages; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.EventGridTrigger; +import io.cloudevents.CloudEvent; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +public class AzureEventGridCloudHandler extends AzureEventHandler{ + + public AzureEventGridCloudHandler() throws Exception {super();} + + public void run( + @EventGridTrigger(name = "eventgridEvent") String eventJson, + final ExecutionContext context) throws Exception { + + context.getLogger().info("GeneXus Event Grid CloudEvents trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + SetupServerlessMappings(context.getFunctionName()); + + try { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule()); + CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class); + + EventMessages msgs = new EventMessages(); + EventMessage msg = new EventMessage(); + msg.setMessageId(cloudEvent.getId()); + msg.setMessageSourceType(cloudEvent.getType()); + msg.setMessageVersion(""); + + msg.setMessageDate(new Date()); + msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString()); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId())); + msgAtts.add(new EventMessageProperty("Subject",cloudEvent.getSubject())); + msgAtts.add(new EventMessageProperty("DataContentType",cloudEvent.getDataContentType())); + msgAtts.add(new EventMessageProperty("DataSchema", Objects.requireNonNull(cloudEvent.getDataSchema()).toString())); + msgAtts.add(new EventMessageProperty("Source", cloudEvent.getSource().toString())); + msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString())); + msgAtts.add(new EventMessageProperty("Time", Objects.requireNonNull(cloudEvent.getTime()).toString())); + + msgs.add(msg); + + EventMessageResponse response = dispatchEvent(msgs, eventJson); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java new file mode 100644 index 000000000..155390a78 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java @@ -0,0 +1,56 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.azure.messaging.eventgrid.EventGridEvent; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.model.*; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.EventGridTrigger; + +import java.util.Date; +import java.util.List; + +public class AzureEventGridHandler extends AzureEventHandler { + public AzureEventGridHandler() throws Exception { + } + + public void run( + @EventGridTrigger(name = "eventgridEvent") EventGridEvent event, + final ExecutionContext context) throws Exception { + + context.getLogger().info("GeneXus Event Grid trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + EventMessages msgs = new EventMessages(); + EventMessage msg = new EventMessage(); + msg.setMessageId(event.getId()); + msg.setMessageSourceType(event.getEventType()); + msg.setMessageVersion(event.getDataVersion()); + + msg.setMessageDate(new Date()); + msg.setMessageData(event.getData().toString()); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", event.getId())); + + msgAtts.add(new EventMessageProperty("Subject",event.getSubject())); + msgAtts.add(new EventMessageProperty("Topic",event.getTopic())); + msgAtts.add(new EventMessageProperty("EventTime",event.getEventTime().toString())); + + msgs.add(msg); + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(msgs, Helper.toJSONString(event)); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + + } +} \ No newline at end of file diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java index 6db61dc9c..007f16c51 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java @@ -1,43 +1,40 @@ package com.genexus.cloud.serverless.azure.handler; -import com.genexus.cloud.serverless.exception.FunctionConfigurationException; import com.genexus.cloud.serverless.GXProcedureExecutor; import com.genexus.cloud.serverless.ServerlessBaseEventHandler; +import com.genexus.cloud.serverless.exception.FunctionConfigurationException; import com.genexus.cloud.serverless.helpers.GlobalConfigurationCache; -import java.util.List; - public class AzureEventHandler extends ServerlessBaseEventHandler { public AzureEventHandler() throws Exception { super(); } - protected void SetupServerlessMappings(String functionName) throws Exception { + protected void SetupServerlessMappings(String functionName) throws FunctionConfigurationException, ClassNotFoundException { logger.debug("Initializing Function configuration"); //First use Environment variable, then try reading from the gxazmappings.json file - - String envvar = String.format("GX_AZURE_%s_CLASS",functionName.trim().toUpperCase()); - if (System.getenv(envvar) != null) { - String gxObjectClassName = System.getenv(envvar); - entryPointClass = Class.forName(gxObjectClassName); - functionConfiguration = new AzureFunctionConfiguration(functionName,gxObjectClassName); - } - if (entryPointClass == null) - { - try { - functionConfiguration = GlobalConfigurationCache.getInstance().getAzureFunctionConfiguration(functionName); - entryPointClass = Class.forName(functionConfiguration.getGXClassName()); + String envvar = String.format("GX_AZURE_%s_CLASS", functionName.trim().toUpperCase()); + if (entryPointClass == null) { + if (System.getenv(envvar) != null) { + String gxObjectClassName = System.getenv(envvar); + entryPointClass = Class.forName(gxObjectClassName); + functionConfiguration = new AzureFunctionConfiguration(functionName, gxObjectClassName); } - catch (Exception e) { - logger.error(String.format("Failed to initialize Application configuration for %s",functionName), e); - throw e; + else { + try { + functionConfiguration = GlobalConfigurationCache.getInstance().getAzureFunctionConfiguration(functionName); + entryPointClass = Class.forName(functionConfiguration.getGXClassName()); + } catch (Exception e) { + logger.error(String.format("Failed to initialize Application configuration for %s", functionName), e); + throw e; + } } } if (entryPointClass != null) executor = new GXProcedureExecutor(entryPointClass); else { logger.error(String.format("GeneXus Entry point class for function %s was not specified. Set %s Environment Variable.",functionName,envvar)); - throw new Exception(String.format("GeneXus Entry point class for function %s was not specified. Set %s Environment Variable.",functionName,envvar)); + throw new FunctionConfigurationException(String.format("GeneXus Entry point class for function %s was not specified. Set %s Environment Variable.",functionName,envvar)); } } @Override @@ -56,7 +53,7 @@ protected AzureFunctionConfiguration createFunctionConfiguration() { return new AzureFunctionConfiguration(); } @Override - protected void InitializeServerlessConfig() throws Exception { + protected void InitializeServerlessConfig(){ } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java index bde7259db..50d7fd6db 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java @@ -2,23 +2,15 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.genexus.cloud.serverless.ServerlessFunctionConfiguration; -import com.genexus.cloud.serverless.exception.FunctionConfigurationException; -import com.genexus.diagnostics.core.ILogger; -import com.genexus.specific.java.LogManager; - -import java.util.List; -import java.util.Optional; public class AzureFunctionConfiguration extends ServerlessFunctionConfiguration { - private final static ILogger logger = LogManager.initialize(".", AzureFunctionConfiguration.class); - private final static String FUNCTION_CONFIG_PATH = "gxazmappings.json"; + @JsonProperty("FunctionName") private String functionName; @JsonProperty("GXEntrypoint") private String gxEntrypoint; - public AzureFunctionConfiguration() - { + public AzureFunctionConfiguration() { } public AzureFunctionConfiguration(String functionName, String gxEntrypoint) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java index f85f6317c..97ca29040 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java @@ -24,8 +24,7 @@ public static List getFunctionsMapConfiguration() th if (configFile.exists()) { try { String jsonConfig = new String(Files.readAllBytes(Paths.get(FUNCTION_CONFIG_PATH))); - List mappings = new ObjectMapper().readValue(jsonConfig, new TypeReference>(){}); - return mappings; + return new ObjectMapper().readValue(jsonConfig, new TypeReference>(){}); } catch (IOException e) { logger.error(String.format("Invalid Azure function configuration file: %s. Please check json content.", FUNCTION_CONFIG_PATH), e); throw new FunctionConfigurationException(String.format("JSON contents of file '%s' are not valid.", FUNCTION_CONFIG_PATH)); @@ -39,16 +38,19 @@ public static List getFunctionsMapConfiguration() th public static String getFunctionConfigurationEntryPoint(String functionName, AzureFunctionConfiguration functionConfiguration) { - return functionConfiguration.getGXClassName(); + if (functionConfiguration != null) + return functionConfiguration.getGXClassName(); + else return null; } - public static AzureFunctionConfiguration getAzureFunctionConfiguration(String functionName, List mappings) throws FunctionConfigurationException - { - Optional config = mappings.stream() - .filter(c -> functionName.equals(c.getFunctionName())) - .findFirst(); - AzureFunctionConfiguration configuration = config.orElseThrow(() -> new FunctionConfigurationException(String.format("Configuration not found for Azure function %s at gxazmappings.json.",functionName))); - return configuration; + public static AzureFunctionConfiguration getAzureFunctionConfiguration(String functionName, List mappings) throws FunctionConfigurationException { + Optional config = null; + if (mappings != null) { + config = mappings.stream() + .filter(c -> functionName.equals(c.getFunctionName())) + .findFirst(); + } + return config.orElseThrow(() -> new FunctionConfigurationException(String.format("Configuration not found for Azure function %s at gxazmappings.json.", functionName))); } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index 10eae2e43..cb14c507f 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -1,19 +1,13 @@ package com.genexus.cloud.serverless.azure.handler; -import com.genexus.cloud.serverless.Helper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.annotation.*; import com.microsoft.azure.functions.ExecutionContext; -import java.time.Instant; import java.util.List; import java.util.*; -/** - * Azure Functions with Azure Storage Queue Trigger Handler. - * https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger?tabs=java - */ public class AzureQueueHandler extends AzureEventHandler { public AzureQueueHandler() throws Exception { super(); @@ -35,8 +29,7 @@ public void run( msg.setMessageId(id); msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); - Instant nowUtc = Instant.now(); - msg.setMessageDate(Date.from(nowUtc)); + msg.setMessageDate(new Date()); msg.setMessageData(message); List msgAtts = msg.getMessageProperties(); @@ -50,38 +43,17 @@ public void run( msgs.add(msg); - boolean wasHandled = false; - String errorMessage; - SetupServerlessMappings(context.getFunctionName()); try { EventMessageResponse response = dispatchEvent(msgs, message); - wasHandled = !response.hasFailed(); - errorMessage = response.getErrorMessage(); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } } catch (Exception e) { - errorMessage = "HandleRequest execution error"; - logger.error(errorMessage, e); + logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } } - - @Override - protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { - return null; - } - @Override - protected AzureFunctionConfiguration createFunctionConfiguration(String className) { - return null; - } - - @Override - protected AzureFunctionConfiguration createFunctionConfiguration() { - return null; - } -} - - - - - +} \ No newline at end of file diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java new file mode 100644 index 000000000..ef2cf1854 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java @@ -0,0 +1,40 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.helpers.BuildServiceBusMessages; +import com.genexus.cloud.serverless.model.*; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.*; + +import java.util.List; + +public class AzureServiceBusQueueHandler extends AzureEventHandler { + public AzureServiceBusQueueHandler() throws Exception { + super(); + } + + public void run( + @ServiceBusQueueTrigger(name = "messages", queueName = "%queue_name%", connection = "%queue_connection%", cardinality = Cardinality.MANY) + List messages, + final ExecutionContext context + ) throws Exception { + + context.getLogger().info("GeneXus Service Bus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(BuildServiceBusMessages.setupServiceBusMessages(messages), Helper.toJSONString(messages)); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java new file mode 100644 index 000000000..08df7a5fa --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java @@ -0,0 +1,40 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.helpers.BuildServiceBusMessages; +import com.genexus.cloud.serverless.model.*; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.*; + +import java.util.List; + +public class AzureServiceBusTopicHandler extends AzureEventHandler { + public AzureServiceBusTopicHandler() throws Exception { + super(); + } + + public void run( + @ServiceBusTopicTrigger(name = "messages", topicName = "%topic_name%", subscriptionName = "%subscriptionName%", connection = "%queue_connection%", cardinality = Cardinality.MANY) + List messages, + final ExecutionContext context + ) throws Exception { + + context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + SetupServerlessMappings(context.getFunctionName()); + + try { + EventMessageResponse response = dispatchEvent(BuildServiceBusMessages.setupServiceBusMessages(messages), Helper.toJSONString(messages)); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java index f53c4e94a..6849531fe 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java @@ -50,38 +50,21 @@ public void run( msgs.add(msg); - String errorMessage; SetupServerlessMappings(context.getFunctionName()); + EventMessageResponse response = dispatchEvent(msgs, TimerInfo); - try { - EventMessageResponse response = dispatchEvent(msgs, TimerInfo); - errorMessage = response.getErrorMessage(); - } catch (Exception e) { - errorMessage = "HandleRequest execution error"; - //logger.error(errorMessage, e); - throw e; //Throw the exception so the runtime can Retry the operation. + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } + } catch (Exception e) { + logger.error("Message was not handled."); throw e; } } - - - @Override - protected AzureFunctionConfiguration createFunctionConfiguration(String functionName, String className) { - return null; - } - @Override - protected AzureFunctionConfiguration createFunctionConfiguration(String className) { - return null; - } - - @Override - protected AzureFunctionConfiguration createFunctionConfiguration() { - return null; - } private static class TimerObject{ @JsonProperty("ScheduleStatus") diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java new file mode 100644 index 000000000..ae3abc03a --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java @@ -0,0 +1,58 @@ +package com.genexus.cloud.serverless.helpers; + +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.model.EventMessage; +import com.genexus.cloud.serverless.model.EventMessageProperty; +import com.genexus.cloud.serverless.model.EventMessageSourceType; +import com.genexus.cloud.serverless.model.EventMessages; + +import java.util.Date; +import java.util.List; + +public class BuildServiceBusMessages { + + public static EventMessages setupServiceBusMessages(List messages) { + EventMessages msgs = new EventMessages(); + + for (ServiceBusReceivedMessage message : messages) { + + EventMessage msg = new EventMessage(); + msg.setMessageId(message.getMessageId()); + msg.setMessageSourceType(EventMessageSourceType.SERVICE_BUS_MESSAGE); + + msg.setMessageDate(new Date()); + msg.setMessageData(message.getBody().toString()); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", message.getMessageId())); + msgAtts.add(new EventMessageProperty("Content-Type", message.getContentType())); + msgAtts.add(new EventMessageProperty("SessionId", message.getSessionId())); + msgAtts.add(new EventMessageProperty("Subject", message.getSubject())); + msgAtts.add(new EventMessageProperty("SequenceNumber", String.valueOf(message.getSequenceNumber()))); + msgAtts.add(new EventMessageProperty("EnqueuedSequenceNumber", String.valueOf(message.getEnqueuedSequenceNumber()))); + msgAtts.add(new EventMessageProperty("CorrelationId", message.getCorrelationId())); + msgAtts.add(new EventMessageProperty("DeliveryCount", String.valueOf(message.getDeliveryCount()))); + + msgAtts.add(new EventMessageProperty("TimeToLive", String.valueOf(message.getTimeToLive()))); + msgAtts.add(new EventMessageProperty("EnqueuedTime", String.valueOf(message.getEnqueuedTime()))); + msgAtts.add(new EventMessageProperty("ExpiresAt", String.valueOf(message.getExpiresAt()))); + msgAtts.add(new EventMessageProperty("LockedUntil", String.valueOf(message.getLockedUntil()))); + msgAtts.add(new EventMessageProperty("LockToken", message.getLockToken())); + + msgAtts.add(new EventMessageProperty("DeadLetterErrorDescription", message.getDeadLetterErrorDescription())); + msgAtts.add(new EventMessageProperty("DeadLetterReason", message.getDeadLetterReason())); + msgAtts.add(new EventMessageProperty("DeadLetterSource", message.getDeadLetterSource())); + + msgAtts.add(new EventMessageProperty("PartitionKey", message.getPartitionKey())); + msgAtts.add(new EventMessageProperty("To", message.getTo())); + msgAtts.add(new EventMessageProperty("ReplyTo", message.getReplyTo())); + msgAtts.add(new EventMessageProperty("ReplyToSessionId", message.getReplyToSessionId())); + + msgAtts.add(new EventMessageProperty("State", String.valueOf(message.getState()))); + + msgs.add(msg); + + } return msgs; + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java index b13a10698..b996f9562 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java @@ -35,8 +35,10 @@ private synchronized void initializeCache() throws FunctionConfigurationExceptio if (!initialized) { List mappings = AzureFunctionConfigurationHelper.getFunctionsMapConfiguration(); if (mappings != null) { - for (AzureFunctionConfiguration azureFunctionConfiguration : mappings) - functionConfigCache.put(azureFunctionConfiguration.getFunctionName(), azureFunctionConfiguration.getGXClassName()); + for (AzureFunctionConfiguration azureFunctionConfiguration : mappings) { + if (azureFunctionConfiguration.isValidConfiguration()) + functionConfigCache.put(azureFunctionConfiguration.getFunctionName(), azureFunctionConfiguration.getGXClassName()); + } initialized = true; } else diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java index 075f5464e..0c8671e3a 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -7,6 +7,7 @@ import com.genexus.ModelContext; import com.genexus.cloud.serverless.model.EventMessageResponse; import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.model.EventMessagesList; import com.genexus.db.DynamicExecute; import org.apache.commons.lang.NotImplementedException; @@ -19,21 +20,23 @@ public class GXProcedureExecutor { protected Class entryPointClass; - private Class[][] supportedMethodSignatures = new Class[5][]; - private int methodSignatureIdx = -1; + public int methodSignatureIdx = -1; protected static final String MESSAGE_COLLECTION_INPUT_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessages"; protected static final String MESSAGE_OUTPUT_COLLECTION_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessageResponse"; + protected static final String MESSAGE_COLLECTION_LIST_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessagesList"; public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundException, NotImplementedException { entryPointClass = entryPointClassParms; + Class[][] supportedMethodSignatures = new Class[6][]; supportedMethodSignatures[0] = new Class[]{Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME), Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; supportedMethodSignatures[1] = new Class[]{String.class, Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; supportedMethodSignatures[2] = new Class[]{String.class}; supportedMethodSignatures[3] = new Class[]{Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; - supportedMethodSignatures[4] = new Class[]{}; //No inputs, no outputs + supportedMethodSignatures[4] = new Class[]{Class.forName(MESSAGE_COLLECTION_LIST_CLASS_NAME), Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; + supportedMethodSignatures[5] = new Class[]{}; //No inputs, no outputs - Optional executeMethodOpt = Arrays.stream(this.entryPointClass.getDeclaredMethods()).filter(m -> m.getName() == DynamicExecute.METHOD_EXECUTE).findFirst(); + Optional executeMethodOpt = Arrays.stream(this.entryPointClass.getDeclaredMethods()).filter(m -> m.getName().equals(DynamicExecute.METHOD_EXECUTE)).findFirst(); if (!executeMethodOpt.isPresent()) { throw new NotImplementedException(String.format("EXECUTE Method not implemented on Class '%s'", entryPointClass.getName())); @@ -46,7 +49,7 @@ public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundExcep if (supportedMethodSignatures[i].length != parametersTypes.length) { continue; } - Class[] listParameters = (Class[]) supportedMethodSignatures[i]; + Class[] listParameters = supportedMethodSignatures[i]; boolean isMatch = true; for (int j = 0; j < listParameters.length && isMatch; j++) { isMatch = listParameters[j] == parametersTypes[j] || listParameters[j] == parametersTypes[j].getComponentType(); @@ -61,7 +64,7 @@ public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundExcep } - public EventMessageResponse execute(ModelContext modelContext, EventMessages msgs, String rawJsonEvent) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, JsonProcessingException { + public EventMessageResponse execute(ModelContext modelContext, EventMessages msgs, EventMessagesList msgsList, String rawJsonEvent) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, JsonProcessingException { EventMessageResponse response = new EventMessageResponse(); Object[] parameters; @@ -85,6 +88,14 @@ public EventMessageResponse execute(ModelContext modelContext, EventMessages msg case 3: parameters = new Object[]{new Object[]{}}; break; + case 4: + Class inputListClass = Class.forName(MESSAGE_COLLECTION_LIST_CLASS_NAME); + Object msgsListInput = inputListClass.getConstructor().newInstance(); + if (GxUserType.class.isAssignableFrom(inputListClass)) { + ((GxUserType) msgsListInput).fromJSonString(Helper.toJSONString(msgsList)); + } + parameters = new Object[]{msgsListInput, new Object[]{}}; + break; default: parameters = new Object[]{}; returnsValue = false; @@ -93,7 +104,7 @@ public EventMessageResponse execute(ModelContext modelContext, EventMessages msg Object[] paramOutArray = null; if (returnsValue) { - parameters[parameters.length - 1] = (Object[]) Array.newInstance(Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME), 1); + parameters[parameters.length - 1] = Array.newInstance(Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME), 1); paramOutArray = (Object[]) parameters[parameters.length - 1]; paramOutArray[0] = Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME).getConstructor(int.class, ModelContext.class).newInstance(-1, modelContext); } diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java index c4488b45f..90b7a46b5 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -2,9 +2,9 @@ import com.genexus.ApplicationContext; import com.genexus.ModelContext; -import com.genexus.cloud.serverless.exception.FunctionConfigurationException; import com.genexus.cloud.serverless.model.EventMessageResponse; import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.model.EventMessagesList; import com.genexus.diagnostics.core.ILogger; import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; @@ -14,11 +14,9 @@ public abstract class ServerlessBaseEventHandler items = new ArrayList(); + + public void addItem(String item) { + items.add(item); + } +} From a034b4461cb3ffc40cf627b6b3ca2f7e1f5fee15 Mon Sep 17 00:00:00 2001 From: sabrina juarez Date: Thu, 1 Aug 2024 17:49:21 -0300 Subject: [PATCH 06/16] Add unit tests. Make some fixes related to avoid unnecessary serialization --- gxazureserverless/client.cfg | 127 +++++++++ gxazureserverless/gxazmappings.json | 34 +++ gxazureserverless/log4j2.xml | 39 +++ gxazureserverless/pom.xml | 18 +- .../handler/AzureBlobStorageHandler.java | 2 +- .../azure/handler/AzureCosmosDBHandler.java | 9 +- .../handler/AzureEventGridCloudHandler.java | 78 ++++-- .../azure/handler/AzureEventGridHandler.java | 57 +++-- .../azure/handler/AzureEventHandler.java | 28 +- .../azure/handler/AzureQueueHandler.java | 39 +-- .../handler/AzureServiceBusQueueHandler.java | 24 +- .../handler/AzureServiceBusTopicHandler.java | 24 +- .../azure/handler/AzureTimerHandler.java | 74 +++--- ...ages.java => ServiceBusMessagesSetup.java} | 15 +- .../azure/events/MockExecutionContext.java | 30 +++ .../events/TestAzureCosmosDBHandler.java | 44 ++++ .../azure/events/TestAzureEventGrid.java | 51 ++++ .../azure/events/TestAzureEventGridCloud.java | 54 ++++ .../azure/events/TestAzureQueueHandler.java | 53 ++++ .../events/TestAzureServiceBusHandler.java | 74 ++++++ .../azure/events/TestAzureTimerHandler.java | 38 +++ .../com/gx/serverless/test/GXApplication.java | 18 ++ .../java/com/gx/serverless/test/GXcfg.java | 12 + .../com/unittest/eventdriven/SdtUser.java | 242 ++++++++++++++++++ .../unittest/eventdriven/StructSdtUser.java | 127 +++++++++ .../cosmosdb/handlecosmosdbazure.java | 103 ++++++++ .../eventgrid/handleeventgridazure.java | 64 +++++ .../handleeventgridcloudazure.java | 94 +++++++ .../queue/handlequeueazureevent.java | 64 +++++ .../queue/handlequeueazureevent2.java | 97 +++++++ .../servicebus/handlesbqueueazureevent.java | 64 +++++ .../servicebus/handlesbqueueazureevent2.java | 94 +++++++ .../timer/handletimerazureevent.java | 64 +++++ gxazureserverless/src/test/java/log4j2.xml | 39 +++ gxserverlesscommon/pom.xml | 12 +- .../cloud/serverless/GXProcedureExecutor.java | 6 +- .../com/genexus/cloud/serverless/Helper.java | 2 + .../ServerlessBaseEventHandler.java | 9 +- ...tEventCustomPayload_CustomPayloadItem.java | 95 +++++++ .../genexusserverlessapi/SdtEventMessage.java | 192 ++++++++++++++ .../SdtEventMessageResponse.java | 226 ++++++++++++++++ .../SdtEventMessages.java | 115 +++++++++ .../SdtEventMessagesList.java | 211 +++++++++++++++ .../StructSdtEventCustomPayload.java | 40 +++ ...tEventCustomPayload_CustomPayloadItem.java | 48 ++++ .../StructSdtEventMessage.java | 100 ++++++++ .../StructSdtEventMessageResponse.java | 54 ++++ .../StructSdtEventMessages.java | 39 +++ .../StructSdtEventMessagesList.java | 41 +++ 49 files changed, 3033 insertions(+), 151 deletions(-) create mode 100644 gxazureserverless/client.cfg create mode 100644 gxazureserverless/gxazmappings.json create mode 100644 gxazureserverless/log4j2.xml rename gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/{BuildServiceBusMessages.java => ServiceBusMessagesSetup.java} (91%) create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/MockExecutionContext.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java create mode 100644 gxazureserverless/src/test/java/com/gx/serverless/test/GXApplication.java create mode 100644 gxazureserverless/src/test/java/com/gx/serverless/test/GXcfg.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/SdtUser.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/StructSdtUser.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/cosmosdb/handlecosmosdbazure.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/eventgrid/handleeventgridazure.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/eventgridcloud/handleeventgridcloudazure.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent2.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java create mode 100644 gxazureserverless/src/test/java/com/unittest/eventdriven/timer/handletimerazureevent.java create mode 100644 gxazureserverless/src/test/java/log4j2.xml create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java create mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java diff --git a/gxazureserverless/client.cfg b/gxazureserverless/client.cfg new file mode 100644 index 000000000..755775f4d --- /dev/null +++ b/gxazureserverless/client.cfg @@ -0,0 +1,127 @@ +[Client] +MODEL_NUM= 2 +GENERATOR_NUM= 12 +LDAP_LOGIN=0 +LOGIN_AS_USERID=0 +LDAP_HOST= +LDAP_AUTH=simple +LDAP_PRINCIPAL= +LDAP_USERID_TYPE=OS +SMTP_HOST= +NAME_SPACE= com.gx.serverless.test +NAME_HOST= +CORBA_SERVER_NAME= +DCOM_GUID= +CONN_TIMEOUT=300 +HELP_MODE=WINHTML +HELP_BASEURL= +PREFERRED_UI=BEST +JFC_LF=NATIVE +CALENDAR=1 +CALC=1 +WP_RESIZE=1 +SHOW_STATUS=1 +FIELD_EXIT=Tab +ESCAPE_FUNCTION=Exit_form +KEY_REFRESH=5 +KEY_PROMPT=4 +MDI_FORMS=1 +REMOTE_CALLS=NEVER +IMAGE_SUBST=0 +CS_CONNECT=First +CS_REORG=1 +CS_REORGJAVA=1 +SUBFILE_ORDER=Y +FC_READONLY=GRAYED +PACKAGE=com.gx.serverless.test +DECIMAL_POINT=. +DATE_FMT= MDY +CTOD_DATE_FMT= L +BLANK_EMPTY_DATE=0 +TIME_FMT=12 +YEAR_LIMIT=40 +COMPRESS_HTML=1 +DocumentType=HTML5 +IE_COMPATIBILITY_VIEW=EmulateIE7 +WEB_IMAGE_DIR=/static +HTTP_BACKEND_URL= +WEB_STATIC_DIR= +ORQ_CLIENT_URL= +ORQ_SERVER_DIR= +TMPMEDIA_DIR=PrivateTempStorage +PRINT_LAYOUT_METADATA_DIR=LayoutMetadata +StorageTimeZone= 1 +GX_BUILD_NUMBER=123400 +ODBC_CALLS=0 +NameSpace1= com.gx.serverless.test +LANGUAGE=eng +LANG_NAME=English +Theme=Carmine +CS_BLOB_PATH=PublicTempStorage +SUBMIT_POOL_SIZE=5 +CACHE_TTL_0=-1 +CACHE_TTL_1=60 +CACHE_TTL_2=600 +CACHE_TTL_3=0 +CACHE_STORAGE_SIZE=0 +CACHING=0 +SMART_CACHING=0 +CACHE_INVALIDATION_TOKEN=201871916103460 +EVENT_BEFORE_COMMIT= +EVENT_AFTER_COMMIT= +EVENT_BEFORE_ROLLBACK= +EVENT_AFTER_ROLLBACK= +EVENT_BEFORE_CONNECT= +EVENT_AFTER_CONNECT= +ENABLE_MANAGEMENT=0 +EnableIntegratedSecurity=0 +IntegratedSecurityLoginWeb= +IntegratedSecurityNotAuthorizedWeb= +VER_STAMP= +[language|English] +code= eng +time_fmt= 12 +decimal_point= . +thousand_sep= , +date_fmt= MDY +culture= en-US +[com.serverlessbasictest] +GXDB_LOCATION= +JTA=0 +DataSource1=DEFAULT +JDBC_LOG= +JDBCLogEnabled=0 +JDBCUniqueName=0 +JDBCLogPath= +JDBCLogLevel=0 +JDBCLogBuffer=0 +JDBCLogDetail=0 +[com.serverlessbasictest|DEFAULT] +CS_DBNAME= +INFORMIX_DB=ANSI +CS_LIBL400= +CS_PACKAGE400= +DB2400_DATE_DATATYPE= +CS_SCHEMA= +USER_ID=82sPNmMP8O3TlpdEZk1r8E== +USER_PASSWORD=q+TSEf35qmaJpVp4SmrATG== +CS_CONNECT=First +WAIT_RECORD=0 +LOCK_RETRY=10 +LoginInServer=1 +JDBC_DRIVER=net.sourceforge.jtds.jdbc.Driver +DB_URL=jdbc:jtds:sqlserver://:1433/ +USE_JDBC_DATASOURCE=0 +JDBC_DATASOURCE= +MAX_CURSOR=100 +INITIALIZE_NEW=1 +ISOLATION_LEVEL=CR +XBASE_TINT=1 +DBMS=sqlserver +UnlimitedRWPool=1 +PoolRWEnabled=1 +RecycleRW=1 +RecycleRWType=1 +RecycleRWMin=30 +POOLSIZE_RW=10 +POOL_STARTUP=0 diff --git a/gxazureserverless/gxazmappings.json b/gxazureserverless/gxazmappings.json new file mode 100644 index 000000000..3790d8acc --- /dev/null +++ b/gxazureserverless/gxazmappings.json @@ -0,0 +1,34 @@ +[ + { + "FunctionName": "TestQueueRaw", + "GXEntrypoint": "com.unittest.eventdriven.queue.handlequeueazureevent" + }, + { + "FunctionName": "TestQueueEventMessage", + "GXEntrypoint": "com.unittest.eventdriven.queue.handlequeueazureevent2" + }, + { + "FunctionName": "TestTimerRaw", + "GXEntrypoint": "com.unittest.eventdriven.timer.handletimerazureevent" + }, + { + "FunctionName": "TestServiceBusRaw", + "GXEntrypoint": "com.unittest.eventdriven.servicebus.handlesbqueueazureevent" + }, + { + "FunctionName": "TestServiceBusMessage", + "GXEntrypoint": "com.unittest.eventdriven.servicebus.handlesbqueueazureevent2" + }, + { + "FunctionName": "TestEventGridRaw", + "GXEntrypoint": "com.unittest.eventdriven.eventgrid.handleeventgridazure" + }, + { + "FunctionName": "TestEventGridCloud", + "GXEntrypoint": "com.unittest.eventdriven.eventgridcloud.handleeventgridcloudazure" + }, + { + "FunctionName": "TestCosmosDB", + "GXEntrypoint": "com.unittest.eventdriven.cosmosdb.handlecosmosdbazure" + } +] \ No newline at end of file diff --git a/gxazureserverless/log4j2.xml b/gxazureserverless/log4j2.xml new file mode 100644 index 000000000..2ff3a3346 --- /dev/null +++ b/gxazureserverless/log4j2.xml @@ -0,0 +1,39 @@ + + + + ${main:0:-.}${sys:file.separator}logs${sys:file.separator} + + ${logBaseDir}client.log + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index 483af4bf9..c7b0309b7 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -13,11 +13,6 @@ gxazureserverless GeneXus Azure Functions Handler - - 1.8 - 1.8 - - ${project.groupId} @@ -79,11 +74,24 @@ 4.22.3 + + org.mockito + mockito-core + 5.12.0 + + com.fasterxml.jackson.core jackson-databind ${jackson.version} + + + org.junit.jupiter + junit-jupiter + RELEASE + test + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java index 637ea9c20..824dc7cf2 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java @@ -35,7 +35,7 @@ public void run( msgs.add(msg); - SetupServerlessMappings(context.getFunctionName()); + setupServerlessMappings(context.getFunctionName()); try { EventMessageResponse response = dispatchEvent(msgs, Base64.getEncoder().encodeToString(content)); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java index 617a735c1..890bb8710 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java @@ -24,8 +24,11 @@ public void run( EventMessages msgs = new EventMessages(); EventMessagesList eventMessagesList = new EventMessagesList(); + String rawMessage= ""; - switch (executor.methodSignatureIdx) { + setupServerlessMappings(context.getFunctionName()); + + switch (executor.getMethodSignatureIdx()) { case 0: msgs = setupEventMessages(eventId,items); break; @@ -33,12 +36,12 @@ public void run( eventMessagesList = setupEventMessagesList(items); break; default: + rawMessage = Helper.toJSONString(items); break; } - SetupServerlessMappings(context.getFunctionName()); try { - EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, Helper.toJSONString(items)); + EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java index 1aae91100..92b4a522b 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java @@ -1,5 +1,6 @@ package com.genexus.cloud.serverless.azure.handler; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.cloud.serverless.model.EventMessage; import com.genexus.cloud.serverless.model.EventMessageProperty; @@ -14,6 +15,8 @@ import java.util.Objects; public class AzureEventGridCloudHandler extends AzureEventHandler{ + EventMessages msgs = new EventMessages(); + String rawMessage = ""; public AzureEventGridCloudHandler() throws Exception {super();} @@ -22,42 +25,63 @@ public void run( final ExecutionContext context) throws Exception { context.getLogger().info("GeneXus Event Grid CloudEvents trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - SetupServerlessMappings(context.getFunctionName()); + setupServerlessMappings(context.getFunctionName()); + setupEventGridMessage(eventJson); try { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule()); - CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class); - - EventMessages msgs = new EventMessages(); - EventMessage msg = new EventMessage(); - msg.setMessageId(cloudEvent.getId()); - msg.setMessageSourceType(cloudEvent.getType()); - msg.setMessageVersion(""); - - msg.setMessageDate(new Date()); - msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString()); - - List msgAtts = msg.getMessageProperties(); - - msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId())); - msgAtts.add(new EventMessageProperty("Subject",cloudEvent.getSubject())); - msgAtts.add(new EventMessageProperty("DataContentType",cloudEvent.getDataContentType())); - msgAtts.add(new EventMessageProperty("DataSchema", Objects.requireNonNull(cloudEvent.getDataSchema()).toString())); - msgAtts.add(new EventMessageProperty("Source", cloudEvent.getSource().toString())); - msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString())); - msgAtts.add(new EventMessageProperty("Time", Objects.requireNonNull(cloudEvent.getTime()).toString())); - - msgs.add(msg); - - EventMessageResponse response = dispatchEvent(msgs, eventJson); + EventMessageResponse response = dispatchEvent(msgs, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } + } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } } + protected void setupEventGridMessage(String eventJson) throws JsonProcessingException { + + switch (executor.getMethodSignatureIdx()) { + case 0: + + try { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule()); + CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class); + + EventMessage msg = new EventMessage(); + msg.setMessageId(cloudEvent.getId()); + msg.setMessageSourceType(cloudEvent.getType()); + msg.setMessageVersion(""); + + msg.setMessageDate(new Date()); + msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString()); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId())); + msgAtts.add(new EventMessageProperty("Subject", cloudEvent.getSubject())); + msgAtts.add(new EventMessageProperty("DataContentType", cloudEvent.getDataContentType())); + if (cloudEvent.getDataSchema() != null) + msgAtts.add(new EventMessageProperty("DataSchema", cloudEvent.getDataSchema().toString())); + if (cloudEvent.getSource() != null) + msgAtts.add(new EventMessageProperty("Source", cloudEvent.getSource().toString())); + if (cloudEvent.getSpecVersion() != null) + msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString())); + if (cloudEvent.getTime() != null) + msgAtts.add(new EventMessageProperty("Time", cloudEvent.getTime().toString())); + + msgs.add(msg); + } + catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e;} + break; + case 1: + case 2: + rawMessage = eventJson; + } + } + } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java index 155390a78..c9a3b4b31 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java @@ -10,6 +10,9 @@ import java.util.List; public class AzureEventGridHandler extends AzureEventHandler { + + EventMessages msgs = new EventMessages(); + String rawMessage = ""; public AzureEventGridHandler() throws Exception { } @@ -19,29 +22,11 @@ public void run( context.getLogger().info("GeneXus Event Grid trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - EventMessages msgs = new EventMessages(); - EventMessage msg = new EventMessage(); - msg.setMessageId(event.getId()); - msg.setMessageSourceType(event.getEventType()); - msg.setMessageVersion(event.getDataVersion()); - - msg.setMessageDate(new Date()); - msg.setMessageData(event.getData().toString()); - - List msgAtts = msg.getMessageProperties(); - - msgAtts.add(new EventMessageProperty("Id", event.getId())); - - msgAtts.add(new EventMessageProperty("Subject",event.getSubject())); - msgAtts.add(new EventMessageProperty("Topic",event.getTopic())); - msgAtts.add(new EventMessageProperty("EventTime",event.getEventTime().toString())); - - msgs.add(msg); - - SetupServerlessMappings(context.getFunctionName()); + setupServerlessMappings(context.getFunctionName()); + setupEventGridMessage(event); try { - EventMessageResponse response = dispatchEvent(msgs, Helper.toJSONString(event)); + EventMessageResponse response = dispatchEvent(msgs, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -52,5 +37,35 @@ public void run( throw e; //Throw the exception so the runtime can Retry the operation. } + + } + protected void setupEventGridMessage(EventGridEvent event) { + + switch (executor.getMethodSignatureIdx()) { + case 0: + EventMessage msg = new EventMessage(); + msg.setMessageId(event.getId()); + msg.setMessageSourceType(event.getEventType()); + msg.setMessageVersion(event.getDataVersion()); + + msg.setMessageDate(new Date()); + msg.setMessageData(event.getData().toString()); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", event.getId())); + + msgAtts.add(new EventMessageProperty("Subject",event.getSubject())); + msgAtts.add(new EventMessageProperty("Topic",event.getTopic())); + if (event.getEventTime()!= null) + msgAtts.add(new EventMessageProperty("EventTime",event.getEventTime().toString())); + + msgs.add(msg); + + break; + case 1: + case 2: + rawMessage = Helper.toJSONString(event); + } } } \ No newline at end of file diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java index 007f16c51..43aee6ddb 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java @@ -9,25 +9,23 @@ public class AzureEventHandler extends ServerlessBaseEventHandler msgAtts = msg.getMessageProperties(); - - msgAtts.add(new EventMessageProperty("Id", id)); - msgAtts.add(new EventMessageProperty("DequeueCount", Long.toString(dequeCount))); - msgAtts.add(new EventMessageProperty("ExpirationTime", expirationTime)); - msgAtts.add(new EventMessageProperty("InsertionTime", insertionTime)); - msgAtts.add(new EventMessageProperty("NextVisibleTime", nextVisibleTime)); - msgAtts.add(new EventMessageProperty("PopReceipt", popReceipt)); + setupServerlessMappings(context.getFunctionName()); - msgs.add(msg); - - SetupServerlessMappings(context.getFunctionName()); + EventMessages msgs = new EventMessages(); + if (executor.getMethodSignatureIdx() == 0) { + EventMessage msg = new EventMessage(); + msg.setMessageId(id); + msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); + + msg.setMessageDate(new Date()); + msg.setMessageData(message); + + List msgAtts = msg.getMessageProperties(); + + msgAtts.add(new EventMessageProperty("Id", id)); + msgAtts.add(new EventMessageProperty("DequeueCount", Long.toString(dequeCount))); + msgAtts.add(new EventMessageProperty("ExpirationTime", expirationTime)); + msgAtts.add(new EventMessageProperty("InsertionTime", insertionTime)); + msgAtts.add(new EventMessageProperty("NextVisibleTime", nextVisibleTime)); + msgAtts.add(new EventMessageProperty("PopReceipt", popReceipt)); + msgs.add(msg); + } try { EventMessageResponse response = dispatchEvent(msgs, message); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java index ef2cf1854..69b172bca 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java @@ -2,14 +2,19 @@ import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.BuildServiceBusMessages; +import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.*; +import java.util.Date; import java.util.List; public class AzureServiceBusQueueHandler extends AzureEventHandler { + + EventMessages msgs = new EventMessages(); + String rawMessage = ""; + public AzureServiceBusQueueHandler() throws Exception { super(); } @@ -22,10 +27,10 @@ public void run( context.getLogger().info("GeneXus Service Bus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - SetupServerlessMappings(context.getFunctionName()); - + setupServerlessMappings(context.getFunctionName()); + setupServiceBusMessages(messages); try { - EventMessageResponse response = dispatchEvent(BuildServiceBusMessages.setupServiceBusMessages(messages), Helper.toJSONString(messages)); + EventMessageResponse response = dispatchEvent(msgs, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -35,6 +40,17 @@ public void run( logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } + } + + protected void setupServiceBusMessages(List messages) { + switch (executor.getMethodSignatureIdx()) { + case 0: + msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); + break; + case 1: + case 2: + rawMessage = Helper.toJSONString(messages); + } } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java index 08df7a5fa..6f85845d6 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java @@ -2,7 +2,7 @@ import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.BuildServiceBusMessages; +import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.*; @@ -10,6 +10,10 @@ import java.util.List; public class AzureServiceBusTopicHandler extends AzureEventHandler { + + EventMessages msgs = new EventMessages(); + String rawMessage = ""; + public AzureServiceBusTopicHandler() throws Exception { super(); } @@ -22,10 +26,10 @@ public void run( context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - SetupServerlessMappings(context.getFunctionName()); - + setupServerlessMappings(context.getFunctionName()); + setupServiceBusMessages(messages); try { - EventMessageResponse response = dispatchEvent(BuildServiceBusMessages.setupServiceBusMessages(messages), Helper.toJSONString(messages)); + EventMessageResponse response = dispatchEvent(msgs,rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -35,6 +39,16 @@ public void run( logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } - + } + protected void setupServiceBusMessages(List messages) { + + switch (executor.getMethodSignatureIdx()) { + case 0: + msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); + break; + case 1: + case 2: + rawMessage = Helper.toJSONString(messages); + } } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java index 6849531fe..27d112ffb 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java @@ -25,47 +25,55 @@ public void run( context.getLogger().info("GeneXus Timer trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - try { - TimerObject timerObject = new ObjectMapper().readValue(TimerInfo, new TypeReference(){}); - EventMessages msgs = new EventMessages(); - EventMessage msg = new EventMessage(); - msg.setMessageId(context.getInvocationId()); - msg.setMessageSourceType(EventMessageSourceType.TIMER); + setupServerlessMappings(context.getFunctionName()); + EventMessages msgs = new EventMessages(); - Instant nowUtc = Instant.now(); - msg.setMessageDate(Date.from(nowUtc)); + if (executor.getMethodSignatureIdx() == 0) { - List msgAtts = msg.getMessageProperties(); + try { + TimerObject timerObject = new ObjectMapper().readValue(TimerInfo, new TypeReference() { + }); - msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); - boolean adjustForSDT = timerObject.timerSchedule.getAdjustForDST(); - msgAtts.add(new EventMessageProperty("AdjustForDST", Boolean.toString(adjustForSDT))); + EventMessage msg = new EventMessage(); + msg.setMessageId(context.getInvocationId()); + msg.setMessageSourceType(EventMessageSourceType.TIMER); - msgAtts.add(new EventMessageProperty("Next", timerObject.timerScheduleStatus.getNext())); - msgAtts.add(new EventMessageProperty("Last", timerObject.timerScheduleStatus.getLast())); - msgAtts.add(new EventMessageProperty("LastUpdated", timerObject.timerScheduleStatus.getLastUpdated())); + Instant nowUtc = Instant.now(); + msg.setMessageDate(Date.from(nowUtc)); - boolean isPastDue = timerObject.getIsPastDue(); - msgAtts.add(new EventMessageProperty("IsPastDue", Boolean.toString(isPastDue))); + List msgAtts = msg.getMessageProperties(); - msgs.add(msg); + msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); + boolean adjustForSDT = timerObject.timerSchedule.getAdjustForDST(); + msgAtts.add(new EventMessageProperty("AdjustForDST", Boolean.toString(adjustForSDT))); + msgAtts.add(new EventMessageProperty("Next", timerObject.timerScheduleStatus.getNext())); + msgAtts.add(new EventMessageProperty("Last", timerObject.timerScheduleStatus.getLast())); + msgAtts.add(new EventMessageProperty("LastUpdated", timerObject.timerScheduleStatus.getLastUpdated())); - SetupServerlessMappings(context.getFunctionName()); - EventMessageResponse response = dispatchEvent(msgs, TimerInfo); + boolean isPastDue = timerObject.getIsPastDue(); + msgAtts.add(new EventMessageProperty("IsPastDue", Boolean.toString(isPastDue))); + + msgs.add(msg); + + } catch (Exception e) { + logger.error("Message could not be processed."); + throw e; + } + } + try { + EventMessageResponse response = dispatchEvent(msgs, TimerInfo); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - - } - catch (Exception e) { - logger.error("Message was not handled."); - throw e; + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. } } - private static class TimerObject{ + public static class TimerObject{ @JsonProperty("ScheduleStatus") TimerScheduleStatus timerScheduleStatus; @@ -76,10 +84,10 @@ private static class TimerObject{ @JsonProperty("Schedule") TimerSchedule timerSchedule; - protected TimerObject() { + public TimerObject() { } - protected TimerObject(TimerScheduleStatus timerScheduleStatus, boolean IsPastDue,TimerSchedule timerSchedule) { + public TimerObject(TimerScheduleStatus timerScheduleStatus, boolean IsPastDue,TimerSchedule timerSchedule) { this.timerScheduleStatus = timerScheduleStatus; this.IsPastDue = IsPastDue; this.timerSchedule = timerSchedule; @@ -90,7 +98,7 @@ protected boolean getIsPastDue() { } } - private static class TimerSchedule{ + public static class TimerSchedule{ @JsonProperty("AdjustForDST") boolean AdjustForDST; @@ -105,7 +113,7 @@ protected boolean getAdjustForDST() { } } - private static class TimerScheduleStatus { + public static class TimerScheduleStatus { @JsonProperty("Last") String Last; @@ -118,13 +126,13 @@ private static class TimerScheduleStatus { public TimerScheduleStatus() {} - protected void setLast(String last) { + public void setLast(String last) { Last = last; } - protected void setNext(String next) { + public void setNext(String next) { Next = next; } - protected void setLastUpdated(String lastUpdated) { + public void setLastUpdated(String lastUpdated) { LastUpdated = lastUpdated; } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java similarity index 91% rename from gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java rename to gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java index ae3abc03a..2c61d7d8a 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/BuildServiceBusMessages.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java @@ -9,11 +9,10 @@ import java.util.Date; import java.util.List; -public class BuildServiceBusMessages { - - public static EventMessages setupServiceBusMessages(List messages) { - EventMessages msgs = new EventMessages(); - +public class ServiceBusMessagesSetup { + public static EventMessages setupservicebuslistmsgs(List messages) + { + EventMessages eventmessages = new EventMessages(); for (ServiceBusReceivedMessage message : messages) { EventMessage msg = new EventMessage(); @@ -51,8 +50,8 @@ public static EventMessages setupServiceBusMessages(List> list = new ArrayList<>(2); + + Map map1 = new HashMap<>(); + map1.put("UserId", "ac7f12fd-9784-4c93-94cd-7e02a7b1cf4b"); + map1.put("UserName", "Jhon"); + + Map map2 = new HashMap<>(); + map2.put("UserId", "bf3288ef-afe5-470e-8be6-2f55b4015f3b"); + map2.put("UserName", "Mary"); + + list.add(map1); + list.add(map2); + + context = new MockExecutionContext("TestCosmosDB","13e2d1f9-6838-4927-a6a8-0160e8601ab5"); + cosmosDBFunction.run(list,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java new file mode 100644 index 000000000..dee85a742 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java @@ -0,0 +1,51 @@ +package com.genexus.cloud.azure.events; +import com.azure.core.util.BinaryData; +import com.azure.messaging.eventgrid.EventGridEvent; +import com.genexus.cloud.serverless.azure.handler.AzureEventGridHandler; +import com.microsoft.azure.functions.ExecutionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.time.OffsetDateTime; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class TestAzureEventGrid { + private AzureEventGridHandler eventGridFunction; + private ExecutionContext context; + + @BeforeEach + public void setup() throws Exception { + eventGridFunction = new AzureEventGridHandler(); + } + + @Test + public void testEventGridFunctionRaw() throws Exception { + + EventGridEvent message = loadmessages(); + context = new MockExecutionContext("TestEventGridRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab5"); + eventGridFunction.run(message,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + + private EventGridEvent loadmessages() + { + String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + long sequenceNumber = 1123456789; + String subject = "testsubject1"; + String eventTime = "2025-01-01T00:00:00.000Z"; + String topic = "testtopic1"; + + EventGridEvent message1 = Mockito.mock(EventGridEvent.class); + Mockito.when(message1.getData()).thenReturn(BinaryData.fromBytes("Test message Event Grid 1".getBytes())); + Mockito.when(message1.getId()).thenReturn(id); + Mockito.when(message1.getEventTime()).thenReturn(OffsetDateTime.parse(eventTime)); + Mockito.when(message1.getTopic()).thenReturn(topic); + Mockito.when(message1.getSubject()).thenReturn(subject); + + return message1; + } +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java new file mode 100644 index 000000000..38ff3c6d2 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java @@ -0,0 +1,54 @@ +package com.genexus.cloud.azure.events; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.cloud.serverless.azure.handler.AzureEventGridCloudHandler;; +import com.microsoft.azure.functions.ExecutionContext; +import io.cloudevents.CloudEvent; +import io.cloudevents.CloudEventData; +import io.cloudevents.SpecVersion; +import io.cloudevents.jackson.JsonFormat; +import org.junit.Test; +import org.mockito.Mockito; + +import java.net.URI; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class TestAzureEventGridCloud { + private AzureEventGridCloudHandler eventGridCloudFunction; + private ExecutionContext context; + + @Test + public void testEventGridCloudFunction() throws Exception { + + eventGridCloudFunction = new AzureEventGridCloudHandler(); + CloudEvent message = loadmessages(); + context = new MockExecutionContext("TestEventGridCloud","13e2d1f9-6838-4927-a6a8-0160e8601ab2"); + + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(JsonFormat.getCloudEventJacksonModule()); + String json = mapper.writeValueAsString(message); + eventGridCloudFunction.run(json,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + + private CloudEvent loadmessages() + { + String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + + CloudEvent message1 = Mockito.mock(CloudEvent.class); + CloudEventData mockData = Mockito.mock(CloudEventData.class); + + Mockito.when(mockData.toBytes()).thenReturn("{\"key\":\"1234\"}".getBytes()); + Mockito.when(message1.getData()).thenReturn(mockData); + + Mockito.when(message1.getType()).thenReturn("MyEventType"); + Mockito.when(message1.getSource()).thenReturn(URI.create("/my/source")); + Mockito.when(message1.getId()).thenReturn(id); + Mockito.when(message1.getSpecVersion()).thenReturn(SpecVersion.parse("1.0")); + + return message1; + } + +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java new file mode 100644 index 000000000..2d41d8ceb --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java @@ -0,0 +1,53 @@ +package com.genexus.cloud.azure.events; + +import com.genexus.cloud.serverless.azure.handler.AzureQueueHandler; +import com.microsoft.azure.functions.ExecutionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class TestAzureQueueHandler { + private AzureQueueHandler queueFunction; + private ExecutionContext context; + + @BeforeEach + public void setup() throws Exception { + queueFunction = new AzureQueueHandler(); + } + + @Test + public void testQueueTriggerFunctionRaw() throws Exception { + String testMessage = "Test message Queue"; + String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + long dequeCount =2; + String expirationTime = "2025-01-01T00:00:00.000Z"; + final String insertionTime = "2024-11-01T00:00:00.000Z"; + String nextVisibleTime = "2024-11-01T04:00:00.000Z"; + String popReceipt = "bc2a33d5-d481-4fc2-a1e7-a9f8e50e0281"; + + context = new MockExecutionContext("TestQueueRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab0"); + queueFunction.run(testMessage,id,dequeCount,expirationTime,insertionTime, nextVisibleTime,popReceipt,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + + } + @Test + public void testQueueTriggerFunctionMessage() throws Exception { + String testMessage = "{\"UserId\":\"d2376a4c-86c3-461f-93cc-1c2e0174222b\", \"UserName\":\"John\"}"; + String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + long dequeCount =2; + String expirationTime = "2025-01-01T00:00:00.000Z"; + final String insertionTime = "2024-11-01T00:00:00.000Z"; + String nextVisibleTime = "2024-11-01T04:00:00.000Z"; + String popReceipt = "bc2a33d5-d481-4fc2-a1e7-a9f8e50e0281"; + + context = new MockExecutionContext("TestQueueEventMessage","758093bf-68c1-47a5-8f93-cc2882e961e7"); + queueFunction.run(testMessage,id,dequeCount,expirationTime,insertionTime, nextVisibleTime,popReceipt,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + + } +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java new file mode 100644 index 000000000..6276f0d92 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java @@ -0,0 +1,74 @@ +package com.genexus.cloud.azure.events; +import com.azure.core.util.BinaryData; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.azure.handler.AzureServiceBusQueueHandler; +import com.microsoft.azure.functions.ExecutionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class TestAzureServiceBusHandler { + private AzureServiceBusQueueHandler sbqueueFunction; + private ExecutionContext context; + + @BeforeEach + public void setup() throws Exception { + sbqueueFunction = new AzureServiceBusQueueHandler(); + } + + @Test + public void testSBTriggerFunctionRaw() throws Exception { + + List messages = loadmessages(); + + context = new MockExecutionContext("TestServiceBusRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab0"); + sbqueueFunction.run(messages,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + @Test + public void testSBTriggerFunctionMessage() throws Exception { + + List messages = loadmessages(); + context = new MockExecutionContext("TestServiceBusMessage","13e2d1f9-6838-4927-a6a8-0160e8601ab1"); + sbqueueFunction.run(messages,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + + } + private List loadmessages() + { + String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + long sequenceNumber = 1123456789; + String subject = "testsubject1"; + + List messages = new ArrayList<>(); + ServiceBusReceivedMessage message1 = Mockito.mock(ServiceBusReceivedMessage.class); + Mockito.when(message1.getBody()).thenReturn(BinaryData.fromBytes("Test message Service Bus Queue 1".getBytes())); + Mockito.when(message1.getMessageId()).thenReturn(id); + Mockito.when(message1.getContentType()).thenReturn("application/octet-stream"); + Mockito.when(message1.getSequenceNumber()).thenReturn(sequenceNumber); + Mockito.when(message1.getSubject()).thenReturn(subject); + messages.add(message1); + + id = "ac6105de-9715-4753-9c80-4c07c4c8bda4"; + sequenceNumber = 1123456780; + subject = "testsubject2"; + ServiceBusReceivedMessage message2 = Mockito.mock(ServiceBusReceivedMessage.class); + Mockito.when(message2.getBody()).thenReturn(BinaryData.fromBytes("Test message Service Bus Queue 2".getBytes())); + Mockito.when(message2.getMessageId()).thenReturn(id); + Mockito.when(message2.getContentType()).thenReturn("application/octet-stream"); + Mockito.when(message2.getSequenceNumber()).thenReturn(sequenceNumber); + Mockito.when(message2.getSubject()).thenReturn(subject); + + messages.add(message2); + return messages; + } +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java new file mode 100644 index 000000000..64160a0da --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java @@ -0,0 +1,38 @@ +package com.genexus.cloud.azure.events; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genexus.cloud.serverless.azure.handler.AzureQueueHandler; +import com.genexus.cloud.serverless.azure.handler.AzureTimerHandler; +import com.microsoft.azure.functions.ExecutionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class TestAzureTimerHandler { + + private AzureTimerHandler timerFunction; + private ExecutionContext context; + + @BeforeEach + public void setup() throws Exception { + timerFunction = new AzureTimerHandler(); + } + @Test + public void testTimerTriggerFunctionRaw() throws Exception { + + AzureTimerHandler.TimerScheduleStatus timerScheduleStatus = new AzureTimerHandler.TimerScheduleStatus(); + timerScheduleStatus.setLast("2025-01-01T00:00:00.000Z"); + timerScheduleStatus.setNext("2025-01-01T00:00:00.000Z"); + timerScheduleStatus.setLastUpdated("2025-01-01T00:00:00.000Z"); + + AzureTimerHandler.TimerSchedule timerSchedule = new AzureTimerHandler.TimerSchedule(true); + AzureTimerHandler.TimerObject timerObject = new AzureTimerHandler.TimerObject(timerScheduleStatus,false,timerSchedule); + + context = new MockExecutionContext("TestTimerRaw","845579bc-e081-46da-8397-daa17e32e269"); + timerFunction.run(new ObjectMapper().writeValueAsString(timerObject),context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + + } +} diff --git a/gxazureserverless/src/test/java/com/gx/serverless/test/GXApplication.java b/gxazureserverless/src/test/java/com/gx/serverless/test/GXApplication.java new file mode 100644 index 000000000..68d0b5544 --- /dev/null +++ b/gxazureserverless/src/test/java/com/gx/serverless/test/GXApplication.java @@ -0,0 +1,18 @@ +package com.gx.serverless.test; + +import com.genexus.webpanels.WebUtils; + +import javax.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + +public final class GXApplication extends Application { + public Set> getClasses() { + Set> rrcs = new HashSet>(); + WebUtils.getGXApplicationClasses(getClass(), rrcs); + WebUtils.AddExternalServices(getClass(), rrcs); + return rrcs; + } + +} + diff --git a/gxazureserverless/src/test/java/com/gx/serverless/test/GXcfg.java b/gxazureserverless/src/test/java/com/gx/serverless/test/GXcfg.java new file mode 100644 index 000000000..ac01107f7 --- /dev/null +++ b/gxazureserverless/src/test/java/com/gx/serverless/test/GXcfg.java @@ -0,0 +1,12 @@ +package com.gx.serverless.test; + +import com.genexus.GXutil; + +public final class GXcfg { + public static int strcmp(String Left, + String Right) { + return GXutil.rtrim(Left).compareTo(GXutil.rtrim(Right)); + } + +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/SdtUser.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/SdtUser.java new file mode 100644 index 000000000..4ab00bb6f --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/SdtUser.java @@ -0,0 +1,242 @@ +package com.unittest.eventdriven; + +import com.genexus.GXutil; +import com.genexus.GxSilentTrnSdt; +import com.genexus.ModelContext; + +import java.util.Date; +import java.util.HashMap; +import java.util.UUID; + +public final class SdtUser extends GxSilentTrnSdt { + public SdtUser(int remoteHandle) { + this(remoteHandle, new ModelContext(SdtUser.class)); + } + + public SdtUser(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, "SdtUser"); + initialize(); + } + + public SdtUser(int remoteHandle, + StructSdtUser struct) { + this(remoteHandle); + setStruct(struct); + } + + private static HashMap mapper = new HashMap(); + + static { + } + + public String getJsonMap(String value) { + return (String) mapper.get(value); + } + + public UUID getgxTv_SdtUser_Userid() { + return gxTv_SdtUser_Userid; + } + + public void setgxTv_SdtUser_Userid(UUID value) { + gxTv_SdtUser_N = (byte) (0); + if (!(gxTv_SdtUser_Userid.equals(value))) { + gxTv_SdtUser_Mode = "INS"; + this.setgxTv_SdtUser_Userid_Z_SetNull(); + this.setgxTv_SdtUser_Username_Z_SetNull(); + this.setgxTv_SdtUser_Userregistereddatetime_Z_SetNull(); + } + SetDirty("Userid"); + gxTv_SdtUser_Userid = value; + } + + public String getgxTv_SdtUser_Username() { + return gxTv_SdtUser_Username; + } + + public void setgxTv_SdtUser_Username(String value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Username"); + gxTv_SdtUser_Username = value; + } + + public Date getgxTv_SdtUser_Userregistereddatetime() { + return gxTv_SdtUser_Userregistereddatetime; + } + + public void setgxTv_SdtUser_Userregistereddatetime(Date value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Userregistereddatetime"); + gxTv_SdtUser_Userregistereddatetime = value; + } + + public String getgxTv_SdtUser_Usereventmessagedata() { + return gxTv_SdtUser_Usereventmessagedata; + } + + public void setgxTv_SdtUser_Usereventmessagedata(String value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Usereventmessagedata"); + gxTv_SdtUser_Usereventmessagedata = value; + } + + public String getgxTv_SdtUser_Mode() { + return gxTv_SdtUser_Mode; + } + + public void setgxTv_SdtUser_Mode(String value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Mode"); + gxTv_SdtUser_Mode = value; + } + + public void setgxTv_SdtUser_Mode_SetNull() { + gxTv_SdtUser_Mode = ""; + SetDirty("Mode"); + } + + public boolean getgxTv_SdtUser_Mode_IsNull() { + return false; + } + + public short getgxTv_SdtUser_Initialized() { + return gxTv_SdtUser_Initialized; + } + + public void setgxTv_SdtUser_Initialized(short value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Initialized"); + gxTv_SdtUser_Initialized = value; + } + + public void setgxTv_SdtUser_Initialized_SetNull() { + gxTv_SdtUser_Initialized = (short) (0); + SetDirty("Initialized"); + } + + public boolean getgxTv_SdtUser_Initialized_IsNull() { + return false; + } + + public UUID getgxTv_SdtUser_Userid_Z() { + return gxTv_SdtUser_Userid_Z; + } + + public void setgxTv_SdtUser_Userid_Z(UUID value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Userid_Z"); + gxTv_SdtUser_Userid_Z = value; + } + + public void setgxTv_SdtUser_Userid_Z_SetNull() { + gxTv_SdtUser_Userid_Z = UUID.fromString("00000000-0000-0000-0000-000000000000"); + SetDirty("Userid_Z"); + } + + public boolean getgxTv_SdtUser_Userid_Z_IsNull() { + return false; + } + + public String getgxTv_SdtUser_Username_Z() { + return gxTv_SdtUser_Username_Z; + } + + public void setgxTv_SdtUser_Username_Z(String value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Username_Z"); + gxTv_SdtUser_Username_Z = value; + } + + public void setgxTv_SdtUser_Username_Z_SetNull() { + gxTv_SdtUser_Username_Z = ""; + SetDirty("Username_Z"); + } + + public boolean getgxTv_SdtUser_Username_Z_IsNull() { + return false; + } + + public Date getgxTv_SdtUser_Userregistereddatetime_Z() { + return gxTv_SdtUser_Userregistereddatetime_Z; + } + + public void setgxTv_SdtUser_Userregistereddatetime_Z(Date value) { + gxTv_SdtUser_N = (byte) (0); + SetDirty("Userregistereddatetime_Z"); + gxTv_SdtUser_Userregistereddatetime_Z = value; + } + + public void setgxTv_SdtUser_Userregistereddatetime_Z_SetNull() { + gxTv_SdtUser_Userregistereddatetime_Z = GXutil.resetTime(GXutil.nullDate()); + SetDirty("Userregistereddatetime_Z"); + } + + public boolean getgxTv_SdtUser_Userregistereddatetime_Z_IsNull() { + return false; + } + + + public void initialize() { + gxTv_SdtUser_Userid = UUID.fromString("00000000-0000-0000-0000-000000000000"); + gxTv_SdtUser_N = (byte) (1); + gxTv_SdtUser_Username = ""; + gxTv_SdtUser_Userregistereddatetime = GXutil.resetTime(GXutil.nullDate()); + gxTv_SdtUser_Usereventmessagedata = ""; + gxTv_SdtUser_Mode = ""; + gxTv_SdtUser_Userid_Z = UUID.fromString("00000000-0000-0000-0000-000000000000"); + gxTv_SdtUser_Username_Z = ""; + gxTv_SdtUser_Userregistereddatetime_Z = GXutil.resetTime(GXutil.nullDate()); + sTagName = ""; + sDateCnv = ""; + sNumToPad = ""; + datetime_STZ = GXutil.resetTime(GXutil.nullDate()); + } + + public byte isNull() { + return gxTv_SdtUser_N; + } + + + public void setStruct(StructSdtUser struct) { + setgxTv_SdtUser_Userid(struct.getUserid()); + setgxTv_SdtUser_Username(struct.getUsername()); + setgxTv_SdtUser_Userregistereddatetime(struct.getUserregistereddatetime()); + setgxTv_SdtUser_Usereventmessagedata(struct.getUsereventmessagedata()); + setgxTv_SdtUser_Mode(struct.getMode()); + setgxTv_SdtUser_Initialized(struct.getInitialized()); + setgxTv_SdtUser_Userid_Z(struct.getUserid_Z()); + setgxTv_SdtUser_Username_Z(struct.getUsername_Z()); + setgxTv_SdtUser_Userregistereddatetime_Z(struct.getUserregistereddatetime_Z()); + } + + @SuppressWarnings("unchecked") + public StructSdtUser getStruct() { + StructSdtUser struct = new StructSdtUser(); + struct.setUserid(getgxTv_SdtUser_Userid()); + struct.setUsername(getgxTv_SdtUser_Username()); + struct.setUserregistereddatetime(getgxTv_SdtUser_Userregistereddatetime()); + struct.setUsereventmessagedata(getgxTv_SdtUser_Usereventmessagedata()); + struct.setMode(getgxTv_SdtUser_Mode()); + struct.setInitialized(getgxTv_SdtUser_Initialized()); + struct.setUserid_Z(getgxTv_SdtUser_Userid_Z()); + struct.setUsername_Z(getgxTv_SdtUser_Username_Z()); + struct.setUserregistereddatetime_Z(getgxTv_SdtUser_Userregistereddatetime_Z()); + return struct; + } + + private byte gxTv_SdtUser_N; + private short gxTv_SdtUser_Initialized; + private String gxTv_SdtUser_Username; + private String gxTv_SdtUser_Mode; + private String gxTv_SdtUser_Username_Z; + private String sTagName; + private String sDateCnv; + private String sNumToPad; + private Date gxTv_SdtUser_Userregistereddatetime; + private Date gxTv_SdtUser_Userregistereddatetime_Z; + private Date datetime_STZ; + private String gxTv_SdtUser_Usereventmessagedata; + private UUID gxTv_SdtUser_Userid; + private UUID gxTv_SdtUser_Userid_Z; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/StructSdtUser.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/StructSdtUser.java new file mode 100644 index 000000000..45040abff --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/StructSdtUser.java @@ -0,0 +1,127 @@ +package com.unittest.eventdriven; + +import com.genexus.ModelContext; + +public final class StructSdtUser implements Cloneable, java.io.Serializable { + public StructSdtUser() { + this(-1, new ModelContext(StructSdtUser.class)); + } + + public StructSdtUser(int remoteHandle, + ModelContext context) { + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.set(1, 0, 1, 0, 0, 0); + cal.set(java.util.Calendar.MILLISECOND, 0); + gxTv_SdtUser_Userid = java.util.UUID.fromString("00000000-0000-0000-0000-000000000000"); + gxTv_SdtUser_Username = ""; + gxTv_SdtUser_Userregistereddatetime = cal.getTime(); + gxTv_SdtUser_Usereventmessagedata = ""; + gxTv_SdtUser_Mode = ""; + gxTv_SdtUser_Userid_Z = java.util.UUID.fromString("00000000-0000-0000-0000-000000000000"); + gxTv_SdtUser_Username_Z = ""; + gxTv_SdtUser_Userregistereddatetime_Z = cal.getTime(); + } + + public Object clone() { + Object cloned = null; + try { + cloned = super.clone(); + } catch (CloneNotSupportedException e) { + ; + } + return cloned; + } + + public java.util.UUID getUserid() { + return gxTv_SdtUser_Userid; + } + + public void setUserid(java.util.UUID value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Userid = value; + } + + public String getUsername() { + return gxTv_SdtUser_Username; + } + + public void setUsername(String value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Username = value; + } + + public java.util.Date getUserregistereddatetime() { + return gxTv_SdtUser_Userregistereddatetime; + } + + public void setUserregistereddatetime(java.util.Date value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Userregistereddatetime = value; + } + + public String getUsereventmessagedata() { + return gxTv_SdtUser_Usereventmessagedata; + } + + public void setUsereventmessagedata(String value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Usereventmessagedata = value; + } + + public String getMode() { + return gxTv_SdtUser_Mode; + } + + public void setMode(String value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Mode = value; + } + + public short getInitialized() { + return gxTv_SdtUser_Initialized; + } + + public void setInitialized(short value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Initialized = value; + } + + public java.util.UUID getUserid_Z() { + return gxTv_SdtUser_Userid_Z; + } + + public void setUserid_Z(java.util.UUID value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Userid_Z = value; + } + + public String getUsername_Z() { + return gxTv_SdtUser_Username_Z; + } + + public void setUsername_Z(String value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Username_Z = value; + } + + public java.util.Date getUserregistereddatetime_Z() { + return gxTv_SdtUser_Userregistereddatetime_Z; + } + + public void setUserregistereddatetime_Z(java.util.Date value) { + gxTv_SdtUser_N = (byte) (0); + gxTv_SdtUser_Userregistereddatetime_Z = value; + } + + private byte gxTv_SdtUser_N; + protected short gxTv_SdtUser_Initialized; + protected String gxTv_SdtUser_Username; + protected String gxTv_SdtUser_Mode; + protected String gxTv_SdtUser_Username_Z; + protected String gxTv_SdtUser_Usereventmessagedata; + protected java.util.UUID gxTv_SdtUser_Userid; + protected java.util.UUID gxTv_SdtUser_Userid_Z; + protected java.util.Date gxTv_SdtUser_Userregistereddatetime; + protected java.util.Date gxTv_SdtUser_Userregistereddatetime_Z; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/cosmosdb/handlecosmosdbazure.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/cosmosdb/handlecosmosdbazure.java new file mode 100644 index 000000000..f08511e42 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/cosmosdb/handlecosmosdbazure.java @@ -0,0 +1,103 @@ +package com.unittest.eventdriven.cosmosdb; + +import com.genexus.GXBaseCollection; +import com.genexus.GXProcedure; +import com.genexus.ModelContext; +import com.genexus.SdtMessages_Message; + +public final class handlecosmosdbazure extends GXProcedure { + public handlecosmosdbazure(int remoteHandle) { + super(remoteHandle, new ModelContext(handlecosmosdbazure.class), ""); + } + + public handlecosmosdbazure(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, ""); + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.SdtEventMessageResponse executeUdp(com.genexus.genexusserverlessapi.SdtEventMessagesList aP0) { + handlecosmosdbazure.this.aP1 = new com.genexus.genexusserverlessapi.SdtEventMessageResponse[]{new com.genexus.genexusserverlessapi.SdtEventMessageResponse()}; + execute_int(aP0, aP1); + return aP1[0]; + } + + public void execute(com.genexus.genexusserverlessapi.SdtEventMessagesList aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(com.genexus.genexusserverlessapi.SdtEventMessagesList aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + handlecosmosdbazure.this.AV17EventMessagesList = aP0; + handlecosmosdbazure.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START CosmosDB Event received"); + System.out.println(AV17EventMessagesList.toJSonString(false, true)); + AV16GXV1 = 1; + while ( AV16GXV1 <= AV17EventMessagesList.getgxTv_SdtEventMessagesList_Items().size() ) + { + AV8EventMessage = (String)AV17EventMessagesList.getgxTv_SdtEventMessagesList_Items().elementAt(-1+AV16GXV1) ; + System.out.println(AV8EventMessage); + //httpContext.GX_msglist.addItem(AV8EventMessage); + + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(!AV11UserSDT.fromJSonString(AV8EventMessage)); + if (AV9EventMessageResponse.getgxTv_SdtEventMessageResponse_Handlefailure()) { + System.out.println("Event Message Data could not be parsed: " + AV8EventMessage); + System.out.println(AV12OutMessages.toJSonString(false)); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Errormessage(AV12OutMessages.toJSonString(false)); + returnInSub = true; + cleanup(); + if (true) return; + } + System.out.println("UserSDT Processed OK: " + AV11UserSDT.toJSonString(false, true)); + AV16GXV1 = (int)(AV16GXV1+1) ; + } + + System.out.println("END CosmosDB Event received"); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handlecosmosdbazure.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV8EventMessage = ""; + AV9EventMessageResponse = new com.genexus.genexusserverlessapi.SdtEventMessageResponse(remoteHandle, context); + AV15Pgmname = ""; + AV10EventMessage = new com.genexus.genexusserverlessapi.SdtEventMessage(remoteHandle, context); + AV12OutMessages = new GXBaseCollection(SdtMessages_Message.class, "Message", "GeneXus", remoteHandle); + AV11UserSDT = new com.unittest.eventdriven.SdtUser(remoteHandle); + AV15Pgmname = "EventDriven.CosmosDB.HandleCosmosDBEvent"; + /* GeneXus formulas. */ + AV15Pgmname = "EventDriven.Queue.CosmosDB.HandleCosmosDBEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private int AV16GXV1; + private String AV15Pgmname; + private boolean returnInSub; + private com.unittest.eventdriven.SdtUser AV11UserSDT; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1; + private GXBaseCollection AV12OutMessages; + private com.genexus.genexusserverlessapi.SdtEventMessages AV8EventMessages; + private com.genexus.genexusserverlessapi.SdtEventMessage AV10EventMessage; + private com.genexus.genexusserverlessapi.SdtEventMessagesList AV17EventMessagesList; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse AV9EventMessageResponse; + private String AV8EventMessage ; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgrid/handleeventgridazure.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgrid/handleeventgridazure.java new file mode 100644 index 000000000..d93e5c9a7 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgrid/handleeventgridazure.java @@ -0,0 +1,64 @@ +package com.unittest.eventdriven.eventgrid; + +import com.genexus.GXProcedure; +import com.genexus.GXutil; +import com.genexus.ModelContext; +import com.genexus.genexusserverlessapi.SdtEventMessageResponse; + +public final class handleeventgridazure extends GXProcedure { + public handleeventgridazure(int remoteHandle) { + super(remoteHandle, new ModelContext(handleeventgridazure.class), ""); + } + + public handleeventgridazure(int remoteHandle, ModelContext context) { + super(remoteHandle, context, ""); + } + + + public void execute(String aP0, SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(String aP0, SdtEventMessageResponse[] aP1) { + handleeventgridazure.this.AV13RAWMessage = aP0; + handleeventgridazure.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Event Grid - Event received"); + System.out.println("Raw message: " + AV13RAWMessage); + System.out.println("END Event Grid - Event received"); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure((GXutil.len(AV13RAWMessage) == 0)); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handleeventgridazure.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new SdtEventMessageResponse(remoteHandle, context); + AV16Pgmname = ""; + AV16Pgmname = "EventDriven.ServiceBus.HandleEventGridAzureEvent"; + /* GeneXus formulas. */ + AV16Pgmname = "EventDriven.ServiceBus.HandleEventGridAzureEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private String AV13RAWMessage; + private String AV16Pgmname; + private SdtEventMessageResponse[] aP1; + private SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgridcloud/handleeventgridcloudazure.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgridcloud/handleeventgridcloudazure.java new file mode 100644 index 000000000..67ee10159 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/eventgridcloud/handleeventgridcloudazure.java @@ -0,0 +1,94 @@ +package com.unittest.eventdriven.eventgridcloud; + +import com.genexus.GXBaseCollection; +import com.genexus.GXProcedure; +import com.genexus.ModelContext; +import com.genexus.SdtMessages_Message; + +public final class handleeventgridcloudazure extends GXProcedure { + public handleeventgridcloudazure(int remoteHandle) { + super(remoteHandle, new ModelContext(handleeventgridcloudazure.class), ""); + } + + public handleeventgridcloudazure(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, ""); + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.SdtEventMessageResponse executeUdp(com.genexus.genexusserverlessapi.SdtEventMessages aP0) { + handleeventgridcloudazure.this.aP1 = new com.genexus.genexusserverlessapi.SdtEventMessageResponse[]{new com.genexus.genexusserverlessapi.SdtEventMessageResponse()}; + execute_int(aP0, aP1); + return aP1[0]; + } + + public void execute(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + handleeventgridcloudazure.this.AV8EventMessages = aP0; + handleeventgridcloudazure.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Event Grid - CloudEvent received"); + + AV16GXV1 = 1; + while (AV16GXV1 <= AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().size()) { + AV10EventMessage = (com.genexus.genexusserverlessapi.SdtEventMessage) ((com.genexus.genexusserverlessapi.SdtEventMessage) AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().elementAt(-1 + AV16GXV1)); + System.out.println("MessageData: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata()); + System.out.println("MessageId: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessageid()); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata() == ""); + if (AV9EventMessageResponse.getgxTv_SdtEventMessageResponse_Handlefailure()) { + System.out.println("EventMessageData could not be parsed."); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Errormessage(AV12OutMessages.toJSonString(false)); + returnInSub = true; + cleanup(); + if (true) return; + } + AV16GXV1 = (int) (AV16GXV1 + 1); + } + System.out.println("END Event Grid - CloudEvent received"); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handleeventgridcloudazure.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new com.genexus.genexusserverlessapi.SdtEventMessageResponse(remoteHandle, context); + AV15Pgmname = ""; + AV10EventMessage = new com.genexus.genexusserverlessapi.SdtEventMessage(remoteHandle, context); + AV12OutMessages = new GXBaseCollection(SdtMessages_Message.class, "Message", "GeneXus", remoteHandle); + + AV15Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent2"; + /* GeneXus formulas. */ + AV15Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent2"; + Gx_err = (short) (0); + } + + private short Gx_err; + private int AV16GXV1; + private String AV15Pgmname; + private boolean returnInSub; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1; + private GXBaseCollection AV12OutMessages; + private com.genexus.genexusserverlessapi.SdtEventMessages AV8EventMessages; + private com.genexus.genexusserverlessapi.SdtEventMessage AV10EventMessage; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent.java new file mode 100644 index 000000000..0d38e2201 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent.java @@ -0,0 +1,64 @@ +package com.unittest.eventdriven.queue; + +import com.genexus.GXProcedure; +import com.genexus.GXutil; +import com.genexus.ModelContext; +import com.genexus.genexusserverlessapi.SdtEventMessageResponse; + +public final class handlequeueazureevent extends GXProcedure { + public handlequeueazureevent(int remoteHandle) { + super(remoteHandle, new ModelContext(handlequeueazureevent.class), ""); + } + + public handlequeueazureevent(int remoteHandle, ModelContext context) { + super(remoteHandle, context, ""); + } + + + public void execute(String aP0, SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(String aP0, SdtEventMessageResponse[] aP1) { + handlequeueazureevent.this.AV13RAWMessage = aP0; + handlequeueazureevent.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Queue Event received"); + System.out.println("Raw message: " +AV13RAWMessage); + System.out.println("END Queue Event received"); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(!AV13RAWMessage.startsWith("Test message")); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handlequeueazureevent.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new SdtEventMessageResponse(remoteHandle, context); + AV16Pgmname = ""; + AV16Pgmname = "EventDriven.Queue.HandleQueueAzureEvent"; + /* GeneXus formulas. */ + AV16Pgmname = "EventDriven.Queue.HandleQueueAzureEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private String AV13RAWMessage; + private String AV16Pgmname; + private SdtEventMessageResponse[] aP1; + private SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent2.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent2.java new file mode 100644 index 000000000..6db1aac24 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/queue/handlequeueazureevent2.java @@ -0,0 +1,97 @@ +package com.unittest.eventdriven.queue; + +import com.genexus.GXBaseCollection; +import com.genexus.GXProcedure; +import com.genexus.ModelContext; +import com.genexus.SdtMessages_Message; + +public final class handlequeueazureevent2 extends GXProcedure { + public handlequeueazureevent2(int remoteHandle) { + super(remoteHandle, new ModelContext(handlequeueazureevent2.class), ""); + } + + public handlequeueazureevent2(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, ""); + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.SdtEventMessageResponse executeUdp(com.genexus.genexusserverlessapi.SdtEventMessages aP0) { + handlequeueazureevent2.this.aP1 = new com.genexus.genexusserverlessapi.SdtEventMessageResponse[]{new com.genexus.genexusserverlessapi.SdtEventMessageResponse()}; + execute_int(aP0, aP1); + return aP1[0]; + } + + public void execute(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + handlequeueazureevent2.this.AV8EventMessages = aP0; + handlequeueazureevent2.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Queue Event received"); + System.out.println(AV8EventMessages.toJSonString(false, true)); + + AV16GXV1 = 1; + while (AV16GXV1 <= AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().size()) { + AV10EventMessage = (com.genexus.genexusserverlessapi.SdtEventMessage) ((com.genexus.genexusserverlessapi.SdtEventMessage) AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().elementAt(-1 + AV16GXV1)); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(!AV11UserSDT.fromJSonString(AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata(), AV12OutMessages)); + if (AV9EventMessageResponse.getgxTv_SdtEventMessageResponse_Handlefailure()) { + System.out.println("EventMessageData could not be parsed: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata()); + System.out.println(AV12OutMessages.toJSonString(false)); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Errormessage(AV12OutMessages.toJSonString(false)); + returnInSub = true; + cleanup(); + if (true) return; + } + System.out.println("UserSDT Processed OK: " + AV11UserSDT.toJSonString(false, true)); + ; + AV16GXV1 = (int) (AV16GXV1 + 1); + } + System.out.println("END Queue Event received"); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handlequeueazureevent2.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new com.genexus.genexusserverlessapi.SdtEventMessageResponse(remoteHandle, context); + AV15Pgmname = ""; + AV10EventMessage = new com.genexus.genexusserverlessapi.SdtEventMessage(remoteHandle, context); + AV12OutMessages = new GXBaseCollection(SdtMessages_Message.class, "Message", "GeneXus", remoteHandle); + AV11UserSDT = new com.unittest.eventdriven.SdtUser(remoteHandle); + AV15Pgmname = "EventDriven.Queue.HandleSimpleUserQueueEvent"; + /* GeneXus formulas. */ + AV15Pgmname = "EventDriven.Queue.HandleSimpleUserQueueEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private int AV16GXV1; + private String AV15Pgmname; + private boolean returnInSub; + private com.unittest.eventdriven.SdtUser AV11UserSDT; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1; + private GXBaseCollection AV12OutMessages; + private com.genexus.genexusserverlessapi.SdtEventMessages AV8EventMessages; + private com.genexus.genexusserverlessapi.SdtEventMessage AV10EventMessage; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java new file mode 100644 index 000000000..500cf445a --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java @@ -0,0 +1,64 @@ +package com.unittest.eventdriven.servicebus; + +import com.genexus.GXProcedure; +import com.genexus.GXutil; +import com.genexus.ModelContext; +import com.genexus.genexusserverlessapi.SdtEventMessageResponse; + +public final class handlesbqueueazureevent extends GXProcedure { + public handlesbqueueazureevent(int remoteHandle) { + super(remoteHandle, new ModelContext(handlesbqueueazureevent.class), ""); + } + + public handlesbqueueazureevent(int remoteHandle, ModelContext context) { + super(remoteHandle, context, ""); + } + + + public void execute(String aP0, SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(String aP0, SdtEventMessageResponse[] aP1) { + handlesbqueueazureevent.this.AV13RAWMessage = aP0; + handlesbqueueazureevent.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Service Bus Event received"); + System.out.println("Raw message: " +AV13RAWMessage); + System.out.println("END Service Bus Event received"); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(false); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handlesbqueueazureevent.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new SdtEventMessageResponse(remoteHandle, context); + AV16Pgmname = ""; + AV16Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent"; + /* GeneXus formulas. */ + AV16Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private String AV13RAWMessage; + private String AV16Pgmname; + private SdtEventMessageResponse[] aP1; + private SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java new file mode 100644 index 000000000..8b9348fb6 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java @@ -0,0 +1,94 @@ +package com.unittest.eventdriven.servicebus; + +import com.genexus.GXBaseCollection; +import com.genexus.GXProcedure; +import com.genexus.ModelContext; +import com.genexus.SdtMessages_Message; + +public final class handlesbqueueazureevent2 extends GXProcedure { + public handlesbqueueazureevent2(int remoteHandle) { + super(remoteHandle, new ModelContext(handlesbqueueazureevent2.class), ""); + } + + public handlesbqueueazureevent2(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, ""); + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.SdtEventMessageResponse executeUdp(com.genexus.genexusserverlessapi.SdtEventMessages aP0) { + handlesbqueueazureevent2.this.aP1 = new com.genexus.genexusserverlessapi.SdtEventMessageResponse[]{new com.genexus.genexusserverlessapi.SdtEventMessageResponse()}; + execute_int(aP0, aP1); + return aP1[0]; + } + + public void execute(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(com.genexus.genexusserverlessapi.SdtEventMessages aP0, + com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1) { + handlesbqueueazureevent2.this.AV8EventMessages = aP0; + handlesbqueueazureevent2.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Service Bus Event received"); + + AV16GXV1 = 1; + while (AV16GXV1 <= AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().size()) { + AV10EventMessage = (com.genexus.genexusserverlessapi.SdtEventMessage) ((com.genexus.genexusserverlessapi.SdtEventMessage) AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().elementAt(-1 + AV16GXV1)); + System.out.println("MessageData: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata()); + System.out.println("MessageId: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessageid()); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata() == ""); + if (AV9EventMessageResponse.getgxTv_SdtEventMessageResponse_Handlefailure()) { + System.out.println("EventMessageData could not be parsed."); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Errormessage(AV12OutMessages.toJSonString(false)); + returnInSub = true; + cleanup(); + if (true) return; + } + AV16GXV1 = (int) (AV16GXV1 + 1); + } + System.out.println("END Service Bus Event received"); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handlesbqueueazureevent2.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new com.genexus.genexusserverlessapi.SdtEventMessageResponse(remoteHandle, context); + AV15Pgmname = ""; + AV10EventMessage = new com.genexus.genexusserverlessapi.SdtEventMessage(remoteHandle, context); + AV12OutMessages = new GXBaseCollection(SdtMessages_Message.class, "Message", "GeneXus", remoteHandle); + + AV15Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent2"; + /* GeneXus formulas. */ + AV15Pgmname = "EventDriven.ServiceBus.HandleSBQueueAzureEvent2"; + Gx_err = (short) (0); + } + + private short Gx_err; + private int AV16GXV1; + private String AV15Pgmname; + private boolean returnInSub; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse[] aP1; + private GXBaseCollection AV12OutMessages; + private com.genexus.genexusserverlessapi.SdtEventMessages AV8EventMessages; + private com.genexus.genexusserverlessapi.SdtEventMessage AV10EventMessage; + private com.genexus.genexusserverlessapi.SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/timer/handletimerazureevent.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/timer/handletimerazureevent.java new file mode 100644 index 000000000..55ca9aca5 --- /dev/null +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/timer/handletimerazureevent.java @@ -0,0 +1,64 @@ +package com.unittest.eventdriven.timer; + +import com.genexus.GXProcedure; +import com.genexus.GXutil; +import com.genexus.ModelContext; +import com.genexus.genexusserverlessapi.SdtEventMessageResponse; + +public final class handletimerazureevent extends GXProcedure { + public handletimerazureevent(int remoteHandle) { + super(remoteHandle, new ModelContext(handletimerazureevent.class), ""); + } + + public handletimerazureevent(int remoteHandle, ModelContext context) { + super(remoteHandle, context, ""); + } + + + public void execute(String aP0, SdtEventMessageResponse[] aP1) { + execute_int(aP0, aP1); + } + + private void execute_int(String aP0, SdtEventMessageResponse[] aP1) { + handletimerazureevent.this.AV13RAWMessage = aP0; + handletimerazureevent.this.aP1 = aP1; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + protected void privateExecute() { + System.out.println("START Timer Event received"); + System.out.println("Raw message: " + AV13RAWMessage); + System.out.println("END Timer Event received"); + AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(false); + cleanup(); + } + + protected void cleanup() { + this.aP1[0] = handletimerazureevent.this.AV9EventMessageResponse; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors() { + } + + /* Aggregate/select formulas */ + public void initialize() { + AV9EventMessageResponse = new SdtEventMessageResponse(remoteHandle, context); + AV16Pgmname = ""; + AV16Pgmname = "EventDriven.Timer.HandleTimerAzureEvent"; + /* GeneXus formulas. */ + AV16Pgmname = "EventDriven.Timer.HandleTimerAzureEvent"; + Gx_err = (short) (0); + } + + private short Gx_err; + private String AV13RAWMessage; + private String AV16Pgmname; + private SdtEventMessageResponse[] aP1; + private SdtEventMessageResponse AV9EventMessageResponse; +} + diff --git a/gxazureserverless/src/test/java/log4j2.xml b/gxazureserverless/src/test/java/log4j2.xml new file mode 100644 index 000000000..2ff3a3346 --- /dev/null +++ b/gxazureserverless/src/test/java/log4j2.xml @@ -0,0 +1,39 @@ + + + + ${main:0:-.}${sys:file.separator}logs${sys:file.separator} + + ${logBaseDir}client.log + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gxserverlesscommon/pom.xml b/gxserverlesscommon/pom.xml index 4b236d0b8..df54f6449 100644 --- a/gxserverlesscommon/pom.xml +++ b/gxserverlesscommon/pom.xml @@ -13,11 +13,6 @@ gxserverlesscommon GeneXus Serverless Common - - 1.8 - 1.8 - - ${project.groupId} @@ -36,12 +31,17 @@ jackson-databind ${jackson.version} - org.glassfish.jersey.core jersey-server ${jersey.javax.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.17.2 + compile + diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java index 0c8671e3a..445e6e112 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -20,12 +20,16 @@ public class GXProcedureExecutor { protected Class entryPointClass; - public int methodSignatureIdx = -1; + protected int methodSignatureIdx = -1; protected static final String MESSAGE_COLLECTION_INPUT_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessages"; protected static final String MESSAGE_OUTPUT_COLLECTION_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessageResponse"; protected static final String MESSAGE_COLLECTION_LIST_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessagesList"; + public int getMethodSignatureIdx() { + return methodSignatureIdx; + } + public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundException, NotImplementedException { entryPointClass = entryPointClassParms; Class[][] supportedMethodSignatures = new Class[6][]; diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java index 035a62b3a..5270988d9 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java @@ -1,6 +1,7 @@ package com.genexus.cloud.serverless; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.genexus.cloud.serverless.model.EventMessage; import com.genexus.cloud.serverless.model.EventMessageProperty; import com.genexus.diagnostics.core.ILogger; @@ -13,6 +14,7 @@ public class Helper { public static String toJSONString(Object dtoObject) { try { ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); return mapper.writeValueAsString(dtoObject); } catch (Exception e) { diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java index 90b7a46b5..656454acd 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -6,15 +6,17 @@ import com.genexus.cloud.serverless.model.EventMessages; import com.genexus.cloud.serverless.model.EventMessagesList; import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; + import com.genexus.specific.java.Connect; -import com.genexus.specific.java.LogManager; + import com.genexus.util.IniFile; public abstract class ServerlessBaseEventHandler { protected T functionConfiguration; protected static ILogger logger = null; - protected static Class entryPointClass = null; + protected Class entryPointClass = null; protected static GXProcedureExecutor executor; private static final String GX_APPLICATION_CLASS = "GXcfg"; @@ -36,7 +38,8 @@ public ServerlessBaseEventHandler(String functionName, String className) throws initialize(); } private void initialize() throws Exception { - logger = LogManager.initialize(".", ServerlessBaseEventHandler.class); + //logger = LogManager.getLogger(ServerlessBaseEventHandler.class); + logger = com.genexus.specific.java.LogManager.initialize(".", ServerlessBaseEventHandler.class); Connect.init(); IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java new file mode 100644 index 000000000..f778cf525 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java @@ -0,0 +1,95 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.GxUserType; +import com.genexus.ModelContext; + +import java.util.HashMap; + +public final class SdtEventCustomPayload_CustomPayloadItem extends GxUserType { + public SdtEventCustomPayload_CustomPayloadItem() { + this(new ModelContext(SdtEventCustomPayload_CustomPayloadItem.class)); + } + + public SdtEventCustomPayload_CustomPayloadItem(ModelContext context) { + super(context, "SdtEventCustomPayload_CustomPayloadItem"); + } + + public SdtEventCustomPayload_CustomPayloadItem(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, "SdtEventCustomPayload_CustomPayloadItem"); + } + + public SdtEventCustomPayload_CustomPayloadItem(StructSdtEventCustomPayload_CustomPayloadItem struct) { + this(); + setStruct(struct); + } + + private static HashMap mapper = new HashMap(); + + static { + } + + public String getJsonMap(String value) { + return (String) mapper.get(value); + } + + public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid() { + return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; + } + + public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(String value) { + gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; + } + + public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue() { + return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; + } + + public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(String value) { + gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; + } + + public void initialize(int remoteHandle) { + initialize(); + } + + public void initialize() { + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; + gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (1); + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; + sTagName = ""; + } + + public byte isNull() { + return gxTv_SdtEventCustomPayload_CustomPayloadItem_N; + } + + public com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem Clone() { + return (com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem) (clone()); + } + + public void setStruct(StructSdtEventCustomPayload_CustomPayloadItem struct) { + setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(struct.getPropertyid()); + setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(struct.getPropertyvalue()); + } + + @SuppressWarnings("unchecked") + public StructSdtEventCustomPayload_CustomPayloadItem getStruct() { + StructSdtEventCustomPayload_CustomPayloadItem struct = new StructSdtEventCustomPayload_CustomPayloadItem(); + struct.setPropertyid(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid()); + struct.setPropertyvalue(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue()); + return struct; + } + + protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; + protected short readOk; + protected short nOutParmCount; + protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; + protected String sTagName; + protected boolean readElement; + protected boolean formatError; + protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java new file mode 100644 index 000000000..c56599c0c --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java @@ -0,0 +1,192 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.GXBaseCollection; +import com.genexus.GXutil; +import com.genexus.GxUserType; +import com.genexus.ModelContext; + +import java.util.Date; +import java.util.HashMap; +import java.util.Vector; + +public final class SdtEventMessage extends GxUserType { + public SdtEventMessage() { + this(new ModelContext(SdtEventMessage.class)); + } + + public SdtEventMessage(ModelContext context) { + super(context, "SdtEventMessage"); + } + + public SdtEventMessage(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, "SdtEventMessage"); + } + + public SdtEventMessage(StructSdtEventMessage struct) { + this(); + setStruct(struct); + } + + private static HashMap mapper = new HashMap(); + + public String getJsonMap(String value) { + return (String) mapper.get(value); + } + + public String getgxTv_SdtEventMessage_Eventmessageid() { + return gxTv_SdtEventMessage_Eventmessageid; + } + + public void setgxTv_SdtEventMessage_Eventmessageid(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessageid = value; + } + + public Date getgxTv_SdtEventMessage_Eventmessagedate() { + return gxTv_SdtEventMessage_Eventmessagedate; + } + + public void setgxTv_SdtEventMessage_Eventmessagedate(Date value) { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagedate = value; + } + + public String getgxTv_SdtEventMessage_Eventmessagesourcetype() { + return gxTv_SdtEventMessage_Eventmessagesourcetype; + } + + public void setgxTv_SdtEventMessage_Eventmessagesourcetype(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagesourcetype = value; + } + + public String getgxTv_SdtEventMessage_Eventmessagedata() { + return gxTv_SdtEventMessage_Eventmessagedata; + } + + public void setgxTv_SdtEventMessage_Eventmessagedata(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagedata = value; + } + + public String getgxTv_SdtEventMessage_Eventmessageversion() { + return gxTv_SdtEventMessage_Eventmessageversion; + } + + public void setgxTv_SdtEventMessage_Eventmessageversion(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessageversion = value; + } + + public GXBaseCollection getgxTv_SdtEventMessage_Eventmessagecustompayload() { + if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { + gxTv_SdtEventMessage_Eventmessagecustompayload = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); + gxTv_SdtEventMessage_N = (byte) (0); + return gxTv_SdtEventMessage_Eventmessagecustompayload; + } + + public void setgxTv_SdtEventMessage_Eventmessagecustompayload(GXBaseCollection value) { + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagecustompayload = value; + } + + public void setgxTv_SdtEventMessage_Eventmessagecustompayload_SetNull() { + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); + gxTv_SdtEventMessage_Eventmessagecustompayload = null; + } + + public boolean getgxTv_SdtEventMessage_Eventmessagecustompayload_IsNull() { + if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { + return true; + } + return false; + } + + public byte getgxTv_SdtEventMessage_Eventmessagecustompayload_N() { + return gxTv_SdtEventMessage_Eventmessagecustompayload_N; + } + + public void initialize(int remoteHandle) { + initialize(); + } + + public void initialize() { + gxTv_SdtEventMessage_Eventmessageid = ""; + gxTv_SdtEventMessage_N = (byte) (1); + gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime(GXutil.nullDate()); + gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); + gxTv_SdtEventMessage_Eventmessagesourcetype = ""; + gxTv_SdtEventMessage_Eventmessagedata = ""; + gxTv_SdtEventMessage_Eventmessageversion = ""; + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); + sTagName = ""; + sDateCnv = ""; + sNumToPad = ""; + datetime_STZ = GXutil.resetTime(GXutil.nullDate()); + } + + public byte isNull() { + return gxTv_SdtEventMessage_N; + } + + public com.genexus.genexusserverlessapi.SdtEventMessage Clone() { + return (com.genexus.genexusserverlessapi.SdtEventMessage) (clone()); + } + + public void setStruct(StructSdtEventMessage struct) { + setgxTv_SdtEventMessage_Eventmessageid(struct.getEventmessageid()); + if (struct.gxTv_SdtEventMessage_Eventmessagedate_N == 0) { + setgxTv_SdtEventMessage_Eventmessagedate(struct.getEventmessagedate()); + } + setgxTv_SdtEventMessage_Eventmessagesourcetype(struct.getEventmessagesourcetype()); + setgxTv_SdtEventMessage_Eventmessagedata(struct.getEventmessagedata()); + setgxTv_SdtEventMessage_Eventmessageversion(struct.getEventmessageversion()); + GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 = struct.getEventmessagecustompayload(); + if (gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 != null) { + for (int i = 0; i < gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.size(); i++) { + gxTv_SdtEventMessage_Eventmessagecustompayload_aux.add(new com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem(gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessage_Eventmessagecustompayload(gxTv_SdtEventMessage_Eventmessagecustompayload_aux); + } + + @SuppressWarnings("unchecked") + public StructSdtEventMessage getStruct() { + StructSdtEventMessage struct = new StructSdtEventMessage(); + struct.setEventmessageid(getgxTv_SdtEventMessage_Eventmessageid()); + if (gxTv_SdtEventMessage_Eventmessagedate_N == 0) { + struct.setEventmessagedate(getgxTv_SdtEventMessage_Eventmessagedate()); + } + struct.setEventmessagesourcetype(getgxTv_SdtEventMessage_Eventmessagesourcetype()); + struct.setEventmessagedata(getgxTv_SdtEventMessage_Eventmessagedata()); + struct.setEventmessageversion(getgxTv_SdtEventMessage_Eventmessageversion()); + struct.setEventmessagecustompayload(getgxTv_SdtEventMessage_Eventmessagecustompayload().getStruct()); + return struct; + } + + protected byte gxTv_SdtEventMessage_N; + protected byte gxTv_SdtEventMessage_Eventmessagedate_N; + protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; + protected short readOk; + protected short nOutParmCount; + protected String sTagName; + protected String sDateCnv; + protected String sNumToPad; + protected Date gxTv_SdtEventMessage_Eventmessagedate; + protected Date datetime_STZ; + protected boolean readElement; + protected boolean formatError; + protected String gxTv_SdtEventMessage_Eventmessagedata; + protected String gxTv_SdtEventMessage_Eventmessageid; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype; + protected String gxTv_SdtEventMessage_Eventmessageversion; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload = null; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java new file mode 100644 index 000000000..7e5acc0dd --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java @@ -0,0 +1,226 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.GXutil; +import com.genexus.GxUserType; +import com.genexus.ModelContext; +import com.genexus.xml.XMLReader; +import com.genexus.xml.XMLWriter; + +import java.util.HashMap; + +public final class SdtEventMessageResponse extends GxUserType +{ + public SdtEventMessageResponse( ) + { + this( new ModelContext(SdtEventMessageResponse.class)); + } + + public SdtEventMessageResponse( ModelContext context ) + { + super( context, "SdtEventMessageResponse"); + } + + public SdtEventMessageResponse( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessageResponse"); + } + + public SdtEventMessageResponse( StructSdtEventMessageResponse struct ) + { + this(); + setStruct(struct); + } + + private static HashMap mapper = new HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "HandleFailure") ) + { + gxTv_SdtEventMessageResponse_Handlefailure = (boolean)((((GXutil.strcmp(oReader.getValue(), "true")==0)||(GXutil.strcmp(oReader.getValue(), "1")==0) ? 1 : 0)==0)?false:true) ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "ErrorMessage") ) + { + gxTv_SdtEventMessageResponse_Errormessage = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessageResponse" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + oWriter.writeElement("HandleFailure", GXutil.booltostr( gxTv_SdtEventMessageResponse_Handlefailure)); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeElement("ErrorMessage", gxTv_SdtEventMessageResponse_Errormessage); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + AddObjectProperty("HandleFailure", gxTv_SdtEventMessageResponse_Handlefailure, false, false); + AddObjectProperty("ErrorMessage", gxTv_SdtEventMessageResponse_Errormessage, false, false); + } + + public boolean getgxTv_SdtEventMessageResponse_Handlefailure( ) + { + return gxTv_SdtEventMessageResponse_Handlefailure ; + } + + public void setgxTv_SdtEventMessageResponse_Handlefailure( boolean value ) + { + gxTv_SdtEventMessageResponse_N = (byte)(0) ; + gxTv_SdtEventMessageResponse_Handlefailure = value ; + } + + public String getgxTv_SdtEventMessageResponse_Errormessage( ) + { + return gxTv_SdtEventMessageResponse_Errormessage ; + } + + public void setgxTv_SdtEventMessageResponse_Errormessage( String value ) + { + gxTv_SdtEventMessageResponse_N = (byte)(0) ; + gxTv_SdtEventMessageResponse_Errormessage = value ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessageResponse_N = (byte)(1) ; + gxTv_SdtEventMessageResponse_Errormessage = "" ; + sTagName = "" ; + } + + public byte isNull( ) + { + return gxTv_SdtEventMessageResponse_N ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessageResponse Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessageResponse)(clone()) ; + } + + public void setStruct( StructSdtEventMessageResponse struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessageResponse_Handlefailure(struct.getHandlefailure()); + setgxTv_SdtEventMessageResponse_Errormessage(struct.getErrormessage()); + } + } + + @SuppressWarnings("unchecked") + public StructSdtEventMessageResponse getStruct( ) + { + StructSdtEventMessageResponse struct = new StructSdtEventMessageResponse (); + struct.setHandlefailure(getgxTv_SdtEventMessageResponse_Handlefailure()); + struct.setErrormessage(getgxTv_SdtEventMessageResponse_Errormessage()); + return struct ; + } + + protected byte gxTv_SdtEventMessageResponse_N ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected boolean gxTv_SdtEventMessageResponse_Handlefailure ; + protected boolean readElement ; + protected boolean formatError ; + protected String gxTv_SdtEventMessageResponse_Errormessage ; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java new file mode 100644 index 000000000..add64ce70 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java @@ -0,0 +1,115 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.GXBaseCollection; +import com.genexus.GxUserType; +import com.genexus.ModelContext; + +import java.util.HashMap; +import java.util.Vector; + +public final class SdtEventMessages extends GxUserType { + public SdtEventMessages() { + this(new ModelContext(SdtEventMessages.class)); + } + + public SdtEventMessages(ModelContext context) { + super(context, "SdtEventMessages"); + } + + public SdtEventMessages(int remoteHandle, + ModelContext context) { + super(remoteHandle, context, "SdtEventMessages"); + } + + public SdtEventMessages(StructSdtEventMessages struct) { + this(); + setStruct(struct); + } + + private static HashMap mapper = new HashMap(); + + static { + } + + public String getJsonMap(String value) { + return (String) mapper.get(value); + } + + public GXBaseCollection getgxTv_SdtEventMessages_Eventmessage() { + if (gxTv_SdtEventMessages_Eventmessage == null) { + gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); + gxTv_SdtEventMessages_N = (byte) (0); + return gxTv_SdtEventMessages_Eventmessage; + } + + public void setgxTv_SdtEventMessages_Eventmessage(GXBaseCollection value) { + gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); + gxTv_SdtEventMessages_N = (byte) (0); + gxTv_SdtEventMessages_Eventmessage = value; + } + + public void setgxTv_SdtEventMessages_Eventmessage_SetNull() { + gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); + gxTv_SdtEventMessages_Eventmessage = null; + } + + public boolean getgxTv_SdtEventMessages_Eventmessage_IsNull() { + if (gxTv_SdtEventMessages_Eventmessage == null) { + return true; + } + return false; + } + + public byte getgxTv_SdtEventMessages_Eventmessage_N() { + return gxTv_SdtEventMessages_Eventmessage_N; + } + + public void initialize(int remoteHandle) { + initialize(); + } + + public void initialize() { + gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); + gxTv_SdtEventMessages_N = (byte) (1); + sTagName = ""; + } + + public byte isNull() { + return gxTv_SdtEventMessages_N; + } + + public com.genexus.genexusserverlessapi.SdtEventMessages Clone() { + return (com.genexus.genexusserverlessapi.SdtEventMessages) (clone()); + } + + public void setStruct(com.genexus.genexusserverlessapi.StructSdtEventMessages struct) { + GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessages_Eventmessage_aux1 = struct.getEventmessage(); + if (gxTv_SdtEventMessages_Eventmessage_aux1 != null) { + for (int i = 0; i < gxTv_SdtEventMessages_Eventmessage_aux1.size(); i++) { + gxTv_SdtEventMessages_Eventmessage_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessage(gxTv_SdtEventMessages_Eventmessage_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessages_Eventmessage(gxTv_SdtEventMessages_Eventmessage_aux); + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessages getStruct() { + com.genexus.genexusserverlessapi.StructSdtEventMessages struct = new com.genexus.genexusserverlessapi.StructSdtEventMessages(); + struct.setEventmessage(getgxTv_SdtEventMessages_Eventmessage().getStruct()); + return struct; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N; + protected byte gxTv_SdtEventMessages_N; + protected short readOk; + protected short nOutParmCount; + protected String sTagName; + protected boolean readElement; + protected boolean formatError; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage = null; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java new file mode 100644 index 000000000..6da6f841e --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java @@ -0,0 +1,211 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.GXSimpleCollection; +import com.genexus.GXutil; +import com.genexus.Globals; +import com.genexus.GxUserType; +import com.genexus.ModelContext; +import com.genexus.xml.XMLReader; +import com.genexus.xml.XMLWriter; +import java.util.HashMap; + +public final class SdtEventMessagesList extends GxUserType { + private static HashMap mapper = new HashMap(); + protected byte gxTv_SdtEventMessagesList_Items_N; + protected byte sdtIsNull; + protected short readOk; + protected short nOutParmCount; + protected String sTagName; + protected boolean readElement; + protected boolean formatError; + protected GXSimpleCollection gxTv_SdtEventMessagesList_Items; + + public SdtEventMessagesList() { + this(new ModelContext(SdtEventMessagesList.class)); + } + + public SdtEventMessagesList(ModelContext context) { + super(context, "SdtEventMessagesList"); + this.gxTv_SdtEventMessagesList_Items = null; + } + + public SdtEventMessagesList(int remoteHandle, ModelContext context) { + super(remoteHandle, context, "SdtEventMessagesList"); + this.gxTv_SdtEventMessagesList_Items = null; + } + + public SdtEventMessagesList(StructSdtEventMessagesList struct) { + this(); + this.setStruct(struct); + } + + public String getJsonMap(String value) { + return (String)mapper.get(value); + } + + public short readxml(XMLReader oReader, String sName) { + short GXSoapError = 1; + this.formatError = false; + this.sTagName = oReader.getName(); + if (oReader.getIsSimple() == 0) { + GXSoapError = oReader.read(); + this.nOutParmCount = 0; + + while(true) { + do { + if (GXutil.strcmp(oReader.getName(), this.sTagName) == 0 && oReader.getNodeType() != 1 || GXSoapError <= 0) { + return GXSoapError; + } + + this.readOk = 0; + this.readElement = false; + if (GXutil.strcmp2(oReader.getLocalName(), "items")) { + if (this.gxTv_SdtEventMessagesList_Items == null) { + this.gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + + if (oReader.getIsSimple() == 0) { + GXSoapError = this.gxTv_SdtEventMessagesList_Items.readxmlcollection(oReader, "items", "Item"); + } + + this.readElement = true; + if (GXSoapError > 0) { + this.readOk = 1; + } + + if (GXutil.strcmp2(oReader.getLocalName(), "items")) { + GXSoapError = oReader.read(); + } + } + + if (!this.readElement) { + this.readOk = 1; + GXSoapError = oReader.read(); + } + + ++this.nOutParmCount; + } while(this.readOk != 0 && !this.formatError); + + StringBuilder var10000 = new StringBuilder(); + Globals var10002 = this.context.globals; + var10002.sSOAPErrMsg = var10000.append(var10002.sSOAPErrMsg).append("Error reading ").append(this.sTagName).append(GXutil.newLine()).toString(); + var10000 = new StringBuilder(); + var10002 = this.context.globals; + var10002.sSOAPErrMsg = var10000.append(var10002.sSOAPErrMsg).append("Message: ").append(oReader.readRawXML()).toString(); + GXSoapError = (short)(this.nOutParmCount * -1); + } + } else { + return GXSoapError; + } + } + + public void writexml(XMLWriter oWriter, String sName, String sNameSpace) { + this.writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml(XMLWriter oWriter, String sName, String sNameSpace, boolean sIncludeState) { + if (GXutil.strcmp("", sName) == 0) { + sName = "EventMessagesList"; + } + + if (GXutil.strcmp("", sNameSpace) == 0) { + sNameSpace = "ServerlessAPI"; + } + + oWriter.writeStartElement(sName); + if (GXutil.strcmp(GXutil.left(sNameSpace, 10), "[*:nosend]") != 0) { + oWriter.writeAttribute("xmlns", sNameSpace); + } else { + sNameSpace = GXutil.right(sNameSpace, GXutil.len(sNameSpace) - 10); + } + + if (this.gxTv_SdtEventMessagesList_Items != null) { + String sNameSpace1; + if (GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0) { + sNameSpace1 = "[*:nosend]ServerlessAPI"; + } else { + sNameSpace1 = "ServerlessAPI"; + } + + this.gxTv_SdtEventMessagesList_Items.writexmlcollection(oWriter, "items", sNameSpace1, "Item", sNameSpace1); + } + + oWriter.writeEndElement(); + } + + public void tojson() { + this.tojson(true); + } + + public void tojson(boolean includeState) { + this.tojson(includeState, true); + } + + public void tojson(boolean includeState, boolean includeNonInitialized) { + if (this.gxTv_SdtEventMessagesList_Items != null) { + this.AddObjectProperty("items", this.gxTv_SdtEventMessagesList_Items, false, false); + } + + } + + public GXSimpleCollection getgxTv_SdtEventMessagesList_Items() { + if (this.gxTv_SdtEventMessagesList_Items == null) { + this.gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + + this.gxTv_SdtEventMessagesList_Items_N = 0; + this.sdtIsNull = 0; + return this.gxTv_SdtEventMessagesList_Items; + } + + public void setgxTv_SdtEventMessagesList_Items(GXSimpleCollection value) { + this.gxTv_SdtEventMessagesList_Items_N = 0; + this.sdtIsNull = 0; + this.gxTv_SdtEventMessagesList_Items = value; + } + + public void setgxTv_SdtEventMessagesList_Items_SetNull() { + this.gxTv_SdtEventMessagesList_Items_N = 1; + this.gxTv_SdtEventMessagesList_Items = null; + } + + public boolean getgxTv_SdtEventMessagesList_Items_IsNull() { + return this.gxTv_SdtEventMessagesList_Items == null; + } + + public byte getgxTv_SdtEventMessagesList_Items_N() { + return this.gxTv_SdtEventMessagesList_Items_N; + } + + public void initialize(int remoteHandle) { + this.initialize(); + } + + public void initialize() { + this.gxTv_SdtEventMessagesList_Items_N = 1; + this.sdtIsNull = 1; + this.sTagName = ""; + } + + public byte isNull() { + return this.sdtIsNull; + } + + public SdtEventMessagesList Clone() { + return (SdtEventMessagesList)((SdtEventMessagesList)this.clone()); + } + + public void setStruct(StructSdtEventMessagesList struct) { + if (struct != null) { + this.setgxTv_SdtEventMessagesList_Items(new GXSimpleCollection(String.class, "internal", "", struct.getItems())); + } + + } + + public StructSdtEventMessagesList getStruct() { + StructSdtEventMessagesList struct = new StructSdtEventMessagesList(); + struct.setItems(this.getgxTv_SdtEventMessagesList_Items().getStruct()); + return struct; + } +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java new file mode 100644 index 000000000..54dd9bbb2 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java @@ -0,0 +1,40 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; + +@javax.xml.bind.annotation.XmlType(name = "EventCustomPayload", namespace = "ServerlessAPI") +public final class StructSdtEventCustomPayload implements Cloneable, java.io.Serializable { + public StructSdtEventCustomPayload() { + this(-1, new ModelContext(StructSdtEventCustomPayload.class)); + } + + public StructSdtEventCustomPayload(int remoteHandle, + ModelContext context) { + } + + public StructSdtEventCustomPayload(java.util.Vector value) { + item = value; + } + + public Object clone() { + Object cloned = null; + try { + cloned = super.clone(); + } catch (CloneNotSupportedException e) { + ; + } + return cloned; + } + + @javax.xml.bind.annotation.XmlElement(name = "CustomPayloadItem", namespace = "ServerlessAPI") + public java.util.Vector getItem() { + return item; + } + + public void setItem(java.util.Vector value) { + item = value; + } + + protected java.util.Vector item = new java.util.Vector<>(); +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java new file mode 100644 index 000000000..0eb592721 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java @@ -0,0 +1,48 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; + +public final class StructSdtEventCustomPayload_CustomPayloadItem implements Cloneable, java.io.Serializable { + public StructSdtEventCustomPayload_CustomPayloadItem() { + this(-1, new ModelContext(StructSdtEventCustomPayload_CustomPayloadItem.class)); + } + + public StructSdtEventCustomPayload_CustomPayloadItem(int remoteHandle, + ModelContext context) { + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; + } + + public Object clone() { + Object cloned = null; + try { + cloned = super.clone(); + } catch (CloneNotSupportedException e) { + ; + } + return cloned; + } + + public String getPropertyid() { + return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; + } + + public void setPropertyid(String value) { + gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; + } + + public String getPropertyvalue() { + return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; + } + + public void setPropertyvalue(String value) { + gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); + gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; + } + + protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; + protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; + protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java new file mode 100644 index 000000000..35b069cfe --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java @@ -0,0 +1,100 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; + +public final class StructSdtEventMessage implements Cloneable, java.io.Serializable { + public StructSdtEventMessage() { + this(-1, new ModelContext(StructSdtEventMessage.class)); + } + + public StructSdtEventMessage(int remoteHandle, + ModelContext context) { + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.set(1, 0, 1, 0, 0, 0); + cal.set(java.util.Calendar.MILLISECOND, 0); + gxTv_SdtEventMessage_Eventmessageid = ""; + gxTv_SdtEventMessage_Eventmessagedate = cal.getTime(); + gxTv_SdtEventMessage_Eventmessagesourcetype = ""; + gxTv_SdtEventMessage_Eventmessagedata = ""; + gxTv_SdtEventMessage_Eventmessageversion = ""; + gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); + } + + public Object clone() { + Object cloned = null; + try { + cloned = super.clone(); + } catch (CloneNotSupportedException e) { + ; + } + return cloned; + } + + public String getEventmessageid() { + return gxTv_SdtEventMessage_Eventmessageid; + } + + public void setEventmessageid(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessageid = value; + } + + public java.util.Date getEventmessagedate() { + return gxTv_SdtEventMessage_Eventmessagedate; + } + + public void setEventmessagedate(java.util.Date value) { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagedate = value; + } + + public String getEventmessagesourcetype() { + return gxTv_SdtEventMessage_Eventmessagesourcetype; + } + + public void setEventmessagesourcetype(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagesourcetype = value; + } + + public String getEventmessagedata() { + return gxTv_SdtEventMessage_Eventmessagedata; + } + + public void setEventmessagedata(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagedata = value; + } + + public String getEventmessageversion() { + return gxTv_SdtEventMessage_Eventmessageversion; + } + + public void setEventmessageversion(String value) { + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessageversion = value; + } + + public java.util.Vector getEventmessagecustompayload() { + return gxTv_SdtEventMessage_Eventmessagecustompayload; + } + + public void setEventmessagecustompayload(java.util.Vector value) { + gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); + gxTv_SdtEventMessage_N = (byte) (0); + gxTv_SdtEventMessage_Eventmessagecustompayload = value; + } + + protected byte gxTv_SdtEventMessage_Eventmessagedate_N; + protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; + protected byte gxTv_SdtEventMessage_N; + protected String gxTv_SdtEventMessage_Eventmessagedata; + protected String gxTv_SdtEventMessage_Eventmessageid; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype; + protected String gxTv_SdtEventMessage_Eventmessageversion; + protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate; + protected java.util.Vector gxTv_SdtEventMessage_Eventmessagecustompayload = null; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java new file mode 100644 index 000000000..ecc385d26 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java @@ -0,0 +1,54 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; + +public final class StructSdtEventMessageResponse implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessageResponse( ) + { + this( -1, new ModelContext( StructSdtEventMessageResponse.class )); + } + + public StructSdtEventMessageResponse( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessageResponse_Errormessage = "" ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public boolean getHandlefailure( ) + { + return gxTv_SdtEventMessageResponse_Handlefailure ; + } + + public void setHandlefailure( boolean value ) + { + gxTv_SdtEventMessageResponse_N = (byte)(0) ; + gxTv_SdtEventMessageResponse_Handlefailure = value ; + } + + public String getErrormessage( ) + { + return gxTv_SdtEventMessageResponse_Errormessage ; + } + + public void setErrormessage( String value ) + { + gxTv_SdtEventMessageResponse_N = (byte)(0) ; + gxTv_SdtEventMessageResponse_Errormessage = value ; + } + + protected byte gxTv_SdtEventMessageResponse_N ; + protected boolean gxTv_SdtEventMessageResponse_Handlefailure ; + protected String gxTv_SdtEventMessageResponse_Errormessage ; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java new file mode 100644 index 000000000..b1d2cc542 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java @@ -0,0 +1,39 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; + +public final class StructSdtEventMessages implements Cloneable, java.io.Serializable { + public StructSdtEventMessages() { + this(-1, new ModelContext(StructSdtEventMessages.class)); + } + + public StructSdtEventMessages(int remoteHandle, + ModelContext context) { + gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); + } + + public Object clone() { + Object cloned = null; + try { + cloned = super.clone(); + } catch (CloneNotSupportedException e) { + ; + } + return cloned; + } + + public java.util.Vector getEventmessage() { + return gxTv_SdtEventMessages_Eventmessage; + } + + public void setEventmessage(java.util.Vector value) { + gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); + gxTv_SdtEventMessages_N = (byte) (0); + gxTv_SdtEventMessages_Eventmessage = value; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N; + protected byte gxTv_SdtEventMessages_N; + protected java.util.Vector gxTv_SdtEventMessages_Eventmessage = null; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java new file mode 100644 index 000000000..c4aceb8d3 --- /dev/null +++ b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java @@ -0,0 +1,41 @@ +package com.genexus.genexusserverlessapi; + +import com.genexus.ModelContext; +import java.io.Serializable; +import java.util.Vector; + +public final class StructSdtEventMessagesList implements Cloneable, Serializable { + protected byte gxTv_SdtEventMessagesList_Items_N; + protected byte sdtIsNull; + protected Vector gxTv_SdtEventMessagesList_Items; + + public StructSdtEventMessagesList() { + this(-1, new ModelContext(StructSdtEventMessagesList.class)); + } + + public StructSdtEventMessagesList(int remoteHandle, ModelContext context) { + this.gxTv_SdtEventMessagesList_Items = null; + this.gxTv_SdtEventMessagesList_Items_N = 1; + } + + public Object clone() { + Object cloned = null; + + try { + cloned = super.clone(); + } catch (CloneNotSupportedException var3) { + } + + return cloned; + } + + public Vector getItems() { + return this.gxTv_SdtEventMessagesList_Items; + } + + public void setItems(Vector value) { + this.gxTv_SdtEventMessagesList_Items_N = 0; + this.sdtIsNull = 0; + this.gxTv_SdtEventMessagesList_Items = value; + } +} From eb83811401526cbd8dfaf6178fb15b975399d631 Mon Sep 17 00:00:00 2001 From: sabrina juarez Date: Fri, 2 Aug 2024 09:27:51 -0300 Subject: [PATCH 07/16] optimize code of blobstorage function --- gxazureserverless/pom.xml | 5 ++- .../handler/AzureBlobStorageHandler.java | 39 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index c7b0309b7..7cbec32aa 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -88,10 +88,11 @@ org.junit.jupiter - junit-jupiter - RELEASE + junit-jupiter-api + 5.10.3 test + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java index 824dc7cf2..b7ef8139f 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java @@ -1,4 +1,5 @@ package com.genexus.cloud.serverless.azure.handler; +import com.genexus.cloud.serverless.Helper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.annotation.*; @@ -9,6 +10,10 @@ import java.util.*; public class AzureBlobStorageHandler extends AzureEventHandler{ + + EventMessages msgs = new EventMessages(); + String rawMessage =""; + public AzureBlobStorageHandler() throws Exception { super(); } @@ -17,28 +22,35 @@ public void run( @BindingName("name") String name, final ExecutionContext context ) throws Exception { + context.getLogger().info("GeneXus Blob Storage trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + setupServerlessMappings(context.getFunctionName()); - EventMessages msgs = new EventMessages(); - EventMessage msg = new EventMessage(); - msg.setMessageId(context.getInvocationId()); - msg.setMessageSourceType(EventMessageSourceType.BLOB); + switch (executor.getMethodSignatureIdx()) { + case 0: - Instant nowUtc = Instant.now(); - msg.setMessageDate(Date.from(nowUtc)); - msg.setMessageData(Base64.getEncoder().encodeToString(content)); + EventMessage msg = new EventMessage(); + msg.setMessageId(context.getInvocationId()); + msg.setMessageSourceType(EventMessageSourceType.BLOB); - List msgAtts = msg.getMessageProperties(); + Instant nowUtc = Instant.now(); + msg.setMessageDate(Date.from(nowUtc)); + msg.setMessageData(Base64.getEncoder().encodeToString(content)); - msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); - msgAtts.add(new EventMessageProperty("name", name)); + List msgAtts = msg.getMessageProperties(); - msgs.add(msg); + msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); + msgAtts.add(new EventMessageProperty("name", name)); - setupServerlessMappings(context.getFunctionName()); + msgs.add(msg); + break; + case 1: + case 2: + rawMessage = Base64.getEncoder().encodeToString(content); + } try { - EventMessageResponse response = dispatchEvent(msgs, Base64.getEncoder().encodeToString(content)); + EventMessageResponse response = dispatchEvent(msgs, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -47,6 +59,5 @@ public void run( logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } - } } From 42a3193510aa49206a967f358bc6b86e3dbfae7c Mon Sep 17 00:00:00 2001 From: sabrina juarez Date: Tue, 6 Aug 2024 13:01:52 -0300 Subject: [PATCH 08/16] Refactor to use common clases from gxserverlesscommon module --- gxawsserverless/pom.xml | 6 + .../cloud/serverless/EventMessage.java | 71 ------------ .../serverless/EventMessageProperty.java | 17 --- .../serverless/EventMessageResponse.java | 28 ----- .../serverless/EventMessageSourceType.java | 8 -- .../cloud/serverless/EventMessages.java | 15 --- .../cloud/serverless/GXProcedureExecutor.java | 108 ------------------ .../com/genexus/cloud/serverless/Helper.java | 1 + .../aws/handler/LambdaBaseEventHandler.java | 5 +- .../aws/handler/LambdaEventBridgeHandler.java | 5 +- .../aws/handler/LambdaSQSHandler.java | 6 +- 11 files changed, 11 insertions(+), 259 deletions(-) delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java diff --git a/gxawsserverless/pom.xml b/gxawsserverless/pom.xml index 621a0df4f..de7fc9888 100644 --- a/gxawsserverless/pom.xml +++ b/gxawsserverless/pom.xml @@ -31,6 +31,12 @@ ${project.version} + + ${project.groupId} + gxserverlesscommon + ${project.version} + + javax.servlet javax.servlet-api diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java deleted file mode 100644 index 86d1ca305..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessage.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.*; - -public class EventMessage { - @JsonProperty("EventMessageId") - private String messageId; - - @JsonProperty("EventMessageDate") - private Date messageDate; - - @JsonProperty("EventMessageSourceType") - private String messageSourceType; - - @JsonProperty("EventMessageData") - private String messageData; - - @JsonProperty("EventMessageVersion") - private String messageVersion = "1.0"; - - @JsonProperty("EventMessageProperties") - private List messageProperties = new ArrayList<>(); - - public String getMessageId() { - return messageId; - } - - public void setMessageId(String messageId) { - this.messageId = messageId; - } - - public Date getMessageDate() { - return messageDate; - } - - public void setMessageDate(Date messageDate) { - this.messageDate = messageDate; - } - - public String getMessageSourceType() { - return messageSourceType; - } - - public void setMessageSourceType(String messageSourceType) { - this.messageSourceType = messageSourceType; - } - - public String getMessageData() { - return messageData; - } - - public void setMessageData(String messageData) { - this.messageData = messageData; - } - - public String getMessageVersion() { - return messageVersion; - } - - public void setMessageVersion(String messageVersion) { - this.messageVersion = messageVersion; - } - - public List getMessageProperties() { - return messageProperties; - } - -} - diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java deleted file mode 100644 index 6f08eefd6..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageProperty.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class EventMessageProperty { - - public EventMessageProperty(String pId, String pValue) { - propertyId = pId; - propertyValue = pValue; - } - - @JsonProperty("PropertyId") - private String propertyId; - - @JsonProperty("PropertyValue") - private String propertyValue; -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java deleted file mode 100644 index dc58130d8..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class EventMessageResponse { - @JsonProperty("HandleFailure") - private boolean hasFailed = false; - - @JsonProperty("ErrorMessage") - private String errorMessage = ""; - - public boolean hasFailed() { - return hasFailed; - } - - public void setAsFailed(boolean hasFailed) { - this.hasFailed = hasFailed; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java deleted file mode 100644 index c2cc1f75c..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessageSourceType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.genexus.cloud.serverless; - -public class EventMessageSourceType { - public static String QUEUE_MESSAGE = "QueueMessage"; - public static String SERVICE_BUS_MESSAGE = "ServiceBusMessage"; - public static String TIMER = "Timer"; - public static String STREAM_MESSAGE = "StreamMessage"; -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java deleted file mode 100644 index 0bf1c6cad..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/EventMessages.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.ArrayList; -import java.util.List; - -public class EventMessages { - @JsonProperty("EventMessage") - List eventMessages = new ArrayList<>(); - - public void add(EventMessage msg) { - eventMessages.add(msg); - } -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java deleted file mode 100644 index 15249b36e..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.genexus.GXProcedure; -import com.genexus.GxUserType; -import com.genexus.ModelContext; -import com.genexus.db.DynamicExecute; -import org.apache.commons.lang.NotImplementedException; - -import java.lang.reflect.Array; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Optional; - -public class GXProcedureExecutor { - protected Class entryPointClass; - - private Class[][] supportedMethodSignatures = new Class[5][]; - private int methodSignatureIdx = -1; - - protected static final String MESSAGE_COLLECTION_INPUT_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessages"; - protected static final String MESSAGE_OUTPUT_COLLECTION_CLASS_NAME = "com.genexus.genexusserverlessapi.SdtEventMessageResponse"; - - public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundException, NotImplementedException { - entryPointClass = entryPointClassParms; - supportedMethodSignatures[0] = new Class[]{Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME), Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; - supportedMethodSignatures[1] = new Class[]{String.class, Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; - supportedMethodSignatures[2] = new Class[]{String.class}; - supportedMethodSignatures[3] = new Class[]{Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME)}; - supportedMethodSignatures[4] = new Class[]{}; //No inputs, no outputs - - Optional executeMethodOpt = Arrays.stream(this.entryPointClass.getDeclaredMethods()).filter(m -> m.getName() == DynamicExecute.METHOD_EXECUTE).findFirst(); - - if (!executeMethodOpt.isPresent()) { - throw new NotImplementedException(String.format("EXECUTE Method not implemented on Class '%s'", entryPointClass.getName())); - } - - Method executeMethod = executeMethodOpt.get(); - Class[] parametersTypes = executeMethod.getParameterTypes(); - - for (int i = 0; i < supportedMethodSignatures.length && methodSignatureIdx < 0; i++) { - if (supportedMethodSignatures[i].length != parametersTypes.length) { - continue; - } - Class[] listParameters = (Class[]) supportedMethodSignatures[i]; - boolean isMatch = true; - for (int j = 0; j < listParameters.length && isMatch; j++) { - isMatch = listParameters[j] == parametersTypes[j] || listParameters[j] == parametersTypes[j].getComponentType(); - } - if (isMatch) { - methodSignatureIdx = i; - } - } - if (methodSignatureIdx < 0) { - throw new NotImplementedException("Expected signature method did not match"); - } - - } - - public EventMessageResponse execute(ModelContext modelContext, EventMessages msgs, String rawJsonEvent) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, JsonProcessingException { - EventMessageResponse response = new EventMessageResponse(); - - Object[] parameters; - boolean returnsValue = true; - switch (methodSignatureIdx) { - case 0: - Class inputClass = Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME); - Object msgsInput = inputClass.getConstructor().newInstance(); - if (GxUserType.class.isAssignableFrom(inputClass)) { - ((GxUserType) msgsInput).fromJSonString(Helper.toJSONString(msgs)); - } - parameters = new Object[]{msgsInput, new Object[]{}}; - break; - case 1: - parameters = new Object[]{rawJsonEvent, new Object[]{}}; - break; - case 2: - parameters = new Object[]{rawJsonEvent}; - returnsValue = false; - break; - case 3: - parameters = new Object[]{new Object[]{}}; - break; - default: - parameters = new Object[]{}; - returnsValue = false; - break; - } - - Object[] paramOutArray = null; - if (returnsValue) { - parameters[parameters.length - 1] = (Object[]) Array.newInstance(Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME), 1); - paramOutArray = (Object[]) parameters[parameters.length - 1]; - paramOutArray[0] = Class.forName(MESSAGE_OUTPUT_COLLECTION_CLASS_NAME).getConstructor(int.class, ModelContext.class).newInstance(-1, modelContext); - } - - com.genexus.db.DynamicExecute.dynamicExecute(modelContext, -1, entryPointClass, "", entryPointClass.getName(), parameters); - - if (paramOutArray != null) { - GxUserType handlerOutput = (GxUserType) paramOutArray[0]; - String jsonResponse = handlerOutput.toJSonString(false); - response = new ObjectMapper().readValue(jsonResponse, EventMessageResponse.class); - } - return response; - } -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java index a1cbb160c..9d86aeba9 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.diagnostics.core.ILogger; import com.genexus.diagnostics.core.LogManager; +import com.genexus.cloud.serverless.model.*; public class Helper { diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java index c9d472d64..f215f4c12 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java @@ -3,8 +3,7 @@ import com.genexus.ApplicationContext; import com.genexus.ModelContext; import com.genexus.cloud.serverless.*; -import com.genexus.cloud.serverless.EventMessageResponse; -import com.genexus.cloud.serverless.EventMessages; +import com.genexus.cloud.serverless.model.*; import com.genexus.diagnostics.core.ILogger; import com.genexus.specific.java.Connect; import com.genexus.specific.java.LogManager; @@ -74,7 +73,7 @@ protected EventMessageResponse dispatchEvent(EventMessages eventMessages, String EventMessageResponse response = null; try { - response = executor.execute(modelContext, eventMessages, lambdaRawMessageBody); + response = executor.execute(modelContext, eventMessages, null, lambdaRawMessageBody); } catch (Exception e) { logger.error(String.format("dispatchEventmessages - program '%s' execution error", entryPointClass.getName()), e); throw e; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java index 32851a211..05bf95001 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java @@ -3,11 +3,8 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.model.*; import com.genexus.cloud.serverless.exception.FunctionRuntimeException; -import com.genexus.cloud.serverless.EventMessage; -import com.genexus.cloud.serverless.EventMessageResponse; -import com.genexus.cloud.serverless.EventMessageSourceType; -import com.genexus.cloud.serverless.EventMessages; import json.org.json.JSONObject; import org.apache.http.client.utils.DateUtils; diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java index fec33a3c1..81f069304 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java @@ -6,11 +6,7 @@ import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; import com.genexus.cloud.serverless.*; -import com.genexus.cloud.serverless.EventMessageProperty; -import com.genexus.cloud.serverless.EventMessage; -import com.genexus.cloud.serverless.EventMessageResponse; -import com.genexus.cloud.serverless.EventMessageSourceType; -import com.genexus.cloud.serverless.EventMessages; +import com.genexus.cloud.serverless.model.*; import java.util.ArrayList; import java.util.Date; From e25a26640f4acbd202a8ed51ff2bef7e02e053da Mon Sep 17 00:00:00 2001 From: Sabrina Juarez Garcia Date: Thu, 5 Dec 2024 22:15:36 -0300 Subject: [PATCH 09/16] Avoid using GetrealPath to logging. --- java/src/main/java/com/genexus/GxRestService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/genexus/GxRestService.java b/java/src/main/java/com/genexus/GxRestService.java index cfd2b6f62..ceccf72f0 100644 --- a/java/src/main/java/com/genexus/GxRestService.java +++ b/java/src/main/java/com/genexus/GxRestService.java @@ -5,6 +5,7 @@ import java.util.Date; import com.genexus.diagnostics.core.ILogger; +import com.genexus.diagnostics.core.LogManager; import com.genexus.internet.MsgList; import com.genexus.security.GXResult; import com.genexus.security.GXSecurityProvider; @@ -80,7 +81,8 @@ public void init(String requestMethod, IHttpServletRequest myServletRequest, IHt private void initLogger(IServletContext myContext) { if (logger == null) { - logger = com.genexus.specific.java.LogManager.initialize(myContext.getRealPath("/"), GxRestService.class); + // logger = com.genexus.specific.java.LogManager.initialize(myContext.getRealPath("/"), GxRestService.class); + logger = LogManager.getLogger(GxRestService.class); } } From e00db77412b642afd7a086468e2549c8c3db9da8 Mon Sep 17 00:00:00 2001 From: Sabrina Juarez Garcia Date: Sun, 29 Dec 2024 21:07:41 -0300 Subject: [PATCH 10/16] Resolve code review issues --- gxazureserverless/pom.xml | 11 ----------- .../azure/handler/AzureBlobStorageHandler.java | 8 +------- .../azure/handler/AzureCosmosDBHandler.java | 8 ++------ .../handler/AzureEventGridCloudHandler.java | 10 ++-------- .../azure/handler/AzureEventGridHandler.java | 8 +------- .../azure/handler/AzureEventHandler.java | 1 - .../handler/AzureFunctionConfiguration.java | 8 ++------ .../AzureFunctionConfigurationHelper.java | 8 +++----- .../azure/handler/AzureQueueHandler.java | 3 --- .../handler/AzureServiceBusQueueHandler.java | 3 --- .../handler/AzureServiceBusTopicHandler.java | 3 +-- .../azure/handler/AzureTimerHandler.java | 6 +----- .../exception/FunctionRuntimeException.java | 9 --------- .../helpers/GlobalConfigurationCache.java | 5 ++--- .../azure/events/TestAzureCosmosDBHandler.java | 1 - .../cloud/azure/events/TestAzureEventGrid.java | 5 ++--- .../azure/events/TestAzureEventGridCloud.java | 5 +---- .../azure/events/TestAzureQueueHandler.java | 1 - .../azure/events/TestAzureServiceBusHandler.java | 7 ++----- .../azure/events/TestAzureTimerHandler.java | 4 +--- .../cloud/serverless/GXProcedureExecutor.java | 1 - .../serverless/ServerlessBaseEventHandler.java | 16 ++++------------ .../ServerlessFunctionConfiguration.java | 3 --- .../cloud/serverless/model/EventMessages.java | 1 - .../src/main/java/com/genexus/GxRestService.java | 1 - 25 files changed, 25 insertions(+), 111 deletions(-) delete mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index 7cbec32aa..391bdc2f9 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -14,17 +14,6 @@ GeneXus Azure Functions Handler - - ${project.groupId} - gxclassR - ${project.version} - - - - ${project.groupId} - gxcommon - ${project.version} - ${project.groupId} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java index b7ef8139f..14ae44856 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureBlobStorageHandler.java @@ -1,5 +1,4 @@ package com.genexus.cloud.serverless.azure.handler; -import com.genexus.cloud.serverless.Helper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.annotation.*; @@ -18,7 +17,7 @@ public AzureBlobStorageHandler() throws Exception { super(); } public void run( - @BlobTrigger(name = "content", path = "%blob_path%", dataType = "binary") byte[] content, + @BlobTrigger(name = "content", source = "EventGrid", path = "%blob_path%", dataType = "binary") byte[] content, @BindingName("name") String name, final ExecutionContext context ) throws Exception { @@ -28,17 +27,13 @@ public void run( switch (executor.getMethodSignatureIdx()) { case 0: - EventMessage msg = new EventMessage(); msg.setMessageId(context.getInvocationId()); msg.setMessageSourceType(EventMessageSourceType.BLOB); - Instant nowUtc = Instant.now(); msg.setMessageDate(Date.from(nowUtc)); msg.setMessageData(Base64.getEncoder().encodeToString(content)); - List msgAtts = msg.getMessageProperties(); - msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); msgAtts.add(new EventMessageProperty("name", name)); @@ -48,7 +43,6 @@ public void run( case 2: rawMessage = Base64.getEncoder().encodeToString(content); } - try { EventMessageResponse response = dispatchEvent(msgs, rawMessage); if (response.hasFailed()) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java index 890bb8710..6371911a2 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java @@ -25,7 +25,6 @@ public void run( EventMessages msgs = new EventMessages(); EventMessagesList eventMessagesList = new EventMessagesList(); String rawMessage= ""; - setupServerlessMappings(context.getFunctionName()); switch (executor.getMethodSignatureIdx()) { @@ -39,20 +38,18 @@ public void run( rawMessage = Helper.toJSONString(items); break; } - try { EventMessageResponse response = dispatchEvent(msgs, eventMessagesList, rawMessage); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } - } + private EventMessagesList setupEventMessagesList(List> jsonList) { EventMessagesList messagesList = new EventMessagesList(); @@ -61,10 +58,10 @@ private EventMessagesList setupEventMessagesList(List> jsonLi } return messagesList; } + private EventMessages setupEventMessages(Guid.GUID eventId, List> jsonList) { EventMessages msgs = new EventMessages(); - for (Map json : jsonList) { String idValue = ""; @@ -73,7 +70,6 @@ private EventMessages setupEventMessages(Guid.GUID eventId, List msgAtts = msg.getMessageProperties(); - for (Map.Entry entry : json.entrySet()) { String key = entry.getKey(); String value = entry.getValue().toString(); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java index 92b4a522b..90e3e5f4d 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java @@ -23,7 +23,6 @@ public class AzureEventGridCloudHandler extends AzureEventHandler{ public void run( @EventGridTrigger(name = "eventgridEvent") String eventJson, final ExecutionContext context) throws Exception { - context.getLogger().info("GeneXus Event Grid CloudEvents trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); setupServerlessMappings(context.getFunctionName()); setupEventGridMessage(eventJson); @@ -34,32 +33,28 @@ public void run( logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } } protected void setupEventGridMessage(String eventJson) throws JsonProcessingException { - switch (executor.getMethodSignatureIdx()) { case 0: - try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule()); CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class); EventMessage msg = new EventMessage(); + msg.setMessageId(cloudEvent.getId()); msg.setMessageSourceType(cloudEvent.getType()); msg.setMessageVersion(""); - msg.setMessageDate(new Date()); msg.setMessageData(Objects.requireNonNull(cloudEvent.getData()).toString()); List msgAtts = msg.getMessageProperties(); - msgAtts.add(new EventMessageProperty("Id", cloudEvent.getId())); msgAtts.add(new EventMessageProperty("Subject", cloudEvent.getSubject())); msgAtts.add(new EventMessageProperty("DataContentType", cloudEvent.getDataContentType())); @@ -70,7 +65,7 @@ protected void setupEventGridMessage(String eventJson) throws JsonProcessingExce if (cloudEvent.getSpecVersion() != null) msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString())); if (cloudEvent.getTime() != null) - msgAtts.add(new EventMessageProperty("Time", cloudEvent.getTime().toString())); + msgAtts.add(new EventMessageProperty("Time", cloudEvent.getTime().toString())); msgs.add(msg); } @@ -83,5 +78,4 @@ protected void setupEventGridMessage(String eventJson) throws JsonProcessingExce rawMessage = eventJson; } } - } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java index c9a3b4b31..ab046a874 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java @@ -31,28 +31,23 @@ public void run( logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } - - } - protected void setupEventGridMessage(EventGridEvent event) { + protected void setupEventGridMessage(EventGridEvent event) { switch (executor.getMethodSignatureIdx()) { case 0: EventMessage msg = new EventMessage(); msg.setMessageId(event.getId()); msg.setMessageSourceType(event.getEventType()); msg.setMessageVersion(event.getDataVersion()); - msg.setMessageDate(new Date()); msg.setMessageData(event.getData().toString()); List msgAtts = msg.getMessageProperties(); - msgAtts.add(new EventMessageProperty("Id", event.getId())); msgAtts.add(new EventMessageProperty("Subject",event.getSubject())); @@ -61,7 +56,6 @@ protected void setupEventGridMessage(EventGridEvent event) { msgAtts.add(new EventMessageProperty("EventTime",event.getEventTime().toString())); msgs.add(msg); - break; case 1: case 2: diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java index 43aee6ddb..e2d700b2f 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventHandler.java @@ -53,6 +53,5 @@ protected AzureFunctionConfiguration createFunctionConfiguration() { @Override protected void InitializeServerlessConfig(){ } - } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java index 50d7fd6db..db1443e7b 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfiguration.java @@ -12,25 +12,22 @@ public class AzureFunctionConfiguration extends ServerlessFunctionConfiguration public AzureFunctionConfiguration() { } - public AzureFunctionConfiguration(String functionName, String gxEntrypoint) - { + public AzureFunctionConfiguration(String functionName, String gxEntrypoint) { this.functionName = functionName; this.gxEntrypoint = gxEntrypoint; } public void setFunctionName(String functionName) { - this.functionName = functionName; } public void setGXEntrypoint(String gxEntrypoint) { - this.gxEntrypoint = gxEntrypoint; } public String getFunctionName() { return functionName; } - public String getGXEntrypoint() { + public String getGXEntrypoint() { return gxEntrypoint; } @Override @@ -42,5 +39,4 @@ public boolean isValidConfiguration () { public String getGXClassName() { return getGXEntrypoint(); } - } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java index 97ca29040..dcda65518 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureFunctionConfigurationHelper.java @@ -17,8 +17,8 @@ public class AzureFunctionConfigurationHelper { private final static ILogger logger = LogManager.initialize(".", AzureFunctionConfiguration.class); private final static String FUNCTION_CONFIG_PATH = "gxazmappings.json"; - public static List getFunctionsMapConfiguration() throws FunctionConfigurationException { + public static List getFunctionsMapConfiguration() throws FunctionConfigurationException { File configFile = new File(FUNCTION_CONFIG_PATH); if (configFile.exists()) { @@ -36,15 +36,14 @@ public static List getFunctionsMapConfiguration() th } } - public static String getFunctionConfigurationEntryPoint(String functionName, AzureFunctionConfiguration functionConfiguration) - { + public static String getFunctionConfigurationEntryPoint(String functionName, AzureFunctionConfiguration functionConfiguration) { if (functionConfiguration != null) return functionConfiguration.getGXClassName(); else return null; } public static AzureFunctionConfiguration getAzureFunctionConfiguration(String functionName, List mappings) throws FunctionConfigurationException { - Optional config = null; + Optional config = Optional.empty(); if (mappings != null) { config = mappings.stream() .filter(c -> functionName.equals(c.getFunctionName())) @@ -52,5 +51,4 @@ public static AzureFunctionConfiguration getAzureFunctionConfiguration(String fu } return config.orElseThrow(() -> new FunctionConfigurationException(String.format("Configuration not found for Azure function %s at gxazmappings.json.", functionName))); } - } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index 23b766308..524f41914 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -31,10 +31,8 @@ public void run( EventMessage msg = new EventMessage(); msg.setMessageId(id); msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); - msg.setMessageDate(new Date()); msg.setMessageData(message); - List msgAtts = msg.getMessageProperties(); msgAtts.add(new EventMessageProperty("Id", id)); @@ -45,7 +43,6 @@ public void run( msgAtts.add(new EventMessageProperty("PopReceipt", popReceipt)); msgs.add(msg); } - try { EventMessageResponse response = dispatchEvent(msgs, message); if (response.hasFailed()) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java index 69b172bca..30186fca7 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java @@ -7,7 +7,6 @@ import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.*; -import java.util.Date; import java.util.List; public class AzureServiceBusQueueHandler extends AzureEventHandler { @@ -35,7 +34,6 @@ public void run( logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. @@ -43,7 +41,6 @@ public void run( } protected void setupServiceBusMessages(List messages) { - switch (executor.getMethodSignatureIdx()) { case 0: msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java index 6f85845d6..6791dfffe 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java @@ -34,14 +34,13 @@ public void run( logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } - } catch (Exception e) { logger.error("HandleRequest execution error", e); throw e; //Throw the exception so the runtime can Retry the operation. } } - protected void setupServiceBusMessages(List messages) { + protected void setupServiceBusMessages(List messages) { switch (executor.getMethodSignatureIdx()) { case 0: msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java index 27d112ffb..2f7b17f20 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureTimerHandler.java @@ -29,11 +29,9 @@ public void run( EventMessages msgs = new EventMessages(); if (executor.getMethodSignatureIdx() == 0) { - try { TimerObject timerObject = new ObjectMapper().readValue(TimerInfo, new TypeReference() { }); - EventMessage msg = new EventMessage(); msg.setMessageId(context.getInvocationId()); msg.setMessageSourceType(EventMessageSourceType.TIMER); @@ -46,7 +44,6 @@ public void run( msgAtts.add(new EventMessageProperty("Id", context.getInvocationId())); boolean adjustForSDT = timerObject.timerSchedule.getAdjustForDST(); msgAtts.add(new EventMessageProperty("AdjustForDST", Boolean.toString(adjustForSDT))); - msgAtts.add(new EventMessageProperty("Next", timerObject.timerScheduleStatus.getNext())); msgAtts.add(new EventMessageProperty("Last", timerObject.timerScheduleStatus.getLast())); msgAtts.add(new EventMessageProperty("LastUpdated", timerObject.timerScheduleStatus.getLastUpdated())); @@ -55,13 +52,11 @@ public void run( msgAtts.add(new EventMessageProperty("IsPastDue", Boolean.toString(isPastDue))); msgs.add(msg); - } catch (Exception e) { logger.error("Message could not be processed."); throw e; } } - try { EventMessageResponse response = dispatchEvent(msgs, TimerInfo); if (response.hasFailed()) { @@ -73,6 +68,7 @@ public void run( throw e; //Throw the exception so the runtime can Retry the operation. } } + public static class TimerObject{ @JsonProperty("ScheduleStatus") diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java deleted file mode 100644 index 83849cc79..000000000 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/exception/FunctionRuntimeException.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.genexus.cloud.serverless.exception; - -public class FunctionRuntimeException extends RuntimeException { - - public FunctionRuntimeException(String errorMessage, Throwable e) { - super(errorMessage, e); - } - -} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java index b996f9562..449bb2c5f 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/GlobalConfigurationCache.java @@ -41,9 +41,8 @@ private synchronized void initializeCache() throws FunctionConfigurationExceptio } initialized = true; } - else - { - logger.error(String.format("Global configuration cache could not be initialized.")); + else { + logger.error("Global configuration cache could not be initialized."); } } } diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java index a72904914..15c6175b1 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java @@ -3,7 +3,6 @@ import com.genexus.cloud.serverless.azure.handler.AzureCosmosDBHandler; import com.microsoft.azure.functions.ExecutionContext; import org.junit.Test; -import org.junit.jupiter.api.BeforeEach; import java.util.ArrayList; import java.util.HashMap; diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java index dee85a742..e75094caf 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGrid.java @@ -1,4 +1,5 @@ package com.genexus.cloud.azure.events; + import com.azure.core.util.BinaryData; import com.azure.messaging.eventgrid.EventGridEvent; import com.genexus.cloud.serverless.azure.handler.AzureEventGridHandler; @@ -22,7 +23,6 @@ public void setup() throws Exception { @Test public void testEventGridFunctionRaw() throws Exception { - EventGridEvent message = loadmessages(); context = new MockExecutionContext("TestEventGridRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab5"); eventGridFunction.run(message,context); @@ -31,8 +31,7 @@ public void testEventGridFunctionRaw() throws Exception { context.getLogger().info("Logger is not null"); } - private EventGridEvent loadmessages() - { + private EventGridEvent loadmessages() { String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; long sequenceNumber = 1123456789; String subject = "testsubject1"; diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java index 38ff3c6d2..541c35372 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureEventGridCloud.java @@ -19,7 +19,6 @@ public class TestAzureEventGridCloud { @Test public void testEventGridCloudFunction() throws Exception { - eventGridCloudFunction = new AzureEventGridCloudHandler(); CloudEvent message = loadmessages(); context = new MockExecutionContext("TestEventGridCloud","13e2d1f9-6838-4927-a6a8-0160e8601ab2"); @@ -33,8 +32,7 @@ public void testEventGridCloudFunction() throws Exception { context.getLogger().info("Logger is not null"); } - private CloudEvent loadmessages() - { + private CloudEvent loadmessages() { String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; CloudEvent message1 = Mockito.mock(CloudEvent.class); @@ -50,5 +48,4 @@ private CloudEvent loadmessages() return message1; } - } diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java index 2d41d8ceb..ad4a18d3c 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureQueueHandler.java @@ -48,6 +48,5 @@ public void testQueueTriggerFunctionMessage() throws Exception { assertNotNull(context.getLogger()); context.getLogger().info("Logger is not null"); - } } diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java index 6276f0d92..28968706a 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java @@ -23,7 +23,6 @@ public void setup() throws Exception { @Test public void testSBTriggerFunctionRaw() throws Exception { - List messages = loadmessages(); context = new MockExecutionContext("TestServiceBusRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab0"); @@ -34,17 +33,15 @@ public void testSBTriggerFunctionRaw() throws Exception { } @Test public void testSBTriggerFunctionMessage() throws Exception { - List messages = loadmessages(); context = new MockExecutionContext("TestServiceBusMessage","13e2d1f9-6838-4927-a6a8-0160e8601ab1"); sbqueueFunction.run(messages,context); assertNotNull(context.getLogger()); context.getLogger().info("Logger is not null"); - } - private List loadmessages() - { + + private List loadmessages() { String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; long sequenceNumber = 1123456789; String subject = "testsubject1"; diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java index 64160a0da..6bca18ba8 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureTimerHandler.java @@ -1,6 +1,6 @@ package com.genexus.cloud.azure.events; + import com.fasterxml.jackson.databind.ObjectMapper; -import com.genexus.cloud.serverless.azure.handler.AzureQueueHandler; import com.genexus.cloud.serverless.azure.handler.AzureTimerHandler; import com.microsoft.azure.functions.ExecutionContext; import org.junit.jupiter.api.BeforeEach; @@ -19,7 +19,6 @@ public void setup() throws Exception { } @Test public void testTimerTriggerFunctionRaw() throws Exception { - AzureTimerHandler.TimerScheduleStatus timerScheduleStatus = new AzureTimerHandler.TimerScheduleStatus(); timerScheduleStatus.setLast("2025-01-01T00:00:00.000Z"); timerScheduleStatus.setNext("2025-01-01T00:00:00.000Z"); @@ -33,6 +32,5 @@ public void testTimerTriggerFunctionRaw() throws Exception { assertNotNull(context.getLogger()); context.getLogger().info("Logger is not null"); - } } diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java index c2a578103..c57930a35 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -65,7 +65,6 @@ public GXProcedureExecutor(Class entryPointClassParms) throws ClassNotFoundExcep if (methodSignatureIdx < 0) { throw new NotImplementedException("Expected signature method did not match"); } - } public EventMessageResponse execute(ModelContext modelContext, EventMessages msgs, EventMessagesList msgsList, String rawJsonEvent) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, JsonProcessingException { diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java index 656454acd..9be08dc64 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -6,10 +6,7 @@ import com.genexus.cloud.serverless.model.EventMessages; import com.genexus.cloud.serverless.model.EventMessagesList; import com.genexus.diagnostics.core.ILogger; -import com.genexus.diagnostics.core.LogManager; - import com.genexus.specific.java.Connect; - import com.genexus.util.IniFile; public abstract class ServerlessBaseEventHandler { @@ -38,17 +35,15 @@ public ServerlessBaseEventHandler(String functionName, String className) throws initialize(); } private void initialize() throws Exception { - //logger = LogManager.getLogger(ServerlessBaseEventHandler.class); + logger = com.genexus.specific.java.LogManager.initialize(".", ServerlessBaseEventHandler.class); Connect.init(); IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null); String packageName = config.getProperty("Client", "PACKAGE", null); - Class cfgClass; - String cfgClassName = packageName.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", packageName, GX_APPLICATION_CLASS); - try { + Class cfgClass; cfgClass = Class.forName(cfgClassName); logger.debug("Finished loading cfgClassName " + cfgClassName); com.genexus.Application.init(cfgClass); @@ -57,37 +52,34 @@ private void initialize() throws Exception { logger.error(String.format("Failed to initialize GX AppConfig Class: %s", cfgClassName), e); throw e; } - InitializeServerlessConfig(); } + protected EventMessageResponse dispatchEvent(EventMessages eventMessages, String rawMessageBody) throws Exception { EventMessagesList eventMessagesList = new EventMessagesList(); return dispatchEvent(eventMessages,eventMessagesList,rawMessageBody); } + protected EventMessageResponse dispatchEvent(EventMessages eventMessages, EventMessagesList eventMessagesList, String rawMessageBody) throws Exception { String jsonStringMessages = Helper.toJSONString(eventMessages); if (logger.isDebugEnabled()) { logger.debug(String.format("dispatchEventMessages (%s) - serialized messages: %s", functionConfiguration.getGXClassName(), jsonStringMessages)); } - ModelContext modelContext = new ModelContext(entryPointClass); EventMessageResponse response; - try { response = executor.execute(modelContext, eventMessages, eventMessagesList, rawMessageBody); } catch (Exception e) { logger.error(String.format("dispatchEventmessages - program '%s' execution error", entryPointClass.getName()), e); throw e; } - if (response.hasFailed()) { logger.info("dispatchEventmessages - messages not handled with success: " + response.getErrorMessage()); } else { logger.debug("dispatchEventmessages - message handled with success"); } return response; - } } diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java index d066ea2a0..e68ca8d28 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessFunctionConfiguration.java @@ -1,9 +1,6 @@ package com.genexus.cloud.serverless; -import com.genexus.cloud.serverless.exception.FunctionConfigurationException; - public abstract class ServerlessFunctionConfiguration { - public ServerlessFunctionConfiguration() {} public abstract boolean isValidConfiguration(); public abstract String getGXClassName(); diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java index a135a11e0..c2d31c84e 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessages.java @@ -1,7 +1,6 @@ package com.genexus.cloud.serverless.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.genexus.cloud.serverless.model.EventMessage; import java.util.ArrayList; import java.util.List; diff --git a/java/src/main/java/com/genexus/GxRestService.java b/java/src/main/java/com/genexus/GxRestService.java index ec9357e45..b78b71769 100644 --- a/java/src/main/java/com/genexus/GxRestService.java +++ b/java/src/main/java/com/genexus/GxRestService.java @@ -81,7 +81,6 @@ public void init(String requestMethod, IHttpServletRequest myServletRequest, IHt private void initLogger(IServletContext myContext) { if (logger == null) { - // logger = com.genexus.specific.java.LogManager.initialize(myContext.getRealPath("/"), GxRestService.class); logger = LogManager.getLogger(GxRestService.class); } } From afa52fa9ff47f6069dbc8b169b4bce19e98f4ceb Mon Sep 17 00:00:00 2001 From: Sabrina Juarez Garcia Date: Sun, 29 Dec 2024 21:36:21 -0300 Subject: [PATCH 11/16] Add handlers for single processing messages for Service Bus functions --- .../AzureServiceBusQueueSingleMsgHandler.java | 58 +++++++++++++++++++ .../AzureServiceBusTopicSingleMsgHandler.java | 57 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java new file mode 100644 index 000000000..0c40aaf58 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java @@ -0,0 +1,58 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; +import com.genexus.cloud.serverless.model.EventMessageResponse; +import com.genexus.cloud.serverless.model.EventMessages; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.Cardinality; +import com.microsoft.azure.functions.annotation.ServiceBusQueueTrigger; + +import java.util.ArrayList; +import java.util.List; + +public class AzureServiceBusQueueSingleMsgHandler extends AzureEventHandler { + + EventMessages msgs = new EventMessages(); + String rawMessage = ""; + + public AzureServiceBusQueueSingleMsgHandler() throws Exception { + super(); + } + + public void run( + @ServiceBusQueueTrigger(name = "messages", queueName = "%queue_name%", connection = "%queue_connection%", cardinality = Cardinality.ONE) + ServiceBusReceivedMessage message, + final ExecutionContext context + ) throws Exception { + + context.getLogger().info("GeneXus Service Bus Queue trigger single message process handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + List messages = new ArrayList<>(); + messages.add(message); + setupServerlessMappings(context.getFunctionName()); + + setupServiceBusMessages(messages); + try { + EventMessageResponse response = dispatchEvent(msgs, rawMessage); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + } + + protected void setupServiceBusMessages(List messages) { + switch (executor.getMethodSignatureIdx()) { + case 0: + msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); + break; + case 1: + case 2: + rawMessage = Helper.toJSONString(messages); + } + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java new file mode 100644 index 000000000..9f9061638 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java @@ -0,0 +1,57 @@ +package com.genexus.cloud.serverless.azure.handler; + +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; +import com.genexus.cloud.serverless.model.EventMessageResponse; +import com.genexus.cloud.serverless.model.EventMessages; +import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.Cardinality; +import com.microsoft.azure.functions.annotation.ServiceBusTopicTrigger; + +import java.util.ArrayList; +import java.util.List; + +public class AzureServiceBusTopicSingleMsgHandler extends AzureEventHandler { + + EventMessages msgs = new EventMessages(); + String rawMessage = ""; + + public AzureServiceBusTopicSingleMsgHandler() throws Exception { + super(); + } + + public void run( + @ServiceBusTopicTrigger(name = "messages", topicName = "%topic_name%", subscriptionName = "%subscriptionName%", connection = "%queue_connection%", cardinality = Cardinality.ONE) + ServiceBusReceivedMessage message, + final ExecutionContext context + ) throws Exception { + + context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); + + setupServerlessMappings(context.getFunctionName()); + List messages = new ArrayList<>(); + messages.add(message); + try { + EventMessageResponse response = dispatchEvent(msgs,rawMessage); + if (response.hasFailed()) { + logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); + throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. + } + } catch (Exception e) { + logger.error("HandleRequest execution error", e); + throw e; //Throw the exception so the runtime can Retry the operation. + } + } + + protected void setupServiceBusMessages(List messages) { + switch (executor.getMethodSignatureIdx()) { + case 0: + msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); + break; + case 1: + case 2: + rawMessage = Helper.toJSONString(messages); + } + } +} From 8fe988ca85638a50f98f8bcb7f74c16ba9396454 Mon Sep 17 00:00:00 2001 From: sjuarez Date: Mon, 6 Jan 2025 17:43:30 -0300 Subject: [PATCH 12/16] Fixes related to message date JSON serialization. --- .../com/genexus/cloud/serverless/Helper.java | 26 - .../aws/handler/LambdaBaseEventHandler.java | 2 +- .../aws/handler/LambdaEventBridgeHandler.java | 8 +- .../aws/handler/LambdaSQSHandler.java | 2 +- ...tEventCustomPayload_CustomPayloadItem.java | 98 --- .../genexusserverlessapi/SdtEventMessage.java | 708 +++++++++++++----- .../SdtEventMessageProperty.java | 225 ++++++ .../SdtEventMessageResponse.java | 10 +- .../SdtEventMessages.java | 351 ++++++--- .../SdtEventMessagesList.java | 243 ++++++ .../StructSdtEventCustomPayload.java | 40 - ...tEventCustomPayload_CustomPayloadItem.java | 48 -- .../StructSdtEventMessage.java | 218 +++--- .../StructSdtEventMessageProperty.java | 54 ++ .../StructSdtEventMessageResponse.java | 6 +- .../StructSdtEventMessages.java | 74 +- .../StructSdtEventMessagesList.java | 43 ++ gxazureserverless/pom.xml | 6 - .../azure/handler/AzureCosmosDBHandler.java | 6 +- .../handler/AzureEventGridCloudHandler.java | 3 - .../azure/handler/AzureEventGridHandler.java | 4 +- .../azure/handler/AzureQueueHandler.java | 17 +- .../handler/AzureServiceBusQueueHandler.java | 29 +- .../AzureServiceBusQueueSingleMsgHandler.java | 40 +- .../handler/AzureServiceBusTopicHandler.java | 29 +- .../AzureServiceBusTopicSingleMsgHandler.java | 42 +- .../ServiceBusBatchMessageProcessor.java | 31 + .../helpers/ServiceBusMessagesSetup.java | 57 -- .../helpers/ServiceBusProcessedMessage.java | 21 + .../ServiceBusSingleMessageProcessor.java | 47 ++ .../events/TestAzureServiceBusHandler.java | 71 -- ...stAzureServiceBusSingleMessageHandler.java | 59 ++ .../genexusserverlessapi/SdtEventMessage.java | 532 +++++++++++++ .../SdtEventMessageProperty.java | 225 ++++++ .../SdtEventMessageResponse.java | 40 +- .../SdtEventMessages.java | 253 +++++++ .../SdtEventMessagesList.java | 243 ++++++ .../StructSdtEventMessage.java | 126 ++++ .../StructSdtEventMessageProperty.java | 54 ++ .../StructSdtEventMessageResponse.java | 11 +- .../StructSdtEventMessages.java | 43 ++ .../StructSdtEventMessagesList.java | 43 ++ .../servicebus/handlesbqueueazureevent.java | 2 +- .../servicebus/handlesbqueueazureevent2.java | 1 + .../cloud/serverless/GXProcedureExecutor.java | 4 +- .../{Helper.java => JSONHelper.java} | 19 +- .../cloud/serverless/model/EventMessage.java | 2 + ...tEventCustomPayload_CustomPayloadItem.java | 95 --- .../genexusserverlessapi/SdtEventMessage.java | 192 ----- .../SdtEventMessages.java | 115 --- .../SdtEventMessagesList.java | 211 ------ .../StructSdtEventCustomPayload.java | 40 - ...tEventCustomPayload_CustomPayloadItem.java | 48 -- .../StructSdtEventMessage.java | 100 --- .../StructSdtEventMessages.java | 39 - .../StructSdtEventMessagesList.java | 41 - 56 files changed, 3285 insertions(+), 1812 deletions(-) delete mode 100644 gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java delete mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java create mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java create mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java delete mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java delete mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java create mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java create mode 100644 gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java delete mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusProcessedMessage.java create mode 100644 gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java delete mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java create mode 100644 gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusSingleMessageHandler.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java rename {gxserverlesscommon/src/main => gxazureserverless/src/test}/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java (86%) create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java rename {gxserverlesscommon/src/main => gxazureserverless/src/test}/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java (83%) create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java create mode 100644 gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java rename gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/{Helper.java => JSONHelper.java} (53%) delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java delete mode 100644 gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java deleted file mode 100644 index 9d86aeba9..000000000 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/Helper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.genexus.cloud.serverless; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.genexus.diagnostics.core.ILogger; -import com.genexus.diagnostics.core.LogManager; -import com.genexus.cloud.serverless.model.*; - -public class Helper { - - private static final ILogger logger = LogManager.getLogger(Helper.class); - - public static String toJSONString(Object dtoObject) { - try { - ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(dtoObject); - } - catch (Exception e) { - logger.error("Failed to serialize object to jsonString", e); - } - return ""; - } - - public static void addEventMessageProperty(EventMessage msg, String key, String value) { - msg.getMessageProperties().add(new EventMessageProperty(key, value)); - } -} diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java index f215f4c12..198f12bad 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaBaseEventHandler.java @@ -63,7 +63,7 @@ private void initialize() throws Exception { } protected EventMessageResponse dispatchEvent(EventMessages eventMessages, String lambdaRawMessageBody) throws Exception { - String jsonStringMessages = Helper.toJSONString(eventMessages); + String jsonStringMessages = JSONHelper.toJSONString(eventMessages); if (logger.isDebugEnabled()) { logger.debug(String.format("dispatchEventMessages (%s) - serialized messages: %s", functionConfiguration.getEntryPointClassName(), jsonStringMessages)); diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java index 7dcc4f9b2..d92da3747 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaEventBridgeHandler.java @@ -2,7 +2,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.JSONHelper; import com.genexus.cloud.serverless.model.*; import com.genexus.cloud.serverless.exception.FunctionRuntimeException; import com.genexus.json.JSONObjectWrapper; @@ -22,7 +22,7 @@ public LambdaEventBridgeHandler(String entryPointClassName) throws Exception { @Override public String handleRequest(Map stringObjectMap, Context context) { - String jsonEventRaw = Helper.toJSONString(stringObjectMap); + String jsonEventRaw = JSONHelper.toJSONString(stringObjectMap); logger.debug("handleRequest started with event: " + jsonEventRaw); @@ -41,7 +41,7 @@ public String handleRequest(Map stringObjectMap, Context context msgItem.setMessageData(new JSONObjectWrapper(jsonEventRaw).getJSONObject("detail").toString()); } for (Map.Entry entry : stringObjectMap.entrySet()) { - Helper.addEventMessageProperty(msgItem, entry.getKey(), entry.getValue().toString()); + JSONHelper.addEventMessageProperty(msgItem, entry.getKey(), entry.getValue().toString()); } msgs.add(msgItem); response = dispatchEvent(msgs, jsonEventRaw); @@ -60,6 +60,6 @@ public String handleRequest(Map stringObjectMap, Context context logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); } - return Helper.toJSONString(response); + return JSONHelper.toJSONString(response); } } diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java index 81f069304..3c7d62f8a 100644 --- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java +++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaSQSHandler.java @@ -60,7 +60,7 @@ public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) { String errorMessage; try { - EventMessageResponse response = dispatchEvent(msgs, Helper.toJSONString(sqsEvent)); + EventMessageResponse response = dispatchEvent(msgs, JSONHelper.toJSONString(sqsEvent)); wasHandled = !response.hasFailed(); errorMessage = response.getErrorMessage(); } catch (Exception e) { diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java deleted file mode 100644 index 7510b3ed8..000000000 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.*; -import com.genexus.*; -import com.genexus.xml.*; -import com.genexus.search.*; -import com.genexus.webpanels.*; - -import java.util.*; - -public final class SdtEventCustomPayload_CustomPayloadItem extends GxUserType { - public SdtEventCustomPayload_CustomPayloadItem() { - this(new ModelContext(SdtEventCustomPayload_CustomPayloadItem.class)); - } - - public SdtEventCustomPayload_CustomPayloadItem(ModelContext context) { - super(context, "SdtEventCustomPayload_CustomPayloadItem"); - } - - public SdtEventCustomPayload_CustomPayloadItem(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventCustomPayload_CustomPayloadItem"); - } - - public SdtEventCustomPayload_CustomPayloadItem(StructSdtEventCustomPayload_CustomPayloadItem struct) { - this(); - setStruct(struct); - } - - private static java.util.HashMap mapper = new java.util.HashMap(); - - static { - } - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; - } - - public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; - } - - public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - } - - public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (1); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; - sTagName = ""; - } - - public byte isNull() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - } - - public com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem Clone() { - return (com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem) (clone()); - } - - public void setStruct(com.genexus.genexusserverlessapi.StructSdtEventCustomPayload_CustomPayloadItem struct) { - setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(struct.getPropertyid()); - setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(struct.getPropertyvalue()); - } - - @SuppressWarnings("unchecked") - public com.genexus.genexusserverlessapi.StructSdtEventCustomPayload_CustomPayloadItem getStruct() { - com.genexus.genexusserverlessapi.StructSdtEventCustomPayload_CustomPayloadItem struct = new com.genexus.genexusserverlessapi.StructSdtEventCustomPayload_CustomPayloadItem(); - struct.setPropertyid(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid()); - struct.setPropertyvalue(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue()); - return struct; - } - - protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - protected short readOk; - protected short nOutParmCount; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - protected String sTagName; - protected boolean readElement; - protected boolean formatError; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; -} - diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java index d3502078e..170a15d71 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java @@ -1,186 +1,532 @@ -package com.genexus.genexusserverlessapi; - +package com.genexus.genexusserverlessapi ; +import com.genexus.*; import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; import java.util.*; -public final class SdtEventMessage extends GxUserType { - public SdtEventMessage() { - this(new ModelContext(SdtEventMessage.class)); - } - - public SdtEventMessage(ModelContext context) { - super(context, "SdtEventMessage"); - } - - public SdtEventMessage(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventMessage"); - } - - public SdtEventMessage(StructSdtEventMessage struct) { - this(); - setStruct(struct); - } - - private static java.util.HashMap mapper = new java.util.HashMap(); - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public String getgxTv_SdtEventMessage_Eventmessageid() { - return gxTv_SdtEventMessage_Eventmessageid; - } - - public void setgxTv_SdtEventMessage_Eventmessageid(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageid = value; - } - - public java.util.Date getgxTv_SdtEventMessage_Eventmessagedate() { - return gxTv_SdtEventMessage_Eventmessagedate; - } - - public void setgxTv_SdtEventMessage_Eventmessagedate(java.util.Date value) { - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedate = value; - } - - public String getgxTv_SdtEventMessage_Eventmessagesourcetype() { - return gxTv_SdtEventMessage_Eventmessagesourcetype; - } - - public void setgxTv_SdtEventMessage_Eventmessagesourcetype(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagesourcetype = value; - } - - public String getgxTv_SdtEventMessage_Eventmessagedata() { - return gxTv_SdtEventMessage_Eventmessagedata; - } - - public void setgxTv_SdtEventMessage_Eventmessagedata(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedata = value; - } - - public String getgxTv_SdtEventMessage_Eventmessageversion() { - return gxTv_SdtEventMessage_Eventmessageversion; - } - - public void setgxTv_SdtEventMessage_Eventmessageversion(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageversion = value; - } - - public GXBaseCollection getgxTv_SdtEventMessage_Eventmessagecustompayload() { - if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { - gxTv_SdtEventMessage_Eventmessagecustompayload = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); - } - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - return gxTv_SdtEventMessage_Eventmessagecustompayload; - } - - public void setgxTv_SdtEventMessage_Eventmessagecustompayload(GXBaseCollection value) { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagecustompayload = value; - } - - public void setgxTv_SdtEventMessage_Eventmessagecustompayload_SetNull() { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagecustompayload = null; - } - - public boolean getgxTv_SdtEventMessage_Eventmessagecustompayload_IsNull() { - if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { - return true; - } - return false; - } - - public byte getgxTv_SdtEventMessage_Eventmessagecustompayload_N() { - return gxTv_SdtEventMessage_Eventmessagecustompayload_N; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventMessage_Eventmessageid = ""; - gxTv_SdtEventMessage_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime(GXutil.nullDate()); - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagesourcetype = ""; - gxTv_SdtEventMessage_Eventmessagedata = ""; - gxTv_SdtEventMessage_Eventmessageversion = ""; - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - sTagName = ""; - sDateCnv = ""; - sNumToPad = ""; - datetime_STZ = GXutil.resetTime(GXutil.nullDate()); - } - - public byte isNull() { - return gxTv_SdtEventMessage_N; - } - - public com.genexus.genexusserverlessapi.SdtEventMessage Clone() { - return (com.genexus.genexusserverlessapi.SdtEventMessage) (clone()); - } - - public void setStruct(com.genexus.genexusserverlessapi.StructSdtEventMessage struct) { - setgxTv_SdtEventMessage_Eventmessageid(struct.getEventmessageid()); - if (struct.gxTv_SdtEventMessage_Eventmessagedate_N == 0) { - setgxTv_SdtEventMessage_Eventmessagedate(struct.getEventmessagedate()); - } - setgxTv_SdtEventMessage_Eventmessagesourcetype(struct.getEventmessagesourcetype()); - setgxTv_SdtEventMessage_Eventmessagedata(struct.getEventmessagedata()); - setgxTv_SdtEventMessage_Eventmessageversion(struct.getEventmessageversion()); - GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); - Vector gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 = struct.getEventmessagecustompayload(); - if (gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 != null) { - for (int i = 0; i < gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.size(); i++) { - gxTv_SdtEventMessage_Eventmessagecustompayload_aux.add(new com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem(gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.elementAt(i))); - } - } - setgxTv_SdtEventMessage_Eventmessagecustompayload(gxTv_SdtEventMessage_Eventmessagecustompayload_aux); - } - - @SuppressWarnings("unchecked") - public com.genexus.genexusserverlessapi.StructSdtEventMessage getStruct() { - com.genexus.genexusserverlessapi.StructSdtEventMessage struct = new com.genexus.genexusserverlessapi.StructSdtEventMessage(); - struct.setEventmessageid(getgxTv_SdtEventMessage_Eventmessageid()); - if (gxTv_SdtEventMessage_Eventmessagedate_N == 0) { - struct.setEventmessagedate(getgxTv_SdtEventMessage_Eventmessagedate()); - } - struct.setEventmessagesourcetype(getgxTv_SdtEventMessage_Eventmessagesourcetype()); - struct.setEventmessagedata(getgxTv_SdtEventMessage_Eventmessagedata()); - struct.setEventmessageversion(getgxTv_SdtEventMessage_Eventmessageversion()); - struct.setEventmessagecustompayload(getgxTv_SdtEventMessage_Eventmessagecustompayload().getStruct()); - return struct; - } - - protected byte gxTv_SdtEventMessage_N; - protected byte gxTv_SdtEventMessage_Eventmessagedate_N; - protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; - protected short readOk; - protected short nOutParmCount; - protected String sTagName; - protected String sDateCnv; - protected String sNumToPad; - protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate; - protected java.util.Date datetime_STZ; - protected boolean readElement; - protected boolean formatError; - protected String gxTv_SdtEventMessage_Eventmessagedata; - protected String gxTv_SdtEventMessage_Eventmessageid; - protected String gxTv_SdtEventMessage_Eventmessagesourcetype; - protected String gxTv_SdtEventMessage_Eventmessageversion; - protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux; - protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload = null; +public final class SdtEventMessage extends GxUserType +{ + public SdtEventMessage( ) + { + this( new ModelContext(SdtEventMessage.class)); + } + + public SdtEventMessage( ModelContext context ) + { + super( context, "SdtEventMessage"); + } + + public SdtEventMessage( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessage"); + } + + public SdtEventMessage( StructSdtEventMessage struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageId") ) + { + gxTv_SdtEventMessage_Eventmessageid = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageDate") ) + { + if ( ( GXutil.strcmp(oReader.getValue(), "") == 0 ) || ( oReader.existsAttribute("xsi:nil") == 1 ) ) + { + gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime( GXutil.nullDate() ); + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + } + else + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = localUtil.ymdhmsToT( (short)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 1, 4), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 6, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 9, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 12, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 15, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 18, 2), ".")))) ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageSourceType") ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageData") ) + { + gxTv_SdtEventMessage_Eventmessagedata = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageProperties") ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + gxTv_SdtEventMessage_Eventmessageproperties = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessage_Eventmessageproperties.readxmlcollection(oReader, "EventMessageProperties", "EventMessageProperty") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageProperties") ) + { + GXSoapError = oReader.read() ; + } + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageVersion") ) + { + gxTv_SdtEventMessage_Eventmessageversion = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessage" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + oWriter.writeElement("EventMessageId", gxTv_SdtEventMessage_Eventmessageid); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + if ( GXutil.dateCompare(GXutil.nullDate(), gxTv_SdtEventMessage_Eventmessagedate) && ( gxTv_SdtEventMessage_Eventmessagedate_N == 1 ) ) + { + oWriter.writeElement("EventMessageDate", ""); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + } + else + { + sDateCnv = "" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.year( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "0000", 1, 4-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.month( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.day( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "T" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.hour( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.minute( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.second( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + oWriter.writeElement("EventMessageDate", sDateCnv); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + } + oWriter.writeElement("EventMessageSourceType", gxTv_SdtEventMessage_Eventmessagesourcetype); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeElement("EventMessageData", gxTv_SdtEventMessage_Eventmessagedata); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + if ( gxTv_SdtEventMessage_Eventmessageproperties != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessage_Eventmessageproperties.writexmlcollection(oWriter, "EventMessageProperties", sNameSpace1, "EventMessageProperty", sNameSpace1); + } + oWriter.writeElement("EventMessageVersion", gxTv_SdtEventMessage_Eventmessageversion); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessage_Eventmessageid_N != 1 ) + { + AddObjectProperty("EventMessageId", gxTv_SdtEventMessage_Eventmessageid, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagedate_N != 1 ) + { + datetime_STZ = gxTv_SdtEventMessage_Eventmessagedate ; + sDateCnv = "" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.year( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "0000", 1, 4-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.month( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.day( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "T" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.hour( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.minute( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.second( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + AddObjectProperty("EventMessageDate", sDateCnv, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagesourcetype_N != 1 ) + { + AddObjectProperty("EventMessageSourceType", gxTv_SdtEventMessage_Eventmessagesourcetype, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagedata_N != 1 ) + { + AddObjectProperty("EventMessageData", gxTv_SdtEventMessage_Eventmessagedata, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessageproperties != null ) + { + AddObjectProperty("EventMessageProperties", gxTv_SdtEventMessage_Eventmessageproperties, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessageversion_N != 1 ) + { + AddObjectProperty("EventMessageVersion", gxTv_SdtEventMessage_Eventmessageversion, false, false); + } + } + + public String getgxTv_SdtEventMessage_Eventmessageid( ) + { + return gxTv_SdtEventMessage_Eventmessageid ; + } + + public void setgxTv_SdtEventMessage_Eventmessageid( String value ) + { + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageid = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageid_N( ) + { + return gxTv_SdtEventMessage_Eventmessageid_N ; + } + + public java.util.Date getgxTv_SdtEventMessage_Eventmessagedate( ) + { + return gxTv_SdtEventMessage_Eventmessagedate ; + } + + public void setgxTv_SdtEventMessage_Eventmessagedate( java.util.Date value ) + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagedate_N( ) + { + return gxTv_SdtEventMessage_Eventmessagedate_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessagesourcetype( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype ; + } + + public void setgxTv_SdtEventMessage_Eventmessagesourcetype( String value ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagesourcetype_N( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessagedata( ) + { + return gxTv_SdtEventMessage_Eventmessagedata ; + } + + public void setgxTv_SdtEventMessage_Eventmessagedata( String value ) + { + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedata = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagedata_N( ) + { + return gxTv_SdtEventMessage_Eventmessagedata_N ; + } + + public GXBaseCollection getgxTv_SdtEventMessage_Eventmessageproperties( ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + gxTv_SdtEventMessage_Eventmessageproperties = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessage_Eventmessageproperties ; + } + + public void setgxTv_SdtEventMessage_Eventmessageproperties( GXBaseCollection value ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageproperties = value ; + } + + public void setgxTv_SdtEventMessage_Eventmessageproperties_SetNull( ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties = null ; + } + + public boolean getgxTv_SdtEventMessage_Eventmessageproperties_IsNull( ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageproperties_N( ) + { + return gxTv_SdtEventMessage_Eventmessageproperties_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessageversion( ) + { + return gxTv_SdtEventMessage_Eventmessageversion ; + } + + public void setgxTv_SdtEventMessage_Eventmessageversion( String value ) + { + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageversion = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageversion_N( ) + { + return gxTv_SdtEventMessage_Eventmessageversion_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessage_Eventmessageid = "" ; + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime( GXutil.nullDate() ); + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = "" ; + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedata = "" ; + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageversion = "" ; + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(1) ; + sTagName = "" ; + sDateCnv = "" ; + sNumToPad = "" ; + datetime_STZ = GXutil.resetTime( GXutil.nullDate() ); + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessage Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessage)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessage struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessage_Eventmessageid(struct.getEventmessageid()); + if ( struct.gxTv_SdtEventMessage_Eventmessagedate_N == 0 ) + { + setgxTv_SdtEventMessage_Eventmessagedate(struct.getEventmessagedate()); + } + setgxTv_SdtEventMessage_Eventmessagesourcetype(struct.getEventmessagesourcetype()); + setgxTv_SdtEventMessage_Eventmessagedata(struct.getEventmessagedata()); + GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessage_Eventmessageproperties_aux1 = struct.getEventmessageproperties(); + if (gxTv_SdtEventMessage_Eventmessageproperties_aux1 != null) + { + for (int i = 0; i < gxTv_SdtEventMessage_Eventmessageproperties_aux1.size(); i++) + { + gxTv_SdtEventMessage_Eventmessageproperties_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessageProperty(gxTv_SdtEventMessage_Eventmessageproperties_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessage_Eventmessageproperties(gxTv_SdtEventMessage_Eventmessageproperties_aux); + setgxTv_SdtEventMessage_Eventmessageversion(struct.getEventmessageversion()); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessage getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessage struct = new com.genexus.genexusserverlessapi.StructSdtEventMessage (); + struct.setEventmessageid(getgxTv_SdtEventMessage_Eventmessageid()); + if ( gxTv_SdtEventMessage_Eventmessagedate_N == 0 ) + { + struct.setEventmessagedate(getgxTv_SdtEventMessage_Eventmessagedate()); + } + struct.setEventmessagesourcetype(getgxTv_SdtEventMessage_Eventmessagesourcetype()); + struct.setEventmessagedata(getgxTv_SdtEventMessage_Eventmessagedata()); + struct.setEventmessageproperties(getgxTv_SdtEventMessage_Eventmessageproperties().getStruct()); + struct.setEventmessageversion(getgxTv_SdtEventMessage_Eventmessageversion()); + return struct ; + } + + protected byte gxTv_SdtEventMessage_Eventmessageid_N ; + protected byte sdtIsNull ; + protected byte gxTv_SdtEventMessage_Eventmessagedate_N ; + protected byte gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedata_N ; + protected byte gxTv_SdtEventMessage_Eventmessageproperties_N ; + protected byte gxTv_SdtEventMessage_Eventmessageversion_N ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected String sDateCnv ; + protected String sNumToPad ; + protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate ; + protected java.util.Date datetime_STZ ; + protected boolean readElement ; + protected boolean formatError ; + protected String gxTv_SdtEventMessage_Eventmessagedata ; + protected String gxTv_SdtEventMessage_Eventmessageid ; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype ; + protected String gxTv_SdtEventMessage_Eventmessageversion ; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties=null ; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties_aux ; } diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java new file mode 100644 index 000000000..918a9c215 --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java @@ -0,0 +1,225 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessageProperty extends GxUserType +{ + public SdtEventMessageProperty( ) + { + this( new ModelContext(SdtEventMessageProperty.class)); + } + + public SdtEventMessageProperty( ModelContext context ) + { + super( context, "SdtEventMessageProperty"); + } + + public SdtEventMessageProperty( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessageProperty"); + } + + public SdtEventMessageProperty( StructSdtEventMessageProperty struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "PropertyId") ) + { + gxTv_SdtEventMessageProperty_Propertyid = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "PropertyValue") ) + { + gxTv_SdtEventMessageProperty_Propertyvalue = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessageProperty" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + oWriter.writeElement("PropertyId", gxTv_SdtEventMessageProperty_Propertyid); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeElement("PropertyValue", gxTv_SdtEventMessageProperty_Propertyvalue); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + AddObjectProperty("PropertyId", gxTv_SdtEventMessageProperty_Propertyid, false, false); + AddObjectProperty("PropertyValue", gxTv_SdtEventMessageProperty_Propertyvalue, false, false); + } + + public String getgxTv_SdtEventMessageProperty_Propertyid( ) + { + return gxTv_SdtEventMessageProperty_Propertyid ; + } + + public void setgxTv_SdtEventMessageProperty_Propertyid( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyid = value ; + } + + public String getgxTv_SdtEventMessageProperty_Propertyvalue( ) + { + return gxTv_SdtEventMessageProperty_Propertyvalue ; + } + + public void setgxTv_SdtEventMessageProperty_Propertyvalue( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyvalue = value ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessageProperty_Propertyid = "" ; + sdtIsNull = (byte)(1) ; + gxTv_SdtEventMessageProperty_Propertyvalue = "" ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessageProperty Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessageProperty)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessageProperty struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessageProperty_Propertyid(struct.getPropertyid()); + setgxTv_SdtEventMessageProperty_Propertyvalue(struct.getPropertyvalue()); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessageProperty getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessageProperty struct = new com.genexus.genexusserverlessapi.StructSdtEventMessageProperty (); + struct.setPropertyid(getgxTv_SdtEventMessageProperty_Propertyid()); + struct.setPropertyvalue(getgxTv_SdtEventMessageProperty_Propertyvalue()); + return struct ; + } + + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String gxTv_SdtEventMessageProperty_Propertyid ; + protected String gxTv_SdtEventMessageProperty_Propertyvalue ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; +} + diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java index f4868de13..c0eed2752 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java @@ -157,7 +157,7 @@ public boolean getgxTv_SdtEventMessageResponse_Handlefailure( ) public void setgxTv_SdtEventMessageResponse_Handlefailure( boolean value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Handlefailure = value ; } @@ -168,7 +168,7 @@ public String getgxTv_SdtEventMessageResponse_Errormessage( ) public void setgxTv_SdtEventMessageResponse_Errormessage( String value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Errormessage = value ; } @@ -179,14 +179,14 @@ public void initialize( int remoteHandle ) public void initialize( ) { - gxTv_SdtEventMessageResponse_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; gxTv_SdtEventMessageResponse_Errormessage = "" ; sTagName = "" ; } public byte isNull( ) { - return gxTv_SdtEventMessageResponse_N ; + return sdtIsNull ; } public com.genexus.genexusserverlessapi.SdtEventMessageResponse Clone( ) @@ -212,7 +212,7 @@ public com.genexus.genexusserverlessapi.StructSdtEventMessageResponse getStruct( return struct ; } - protected byte gxTv_SdtEventMessageResponse_N ; + protected byte sdtIsNull ; protected short readOk ; protected short nOutParmCount ; protected String sTagName ; diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java index af0c5fb35..6ef489957 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java @@ -1,116 +1,253 @@ -package com.genexus.genexusserverlessapi; - +package com.genexus.genexusserverlessapi ; import com.genexus.*; import com.genexus.*; import com.genexus.xml.*; import com.genexus.search.*; import com.genexus.webpanels.*; - import java.util.*; -public final class SdtEventMessages extends GxUserType { - public SdtEventMessages() { - this(new ModelContext(SdtEventMessages.class)); - } - - public SdtEventMessages(ModelContext context) { - super(context, "SdtEventMessages"); - } - - public SdtEventMessages(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventMessages"); - } - - public SdtEventMessages(StructSdtEventMessages struct) { - this(); - setStruct(struct); - } - - private static java.util.HashMap mapper = new java.util.HashMap(); - - static { - } - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public GXBaseCollection getgxTv_SdtEventMessages_Eventmessage() { - if (gxTv_SdtEventMessages_Eventmessage == null) { - gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); - } - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - return gxTv_SdtEventMessages_Eventmessage; - } - - public void setgxTv_SdtEventMessages_Eventmessage(GXBaseCollection value) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - gxTv_SdtEventMessages_Eventmessage = value; - } - - public void setgxTv_SdtEventMessages_Eventmessage_SetNull() { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - gxTv_SdtEventMessages_Eventmessage = null; - } - - public boolean getgxTv_SdtEventMessages_Eventmessage_IsNull() { - if (gxTv_SdtEventMessages_Eventmessage == null) { - return true; - } - return false; - } - - public byte getgxTv_SdtEventMessages_Eventmessage_N() { - return gxTv_SdtEventMessages_Eventmessage_N; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - gxTv_SdtEventMessages_N = (byte) (1); - sTagName = ""; - } - - public byte isNull() { - return gxTv_SdtEventMessages_N; - } - - public com.genexus.genexusserverlessapi.SdtEventMessages Clone() { - return (com.genexus.genexusserverlessapi.SdtEventMessages) (clone()); - } - - public void setStruct(com.genexus.genexusserverlessapi.StructSdtEventMessages struct) { - GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); - Vector gxTv_SdtEventMessages_Eventmessage_aux1 = struct.getEventmessage(); - if (gxTv_SdtEventMessages_Eventmessage_aux1 != null) { - for (int i = 0; i < gxTv_SdtEventMessages_Eventmessage_aux1.size(); i++) { - gxTv_SdtEventMessages_Eventmessage_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessage(gxTv_SdtEventMessages_Eventmessage_aux1.elementAt(i))); - } - } - setgxTv_SdtEventMessages_Eventmessage(gxTv_SdtEventMessages_Eventmessage_aux); - } - - @SuppressWarnings("unchecked") - public com.genexus.genexusserverlessapi.StructSdtEventMessages getStruct() { - com.genexus.genexusserverlessapi.StructSdtEventMessages struct = new com.genexus.genexusserverlessapi.StructSdtEventMessages(); - struct.setEventmessage(getgxTv_SdtEventMessages_Eventmessage().getStruct()); - return struct; - } - - protected byte gxTv_SdtEventMessages_Eventmessage_N; - protected byte gxTv_SdtEventMessages_N; - protected short readOk; - protected short nOutParmCount; - protected String sTagName; - protected boolean readElement; - protected boolean formatError; - protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux; - protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage = null; +public final class SdtEventMessages extends GxUserType +{ + public SdtEventMessages( ) + { + this( new ModelContext(SdtEventMessages.class)); + } + + public SdtEventMessages( ModelContext context ) + { + super( context, "SdtEventMessages"); + } + + public SdtEventMessages( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessages"); + } + + public SdtEventMessages( StructSdtEventMessages struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessage") ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessages_Eventmessage.readxmlcollection(oReader, "EventMessage", "EventMessage") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessage") ) + { + GXSoapError = oReader.read() ; + } + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessages" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + if ( gxTv_SdtEventMessages_Eventmessage != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessages_Eventmessage.writexmlcollection(oWriter, "EventMessage", sNameSpace1, "EventMessage", sNameSpace1); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessages_Eventmessage != null ) + { + AddObjectProperty("EventMessage", gxTv_SdtEventMessages_Eventmessage, false, false); + } + } + + public GXBaseCollection getgxTv_SdtEventMessages_Eventmessage( ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessages_Eventmessage ; + } + + public void setgxTv_SdtEventMessages_Eventmessage( GXBaseCollection value ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessages_Eventmessage = value ; + } + + public void setgxTv_SdtEventMessages_Eventmessage_SetNull( ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + gxTv_SdtEventMessages_Eventmessage = null ; + } + + public boolean getgxTv_SdtEventMessages_Eventmessage_IsNull( ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessages_Eventmessage_N( ) + { + return gxTv_SdtEventMessages_Eventmessage_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessages Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessages)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessages struct ) + { + if ( struct != null ) + { + GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessages_Eventmessage_aux1 = struct.getEventmessage(); + if (gxTv_SdtEventMessages_Eventmessage_aux1 != null) + { + for (int i = 0; i < gxTv_SdtEventMessages_Eventmessage_aux1.size(); i++) + { + gxTv_SdtEventMessages_Eventmessage_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessage(gxTv_SdtEventMessages_Eventmessage_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessages_Eventmessage(gxTv_SdtEventMessages_Eventmessage_aux); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessages getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessages struct = new com.genexus.genexusserverlessapi.StructSdtEventMessages (); + struct.setEventmessage(getgxTv_SdtEventMessages_Eventmessage().getStruct()); + return struct ; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N ; + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage=null ; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux ; } diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java new file mode 100644 index 000000000..423e6c68f --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java @@ -0,0 +1,243 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessagesList extends GxUserType +{ + public SdtEventMessagesList( ) + { + this( new ModelContext(SdtEventMessagesList.class)); + } + + public SdtEventMessagesList( ModelContext context ) + { + super( context, "SdtEventMessagesList"); + } + + public SdtEventMessagesList( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessagesList"); + } + + public SdtEventMessagesList( StructSdtEventMessagesList struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "items") ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessagesList_Items.readxmlcollection(oReader, "items", "Item") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "items") ) + { + GXSoapError = oReader.read() ; + } + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessagesList" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + if ( gxTv_SdtEventMessagesList_Items != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessagesList_Items.writexmlcollection(oWriter, "items", sNameSpace1, "Item", sNameSpace1); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessagesList_Items != null ) + { + AddObjectProperty("items", gxTv_SdtEventMessagesList_Items, false, false); + } + } + + public GXSimpleCollection getgxTv_SdtEventMessagesList_Items( ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessagesList_Items ; + } + + public void setgxTv_SdtEventMessagesList_Items( GXSimpleCollection value ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessagesList_Items = value ; + } + + public void setgxTv_SdtEventMessagesList_Items_SetNull( ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + gxTv_SdtEventMessagesList_Items = null ; + } + + public boolean getgxTv_SdtEventMessagesList_Items_IsNull( ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessagesList_Items_N( ) + { + return gxTv_SdtEventMessagesList_Items_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessagesList Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessagesList)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessagesList struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessagesList_Items(new GXSimpleCollection(String.class, "internal", "", struct.getItems())); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessagesList getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessagesList struct = new com.genexus.genexusserverlessapi.StructSdtEventMessagesList (); + struct.setItems(getgxTv_SdtEventMessagesList_Items().getStruct()); + return struct ; + } + + protected byte gxTv_SdtEventMessagesList_Items_N ; + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; + protected GXSimpleCollection gxTv_SdtEventMessagesList_Items=null ; +} + diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java deleted file mode 100644 index 38d73aaae..000000000 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.*; - -@javax.xml.bind.annotation.XmlType(name = "EventCustomPayload", namespace = "ServerlessAPI") -public final class StructSdtEventCustomPayload implements Cloneable, java.io.Serializable { - public StructSdtEventCustomPayload() { - this(-1, new ModelContext(StructSdtEventCustomPayload.class)); - } - - public StructSdtEventCustomPayload(int remoteHandle, - ModelContext context) { - } - - public StructSdtEventCustomPayload(java.util.Vector value) { - item = value; - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - @javax.xml.bind.annotation.XmlElement(name = "CustomPayloadItem", namespace = "ServerlessAPI") - public java.util.Vector getItem() { - return item; - } - - public void setItem(java.util.Vector value) { - item = value; - } - - protected java.util.Vector item = new java.util.Vector<>(); -} - diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java deleted file mode 100644 index d1485d4c7..000000000 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.*; - -public final class StructSdtEventCustomPayload_CustomPayloadItem implements Cloneable, java.io.Serializable { - public StructSdtEventCustomPayload_CustomPayloadItem() { - this(-1, new ModelContext(StructSdtEventCustomPayload_CustomPayloadItem.class)); - } - - public StructSdtEventCustomPayload_CustomPayloadItem(int remoteHandle, - ModelContext context) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public String getPropertyid() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; - } - - public void setPropertyid(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; - } - - public String getPropertyvalue() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - } - - public void setPropertyvalue(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; - } - - protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; -} - diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java index 2c5c3414e..13b9c7e68 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java @@ -1,100 +1,126 @@ -package com.genexus.genexusserverlessapi; - +package com.genexus.genexusserverlessapi ; import com.genexus.*; -public final class StructSdtEventMessage implements Cloneable, java.io.Serializable { - public StructSdtEventMessage() { - this(-1, new ModelContext(StructSdtEventMessage.class)); - } - - public StructSdtEventMessage(int remoteHandle, - ModelContext context) { - java.util.Calendar cal = java.util.Calendar.getInstance(); - cal.set(1, 0, 1, 0, 0, 0); - cal.set(java.util.Calendar.MILLISECOND, 0); - gxTv_SdtEventMessage_Eventmessageid = ""; - gxTv_SdtEventMessage_Eventmessagedate = cal.getTime(); - gxTv_SdtEventMessage_Eventmessagesourcetype = ""; - gxTv_SdtEventMessage_Eventmessagedata = ""; - gxTv_SdtEventMessage_Eventmessageversion = ""; - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public String getEventmessageid() { - return gxTv_SdtEventMessage_Eventmessageid; - } - - public void setEventmessageid(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageid = value; - } - - public java.util.Date getEventmessagedate() { - return gxTv_SdtEventMessage_Eventmessagedate; - } - - public void setEventmessagedate(java.util.Date value) { - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedate = value; - } - - public String getEventmessagesourcetype() { - return gxTv_SdtEventMessage_Eventmessagesourcetype; - } - - public void setEventmessagesourcetype(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagesourcetype = value; - } - - public String getEventmessagedata() { - return gxTv_SdtEventMessage_Eventmessagedata; - } - - public void setEventmessagedata(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedata = value; - } - - public String getEventmessageversion() { - return gxTv_SdtEventMessage_Eventmessageversion; - } - - public void setEventmessageversion(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageversion = value; - } - - public java.util.Vector getEventmessagecustompayload() { - return gxTv_SdtEventMessage_Eventmessagecustompayload; - } - - public void setEventmessagecustompayload(java.util.Vector value) { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagecustompayload = value; - } - - protected byte gxTv_SdtEventMessage_Eventmessagedate_N; - protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; - protected byte gxTv_SdtEventMessage_N; - protected String gxTv_SdtEventMessage_Eventmessagedata; - protected String gxTv_SdtEventMessage_Eventmessageid; - protected String gxTv_SdtEventMessage_Eventmessagesourcetype; - protected String gxTv_SdtEventMessage_Eventmessageversion; - protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate; - protected java.util.Vector gxTv_SdtEventMessage_Eventmessagecustompayload = null; +public final class StructSdtEventMessage implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessage( ) + { + this( -1, new ModelContext( StructSdtEventMessage.class )); + } + + public StructSdtEventMessage( int remoteHandle , + ModelContext context ) + { + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.set(1, 0, 1, 0, 0, 0); + cal.set(java.util.Calendar.MILLISECOND, 0); + gxTv_SdtEventMessage_Eventmessageid = "" ; + gxTv_SdtEventMessage_Eventmessagedate = cal.getTime() ; + gxTv_SdtEventMessage_Eventmessagesourcetype = "" ; + gxTv_SdtEventMessage_Eventmessagedata = "" ; + gxTv_SdtEventMessage_Eventmessageversion = "" ; + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public String getEventmessageid( ) + { + return gxTv_SdtEventMessage_Eventmessageid ; + } + + public void setEventmessageid( String value ) + { + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageid = value ; + } + + public java.util.Date getEventmessagedate( ) + { + return gxTv_SdtEventMessage_Eventmessagedate ; + } + + public void setEventmessagedate( java.util.Date value ) + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = value ; + } + + public String getEventmessagesourcetype( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype ; + } + + public void setEventmessagesourcetype( String value ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = value ; + } + + public String getEventmessagedata( ) + { + return gxTv_SdtEventMessage_Eventmessagedata ; + } + + public void setEventmessagedata( String value ) + { + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedata = value ; + } + + public java.util.Vector getEventmessageproperties( ) + { + return gxTv_SdtEventMessage_Eventmessageproperties ; + } + + public void setEventmessageproperties( java.util.Vector value ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageproperties = value ; + } + + public String getEventmessageversion( ) + { + return gxTv_SdtEventMessage_Eventmessageversion ; + } + + public void setEventmessageversion( String value ) + { + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageversion = value ; + } + + protected byte gxTv_SdtEventMessage_Eventmessageid_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedate_N ; + protected byte gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedata_N ; + protected byte gxTv_SdtEventMessage_Eventmessageproperties_N ; + protected byte gxTv_SdtEventMessage_Eventmessageversion_N ; + protected byte sdtIsNull ; + protected String gxTv_SdtEventMessage_Eventmessagedata ; + protected String gxTv_SdtEventMessage_Eventmessageid ; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype ; + protected String gxTv_SdtEventMessage_Eventmessageversion ; + protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate ; + protected java.util.Vector gxTv_SdtEventMessage_Eventmessageproperties=null ; } diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java new file mode 100644 index 000000000..543aaeb2f --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java @@ -0,0 +1,54 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessageProperty implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessageProperty( ) + { + this( -1, new ModelContext( StructSdtEventMessageProperty.class )); + } + + public StructSdtEventMessageProperty( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessageProperty_Propertyid = "" ; + gxTv_SdtEventMessageProperty_Propertyvalue = "" ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public String getPropertyid( ) + { + return gxTv_SdtEventMessageProperty_Propertyid ; + } + + public void setPropertyid( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyid = value ; + } + + public String getPropertyvalue( ) + { + return gxTv_SdtEventMessageProperty_Propertyvalue ; + } + + public void setPropertyvalue( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyvalue = value ; + } + + protected byte sdtIsNull ; + protected String gxTv_SdtEventMessageProperty_Propertyid ; + protected String gxTv_SdtEventMessageProperty_Propertyvalue ; +} + diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java index 4f78a73e9..f390dd9c2 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java @@ -31,7 +31,7 @@ public boolean getHandlefailure( ) public void setHandlefailure( boolean value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Handlefailure = value ; } @@ -42,11 +42,11 @@ public String getErrormessage( ) public void setErrormessage( String value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Errormessage = value ; } - protected byte gxTv_SdtEventMessageResponse_N ; + protected byte sdtIsNull ; protected boolean gxTv_SdtEventMessageResponse_Handlefailure ; protected String gxTv_SdtEventMessageResponse_Errormessage ; } diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java index 18a558a2d..e1ac05e3b 100644 --- a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java @@ -1,39 +1,43 @@ -package com.genexus.genexusserverlessapi; - +package com.genexus.genexusserverlessapi ; import com.genexus.*; -public final class StructSdtEventMessages implements Cloneable, java.io.Serializable { - public StructSdtEventMessages() { - this(-1, new ModelContext(StructSdtEventMessages.class)); - } - - public StructSdtEventMessages(int remoteHandle, - ModelContext context) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public java.util.Vector getEventmessage() { - return gxTv_SdtEventMessages_Eventmessage; - } - - public void setEventmessage(java.util.Vector value) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - gxTv_SdtEventMessages_Eventmessage = value; - } - - protected byte gxTv_SdtEventMessages_Eventmessage_N; - protected byte gxTv_SdtEventMessages_N; - protected java.util.Vector gxTv_SdtEventMessages_Eventmessage = null; +public final class StructSdtEventMessages implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessages( ) + { + this( -1, new ModelContext( StructSdtEventMessages.class )); + } + + public StructSdtEventMessages( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public java.util.Vector getEventmessage( ) + { + return gxTv_SdtEventMessages_Eventmessage ; + } + + public void setEventmessage( java.util.Vector value ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessages_Eventmessage = value ; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N ; + protected byte sdtIsNull ; + protected java.util.Vector gxTv_SdtEventMessages_Eventmessage=null ; } diff --git a/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java new file mode 100644 index 000000000..a770155e1 --- /dev/null +++ b/gxawsserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java @@ -0,0 +1,43 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessagesList implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessagesList( ) + { + this( -1, new ModelContext( StructSdtEventMessagesList.class )); + } + + public StructSdtEventMessagesList( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public java.util.Vector getItems( ) + { + return gxTv_SdtEventMessagesList_Items ; + } + + public void setItems( java.util.Vector value ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessagesList_Items = value ; + } + + protected byte gxTv_SdtEventMessagesList_Items_N ; + protected byte sdtIsNull ; + protected java.util.Vector gxTv_SdtEventMessagesList_Items=null ; +} + diff --git a/gxazureserverless/pom.xml b/gxazureserverless/pom.xml index 391bdc2f9..6fa7fef36 100644 --- a/gxazureserverless/pom.xml +++ b/gxazureserverless/pom.xml @@ -51,12 +51,6 @@ 4.0.1 - - com.azure - azure-messaging-servicebus - 7.17.1 - - com.azure azure-messaging-eventgrid diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java index 6371911a2..d9de15c96 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java @@ -1,5 +1,5 @@ package com.genexus.cloud.serverless.azure.handler; -import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.JSONHelper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.CosmosDBTrigger; @@ -35,7 +35,7 @@ public void run( eventMessagesList = setupEventMessagesList(items); break; default: - rawMessage = Helper.toJSONString(items); + rawMessage = JSONHelper.toJSONString(items); break; } try { @@ -54,7 +54,7 @@ private EventMessagesList setupEventMessagesList(List> jsonLi { EventMessagesList messagesList = new EventMessagesList(); for (Map json : jsonList) { - messagesList.addItem(Helper.toJSONString(json)); + messagesList.addItem(JSONHelper.toJSONString(json)); } return messagesList; } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java index 90e3e5f4d..3aa86be12 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridCloudHandler.java @@ -45,9 +45,7 @@ protected void setupEventGridMessage(String eventJson) throws JsonProcessingExce ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(io.cloudevents.jackson.JsonFormat.getCloudEventJacksonModule()); CloudEvent cloudEvent = objectMapper.readValue(eventJson, CloudEvent.class); - EventMessage msg = new EventMessage(); - msg.setMessageId(cloudEvent.getId()); msg.setMessageSourceType(cloudEvent.getType()); msg.setMessageVersion(""); @@ -66,7 +64,6 @@ protected void setupEventGridMessage(String eventJson) throws JsonProcessingExce msgAtts.add(new EventMessageProperty("SpecVersion", cloudEvent.getSpecVersion().toString())); if (cloudEvent.getTime() != null) msgAtts.add(new EventMessageProperty("Time", cloudEvent.getTime().toString())); - msgs.add(msg); } catch (Exception e) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java index ab046a874..df304349a 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureEventGridHandler.java @@ -1,7 +1,7 @@ package com.genexus.cloud.serverless.azure.handler; import com.azure.messaging.eventgrid.EventGridEvent; -import com.genexus.cloud.serverless.Helper; +import com.genexus.cloud.serverless.JSONHelper; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.EventGridTrigger; @@ -59,7 +59,7 @@ protected void setupEventGridMessage(EventGridEvent event) { break; case 1: case 2: - rawMessage = Helper.toJSONString(event); + rawMessage = JSONHelper.toJSONString(event); } } } \ No newline at end of file diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index 524f41914..bfca74424 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -5,6 +5,7 @@ import com.microsoft.azure.functions.annotation.*; import com.microsoft.azure.functions.ExecutionContext; +import java.time.Instant; import java.util.List; import java.util.*; @@ -23,18 +24,26 @@ public void run( final ExecutionContext context) throws Exception { context.getLogger().info("GeneXus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - setupServerlessMappings(context.getFunctionName()); - EventMessages msgs = new EventMessages(); if (executor.getMethodSignatureIdx() == 0) { EventMessage msg = new EventMessage(); msg.setMessageId(id); msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); - msg.setMessageDate(new Date()); + try { + String sanitizedTime = insertionTime.replace("\"", ""); + if (!sanitizedTime.endsWith("Z")) { + sanitizedTime += "Z"; + } + Instant instant = Instant.from(Instant.parse(sanitizedTime)); + msg.setMessageDate(Date.from(instant)); + } + catch (Exception exception) + { + context.getLogger().severe(exception.toString()); + } msg.setMessageData(message); List msgAtts = msg.getMessageProperties(); - msgAtts.add(new EventMessageProperty("Id", id)); msgAtts.add(new EventMessageProperty("DequeueCount", Long.toString(dequeCount))); msgAtts.add(new EventMessageProperty("ExpirationTime", expirationTime)); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java index 30186fca7..4975a104c 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java @@ -1,35 +1,29 @@ package com.genexus.cloud.serverless.azure.handler; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; +import com.genexus.cloud.serverless.helpers.ServiceBusBatchMessageProcessor; +import com.genexus.cloud.serverless.helpers.ServiceBusProcessedMessage; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.*; -import java.util.List; - public class AzureServiceBusQueueHandler extends AzureEventHandler { - EventMessages msgs = new EventMessages(); - String rawMessage = ""; - public AzureServiceBusQueueHandler() throws Exception { super(); } public void run( @ServiceBusQueueTrigger(name = "messages", queueName = "%queue_name%", connection = "%queue_connection%", cardinality = Cardinality.MANY) - List messages, + String[] messages, final ExecutionContext context ) throws Exception { context.getLogger().info("GeneXus Service Bus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - setupServerlessMappings(context.getFunctionName()); - setupServiceBusMessages(messages); + ServiceBusBatchMessageProcessor queueBatchMessageProcessor = new ServiceBusBatchMessageProcessor(); + ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(executor,messages); try { - EventMessageResponse response = dispatchEvent(msgs, rawMessage); + EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(),queueMessage.getRawMessage()); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -39,15 +33,4 @@ public void run( throw e; //Throw the exception so the runtime can Retry the operation. } } - - protected void setupServiceBusMessages(List messages) { - switch (executor.getMethodSignatureIdx()) { - case 0: - msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); - break; - case 1: - case 2: - rawMessage = Helper.toJSONString(messages); - } - } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java index 0c40aaf58..ee9c45820 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueSingleMsgHandler.java @@ -1,58 +1,40 @@ package com.genexus.cloud.serverless.azure.handler; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.helpers.ServiceBusProcessedMessage; +import com.genexus.cloud.serverless.helpers.ServiceBusSingleMessageProcessor; +import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.BindingName; import com.microsoft.azure.functions.annotation.Cardinality; import com.microsoft.azure.functions.annotation.ServiceBusQueueTrigger; -import java.util.ArrayList; -import java.util.List; - public class AzureServiceBusQueueSingleMsgHandler extends AzureEventHandler { - EventMessages msgs = new EventMessages(); - String rawMessage = ""; - public AzureServiceBusQueueSingleMsgHandler() throws Exception { super(); } public void run( @ServiceBusQueueTrigger(name = "messages", queueName = "%queue_name%", connection = "%queue_connection%", cardinality = Cardinality.ONE) - ServiceBusReceivedMessage message, + String message, + @BindingName("MessageId") String messageId, + @BindingName("EnqueuedTimeUtc") String enqueuedTimeUtc, // (ISO-8601) final ExecutionContext context ) throws Exception { context.getLogger().info("GeneXus Service Bus Queue trigger single message process handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - List messages = new ArrayList<>(); - messages.add(message); setupServerlessMappings(context.getFunctionName()); - - setupServiceBusMessages(messages); + ServiceBusSingleMessageProcessor queueSingleMessageProcessor = new ServiceBusSingleMessageProcessor(); + ServiceBusProcessedMessage queueMessage = queueSingleMessageProcessor.processQueueMessage(executor,messageId,enqueuedTimeUtc,context,message); try { - EventMessageResponse response = dispatchEvent(msgs, rawMessage); + EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(), queueMessage.getRawMessage()); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } } catch (Exception e) { logger.error("HandleRequest execution error", e); - throw e; //Throw the exception so the runtime can Retry the operation. - } - } - - protected void setupServiceBusMessages(List messages) { - switch (executor.getMethodSignatureIdx()) { - case 0: - msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); - break; - case 1: - case 2: - rawMessage = Helper.toJSONString(messages); + throw e; //Throw the exception so the runtime can Retry the operation. } } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java index 6791dfffe..016dd26ad 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java @@ -1,35 +1,29 @@ package com.genexus.cloud.serverless.azure.handler; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; +import com.genexus.cloud.serverless.helpers.ServiceBusBatchMessageProcessor; +import com.genexus.cloud.serverless.helpers.ServiceBusProcessedMessage; import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.*; -import java.util.List; - public class AzureServiceBusTopicHandler extends AzureEventHandler { - EventMessages msgs = new EventMessages(); - String rawMessage = ""; - public AzureServiceBusTopicHandler() throws Exception { super(); } public void run( @ServiceBusTopicTrigger(name = "messages", topicName = "%topic_name%", subscriptionName = "%subscriptionName%", connection = "%queue_connection%", cardinality = Cardinality.MANY) - List messages, + String[] messages, final ExecutionContext context ) throws Exception { context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - setupServerlessMappings(context.getFunctionName()); - setupServiceBusMessages(messages); + ServiceBusBatchMessageProcessor queueBatchMessageProcessor = new ServiceBusBatchMessageProcessor(); + ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(executor,messages); try { - EventMessageResponse response = dispatchEvent(msgs,rawMessage); + EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(), queueMessage.getRawMessage()); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. @@ -39,15 +33,4 @@ public void run( throw e; //Throw the exception so the runtime can Retry the operation. } } - - protected void setupServiceBusMessages(List messages) { - switch (executor.getMethodSignatureIdx()) { - case 0: - msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); - break; - case 1: - case 2: - rawMessage = Helper.toJSONString(messages); - } - } } diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java index 9f9061638..2e3cc218e 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicSingleMsgHandler.java @@ -1,57 +1,41 @@ package com.genexus.cloud.serverless.azure.handler; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.Helper; -import com.genexus.cloud.serverless.helpers.ServiceBusMessagesSetup; -import com.genexus.cloud.serverless.model.EventMessageResponse; -import com.genexus.cloud.serverless.model.EventMessages; +import com.genexus.cloud.serverless.helpers.ServiceBusProcessedMessage; +import com.genexus.cloud.serverless.helpers.ServiceBusSingleMessageProcessor; +import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.annotation.BindingName; import com.microsoft.azure.functions.annotation.Cardinality; import com.microsoft.azure.functions.annotation.ServiceBusTopicTrigger; -import java.util.ArrayList; -import java.util.List; - public class AzureServiceBusTopicSingleMsgHandler extends AzureEventHandler { - EventMessages msgs = new EventMessages(); - String rawMessage = ""; - public AzureServiceBusTopicSingleMsgHandler() throws Exception { super(); } public void run( @ServiceBusTopicTrigger(name = "messages", topicName = "%topic_name%", subscriptionName = "%subscriptionName%", connection = "%queue_connection%", cardinality = Cardinality.ONE) - ServiceBusReceivedMessage message, + String message, + @BindingName("MessageId") String messageId, + @BindingName("EnqueuedTimeUtc") String enqueuedTimeUtc, // (ISO-8601) final ExecutionContext context ) throws Exception { - context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - + context.getLogger().info("GeneXus Service Bus Topic trigger single message handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); setupServerlessMappings(context.getFunctionName()); - List messages = new ArrayList<>(); - messages.add(message); + ServiceBusSingleMessageProcessor queueSingleMessageProcessor = new ServiceBusSingleMessageProcessor(); + ServiceBusProcessedMessage queueMessage = queueSingleMessageProcessor.processQueueMessage(executor,messageId,enqueuedTimeUtc,context,message); try { - EventMessageResponse response = dispatchEvent(msgs,rawMessage); + EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(),queueMessage.getRawMessage()); if (response.hasFailed()) { logger.error(String.format("Messages were not handled. Error: %s", response.getErrorMessage())); throw new RuntimeException(response.getErrorMessage()); //Throw the exception so the runtime can Retry the operation. } } catch (Exception e) { logger.error("HandleRequest execution error", e); - throw e; //Throw the exception so the runtime can Retry the operation. - } - } - - protected void setupServiceBusMessages(List messages) { - switch (executor.getMethodSignatureIdx()) { - case 0: - msgs = ServiceBusMessagesSetup.setupservicebuslistmsgs(messages); - break; - case 1: - case 2: - rawMessage = Helper.toJSONString(messages); + throw e; //Throw the exception so the runtime can Retry the operation. } } } + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java new file mode 100644 index 000000000..eaa332a1a --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java @@ -0,0 +1,31 @@ +package com.genexus.cloud.serverless.helpers; + +import com.genexus.cloud.serverless.GXProcedureExecutor; +import com.genexus.cloud.serverless.JSONHelper; +import com.genexus.cloud.serverless.model.EventMessage; +import com.genexus.cloud.serverless.model.EventMessages; +import com.sun.jna.platform.win32.Guid; + +public class ServiceBusBatchMessageProcessor { + public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor executor, String[] messages) { + String rawMessage = ""; + EventMessages eventMessages = new EventMessages(); + switch (executor.getMethodSignatureIdx()) { + case 0: { + for(String message : messages) + { + EventMessage msg = new EventMessage(); + msg.setMessageId(Guid.GUID.newGuid().toString()); // This is a fake Id. + msg.setMessageData(message); + eventMessages.add(msg); + } + } + break; + case 1: + case 2: + rawMessage = JSONHelper.toJSONString(messages); + break; + } + return new ServiceBusProcessedMessage(eventMessages,rawMessage); + } +} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java deleted file mode 100644 index 2c61d7d8a..000000000 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusMessagesSetup.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.genexus.cloud.serverless.helpers; - -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.model.EventMessage; -import com.genexus.cloud.serverless.model.EventMessageProperty; -import com.genexus.cloud.serverless.model.EventMessageSourceType; -import com.genexus.cloud.serverless.model.EventMessages; - -import java.util.Date; -import java.util.List; - -public class ServiceBusMessagesSetup { - public static EventMessages setupservicebuslistmsgs(List messages) - { - EventMessages eventmessages = new EventMessages(); - for (ServiceBusReceivedMessage message : messages) { - - EventMessage msg = new EventMessage(); - msg.setMessageId(message.getMessageId()); - msg.setMessageSourceType(EventMessageSourceType.SERVICE_BUS_MESSAGE); - - msg.setMessageDate(new Date()); - msg.setMessageData(message.getBody().toString()); - - List msgAtts = msg.getMessageProperties(); - - msgAtts.add(new EventMessageProperty("Id", message.getMessageId())); - msgAtts.add(new EventMessageProperty("Content-Type", message.getContentType())); - msgAtts.add(new EventMessageProperty("SessionId", message.getSessionId())); - msgAtts.add(new EventMessageProperty("Subject", message.getSubject())); - msgAtts.add(new EventMessageProperty("SequenceNumber", String.valueOf(message.getSequenceNumber()))); - msgAtts.add(new EventMessageProperty("EnqueuedSequenceNumber", String.valueOf(message.getEnqueuedSequenceNumber()))); - msgAtts.add(new EventMessageProperty("CorrelationId", message.getCorrelationId())); - msgAtts.add(new EventMessageProperty("DeliveryCount", String.valueOf(message.getDeliveryCount()))); - - msgAtts.add(new EventMessageProperty("TimeToLive", String.valueOf(message.getTimeToLive()))); - msgAtts.add(new EventMessageProperty("EnqueuedTime", String.valueOf(message.getEnqueuedTime()))); - msgAtts.add(new EventMessageProperty("ExpiresAt", String.valueOf(message.getExpiresAt()))); - msgAtts.add(new EventMessageProperty("LockedUntil", String.valueOf(message.getLockedUntil()))); - msgAtts.add(new EventMessageProperty("LockToken", message.getLockToken())); - - msgAtts.add(new EventMessageProperty("DeadLetterErrorDescription", message.getDeadLetterErrorDescription())); - msgAtts.add(new EventMessageProperty("DeadLetterReason", message.getDeadLetterReason())); - msgAtts.add(new EventMessageProperty("DeadLetterSource", message.getDeadLetterSource())); - - msgAtts.add(new EventMessageProperty("PartitionKey", message.getPartitionKey())); - msgAtts.add(new EventMessageProperty("To", message.getTo())); - msgAtts.add(new EventMessageProperty("ReplyTo", message.getReplyTo())); - msgAtts.add(new EventMessageProperty("ReplyToSessionId", message.getReplyToSessionId())); - - msgAtts.add(new EventMessageProperty("State", String.valueOf(message.getState()))); - - eventmessages.add(msg); - } - return eventmessages; - } -} diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusProcessedMessage.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusProcessedMessage.java new file mode 100644 index 000000000..853d58596 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusProcessedMessage.java @@ -0,0 +1,21 @@ +package com.genexus.cloud.serverless.helpers; +import com.genexus.cloud.serverless.model.EventMessages; + +public class ServiceBusProcessedMessage { + private final EventMessages _eventMessages; + private final String _rawMessage; + + public ServiceBusProcessedMessage(EventMessages eventMessages, String rawMessage) { + this._eventMessages = eventMessages; + this._rawMessage = rawMessage; + } + + public EventMessages getEventMessages() { + return _eventMessages; + } + + public String getRawMessage() { + return _rawMessage; + } +} + diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java new file mode 100644 index 000000000..979eafe98 --- /dev/null +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java @@ -0,0 +1,47 @@ +package com.genexus.cloud.serverless.helpers; + +import com.genexus.cloud.serverless.GXProcedureExecutor; +import com.genexus.cloud.serverless.model.*; +import com.microsoft.azure.functions.ExecutionContext; + +import java.time.Instant; +import java.util.Date; +import java.util.List; + +public class ServiceBusSingleMessageProcessor { + + public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor executor, String messageId, String enqueuedTimeUtc, ExecutionContext context, String message){ + EventMessages eventmessages = new EventMessages(); + String rawMessage = ""; + switch (executor.getMethodSignatureIdx()) { + case 0: { + EventMessage msg = new EventMessage(); + msg.setMessageId(messageId); + msg.setMessageSourceType(EventMessageSourceType.SERVICE_BUS_MESSAGE); + try { + String sanitizedTime = enqueuedTimeUtc.replace("\"", ""); + if (!sanitizedTime.endsWith("Z")) { + sanitizedTime += "Z"; + } + Instant instant = Instant.from(Instant.parse(sanitizedTime)); + msg.setMessageDate(Date.from(instant)); + } + catch (Exception exception) + { + context.getLogger().severe(exception.toString()); + } + msg.setMessageData(message); + List msgProperties = msg.getMessageProperties(); + msgProperties.add(new EventMessageProperty("Id", messageId)); + msgProperties.add(new EventMessageProperty("EnqueuedTime", enqueuedTimeUtc)); + eventmessages.add(msg); + } + break; + case 1: + case 2: + rawMessage = message; + break; + } + return new ServiceBusProcessedMessage(eventmessages,rawMessage); + } +} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java deleted file mode 100644 index 28968706a..000000000 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.genexus.cloud.azure.events; -import com.azure.core.util.BinaryData; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; -import com.genexus.cloud.serverless.azure.handler.AzureServiceBusQueueHandler; -import com.microsoft.azure.functions.ExecutionContext; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -public class TestAzureServiceBusHandler { - private AzureServiceBusQueueHandler sbqueueFunction; - private ExecutionContext context; - - @BeforeEach - public void setup() throws Exception { - sbqueueFunction = new AzureServiceBusQueueHandler(); - } - - @Test - public void testSBTriggerFunctionRaw() throws Exception { - List messages = loadmessages(); - - context = new MockExecutionContext("TestServiceBusRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab0"); - sbqueueFunction.run(messages,context); - - assertNotNull(context.getLogger()); - context.getLogger().info("Logger is not null"); - } - @Test - public void testSBTriggerFunctionMessage() throws Exception { - List messages = loadmessages(); - context = new MockExecutionContext("TestServiceBusMessage","13e2d1f9-6838-4927-a6a8-0160e8601ab1"); - sbqueueFunction.run(messages,context); - - assertNotNull(context.getLogger()); - context.getLogger().info("Logger is not null"); - } - - private List loadmessages() { - String id = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; - long sequenceNumber = 1123456789; - String subject = "testsubject1"; - - List messages = new ArrayList<>(); - ServiceBusReceivedMessage message1 = Mockito.mock(ServiceBusReceivedMessage.class); - Mockito.when(message1.getBody()).thenReturn(BinaryData.fromBytes("Test message Service Bus Queue 1".getBytes())); - Mockito.when(message1.getMessageId()).thenReturn(id); - Mockito.when(message1.getContentType()).thenReturn("application/octet-stream"); - Mockito.when(message1.getSequenceNumber()).thenReturn(sequenceNumber); - Mockito.when(message1.getSubject()).thenReturn(subject); - messages.add(message1); - - id = "ac6105de-9715-4753-9c80-4c07c4c8bda4"; - sequenceNumber = 1123456780; - subject = "testsubject2"; - ServiceBusReceivedMessage message2 = Mockito.mock(ServiceBusReceivedMessage.class); - Mockito.when(message2.getBody()).thenReturn(BinaryData.fromBytes("Test message Service Bus Queue 2".getBytes())); - Mockito.when(message2.getMessageId()).thenReturn(id); - Mockito.when(message2.getContentType()).thenReturn("application/octet-stream"); - Mockito.when(message2.getSequenceNumber()).thenReturn(sequenceNumber); - Mockito.when(message2.getSubject()).thenReturn(subject); - - messages.add(message2); - return messages; - } -} diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusSingleMessageHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusSingleMessageHandler.java new file mode 100644 index 000000000..0f8e0733b --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureServiceBusSingleMessageHandler.java @@ -0,0 +1,59 @@ +package com.genexus.cloud.azure.events; + +import com.genexus.cloud.serverless.azure.handler.AzureServiceBusQueueSingleMsgHandler; + +import com.microsoft.azure.functions.ExecutionContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class TestAzureServiceBusSingleMessageHandler { + private AzureServiceBusQueueSingleMsgHandler queueFunction; + private ExecutionContext context; + + @BeforeEach + public void setup() throws Exception { + queueFunction = new AzureServiceBusQueueSingleMsgHandler(); + } + + @Test + public void testSBTriggerFunctionRaw() throws Exception { + + String messageId = "ac6105de-9715-4753-9c80-4c07c4c8bda3"; + String enqueuedTimeUtc = "2025-01-01T12:34:56Z"; + String message = "Test message Service Bus Queue 1"; + + context = new MockExecutionContext("TestServiceBusRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab0"); + queueFunction.run(message,messageId,enqueuedTimeUtc,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + @Test + public void testSBTriggerFunctionRaw2() throws Exception { + + String messageId = "ac6105de-9715-4753-9c80-4c07c4c8bda4"; + String enqueuedTimeUtc = "2025-01-01T12:34:56Z"; + String message = "{\"UserId\":\"d2376a4c-86c3-461f-93cc-1c2e0174222b\", \"UserName\":\"John\"}"; + + context = new MockExecutionContext("TestServiceBusRaw","13e2d1f9-6838-4927-a6a8-0160e8601ab1"); + queueFunction.run(message,messageId,enqueuedTimeUtc,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } + @Test + public void testSBTriggerFunctionMessage() throws Exception { + + String messageId = "ac6105de-9715-4753-9c80-4c07c4c8bda5"; + String enqueuedTimeUtc = "2025-01-01T12:34:56Z"; + String message = "{\"UserId\":\"d2376a4c-86c3-461f-93cc-1c2e0174222a\", \"UserName\":\"Mary\"}"; + + context = new MockExecutionContext("TestServiceBusMessage","13e2d1f9-6838-4927-a6a8-0160e8601ab1"); + queueFunction.run(message,messageId,enqueuedTimeUtc,context); + + assertNotNull(context.getLogger()); + context.getLogger().info("Logger is not null"); + } +} diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java new file mode 100644 index 000000000..170a15d71 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessage.java @@ -0,0 +1,532 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessage extends GxUserType +{ + public SdtEventMessage( ) + { + this( new ModelContext(SdtEventMessage.class)); + } + + public SdtEventMessage( ModelContext context ) + { + super( context, "SdtEventMessage"); + } + + public SdtEventMessage( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessage"); + } + + public SdtEventMessage( StructSdtEventMessage struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageId") ) + { + gxTv_SdtEventMessage_Eventmessageid = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageDate") ) + { + if ( ( GXutil.strcmp(oReader.getValue(), "") == 0 ) || ( oReader.existsAttribute("xsi:nil") == 1 ) ) + { + gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime( GXutil.nullDate() ); + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + } + else + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = localUtil.ymdhmsToT( (short)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 1, 4), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 6, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 9, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 12, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 15, 2), "."))), (byte)(DecimalUtil.decToDouble(CommonUtil.decimalVal( GXutil.substring( oReader.getValue(), 18, 2), ".")))) ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageSourceType") ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageData") ) + { + gxTv_SdtEventMessage_Eventmessagedata = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageProperties") ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + gxTv_SdtEventMessage_Eventmessageproperties = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessage_Eventmessageproperties.readxmlcollection(oReader, "EventMessageProperties", "EventMessageProperty") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageProperties") ) + { + GXSoapError = oReader.read() ; + } + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessageVersion") ) + { + gxTv_SdtEventMessage_Eventmessageversion = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessage" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + oWriter.writeElement("EventMessageId", gxTv_SdtEventMessage_Eventmessageid); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + if ( GXutil.dateCompare(GXutil.nullDate(), gxTv_SdtEventMessage_Eventmessagedate) && ( gxTv_SdtEventMessage_Eventmessagedate_N == 1 ) ) + { + oWriter.writeElement("EventMessageDate", ""); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + } + else + { + sDateCnv = "" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.year( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "0000", 1, 4-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.month( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.day( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "T" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.hour( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.minute( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.second( gxTv_SdtEventMessage_Eventmessagedate), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + oWriter.writeElement("EventMessageDate", sDateCnv); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + } + oWriter.writeElement("EventMessageSourceType", gxTv_SdtEventMessage_Eventmessagesourcetype); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeElement("EventMessageData", gxTv_SdtEventMessage_Eventmessagedata); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + if ( gxTv_SdtEventMessage_Eventmessageproperties != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessage_Eventmessageproperties.writexmlcollection(oWriter, "EventMessageProperties", sNameSpace1, "EventMessageProperty", sNameSpace1); + } + oWriter.writeElement("EventMessageVersion", gxTv_SdtEventMessage_Eventmessageversion); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessage_Eventmessageid_N != 1 ) + { + AddObjectProperty("EventMessageId", gxTv_SdtEventMessage_Eventmessageid, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagedate_N != 1 ) + { + datetime_STZ = gxTv_SdtEventMessage_Eventmessagedate ; + sDateCnv = "" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.year( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "0000", 1, 4-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.month( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "-" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.day( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += "T" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.hour( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.minute( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + sDateCnv += ":" ; + sNumToPad = GXutil.trim( GXutil.str( GXutil.second( datetime_STZ), 10, 0)) ; + sDateCnv += GXutil.substring( "00", 1, 2-GXutil.len( sNumToPad)) + sNumToPad ; + AddObjectProperty("EventMessageDate", sDateCnv, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagesourcetype_N != 1 ) + { + AddObjectProperty("EventMessageSourceType", gxTv_SdtEventMessage_Eventmessagesourcetype, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessagedata_N != 1 ) + { + AddObjectProperty("EventMessageData", gxTv_SdtEventMessage_Eventmessagedata, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessageproperties != null ) + { + AddObjectProperty("EventMessageProperties", gxTv_SdtEventMessage_Eventmessageproperties, false, false); + } + if ( gxTv_SdtEventMessage_Eventmessageversion_N != 1 ) + { + AddObjectProperty("EventMessageVersion", gxTv_SdtEventMessage_Eventmessageversion, false, false); + } + } + + public String getgxTv_SdtEventMessage_Eventmessageid( ) + { + return gxTv_SdtEventMessage_Eventmessageid ; + } + + public void setgxTv_SdtEventMessage_Eventmessageid( String value ) + { + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageid = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageid_N( ) + { + return gxTv_SdtEventMessage_Eventmessageid_N ; + } + + public java.util.Date getgxTv_SdtEventMessage_Eventmessagedate( ) + { + return gxTv_SdtEventMessage_Eventmessagedate ; + } + + public void setgxTv_SdtEventMessage_Eventmessagedate( java.util.Date value ) + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagedate_N( ) + { + return gxTv_SdtEventMessage_Eventmessagedate_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessagesourcetype( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype ; + } + + public void setgxTv_SdtEventMessage_Eventmessagesourcetype( String value ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagesourcetype_N( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessagedata( ) + { + return gxTv_SdtEventMessage_Eventmessagedata ; + } + + public void setgxTv_SdtEventMessage_Eventmessagedata( String value ) + { + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedata = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessagedata_N( ) + { + return gxTv_SdtEventMessage_Eventmessagedata_N ; + } + + public GXBaseCollection getgxTv_SdtEventMessage_Eventmessageproperties( ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + gxTv_SdtEventMessage_Eventmessageproperties = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessage_Eventmessageproperties ; + } + + public void setgxTv_SdtEventMessage_Eventmessageproperties( GXBaseCollection value ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageproperties = value ; + } + + public void setgxTv_SdtEventMessage_Eventmessageproperties_SetNull( ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties = null ; + } + + public boolean getgxTv_SdtEventMessage_Eventmessageproperties_IsNull( ) + { + if ( gxTv_SdtEventMessage_Eventmessageproperties == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageproperties_N( ) + { + return gxTv_SdtEventMessage_Eventmessageproperties_N ; + } + + public String getgxTv_SdtEventMessage_Eventmessageversion( ) + { + return gxTv_SdtEventMessage_Eventmessageversion ; + } + + public void setgxTv_SdtEventMessage_Eventmessageversion( String value ) + { + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageversion = value ; + } + + public byte getgxTv_SdtEventMessage_Eventmessageversion_N( ) + { + return gxTv_SdtEventMessage_Eventmessageversion_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessage_Eventmessageid = "" ; + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime( GXutil.nullDate() ); + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = "" ; + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedata = "" ; + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageversion = "" ; + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(1) ; + sTagName = "" ; + sDateCnv = "" ; + sNumToPad = "" ; + datetime_STZ = GXutil.resetTime( GXutil.nullDate() ); + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessage Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessage)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessage struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessage_Eventmessageid(struct.getEventmessageid()); + if ( struct.gxTv_SdtEventMessage_Eventmessagedate_N == 0 ) + { + setgxTv_SdtEventMessage_Eventmessagedate(struct.getEventmessagedate()); + } + setgxTv_SdtEventMessage_Eventmessagesourcetype(struct.getEventmessagesourcetype()); + setgxTv_SdtEventMessage_Eventmessagedata(struct.getEventmessagedata()); + GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessageProperty.class, "EventMessageProperty", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessage_Eventmessageproperties_aux1 = struct.getEventmessageproperties(); + if (gxTv_SdtEventMessage_Eventmessageproperties_aux1 != null) + { + for (int i = 0; i < gxTv_SdtEventMessage_Eventmessageproperties_aux1.size(); i++) + { + gxTv_SdtEventMessage_Eventmessageproperties_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessageProperty(gxTv_SdtEventMessage_Eventmessageproperties_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessage_Eventmessageproperties(gxTv_SdtEventMessage_Eventmessageproperties_aux); + setgxTv_SdtEventMessage_Eventmessageversion(struct.getEventmessageversion()); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessage getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessage struct = new com.genexus.genexusserverlessapi.StructSdtEventMessage (); + struct.setEventmessageid(getgxTv_SdtEventMessage_Eventmessageid()); + if ( gxTv_SdtEventMessage_Eventmessagedate_N == 0 ) + { + struct.setEventmessagedate(getgxTv_SdtEventMessage_Eventmessagedate()); + } + struct.setEventmessagesourcetype(getgxTv_SdtEventMessage_Eventmessagesourcetype()); + struct.setEventmessagedata(getgxTv_SdtEventMessage_Eventmessagedata()); + struct.setEventmessageproperties(getgxTv_SdtEventMessage_Eventmessageproperties().getStruct()); + struct.setEventmessageversion(getgxTv_SdtEventMessage_Eventmessageversion()); + return struct ; + } + + protected byte gxTv_SdtEventMessage_Eventmessageid_N ; + protected byte sdtIsNull ; + protected byte gxTv_SdtEventMessage_Eventmessagedate_N ; + protected byte gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedata_N ; + protected byte gxTv_SdtEventMessage_Eventmessageproperties_N ; + protected byte gxTv_SdtEventMessage_Eventmessageversion_N ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected String sDateCnv ; + protected String sNumToPad ; + protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate ; + protected java.util.Date datetime_STZ ; + protected boolean readElement ; + protected boolean formatError ; + protected String gxTv_SdtEventMessage_Eventmessagedata ; + protected String gxTv_SdtEventMessage_Eventmessageid ; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype ; + protected String gxTv_SdtEventMessage_Eventmessageversion ; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties=null ; + protected GXBaseCollection gxTv_SdtEventMessage_Eventmessageproperties_aux ; +} + diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java new file mode 100644 index 000000000..918a9c215 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageProperty.java @@ -0,0 +1,225 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessageProperty extends GxUserType +{ + public SdtEventMessageProperty( ) + { + this( new ModelContext(SdtEventMessageProperty.class)); + } + + public SdtEventMessageProperty( ModelContext context ) + { + super( context, "SdtEventMessageProperty"); + } + + public SdtEventMessageProperty( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessageProperty"); + } + + public SdtEventMessageProperty( StructSdtEventMessageProperty struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "PropertyId") ) + { + gxTv_SdtEventMessageProperty_Propertyid = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "PropertyValue") ) + { + gxTv_SdtEventMessageProperty_Propertyvalue = oReader.getValue() ; + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + GXSoapError = oReader.read() ; + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessageProperty" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + oWriter.writeElement("PropertyId", gxTv_SdtEventMessageProperty_Propertyid); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeElement("PropertyValue", gxTv_SdtEventMessageProperty_Propertyvalue); + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") != 0 ) + { + oWriter.writeAttribute("xmlns", "ServerlessAPI"); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + AddObjectProperty("PropertyId", gxTv_SdtEventMessageProperty_Propertyid, false, false); + AddObjectProperty("PropertyValue", gxTv_SdtEventMessageProperty_Propertyvalue, false, false); + } + + public String getgxTv_SdtEventMessageProperty_Propertyid( ) + { + return gxTv_SdtEventMessageProperty_Propertyid ; + } + + public void setgxTv_SdtEventMessageProperty_Propertyid( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyid = value ; + } + + public String getgxTv_SdtEventMessageProperty_Propertyvalue( ) + { + return gxTv_SdtEventMessageProperty_Propertyvalue ; + } + + public void setgxTv_SdtEventMessageProperty_Propertyvalue( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyvalue = value ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessageProperty_Propertyid = "" ; + sdtIsNull = (byte)(1) ; + gxTv_SdtEventMessageProperty_Propertyvalue = "" ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessageProperty Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessageProperty)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessageProperty struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessageProperty_Propertyid(struct.getPropertyid()); + setgxTv_SdtEventMessageProperty_Propertyvalue(struct.getPropertyvalue()); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessageProperty getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessageProperty struct = new com.genexus.genexusserverlessapi.StructSdtEventMessageProperty (); + struct.setPropertyid(getgxTv_SdtEventMessageProperty_Propertyid()); + struct.setPropertyvalue(getgxTv_SdtEventMessageProperty_Propertyvalue()); + return struct ; + } + + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String gxTv_SdtEventMessageProperty_Propertyid ; + protected String gxTv_SdtEventMessageProperty_Propertyvalue ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java similarity index 86% rename from gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java rename to gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java index 7e5acc0dd..c0eed2752 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessageResponse.java @@ -1,12 +1,10 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.GXutil; -import com.genexus.GxUserType; -import com.genexus.ModelContext; -import com.genexus.xml.XMLReader; -import com.genexus.xml.XMLWriter; - -import java.util.HashMap; +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; public final class SdtEventMessageResponse extends GxUserType { @@ -32,7 +30,7 @@ public SdtEventMessageResponse( StructSdtEventMessageResponse struct ) setStruct(struct); } - private static HashMap mapper = new HashMap(); + private static java.util.HashMap mapper = new java.util.HashMap(); static { } @@ -42,7 +40,7 @@ public String getJsonMap( String value ) return (String) mapper.get(value); } - public short readxml( XMLReader oReader , + public short readxml( com.genexus.xml.XMLReader oReader , String sName ) { short GXSoapError = 1; @@ -93,14 +91,14 @@ public short readxml( XMLReader oReader , return GXSoapError ; } - public void writexml( XMLWriter oWriter , + public void writexml( com.genexus.xml.XMLWriter oWriter , String sName , String sNameSpace ) { writexml(oWriter, sName, sNameSpace, true); } - public void writexml( XMLWriter oWriter , + public void writexml( com.genexus.xml.XMLWriter oWriter , String sName , String sNameSpace , boolean sIncludeState ) @@ -159,7 +157,7 @@ public boolean getgxTv_SdtEventMessageResponse_Handlefailure( ) public void setgxTv_SdtEventMessageResponse_Handlefailure( boolean value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Handlefailure = value ; } @@ -170,7 +168,7 @@ public String getgxTv_SdtEventMessageResponse_Errormessage( ) public void setgxTv_SdtEventMessageResponse_Errormessage( String value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Errormessage = value ; } @@ -181,14 +179,14 @@ public void initialize( int remoteHandle ) public void initialize( ) { - gxTv_SdtEventMessageResponse_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; gxTv_SdtEventMessageResponse_Errormessage = "" ; sTagName = "" ; } public byte isNull( ) { - return gxTv_SdtEventMessageResponse_N ; + return sdtIsNull ; } public com.genexus.genexusserverlessapi.SdtEventMessageResponse Clone( ) @@ -196,7 +194,7 @@ public com.genexus.genexusserverlessapi.SdtEventMessageResponse Clone( ) return (com.genexus.genexusserverlessapi.SdtEventMessageResponse)(clone()) ; } - public void setStruct( StructSdtEventMessageResponse struct ) + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessageResponse struct ) { if ( struct != null ) { @@ -206,15 +204,15 @@ public void setStruct( StructSdtEventMessageResponse struct ) } @SuppressWarnings("unchecked") - public StructSdtEventMessageResponse getStruct( ) + public com.genexus.genexusserverlessapi.StructSdtEventMessageResponse getStruct( ) { - StructSdtEventMessageResponse struct = new StructSdtEventMessageResponse (); + com.genexus.genexusserverlessapi.StructSdtEventMessageResponse struct = new com.genexus.genexusserverlessapi.StructSdtEventMessageResponse (); struct.setHandlefailure(getgxTv_SdtEventMessageResponse_Handlefailure()); struct.setErrormessage(getgxTv_SdtEventMessageResponse_Errormessage()); return struct ; } - protected byte gxTv_SdtEventMessageResponse_N ; + protected byte sdtIsNull ; protected short readOk ; protected short nOutParmCount ; protected String sTagName ; diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java new file mode 100644 index 000000000..6ef489957 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessages.java @@ -0,0 +1,253 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessages extends GxUserType +{ + public SdtEventMessages( ) + { + this( new ModelContext(SdtEventMessages.class)); + } + + public SdtEventMessages( ModelContext context ) + { + super( context, "SdtEventMessages"); + } + + public SdtEventMessages( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessages"); + } + + public SdtEventMessages( StructSdtEventMessages struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessage") ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessages_Eventmessage.readxmlcollection(oReader, "EventMessage", "EventMessage") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "EventMessage") ) + { + GXSoapError = oReader.read() ; + } + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessages" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + if ( gxTv_SdtEventMessages_Eventmessage != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessages_Eventmessage.writexmlcollection(oWriter, "EventMessage", sNameSpace1, "EventMessage", sNameSpace1); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessages_Eventmessage != null ) + { + AddObjectProperty("EventMessage", gxTv_SdtEventMessages_Eventmessage, false, false); + } + } + + public GXBaseCollection getgxTv_SdtEventMessages_Eventmessage( ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + } + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessages_Eventmessage ; + } + + public void setgxTv_SdtEventMessages_Eventmessage( GXBaseCollection value ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessages_Eventmessage = value ; + } + + public void setgxTv_SdtEventMessages_Eventmessage_SetNull( ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + gxTv_SdtEventMessages_Eventmessage = null ; + } + + public boolean getgxTv_SdtEventMessages_Eventmessage_IsNull( ) + { + if ( gxTv_SdtEventMessages_Eventmessage == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessages_Eventmessage_N( ) + { + return gxTv_SdtEventMessages_Eventmessage_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessages Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessages)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessages struct ) + { + if ( struct != null ) + { + GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); + Vector gxTv_SdtEventMessages_Eventmessage_aux1 = struct.getEventmessage(); + if (gxTv_SdtEventMessages_Eventmessage_aux1 != null) + { + for (int i = 0; i < gxTv_SdtEventMessages_Eventmessage_aux1.size(); i++) + { + gxTv_SdtEventMessages_Eventmessage_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessage(gxTv_SdtEventMessages_Eventmessage_aux1.elementAt(i))); + } + } + setgxTv_SdtEventMessages_Eventmessage(gxTv_SdtEventMessages_Eventmessage_aux); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessages getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessages struct = new com.genexus.genexusserverlessapi.StructSdtEventMessages (); + struct.setEventmessage(getgxTv_SdtEventMessages_Eventmessage().getStruct()); + return struct ; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N ; + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage=null ; + protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux ; +} + diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java new file mode 100644 index 000000000..423e6c68f --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java @@ -0,0 +1,243 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; +import com.genexus.*; +import com.genexus.xml.*; +import com.genexus.search.*; +import com.genexus.webpanels.*; +import java.util.*; + +public final class SdtEventMessagesList extends GxUserType +{ + public SdtEventMessagesList( ) + { + this( new ModelContext(SdtEventMessagesList.class)); + } + + public SdtEventMessagesList( ModelContext context ) + { + super( context, "SdtEventMessagesList"); + } + + public SdtEventMessagesList( int remoteHandle , + ModelContext context ) + { + super( remoteHandle, context, "SdtEventMessagesList"); + } + + public SdtEventMessagesList( StructSdtEventMessagesList struct ) + { + this(); + setStruct(struct); + } + + private static java.util.HashMap mapper = new java.util.HashMap(); + static + { + } + + public String getJsonMap( String value ) + { + return (String) mapper.get(value); + } + + public short readxml( com.genexus.xml.XMLReader oReader , + String sName ) + { + short GXSoapError = 1; + formatError = false ; + sTagName = oReader.getName() ; + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = oReader.read() ; + nOutParmCount = (short)(0) ; + while ( ( ( GXutil.strcmp(oReader.getName(), sTagName) != 0 ) || ( oReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) ) + { + readOk = (short)(0) ; + readElement = false ; + if ( GXutil.strcmp2( oReader.getLocalName(), "items") ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + if ( oReader.getIsSimple() == 0 ) + { + GXSoapError = gxTv_SdtEventMessagesList_Items.readxmlcollection(oReader, "items", "Item") ; + } + readElement = true ; + if ( GXSoapError > 0 ) + { + readOk = (short)(1) ; + } + if ( GXutil.strcmp2( oReader.getLocalName(), "items") ) + { + GXSoapError = oReader.read() ; + } + } + if ( ! readElement ) + { + readOk = (short)(1) ; + GXSoapError = oReader.read() ; + } + nOutParmCount = (short)(nOutParmCount+1) ; + if ( ( readOk == 0 ) || formatError ) + { + context.globals.sSOAPErrMsg += "Error reading " + sTagName + GXutil.newLine( ) ; + context.globals.sSOAPErrMsg += "Message: " + oReader.readRawXML() ; + GXSoapError = (short)(nOutParmCount*-1) ; + } + } + } + return GXSoapError ; + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace ) + { + writexml(oWriter, sName, sNameSpace, true); + } + + public void writexml( com.genexus.xml.XMLWriter oWriter , + String sName , + String sNameSpace , + boolean sIncludeState ) + { + if ( (GXutil.strcmp("", sName)==0) ) + { + sName = "EventMessagesList" ; + } + if ( (GXutil.strcmp("", sNameSpace)==0) ) + { + sNameSpace = "ServerlessAPI" ; + } + oWriter.writeStartElement(sName); + if ( GXutil.strcmp(GXutil.left( sNameSpace, 10), "[*:nosend]") != 0 ) + { + oWriter.writeAttribute("xmlns", sNameSpace); + } + else + { + sNameSpace = GXutil.right( sNameSpace, GXutil.len( sNameSpace)-10) ; + } + if ( gxTv_SdtEventMessagesList_Items != null ) + { + String sNameSpace1; + if ( GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0 ) + { + sNameSpace1 = "[*:nosend]" + "ServerlessAPI" ; + } + else + { + sNameSpace1 = "ServerlessAPI" ; + } + gxTv_SdtEventMessagesList_Items.writexmlcollection(oWriter, "items", sNameSpace1, "Item", sNameSpace1); + } + oWriter.writeEndElement(); + } + + public void tojson( ) + { + tojson( true) ; + } + + public void tojson( boolean includeState ) + { + tojson( includeState, true) ; + } + + public void tojson( boolean includeState , + boolean includeNonInitialized ) + { + if ( gxTv_SdtEventMessagesList_Items != null ) + { + AddObjectProperty("items", gxTv_SdtEventMessagesList_Items, false, false); + } + } + + public GXSimpleCollection getgxTv_SdtEventMessagesList_Items( ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); + } + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + return gxTv_SdtEventMessagesList_Items ; + } + + public void setgxTv_SdtEventMessagesList_Items( GXSimpleCollection value ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessagesList_Items = value ; + } + + public void setgxTv_SdtEventMessagesList_Items_SetNull( ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + gxTv_SdtEventMessagesList_Items = null ; + } + + public boolean getgxTv_SdtEventMessagesList_Items_IsNull( ) + { + if ( gxTv_SdtEventMessagesList_Items == null ) + { + return true ; + } + return false ; + } + + public byte getgxTv_SdtEventMessagesList_Items_N( ) + { + return gxTv_SdtEventMessagesList_Items_N ; + } + + public void initialize( int remoteHandle ) + { + initialize( ) ; + } + + public void initialize( ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + sdtIsNull = (byte)(1) ; + sTagName = "" ; + } + + public byte isNull( ) + { + return sdtIsNull ; + } + + public com.genexus.genexusserverlessapi.SdtEventMessagesList Clone( ) + { + return (com.genexus.genexusserverlessapi.SdtEventMessagesList)(clone()) ; + } + + public void setStruct( com.genexus.genexusserverlessapi.StructSdtEventMessagesList struct ) + { + if ( struct != null ) + { + setgxTv_SdtEventMessagesList_Items(new GXSimpleCollection(String.class, "internal", "", struct.getItems())); + } + } + + @SuppressWarnings("unchecked") + public com.genexus.genexusserverlessapi.StructSdtEventMessagesList getStruct( ) + { + com.genexus.genexusserverlessapi.StructSdtEventMessagesList struct = new com.genexus.genexusserverlessapi.StructSdtEventMessagesList (); + struct.setItems(getgxTv_SdtEventMessagesList_Items().getStruct()); + return struct ; + } + + protected byte gxTv_SdtEventMessagesList_Items_N ; + protected byte sdtIsNull ; + protected short readOk ; + protected short nOutParmCount ; + protected String sTagName ; + protected boolean readElement ; + protected boolean formatError ; + protected GXSimpleCollection gxTv_SdtEventMessagesList_Items=null ; +} + diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java new file mode 100644 index 000000000..13b9c7e68 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java @@ -0,0 +1,126 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessage implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessage( ) + { + this( -1, new ModelContext( StructSdtEventMessage.class )); + } + + public StructSdtEventMessage( int remoteHandle , + ModelContext context ) + { + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.set(1, 0, 1, 0, 0, 0); + cal.set(java.util.Calendar.MILLISECOND, 0); + gxTv_SdtEventMessage_Eventmessageid = "" ; + gxTv_SdtEventMessage_Eventmessagedate = cal.getTime() ; + gxTv_SdtEventMessage_Eventmessagesourcetype = "" ; + gxTv_SdtEventMessage_Eventmessagedata = "" ; + gxTv_SdtEventMessage_Eventmessageversion = "" ; + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(1) ; + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public String getEventmessageid( ) + { + return gxTv_SdtEventMessage_Eventmessageid ; + } + + public void setEventmessageid( String value ) + { + gxTv_SdtEventMessage_Eventmessageid_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageid = value ; + } + + public java.util.Date getEventmessagedate( ) + { + return gxTv_SdtEventMessage_Eventmessagedate ; + } + + public void setEventmessagedate( java.util.Date value ) + { + gxTv_SdtEventMessage_Eventmessagedate_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedate = value ; + } + + public String getEventmessagesourcetype( ) + { + return gxTv_SdtEventMessage_Eventmessagesourcetype ; + } + + public void setEventmessagesourcetype( String value ) + { + gxTv_SdtEventMessage_Eventmessagesourcetype_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagesourcetype = value ; + } + + public String getEventmessagedata( ) + { + return gxTv_SdtEventMessage_Eventmessagedata ; + } + + public void setEventmessagedata( String value ) + { + gxTv_SdtEventMessage_Eventmessagedata_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessagedata = value ; + } + + public java.util.Vector getEventmessageproperties( ) + { + return gxTv_SdtEventMessage_Eventmessageproperties ; + } + + public void setEventmessageproperties( java.util.Vector value ) + { + gxTv_SdtEventMessage_Eventmessageproperties_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageproperties = value ; + } + + public String getEventmessageversion( ) + { + return gxTv_SdtEventMessage_Eventmessageversion ; + } + + public void setEventmessageversion( String value ) + { + gxTv_SdtEventMessage_Eventmessageversion_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessage_Eventmessageversion = value ; + } + + protected byte gxTv_SdtEventMessage_Eventmessageid_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedate_N ; + protected byte gxTv_SdtEventMessage_Eventmessagesourcetype_N ; + protected byte gxTv_SdtEventMessage_Eventmessagedata_N ; + protected byte gxTv_SdtEventMessage_Eventmessageproperties_N ; + protected byte gxTv_SdtEventMessage_Eventmessageversion_N ; + protected byte sdtIsNull ; + protected String gxTv_SdtEventMessage_Eventmessagedata ; + protected String gxTv_SdtEventMessage_Eventmessageid ; + protected String gxTv_SdtEventMessage_Eventmessagesourcetype ; + protected String gxTv_SdtEventMessage_Eventmessageversion ; + protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate ; + protected java.util.Vector gxTv_SdtEventMessage_Eventmessageproperties=null ; +} + diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java new file mode 100644 index 000000000..543aaeb2f --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageProperty.java @@ -0,0 +1,54 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessageProperty implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessageProperty( ) + { + this( -1, new ModelContext( StructSdtEventMessageProperty.class )); + } + + public StructSdtEventMessageProperty( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessageProperty_Propertyid = "" ; + gxTv_SdtEventMessageProperty_Propertyvalue = "" ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public String getPropertyid( ) + { + return gxTv_SdtEventMessageProperty_Propertyid ; + } + + public void setPropertyid( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyid = value ; + } + + public String getPropertyvalue( ) + { + return gxTv_SdtEventMessageProperty_Propertyvalue ; + } + + public void setPropertyvalue( String value ) + { + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessageProperty_Propertyvalue = value ; + } + + protected byte sdtIsNull ; + protected String gxTv_SdtEventMessageProperty_Propertyid ; + protected String gxTv_SdtEventMessageProperty_Propertyvalue ; +} + diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java similarity index 83% rename from gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java rename to gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java index ecc385d26..f390dd9c2 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessageResponse.java @@ -1,6 +1,5 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; +package com.genexus.genexusserverlessapi ; +import com.genexus.*; public final class StructSdtEventMessageResponse implements Cloneable, java.io.Serializable { @@ -32,7 +31,7 @@ public boolean getHandlefailure( ) public void setHandlefailure( boolean value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Handlefailure = value ; } @@ -43,11 +42,11 @@ public String getErrormessage( ) public void setErrormessage( String value ) { - gxTv_SdtEventMessageResponse_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; gxTv_SdtEventMessageResponse_Errormessage = value ; } - protected byte gxTv_SdtEventMessageResponse_N ; + protected byte sdtIsNull ; protected boolean gxTv_SdtEventMessageResponse_Handlefailure ; protected String gxTv_SdtEventMessageResponse_Errormessage ; } diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java new file mode 100644 index 000000000..e1ac05e3b --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java @@ -0,0 +1,43 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessages implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessages( ) + { + this( -1, new ModelContext( StructSdtEventMessages.class )); + } + + public StructSdtEventMessages( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public java.util.Vector getEventmessage( ) + { + return gxTv_SdtEventMessages_Eventmessage ; + } + + public void setEventmessage( java.util.Vector value ) + { + gxTv_SdtEventMessages_Eventmessage_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessages_Eventmessage = value ; + } + + protected byte gxTv_SdtEventMessages_Eventmessage_N ; + protected byte sdtIsNull ; + protected java.util.Vector gxTv_SdtEventMessages_Eventmessage=null ; +} + diff --git a/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java new file mode 100644 index 000000000..a770155e1 --- /dev/null +++ b/gxazureserverless/src/test/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java @@ -0,0 +1,43 @@ +package com.genexus.genexusserverlessapi ; +import com.genexus.*; + +public final class StructSdtEventMessagesList implements Cloneable, java.io.Serializable +{ + public StructSdtEventMessagesList( ) + { + this( -1, new ModelContext( StructSdtEventMessagesList.class )); + } + + public StructSdtEventMessagesList( int remoteHandle , + ModelContext context ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(1) ; + } + + public Object clone() + { + Object cloned = null; + try + { + cloned = super.clone(); + }catch (CloneNotSupportedException e){ ; } + return cloned; + } + + public java.util.Vector getItems( ) + { + return gxTv_SdtEventMessagesList_Items ; + } + + public void setItems( java.util.Vector value ) + { + gxTv_SdtEventMessagesList_Items_N = (byte)(0) ; + sdtIsNull = (byte)(0) ; + gxTv_SdtEventMessagesList_Items = value ; + } + + protected byte gxTv_SdtEventMessagesList_Items_N ; + protected byte sdtIsNull ; + protected java.util.Vector gxTv_SdtEventMessagesList_Items=null ; +} + diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java index 500cf445a..77991048f 100644 --- a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent.java @@ -1,7 +1,7 @@ package com.unittest.eventdriven.servicebus; import com.genexus.GXProcedure; -import com.genexus.GXutil; + import com.genexus.ModelContext; import com.genexus.genexusserverlessapi.SdtEventMessageResponse; diff --git a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java index 8b9348fb6..64ca592a0 100644 --- a/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java +++ b/gxazureserverless/src/test/java/com/unittest/eventdriven/servicebus/handlesbqueueazureevent2.java @@ -45,6 +45,7 @@ protected void privateExecute() { AV10EventMessage = (com.genexus.genexusserverlessapi.SdtEventMessage) ((com.genexus.genexusserverlessapi.SdtEventMessage) AV8EventMessages.getgxTv_SdtEventMessages_Eventmessage().elementAt(-1 + AV16GXV1)); System.out.println("MessageData: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata()); System.out.println("MessageId: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessageid()); + System.out.println("MessageDate: " + AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedate()); AV9EventMessageResponse.setgxTv_SdtEventMessageResponse_Handlefailure(AV10EventMessage.getgxTv_SdtEventMessage_Eventmessagedata() == ""); if (AV9EventMessageResponse.getgxTv_SdtEventMessageResponse_Handlefailure()) { System.out.println("EventMessageData could not be parsed."); diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java index c57930a35..6035b22d2 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/GXProcedureExecutor.java @@ -77,7 +77,7 @@ public EventMessageResponse execute(ModelContext modelContext, EventMessages msg Class inputClass = Class.forName(MESSAGE_COLLECTION_INPUT_CLASS_NAME); Object msgsInput = inputClass.getConstructor().newInstance(); if (GxUserType.class.isAssignableFrom(inputClass)) { - ((GxUserType) msgsInput).fromJSonString(Helper.toJSONString(msgs)); + ((GxUserType) msgsInput).fromJSonString(JSONHelper.toJSONString(msgs)); } parameters = new Object[]{msgsInput, new Object[]{}}; break; @@ -95,7 +95,7 @@ public EventMessageResponse execute(ModelContext modelContext, EventMessages msg Class inputListClass = Class.forName(MESSAGE_COLLECTION_LIST_CLASS_NAME); Object msgsListInput = inputListClass.getConstructor().newInstance(); if (GxUserType.class.isAssignableFrom(inputListClass)) { - ((GxUserType) msgsListInput).fromJSonString(Helper.toJSONString(msgsList)); + ((GxUserType) msgsListInput).fromJSonString(JSONHelper.toJSONString(msgsList)); } parameters = new Object[]{msgsListInput, new Object[]{}}; break; diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/JSONHelper.java similarity index 53% rename from gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java rename to gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/JSONHelper.java index 5270988d9..e67359e64 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/Helper.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/JSONHelper.java @@ -1,21 +1,28 @@ package com.genexus.cloud.serverless; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.genexus.cloud.serverless.model.EventMessage; import com.genexus.cloud.serverless.model.EventMessageProperty; import com.genexus.diagnostics.core.ILogger; import com.genexus.diagnostics.core.LogManager; -public class Helper { +import java.text.SimpleDateFormat; - private static final ILogger logger = LogManager.getLogger(Helper.class); +public class JSONHelper { + + private static final ILogger logger = LogManager.getLogger(JSONHelper.class); public static String toJSONString(Object dtoObject) { try { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); - return mapper.writeValueAsString(dtoObject); + + JsonMapper jsonMapper = new JsonMapper(); + jsonMapper.registerModule(new JavaTimeModule()); + jsonMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + jsonMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + String json = jsonMapper.writeValueAsString(dtoObject); + return json; } catch (Exception e) { logger.error("Failed to serialize object to jsonString", e); diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java index 3dbd4a078..b90f6ec60 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/model/EventMessage.java @@ -1,5 +1,6 @@ package com.genexus.cloud.serverless.model; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; @@ -10,6 +11,7 @@ public class EventMessage { @JsonProperty("EventMessageId") private String messageId; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") @JsonProperty("EventMessageDate") private Date messageDate; diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java deleted file mode 100644 index f778cf525..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventCustomPayload_CustomPayloadItem.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.GxUserType; -import com.genexus.ModelContext; - -import java.util.HashMap; - -public final class SdtEventCustomPayload_CustomPayloadItem extends GxUserType { - public SdtEventCustomPayload_CustomPayloadItem() { - this(new ModelContext(SdtEventCustomPayload_CustomPayloadItem.class)); - } - - public SdtEventCustomPayload_CustomPayloadItem(ModelContext context) { - super(context, "SdtEventCustomPayload_CustomPayloadItem"); - } - - public SdtEventCustomPayload_CustomPayloadItem(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventCustomPayload_CustomPayloadItem"); - } - - public SdtEventCustomPayload_CustomPayloadItem(StructSdtEventCustomPayload_CustomPayloadItem struct) { - this(); - setStruct(struct); - } - - private static HashMap mapper = new HashMap(); - - static { - } - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; - } - - public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; - } - - public String getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - } - - public void setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (1); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; - sTagName = ""; - } - - public byte isNull() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - } - - public com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem Clone() { - return (com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem) (clone()); - } - - public void setStruct(StructSdtEventCustomPayload_CustomPayloadItem struct) { - setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid(struct.getPropertyid()); - setgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue(struct.getPropertyvalue()); - } - - @SuppressWarnings("unchecked") - public StructSdtEventCustomPayload_CustomPayloadItem getStruct() { - StructSdtEventCustomPayload_CustomPayloadItem struct = new StructSdtEventCustomPayload_CustomPayloadItem(); - struct.setPropertyid(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid()); - struct.setPropertyvalue(getgxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue()); - return struct; - } - - protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - protected short readOk; - protected short nOutParmCount; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - protected String sTagName; - protected boolean readElement; - protected boolean formatError; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java deleted file mode 100644 index c56599c0c..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessage.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.GXBaseCollection; -import com.genexus.GXutil; -import com.genexus.GxUserType; -import com.genexus.ModelContext; - -import java.util.Date; -import java.util.HashMap; -import java.util.Vector; - -public final class SdtEventMessage extends GxUserType { - public SdtEventMessage() { - this(new ModelContext(SdtEventMessage.class)); - } - - public SdtEventMessage(ModelContext context) { - super(context, "SdtEventMessage"); - } - - public SdtEventMessage(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventMessage"); - } - - public SdtEventMessage(StructSdtEventMessage struct) { - this(); - setStruct(struct); - } - - private static HashMap mapper = new HashMap(); - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public String getgxTv_SdtEventMessage_Eventmessageid() { - return gxTv_SdtEventMessage_Eventmessageid; - } - - public void setgxTv_SdtEventMessage_Eventmessageid(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageid = value; - } - - public Date getgxTv_SdtEventMessage_Eventmessagedate() { - return gxTv_SdtEventMessage_Eventmessagedate; - } - - public void setgxTv_SdtEventMessage_Eventmessagedate(Date value) { - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedate = value; - } - - public String getgxTv_SdtEventMessage_Eventmessagesourcetype() { - return gxTv_SdtEventMessage_Eventmessagesourcetype; - } - - public void setgxTv_SdtEventMessage_Eventmessagesourcetype(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagesourcetype = value; - } - - public String getgxTv_SdtEventMessage_Eventmessagedata() { - return gxTv_SdtEventMessage_Eventmessagedata; - } - - public void setgxTv_SdtEventMessage_Eventmessagedata(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedata = value; - } - - public String getgxTv_SdtEventMessage_Eventmessageversion() { - return gxTv_SdtEventMessage_Eventmessageversion; - } - - public void setgxTv_SdtEventMessage_Eventmessageversion(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageversion = value; - } - - public GXBaseCollection getgxTv_SdtEventMessage_Eventmessagecustompayload() { - if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { - gxTv_SdtEventMessage_Eventmessagecustompayload = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); - } - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - return gxTv_SdtEventMessage_Eventmessagecustompayload; - } - - public void setgxTv_SdtEventMessage_Eventmessagecustompayload(GXBaseCollection value) { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagecustompayload = value; - } - - public void setgxTv_SdtEventMessage_Eventmessagecustompayload_SetNull() { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagecustompayload = null; - } - - public boolean getgxTv_SdtEventMessage_Eventmessagecustompayload_IsNull() { - if (gxTv_SdtEventMessage_Eventmessagecustompayload == null) { - return true; - } - return false; - } - - public byte getgxTv_SdtEventMessage_Eventmessagecustompayload_N() { - return gxTv_SdtEventMessage_Eventmessagecustompayload_N; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventMessage_Eventmessageid = ""; - gxTv_SdtEventMessage_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagedate = GXutil.resetTime(GXutil.nullDate()); - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagesourcetype = ""; - gxTv_SdtEventMessage_Eventmessagedata = ""; - gxTv_SdtEventMessage_Eventmessageversion = ""; - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - sTagName = ""; - sDateCnv = ""; - sNumToPad = ""; - datetime_STZ = GXutil.resetTime(GXutil.nullDate()); - } - - public byte isNull() { - return gxTv_SdtEventMessage_N; - } - - public com.genexus.genexusserverlessapi.SdtEventMessage Clone() { - return (com.genexus.genexusserverlessapi.SdtEventMessage) (clone()); - } - - public void setStruct(StructSdtEventMessage struct) { - setgxTv_SdtEventMessage_Eventmessageid(struct.getEventmessageid()); - if (struct.gxTv_SdtEventMessage_Eventmessagedate_N == 0) { - setgxTv_SdtEventMessage_Eventmessagedate(struct.getEventmessagedate()); - } - setgxTv_SdtEventMessage_Eventmessagesourcetype(struct.getEventmessagesourcetype()); - setgxTv_SdtEventMessage_Eventmessagedata(struct.getEventmessagedata()); - setgxTv_SdtEventMessage_Eventmessageversion(struct.getEventmessageversion()); - GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem.class, "CustomPayloadItem", "ServerlessAPI", remoteHandle); - Vector gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 = struct.getEventmessagecustompayload(); - if (gxTv_SdtEventMessage_Eventmessagecustompayload_aux1 != null) { - for (int i = 0; i < gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.size(); i++) { - gxTv_SdtEventMessage_Eventmessagecustompayload_aux.add(new com.genexus.genexusserverlessapi.SdtEventCustomPayload_CustomPayloadItem(gxTv_SdtEventMessage_Eventmessagecustompayload_aux1.elementAt(i))); - } - } - setgxTv_SdtEventMessage_Eventmessagecustompayload(gxTv_SdtEventMessage_Eventmessagecustompayload_aux); - } - - @SuppressWarnings("unchecked") - public StructSdtEventMessage getStruct() { - StructSdtEventMessage struct = new StructSdtEventMessage(); - struct.setEventmessageid(getgxTv_SdtEventMessage_Eventmessageid()); - if (gxTv_SdtEventMessage_Eventmessagedate_N == 0) { - struct.setEventmessagedate(getgxTv_SdtEventMessage_Eventmessagedate()); - } - struct.setEventmessagesourcetype(getgxTv_SdtEventMessage_Eventmessagesourcetype()); - struct.setEventmessagedata(getgxTv_SdtEventMessage_Eventmessagedata()); - struct.setEventmessageversion(getgxTv_SdtEventMessage_Eventmessageversion()); - struct.setEventmessagecustompayload(getgxTv_SdtEventMessage_Eventmessagecustompayload().getStruct()); - return struct; - } - - protected byte gxTv_SdtEventMessage_N; - protected byte gxTv_SdtEventMessage_Eventmessagedate_N; - protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; - protected short readOk; - protected short nOutParmCount; - protected String sTagName; - protected String sDateCnv; - protected String sNumToPad; - protected Date gxTv_SdtEventMessage_Eventmessagedate; - protected Date datetime_STZ; - protected boolean readElement; - protected boolean formatError; - protected String gxTv_SdtEventMessage_Eventmessagedata; - protected String gxTv_SdtEventMessage_Eventmessageid; - protected String gxTv_SdtEventMessage_Eventmessagesourcetype; - protected String gxTv_SdtEventMessage_Eventmessageversion; - protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload_aux; - protected GXBaseCollection gxTv_SdtEventMessage_Eventmessagecustompayload = null; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java deleted file mode 100644 index add64ce70..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessages.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.GXBaseCollection; -import com.genexus.GxUserType; -import com.genexus.ModelContext; - -import java.util.HashMap; -import java.util.Vector; - -public final class SdtEventMessages extends GxUserType { - public SdtEventMessages() { - this(new ModelContext(SdtEventMessages.class)); - } - - public SdtEventMessages(ModelContext context) { - super(context, "SdtEventMessages"); - } - - public SdtEventMessages(int remoteHandle, - ModelContext context) { - super(remoteHandle, context, "SdtEventMessages"); - } - - public SdtEventMessages(StructSdtEventMessages struct) { - this(); - setStruct(struct); - } - - private static HashMap mapper = new HashMap(); - - static { - } - - public String getJsonMap(String value) { - return (String) mapper.get(value); - } - - public GXBaseCollection getgxTv_SdtEventMessages_Eventmessage() { - if (gxTv_SdtEventMessages_Eventmessage == null) { - gxTv_SdtEventMessages_Eventmessage = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); - } - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - return gxTv_SdtEventMessages_Eventmessage; - } - - public void setgxTv_SdtEventMessages_Eventmessage(GXBaseCollection value) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - gxTv_SdtEventMessages_Eventmessage = value; - } - - public void setgxTv_SdtEventMessages_Eventmessage_SetNull() { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - gxTv_SdtEventMessages_Eventmessage = null; - } - - public boolean getgxTv_SdtEventMessages_Eventmessage_IsNull() { - if (gxTv_SdtEventMessages_Eventmessage == null) { - return true; - } - return false; - } - - public byte getgxTv_SdtEventMessages_Eventmessage_N() { - return gxTv_SdtEventMessages_Eventmessage_N; - } - - public void initialize(int remoteHandle) { - initialize(); - } - - public void initialize() { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - gxTv_SdtEventMessages_N = (byte) (1); - sTagName = ""; - } - - public byte isNull() { - return gxTv_SdtEventMessages_N; - } - - public com.genexus.genexusserverlessapi.SdtEventMessages Clone() { - return (com.genexus.genexusserverlessapi.SdtEventMessages) (clone()); - } - - public void setStruct(com.genexus.genexusserverlessapi.StructSdtEventMessages struct) { - GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux = new GXBaseCollection(com.genexus.genexusserverlessapi.SdtEventMessage.class, "EventMessage", "ServerlessAPI", remoteHandle); - Vector gxTv_SdtEventMessages_Eventmessage_aux1 = struct.getEventmessage(); - if (gxTv_SdtEventMessages_Eventmessage_aux1 != null) { - for (int i = 0; i < gxTv_SdtEventMessages_Eventmessage_aux1.size(); i++) { - gxTv_SdtEventMessages_Eventmessage_aux.add(new com.genexus.genexusserverlessapi.SdtEventMessage(gxTv_SdtEventMessages_Eventmessage_aux1.elementAt(i))); - } - } - setgxTv_SdtEventMessages_Eventmessage(gxTv_SdtEventMessages_Eventmessage_aux); - } - - @SuppressWarnings("unchecked") - public com.genexus.genexusserverlessapi.StructSdtEventMessages getStruct() { - com.genexus.genexusserverlessapi.StructSdtEventMessages struct = new com.genexus.genexusserverlessapi.StructSdtEventMessages(); - struct.setEventmessage(getgxTv_SdtEventMessages_Eventmessage().getStruct()); - return struct; - } - - protected byte gxTv_SdtEventMessages_Eventmessage_N; - protected byte gxTv_SdtEventMessages_N; - protected short readOk; - protected short nOutParmCount; - protected String sTagName; - protected boolean readElement; - protected boolean formatError; - protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage_aux; - protected GXBaseCollection gxTv_SdtEventMessages_Eventmessage = null; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java deleted file mode 100644 index 6da6f841e..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/SdtEventMessagesList.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.GXSimpleCollection; -import com.genexus.GXutil; -import com.genexus.Globals; -import com.genexus.GxUserType; -import com.genexus.ModelContext; -import com.genexus.xml.XMLReader; -import com.genexus.xml.XMLWriter; -import java.util.HashMap; - -public final class SdtEventMessagesList extends GxUserType { - private static HashMap mapper = new HashMap(); - protected byte gxTv_SdtEventMessagesList_Items_N; - protected byte sdtIsNull; - protected short readOk; - protected short nOutParmCount; - protected String sTagName; - protected boolean readElement; - protected boolean formatError; - protected GXSimpleCollection gxTv_SdtEventMessagesList_Items; - - public SdtEventMessagesList() { - this(new ModelContext(SdtEventMessagesList.class)); - } - - public SdtEventMessagesList(ModelContext context) { - super(context, "SdtEventMessagesList"); - this.gxTv_SdtEventMessagesList_Items = null; - } - - public SdtEventMessagesList(int remoteHandle, ModelContext context) { - super(remoteHandle, context, "SdtEventMessagesList"); - this.gxTv_SdtEventMessagesList_Items = null; - } - - public SdtEventMessagesList(StructSdtEventMessagesList struct) { - this(); - this.setStruct(struct); - } - - public String getJsonMap(String value) { - return (String)mapper.get(value); - } - - public short readxml(XMLReader oReader, String sName) { - short GXSoapError = 1; - this.formatError = false; - this.sTagName = oReader.getName(); - if (oReader.getIsSimple() == 0) { - GXSoapError = oReader.read(); - this.nOutParmCount = 0; - - while(true) { - do { - if (GXutil.strcmp(oReader.getName(), this.sTagName) == 0 && oReader.getNodeType() != 1 || GXSoapError <= 0) { - return GXSoapError; - } - - this.readOk = 0; - this.readElement = false; - if (GXutil.strcmp2(oReader.getLocalName(), "items")) { - if (this.gxTv_SdtEventMessagesList_Items == null) { - this.gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); - } - - if (oReader.getIsSimple() == 0) { - GXSoapError = this.gxTv_SdtEventMessagesList_Items.readxmlcollection(oReader, "items", "Item"); - } - - this.readElement = true; - if (GXSoapError > 0) { - this.readOk = 1; - } - - if (GXutil.strcmp2(oReader.getLocalName(), "items")) { - GXSoapError = oReader.read(); - } - } - - if (!this.readElement) { - this.readOk = 1; - GXSoapError = oReader.read(); - } - - ++this.nOutParmCount; - } while(this.readOk != 0 && !this.formatError); - - StringBuilder var10000 = new StringBuilder(); - Globals var10002 = this.context.globals; - var10002.sSOAPErrMsg = var10000.append(var10002.sSOAPErrMsg).append("Error reading ").append(this.sTagName).append(GXutil.newLine()).toString(); - var10000 = new StringBuilder(); - var10002 = this.context.globals; - var10002.sSOAPErrMsg = var10000.append(var10002.sSOAPErrMsg).append("Message: ").append(oReader.readRawXML()).toString(); - GXSoapError = (short)(this.nOutParmCount * -1); - } - } else { - return GXSoapError; - } - } - - public void writexml(XMLWriter oWriter, String sName, String sNameSpace) { - this.writexml(oWriter, sName, sNameSpace, true); - } - - public void writexml(XMLWriter oWriter, String sName, String sNameSpace, boolean sIncludeState) { - if (GXutil.strcmp("", sName) == 0) { - sName = "EventMessagesList"; - } - - if (GXutil.strcmp("", sNameSpace) == 0) { - sNameSpace = "ServerlessAPI"; - } - - oWriter.writeStartElement(sName); - if (GXutil.strcmp(GXutil.left(sNameSpace, 10), "[*:nosend]") != 0) { - oWriter.writeAttribute("xmlns", sNameSpace); - } else { - sNameSpace = GXutil.right(sNameSpace, GXutil.len(sNameSpace) - 10); - } - - if (this.gxTv_SdtEventMessagesList_Items != null) { - String sNameSpace1; - if (GXutil.strcmp(sNameSpace, "ServerlessAPI") == 0) { - sNameSpace1 = "[*:nosend]ServerlessAPI"; - } else { - sNameSpace1 = "ServerlessAPI"; - } - - this.gxTv_SdtEventMessagesList_Items.writexmlcollection(oWriter, "items", sNameSpace1, "Item", sNameSpace1); - } - - oWriter.writeEndElement(); - } - - public void tojson() { - this.tojson(true); - } - - public void tojson(boolean includeState) { - this.tojson(includeState, true); - } - - public void tojson(boolean includeState, boolean includeNonInitialized) { - if (this.gxTv_SdtEventMessagesList_Items != null) { - this.AddObjectProperty("items", this.gxTv_SdtEventMessagesList_Items, false, false); - } - - } - - public GXSimpleCollection getgxTv_SdtEventMessagesList_Items() { - if (this.gxTv_SdtEventMessagesList_Items == null) { - this.gxTv_SdtEventMessagesList_Items = new GXSimpleCollection(String.class, "internal", ""); - } - - this.gxTv_SdtEventMessagesList_Items_N = 0; - this.sdtIsNull = 0; - return this.gxTv_SdtEventMessagesList_Items; - } - - public void setgxTv_SdtEventMessagesList_Items(GXSimpleCollection value) { - this.gxTv_SdtEventMessagesList_Items_N = 0; - this.sdtIsNull = 0; - this.gxTv_SdtEventMessagesList_Items = value; - } - - public void setgxTv_SdtEventMessagesList_Items_SetNull() { - this.gxTv_SdtEventMessagesList_Items_N = 1; - this.gxTv_SdtEventMessagesList_Items = null; - } - - public boolean getgxTv_SdtEventMessagesList_Items_IsNull() { - return this.gxTv_SdtEventMessagesList_Items == null; - } - - public byte getgxTv_SdtEventMessagesList_Items_N() { - return this.gxTv_SdtEventMessagesList_Items_N; - } - - public void initialize(int remoteHandle) { - this.initialize(); - } - - public void initialize() { - this.gxTv_SdtEventMessagesList_Items_N = 1; - this.sdtIsNull = 1; - this.sTagName = ""; - } - - public byte isNull() { - return this.sdtIsNull; - } - - public SdtEventMessagesList Clone() { - return (SdtEventMessagesList)((SdtEventMessagesList)this.clone()); - } - - public void setStruct(StructSdtEventMessagesList struct) { - if (struct != null) { - this.setgxTv_SdtEventMessagesList_Items(new GXSimpleCollection(String.class, "internal", "", struct.getItems())); - } - - } - - public StructSdtEventMessagesList getStruct() { - StructSdtEventMessagesList struct = new StructSdtEventMessagesList(); - struct.setItems(this.getgxTv_SdtEventMessagesList_Items().getStruct()); - return struct; - } -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java deleted file mode 100644 index 54dd9bbb2..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; - -@javax.xml.bind.annotation.XmlType(name = "EventCustomPayload", namespace = "ServerlessAPI") -public final class StructSdtEventCustomPayload implements Cloneable, java.io.Serializable { - public StructSdtEventCustomPayload() { - this(-1, new ModelContext(StructSdtEventCustomPayload.class)); - } - - public StructSdtEventCustomPayload(int remoteHandle, - ModelContext context) { - } - - public StructSdtEventCustomPayload(java.util.Vector value) { - item = value; - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - @javax.xml.bind.annotation.XmlElement(name = "CustomPayloadItem", namespace = "ServerlessAPI") - public java.util.Vector getItem() { - return item; - } - - public void setItem(java.util.Vector value) { - item = value; - } - - protected java.util.Vector item = new java.util.Vector<>(); -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java deleted file mode 100644 index 0eb592721..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventCustomPayload_CustomPayloadItem.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; - -public final class StructSdtEventCustomPayload_CustomPayloadItem implements Cloneable, java.io.Serializable { - public StructSdtEventCustomPayload_CustomPayloadItem() { - this(-1, new ModelContext(StructSdtEventCustomPayload_CustomPayloadItem.class)); - } - - public StructSdtEventCustomPayload_CustomPayloadItem(int remoteHandle, - ModelContext context) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = ""; - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = ""; - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public String getPropertyid() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; - } - - public void setPropertyid(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid = value; - } - - public String getPropertyvalue() { - return gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - } - - public void setPropertyvalue(String value) { - gxTv_SdtEventCustomPayload_CustomPayloadItem_N = (byte) (0); - gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue = value; - } - - protected byte gxTv_SdtEventCustomPayload_CustomPayloadItem_N; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyvalue; - protected String gxTv_SdtEventCustomPayload_CustomPayloadItem_Propertyid; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java deleted file mode 100644 index 35b069cfe..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessage.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; - -public final class StructSdtEventMessage implements Cloneable, java.io.Serializable { - public StructSdtEventMessage() { - this(-1, new ModelContext(StructSdtEventMessage.class)); - } - - public StructSdtEventMessage(int remoteHandle, - ModelContext context) { - java.util.Calendar cal = java.util.Calendar.getInstance(); - cal.set(1, 0, 1, 0, 0, 0); - cal.set(java.util.Calendar.MILLISECOND, 0); - gxTv_SdtEventMessage_Eventmessageid = ""; - gxTv_SdtEventMessage_Eventmessagedate = cal.getTime(); - gxTv_SdtEventMessage_Eventmessagesourcetype = ""; - gxTv_SdtEventMessage_Eventmessagedata = ""; - gxTv_SdtEventMessage_Eventmessageversion = ""; - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (1); - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (1); - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public String getEventmessageid() { - return gxTv_SdtEventMessage_Eventmessageid; - } - - public void setEventmessageid(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageid = value; - } - - public java.util.Date getEventmessagedate() { - return gxTv_SdtEventMessage_Eventmessagedate; - } - - public void setEventmessagedate(java.util.Date value) { - gxTv_SdtEventMessage_Eventmessagedate_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedate = value; - } - - public String getEventmessagesourcetype() { - return gxTv_SdtEventMessage_Eventmessagesourcetype; - } - - public void setEventmessagesourcetype(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagesourcetype = value; - } - - public String getEventmessagedata() { - return gxTv_SdtEventMessage_Eventmessagedata; - } - - public void setEventmessagedata(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagedata = value; - } - - public String getEventmessageversion() { - return gxTv_SdtEventMessage_Eventmessageversion; - } - - public void setEventmessageversion(String value) { - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessageversion = value; - } - - public java.util.Vector getEventmessagecustompayload() { - return gxTv_SdtEventMessage_Eventmessagecustompayload; - } - - public void setEventmessagecustompayload(java.util.Vector value) { - gxTv_SdtEventMessage_Eventmessagecustompayload_N = (byte) (0); - gxTv_SdtEventMessage_N = (byte) (0); - gxTv_SdtEventMessage_Eventmessagecustompayload = value; - } - - protected byte gxTv_SdtEventMessage_Eventmessagedate_N; - protected byte gxTv_SdtEventMessage_Eventmessagecustompayload_N; - protected byte gxTv_SdtEventMessage_N; - protected String gxTv_SdtEventMessage_Eventmessagedata; - protected String gxTv_SdtEventMessage_Eventmessageid; - protected String gxTv_SdtEventMessage_Eventmessagesourcetype; - protected String gxTv_SdtEventMessage_Eventmessageversion; - protected java.util.Date gxTv_SdtEventMessage_Eventmessagedate; - protected java.util.Vector gxTv_SdtEventMessage_Eventmessagecustompayload = null; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java deleted file mode 100644 index b1d2cc542..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessages.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; - -public final class StructSdtEventMessages implements Cloneable, java.io.Serializable { - public StructSdtEventMessages() { - this(-1, new ModelContext(StructSdtEventMessages.class)); - } - - public StructSdtEventMessages(int remoteHandle, - ModelContext context) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (1); - } - - public Object clone() { - Object cloned = null; - try { - cloned = super.clone(); - } catch (CloneNotSupportedException e) { - ; - } - return cloned; - } - - public java.util.Vector getEventmessage() { - return gxTv_SdtEventMessages_Eventmessage; - } - - public void setEventmessage(java.util.Vector value) { - gxTv_SdtEventMessages_Eventmessage_N = (byte) (0); - gxTv_SdtEventMessages_N = (byte) (0); - gxTv_SdtEventMessages_Eventmessage = value; - } - - protected byte gxTv_SdtEventMessages_Eventmessage_N; - protected byte gxTv_SdtEventMessages_N; - protected java.util.Vector gxTv_SdtEventMessages_Eventmessage = null; -} - diff --git a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java b/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java deleted file mode 100644 index c4aceb8d3..000000000 --- a/gxserverlesscommon/src/main/java/com/genexus/genexusserverlessapi/StructSdtEventMessagesList.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.genexus.genexusserverlessapi; - -import com.genexus.ModelContext; -import java.io.Serializable; -import java.util.Vector; - -public final class StructSdtEventMessagesList implements Cloneable, Serializable { - protected byte gxTv_SdtEventMessagesList_Items_N; - protected byte sdtIsNull; - protected Vector gxTv_SdtEventMessagesList_Items; - - public StructSdtEventMessagesList() { - this(-1, new ModelContext(StructSdtEventMessagesList.class)); - } - - public StructSdtEventMessagesList(int remoteHandle, ModelContext context) { - this.gxTv_SdtEventMessagesList_Items = null; - this.gxTv_SdtEventMessagesList_Items_N = 1; - } - - public Object clone() { - Object cloned = null; - - try { - cloned = super.clone(); - } catch (CloneNotSupportedException var3) { - } - - return cloned; - } - - public Vector getItems() { - return this.gxTv_SdtEventMessagesList_Items; - } - - public void setItems(Vector value) { - this.gxTv_SdtEventMessagesList_Items_N = 0; - this.sdtIsNull = 0; - this.gxTv_SdtEventMessagesList_Items = value; - } -} From 2a6858f618fd1946328946c78326bf5d13885b8e Mon Sep 17 00:00:00 2001 From: sjuarez Date: Mon, 6 Jan 2025 17:48:38 -0300 Subject: [PATCH 13/16] Fix build error --- .../genexus/cloud/serverless/ServerlessBaseEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java index 9be08dc64..69ddeeb1b 100644 --- a/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java +++ b/gxserverlesscommon/src/main/java/com/genexus/cloud/serverless/ServerlessBaseEventHandler.java @@ -61,7 +61,7 @@ protected EventMessageResponse dispatchEvent(EventMessages eventMessages, String } protected EventMessageResponse dispatchEvent(EventMessages eventMessages, EventMessagesList eventMessagesList, String rawMessageBody) throws Exception { - String jsonStringMessages = Helper.toJSONString(eventMessages); + String jsonStringMessages = JSONHelper.toJSONString(eventMessages); if (logger.isDebugEnabled()) { logger.debug(String.format("dispatchEventMessages (%s) - serialized messages: %s", functionConfiguration.getGXClassName(), jsonStringMessages)); From de737e3836dd807a0b875695774df8fbc6043cee Mon Sep 17 00:00:00 2001 From: sjuarez Date: Tue, 7 Jan 2025 10:56:05 -0300 Subject: [PATCH 14/16] Use fake Id (function invocation Id) por Message Id for Service Bus. Use current time as we do not have enqueued time metadata (java SDK limitation) --- .../azure/handler/AzureServiceBusQueueHandler.java | 2 +- .../azure/handler/AzureServiceBusTopicHandler.java | 2 +- .../helpers/ServiceBusBatchMessageProcessor.java | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java index 4975a104c..750ad7f53 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusQueueHandler.java @@ -21,7 +21,7 @@ public void run( context.getLogger().info("GeneXus Service Bus Queue trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); setupServerlessMappings(context.getFunctionName()); ServiceBusBatchMessageProcessor queueBatchMessageProcessor = new ServiceBusBatchMessageProcessor(); - ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(executor,messages); + ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(context, executor, messages); try { EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(),queueMessage.getRawMessage()); if (response.hasFailed()) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java index 016dd26ad..0242ead8f 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureServiceBusTopicHandler.java @@ -21,7 +21,7 @@ public void run( context.getLogger().info("GeneXus Service Bus Topic trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); setupServerlessMappings(context.getFunctionName()); ServiceBusBatchMessageProcessor queueBatchMessageProcessor = new ServiceBusBatchMessageProcessor(); - ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(executor,messages); + ServiceBusProcessedMessage queueMessage = queueBatchMessageProcessor.processQueueMessage(context, executor, messages); try { EventMessageResponse response = dispatchEvent(queueMessage.getEventMessages(), queueMessage.getRawMessage()); if (response.hasFailed()) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java index eaa332a1a..8bf2971e4 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusBatchMessageProcessor.java @@ -4,10 +4,14 @@ import com.genexus.cloud.serverless.JSONHelper; import com.genexus.cloud.serverless.model.EventMessage; import com.genexus.cloud.serverless.model.EventMessages; +import com.microsoft.azure.functions.ExecutionContext; import com.sun.jna.platform.win32.Guid; +import java.time.Instant; +import java.util.Date; + public class ServiceBusBatchMessageProcessor { - public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor executor, String[] messages) { + public ServiceBusProcessedMessage processQueueMessage(ExecutionContext context, GXProcedureExecutor executor, String[] messages) { String rawMessage = ""; EventMessages eventMessages = new EventMessages(); switch (executor.getMethodSignatureIdx()) { @@ -15,7 +19,8 @@ public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor execut for(String message : messages) { EventMessage msg = new EventMessage(); - msg.setMessageId(Guid.GUID.newGuid().toString()); // This is a fake Id. + msg.setMessageId(context.getInvocationId()); // This is a fake Id. + msg.setMessageDate(Date.from(Instant.now())); //This is the time of processing not the enqueued time. Until now, this metadata is not available. msg.setMessageData(message); eventMessages.add(msg); } From 2a8bd977cc3933fa7c6fff43b7cd8f10a045e148 Mon Sep 17 00:00:00 2001 From: sjuarez Date: Tue, 7 Jan 2025 21:59:05 -0300 Subject: [PATCH 15/16] Fix CosmosDB trigger and other minor fixes --- .../azure/handler/AzureCosmosDBHandler.java | 36 +++++++++++++------ .../azure/handler/AzureQueueHandler.java | 2 +- .../ServiceBusSingleMessageProcessor.java | 2 +- .../events/TestAzureCosmosDBHandler.java | 3 +- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java index d9de15c96..628eb4ba1 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureCosmosDBHandler.java @@ -3,11 +3,8 @@ import com.genexus.cloud.serverless.model.*; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.annotation.CosmosDBTrigger; -import com.sun.jna.platform.win32.Guid; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; public class AzureCosmosDBHandler extends AzureEventHandler{ @@ -15,13 +12,12 @@ public AzureCosmosDBHandler() throws Exception { super(); } public void run( - @CosmosDBTrigger(name = "itemIn", databaseName = "%CosmosDB_Database_Name%", containerName = "%Container_Name%", leaseContainerName = "%lease_Container_Name%", connection = "%CosmosDB_Connection%") List> items , + @CosmosDBTrigger(name = "itemIn", databaseName = "%CosmosDB_Database_Name%", containerName = "%Container_Name%", leaseContainerName = "%lease_Container_Name%", connection = "connection") List items , final ExecutionContext context) throws Exception { context.getLogger().info("GeneXus CosmosDB trigger handler. Function processed: " + context.getFunctionName() + " Invocation Id: " + context.getInvocationId()); - Guid.GUID eventId = new Guid.GUID(context.getInvocationId()); - + UUID eventId = UUID.randomUUID(); EventMessages msgs = new EventMessages(); EventMessagesList eventMessagesList = new EventMessagesList(); String rawMessage= ""; @@ -29,10 +25,10 @@ public void run( switch (executor.getMethodSignatureIdx()) { case 0: - msgs = setupEventMessages(eventId,items); + msgs = setupEventMessages(eventId,TryGetDocuments(items)); break; case 4: - eventMessagesList = setupEventMessagesList(items); + eventMessagesList = setupEventMessagesList(TryGetDocuments(items)); break; default: rawMessage = JSONHelper.toJSONString(items); @@ -50,6 +46,26 @@ public void run( } } + private List> TryGetDocuments(List items){ + List> documents = new ArrayList<>(); + if (items != null && !items.isEmpty()) { + for (Object item : items) { + if (item instanceof Map) { + try { + Map document = (Map) item; + documents.add(document); + } + catch (Exception ex) + { + logger.error(String.format("Messages were not handled. Error trying to read Cosmos DB data. %s", ex.toString())); + throw new RuntimeException(String.format("Error trying to read Cosmos DB data. %s", ex.toString())); //Throw the exception so the runtime can Retry the operation. + } + } + } + return documents; + } + return null; + } private EventMessagesList setupEventMessagesList(List> jsonList) { EventMessagesList messagesList = new EventMessagesList(); @@ -59,7 +75,7 @@ private EventMessagesList setupEventMessagesList(List> jsonLi return messagesList; } - private EventMessages setupEventMessages(Guid.GUID eventId, List> jsonList) + private EventMessages setupEventMessages(UUID eventId, List> jsonList) { EventMessages msgs = new EventMessages(); for (Map json : jsonList) { diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index bfca74424..11150df64 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -32,7 +32,7 @@ public void run( msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); try { String sanitizedTime = insertionTime.replace("\"", ""); - if (!sanitizedTime.endsWith("Z")) { + if (!sanitizedTime.endsWith("Z") && !sanitizedTime.matches(".*[+-]\\d{2}:\\d{2}$")) { sanitizedTime += "Z"; } Instant instant = Instant.from(Instant.parse(sanitizedTime)); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java index 979eafe98..4fb0d32d3 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java @@ -20,7 +20,7 @@ public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor execut msg.setMessageSourceType(EventMessageSourceType.SERVICE_BUS_MESSAGE); try { String sanitizedTime = enqueuedTimeUtc.replace("\"", ""); - if (!sanitizedTime.endsWith("Z")) { + if (!sanitizedTime.endsWith("Z") && !sanitizedTime.matches(".*[+-]\\d{2}:\\d{2}$")) { sanitizedTime += "Z"; } Instant instant = Instant.from(Instant.parse(sanitizedTime)); diff --git a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java index 15c6175b1..a2a5babce 100644 --- a/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java +++ b/gxazureserverless/src/test/java/com/genexus/cloud/azure/events/TestAzureCosmosDBHandler.java @@ -15,12 +15,11 @@ public class TestAzureCosmosDBHandler { private AzureCosmosDBHandler cosmosDBFunction; private ExecutionContext context; - @Test public void testCosmosDBFunction() throws Exception { cosmosDBFunction = new AzureCosmosDBHandler(); - List> list = new ArrayList<>(2); + List list = new ArrayList<>(2); Map map1 = new HashMap<>(); map1.put("UserId", "ac7f12fd-9784-4c93-94cd-7e02a7b1cf4b"); From 6cc6a89bef8f200547c4822397244a0c32e0bc1c Mon Sep 17 00:00:00 2001 From: sjuarez Date: Thu, 9 Jan 2025 00:20:02 -0300 Subject: [PATCH 16/16] use current date for the message date data --- .../serverless/azure/handler/AzureQueueHandler.java | 13 +------------ .../helpers/ServiceBusSingleMessageProcessor.java | 13 +------------ 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java index 11150df64..5409473c6 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/azure/handler/AzureQueueHandler.java @@ -30,18 +30,7 @@ public void run( EventMessage msg = new EventMessage(); msg.setMessageId(id); msg.setMessageSourceType(EventMessageSourceType.QUEUE_MESSAGE); - try { - String sanitizedTime = insertionTime.replace("\"", ""); - if (!sanitizedTime.endsWith("Z") && !sanitizedTime.matches(".*[+-]\\d{2}:\\d{2}$")) { - sanitizedTime += "Z"; - } - Instant instant = Instant.from(Instant.parse(sanitizedTime)); - msg.setMessageDate(Date.from(instant)); - } - catch (Exception exception) - { - context.getLogger().severe(exception.toString()); - } + msg.setMessageDate(Date.from(Instant.now())); msg.setMessageData(message); List msgAtts = msg.getMessageProperties(); msgAtts.add(new EventMessageProperty("Id", id)); diff --git a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java index 4fb0d32d3..bc1ddebe6 100644 --- a/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java +++ b/gxazureserverless/src/main/java/com/genexus/cloud/serverless/helpers/ServiceBusSingleMessageProcessor.java @@ -18,18 +18,7 @@ public ServiceBusProcessedMessage processQueueMessage(GXProcedureExecutor execut EventMessage msg = new EventMessage(); msg.setMessageId(messageId); msg.setMessageSourceType(EventMessageSourceType.SERVICE_BUS_MESSAGE); - try { - String sanitizedTime = enqueuedTimeUtc.replace("\"", ""); - if (!sanitizedTime.endsWith("Z") && !sanitizedTime.matches(".*[+-]\\d{2}:\\d{2}$")) { - sanitizedTime += "Z"; - } - Instant instant = Instant.from(Instant.parse(sanitizedTime)); - msg.setMessageDate(Date.from(instant)); - } - catch (Exception exception) - { - context.getLogger().severe(exception.toString()); - } + msg.setMessageDate(Date.from(Instant.now())); msg.setMessageData(message); List msgProperties = msg.getMessageProperties(); msgProperties.add(new EventMessageProperty("Id", messageId));