From 4a112c19531bea99ea57584c7fb69082811c21e2 Mon Sep 17 00:00:00 2001 From: Vinay Suresh Date: Wed, 5 May 2021 18:32:08 +0530 Subject: [PATCH 1/2] MessageConfig store init commit --- pom.xml | 1 + statesman-engine/pom.xml | 54 ++++++++++++++ .../statesman/engine/MessageConfigStore.java | 13 ++++ .../engine/action/ActionExecutorImpl.java | 5 +- .../statesman/model/MessageConfig.java | 21 ++++++ statesman-publisher/pom.xml | 49 +++++++++++++ statesman-server/db/schema.sql | 6 ++ statesman-server/pom.xml | 46 +++++++++++- .../statesman/server/StatesmanApp.java | 8 +- .../dao/message/IMessageConstructor.java | 5 ++ .../message/MessageConfigStoreCommand.java | 73 +++++++++++++++++++ .../dao/message/MessageConstructor.java | 60 +++++++++++++++ .../dao/message/StoredMessageConfig.java | 28 +++++++ .../statesman/server/module/DBModule.java | 7 ++ .../server/module/StatesmanModule.java | 10 ++- .../server/resources/TemplateResource.java | 39 +++++++++- .../statesman/server/utils/MapperUtils.java | 18 +++++ .../statesman/server/utils/WorkflowUtils.java | 13 ++++ 18 files changed, 447 insertions(+), 9 deletions(-) create mode 100644 statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java create mode 100644 statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java create mode 100644 statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java create mode 100644 statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java create mode 100644 statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java create mode 100644 statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java diff --git a/pom.xml b/pom.xml index 2d8cf60e..a2f26b24 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ 1.10.19 24.1.1-jre 2.6.2 + 1.0.6 diff --git a/statesman-engine/pom.xml b/statesman-engine/pom.xml index 55d63a33..f376f732 100644 --- a/statesman-engine/pom.xml +++ b/statesman-engine/pom.xml @@ -71,6 +71,60 @@ jsoup ${jsoup.version} + + io.appform.functionmetrics + function-metrics + ${function-metrics.version} + + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.11 + + + org.aspectj + aspectjrt + 1.8.13 + + + org.aspectj + aspectjtools + 1.8.13 + + + + + 1.8 + 1.8 + 1.8 + true + true + + + ${project.build.directory}/classes + + true + ignore + + + io.appform.functionmetrics + function-metrics + + + + + + process-classes + + compile + + + + + + diff --git a/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java b/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java new file mode 100644 index 00000000..c69e8796 --- /dev/null +++ b/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java @@ -0,0 +1,13 @@ +package io.appform.statesman.engine; + +import io.appform.statesman.model.MessageConfig; +import io.appform.statesman.model.action.template.ActionTemplate; + +import java.util.Optional; + +public interface MessageConfigStore { + + Optional create(MessageConfig messageConfig); + + Optional get(String messageConfigId); +} diff --git a/statesman-engine/src/main/java/io/appform/statesman/engine/action/ActionExecutorImpl.java b/statesman-engine/src/main/java/io/appform/statesman/engine/action/ActionExecutorImpl.java index 712679fe..dd4ad872 100644 --- a/statesman-engine/src/main/java/io/appform/statesman/engine/action/ActionExecutorImpl.java +++ b/statesman-engine/src/main/java/io/appform/statesman/engine/action/ActionExecutorImpl.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.inject.Inject; import com.google.inject.Singleton; +import io.appform.functionmetrics.MetricTerm; +import io.appform.functionmetrics.MonitoredFunction; import io.appform.statesman.engine.ActionTemplateStore; import io.appform.statesman.model.Workflow; import io.appform.statesman.model.action.template.ActionTemplate; @@ -26,7 +28,8 @@ public void ActionExecutor(final Provider actionRegistry, } @Override - public Optional execute(String actionId, Workflow workflow) { + @MonitoredFunction + public Optional execute(@MetricTerm String actionId, Workflow workflow) { return actionTemplateStore.get().get(actionId) .map(actionTemplate -> execute(workflow, actionTemplate)); } diff --git a/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java b/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java new file mode 100644 index 00000000..4e14db0e --- /dev/null +++ b/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java @@ -0,0 +1,21 @@ +package io.appform.statesman.model; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MessageConfig { + @NotNull + String messageId; + + @NotNull + JsonNode messageBody; +} diff --git a/statesman-publisher/pom.xml b/statesman-publisher/pom.xml index 2f30dd36..0424ee58 100644 --- a/statesman-publisher/pom.xml +++ b/statesman-publisher/pom.xml @@ -73,4 +73,53 @@ + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.11 + + + org.aspectj + aspectjrt + 1.8.13 + + + org.aspectj + aspectjtools + 1.8.13 + + + + + 1.8 + 1.8 + 1.8 + true + true + + + ${project.build.directory}/classes + + true + ignore + + + io.appform.functionmetrics + function-metrics + + + + + + process-classes + + compile + + + + + + diff --git a/statesman-server/db/schema.sql b/statesman-server/db/schema.sql index c8dd7674..b8ec70e4 100644 --- a/statesman-server/db/schema.sql +++ b/statesman-server/db/schema.sql @@ -137,3 +137,9 @@ CREATE TABLE `workflow_templates` ( PRIMARY KEY (`id`), UNIQUE KEY `uniq_template_id` (`template_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `message_config` ( + `message_id` varchar(64) DEFAULT NULL, + `message_config_body` blob DEFAULT NULL, + PRIMARY KEY (`message_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/statesman-server/pom.xml b/statesman-server/pom.xml index e035a494..1e067454 100644 --- a/statesman-server/pom.xml +++ b/statesman-server/pom.xml @@ -17,7 +17,6 @@ 1.3.12-1 1.3.13-6 2.2.0 - 1.0.6 @@ -175,6 +174,51 @@ + + org.codehaus.mojo + aspectj-maven-plugin + 1.11 + + + org.aspectj + aspectjrt + 1.8.13 + + + org.aspectj + aspectjtools + 1.8.13 + + + + + 1.8 + 1.8 + 1.8 + true + true + + + ${project.build.directory}/classes + + true + ignore + + + io.appform.functionmetrics + function-metrics + + + + + + process-classes + + compile + + + + diff --git a/statesman-server/src/main/java/io/appform/statesman/server/StatesmanApp.java b/statesman-server/src/main/java/io/appform/statesman/server/StatesmanApp.java index abbc5c7e..ed6f096f 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/StatesmanApp.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/StatesmanApp.java @@ -10,6 +10,7 @@ import io.appform.dropwizard.sharding.DBShardingBundle; import io.appform.dropwizard.sharding.config.ShardedHibernateFactory; import io.appform.functionmetrics.FunctionMetricsManager; +import io.appform.functionmetrics.Options; import io.appform.statesman.server.exception.GenericExceptionMapper; import io.appform.statesman.server.module.DBModule; import io.appform.statesman.server.module.StatesmanModule; @@ -31,7 +32,7 @@ public class StatesmanApp extends Application { public void initialize(Bootstrap bootstrap) { bootstrap.setConfigurationSourceProvider( new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), - new EnvironmentVariableSubstitutor(false))); + new EnvironmentVariableSubstitutor(false))); final ObjectMapper mapper = bootstrap.getObjectMapper(); setMapperProperties(mapper); MapperUtils.initialize(mapper); @@ -44,7 +45,10 @@ public void initialize(Bootstrap bootstrap) { @Override public void run(AppConfig appConfig, Environment environment) { - FunctionMetricsManager.initialize("commands", environment.metrics()); + FunctionMetricsManager.initialize("commands", environment.metrics(), + new Options.OptionsBuilder() + .enableParameterCapture(true) + .build()); environment.jersey().register(GenericExceptionMapper.class); } diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java new file mode 100644 index 00000000..b8faf2b6 --- /dev/null +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java @@ -0,0 +1,5 @@ +package io.appform.statesman.server.dao.message; + +public interface IMessageConstructor { + String constructMessage(String messageId,String language,String state); +} diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java new file mode 100644 index 00000000..4e0219ca --- /dev/null +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java @@ -0,0 +1,73 @@ +package io.appform.statesman.server.dao.message; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import io.appform.dropwizard.sharding.dao.LookupDao; +import io.appform.statesman.engine.MessageConfigStore; +import io.appform.statesman.model.MessageConfig; +import io.appform.statesman.model.exception.ResponseCode; +import io.appform.statesman.model.exception.StatesmanError; +import io.appform.statesman.server.utils.MapperUtils; +import io.appform.statesman.server.utils.WorkflowUtils; +import lombok.extern.slf4j.Slf4j; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Singleton +public class MessageConfigStoreCommand implements MessageConfigStore { + + private final LookupDao messageLookupDao; + private final LoadingCache> messageConfigCache; + + @Inject + public MessageConfigStoreCommand(LookupDao messageLookupDao) { + this.messageLookupDao = messageLookupDao; + messageConfigCache = Caffeine.newBuilder() + .maximumSize(1_000) + .expireAfterWrite(300, TimeUnit.SECONDS) + .refreshAfterWrite(60, TimeUnit.SECONDS) + .build(key -> { + log.debug("Loading data for action for key: {}", key); + return getFromDb(key); + }); + } + + private Optional getFromDb(String messageId) { + try { + return messageLookupDao.get(messageId) + .map(config -> + new MessageConfig(config.getMessageId(), MapperUtils.readTree(config.getMessageConfigBody()))); + } catch (Exception e) { + throw StatesmanError.propagate(e, ResponseCode.DAO_ERROR); + } + } + + + @Override + public Optional create(MessageConfig messageConfig) { + try { + return messageLookupDao + .save(WorkflowUtils.toDao(messageConfig)) + .map(config -> + new MessageConfig(config.getMessageId(), MapperUtils.readTree(config.getMessageConfigBody()))); + + } catch (Exception e) { + throw StatesmanError.propagate(e, ResponseCode.DAO_ERROR); + } + } + + @Override + public Optional get(String messageConfigId) { + try { + return messageConfigCache.get(messageConfigId); + } catch (Exception e) { + throw StatesmanError.propagate(e, ResponseCode.DAO_ERROR); + } + } +} diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java new file mode 100644 index 00000000..4af82be2 --- /dev/null +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java @@ -0,0 +1,60 @@ +package io.appform.statesman.server.dao.message; + +import com.fasterxml.jackson.databind.JsonNode; +import io.appform.statesman.model.MessageConfig; +import io.appform.statesman.model.exception.ResponseCode; +import io.appform.statesman.model.exception.StatesmanError; +import io.appform.statesman.server.utils.MapperUtils; +import lombok.extern.slf4j.Slf4j; + +import javax.inject.Inject; +import java.util.Optional; + + +@Slf4j +public class MessageConstructor implements IMessageConstructor { + + private final MessageConfigStoreCommand messageConfigStoreCommand; + private final String DEFAULT_FILED_NAME = "default"; + + @Inject + public MessageConstructor(MessageConfigStoreCommand messageConfigStoreCommand) { + this.messageConfigStoreCommand = messageConfigStoreCommand; + } + + + @Override + public String constructMessage(String messageId, String language, String state) { + + Optional optionalMessageConfig = messageConfigStoreCommand.get(messageId); + if(!optionalMessageConfig.isPresent()){ + throw new StatesmanError("No message config found", ResponseCode.NO_PROVIDER_FOUND); + } + + MessageConfig storeOutput = optionalMessageConfig.get(); + JsonNode root = storeOutput.getMessageBody(); + JsonNode languageNode; + + if(root == null){ + throw new StatesmanError("No message config found", ResponseCode.NO_PROVIDER_FOUND); + }else if((root.get(language) == null)){ + if(root.get(DEFAULT_FILED_NAME) == null) { + throw new StatesmanError("No default language found", ResponseCode.NO_PROVIDER_FOUND); + }else{ + languageNode = root.get(DEFAULT_FILED_NAME); + } + }else{ + languageNode = root.get(language); + } + + if(languageNode.get(state) != null) { + return languageNode.get(state).asText(); + }else if(languageNode.get(DEFAULT_FILED_NAME) != null) { + return languageNode.get(DEFAULT_FILED_NAME).asText(); + }else{ + return root.get(DEFAULT_FILED_NAME).get(DEFAULT_FILED_NAME).asText(); + } + } +} + + diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java new file mode 100644 index 00000000..168fc776 --- /dev/null +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java @@ -0,0 +1,28 @@ +package io.appform.statesman.server.dao.message; + +import io.appform.dropwizard.sharding.sharding.LookupKey; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Table(name = "message_config", uniqueConstraints = { + @UniqueConstraint(columnNames = "message_id") +}) +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class StoredMessageConfig { + + @Id + @Column(name = "message_id") + @LookupKey + private String messageId; + + @Column(name = "message_config_body") + private byte[] messageConfigBody; +} diff --git a/statesman-server/src/main/java/io/appform/statesman/server/module/DBModule.java b/statesman-server/src/main/java/io/appform/statesman/server/module/DBModule.java index 3fbef826..f5d3f8ed 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/module/DBModule.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/module/DBModule.java @@ -8,6 +8,7 @@ import io.appform.dropwizard.sharding.dao.RelationalDao; import io.appform.statesman.server.dao.action.StoredActionTemplate; import io.appform.statesman.server.dao.callback.StoredCallbackTransformationTemplate; +import io.appform.statesman.server.dao.message.StoredMessageConfig; import io.appform.statesman.server.dao.providers.StoredProvider; import io.appform.statesman.server.dao.transition.StoredStateTransition; import io.appform.statesman.server.dao.workflow.StoredWorkflowInstance; @@ -34,6 +35,12 @@ public LookupDao provideActionTemplateLookupDao() { return dbShardingBundle.createParentObjectDao(StoredActionTemplate.class); } + @Singleton + @Provides + public LookupDao provideMessageLookupDao() { + return dbShardingBundle.createParentObjectDao(StoredMessageConfig.class); + } + @Singleton @Provides public LookupDao provideWorkflowTemplateLookupDao() { diff --git a/statesman-server/src/main/java/io/appform/statesman/server/module/StatesmanModule.java b/statesman-server/src/main/java/io/appform/statesman/server/module/StatesmanModule.java index dc423916..1dafc7c9 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/module/StatesmanModule.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/module/StatesmanModule.java @@ -5,10 +5,7 @@ import com.google.inject.Singleton; import com.google.inject.name.Named; import com.google.inject.name.Names; -import io.appform.statesman.engine.ActionTemplateStore; -import io.appform.statesman.engine.ProviderSelector; -import io.appform.statesman.engine.TransitionStore; -import io.appform.statesman.engine.WorkflowProvider; +import io.appform.statesman.engine.*; import io.appform.statesman.engine.action.ActionExecutor; import io.appform.statesman.engine.action.ActionExecutorImpl; import io.appform.statesman.engine.action.ActionRegistry; @@ -30,6 +27,9 @@ import io.appform.statesman.server.dao.action.ActionTemplateStoreCommand; import io.appform.statesman.server.dao.callback.CallbackTemplateProvider; import io.appform.statesman.server.dao.callback.CallbackTemplateProviderCommand; +import io.appform.statesman.server.dao.message.IMessageConstructor; +import io.appform.statesman.server.dao.message.MessageConfigStoreCommand; +import io.appform.statesman.server.dao.message.MessageConstructor; import io.appform.statesman.server.dao.transition.TransitionStoreCommand; import io.appform.statesman.server.dao.workflow.WorkflowProviderCommand; import io.appform.statesman.server.droppedcalldetector.DroppedCallDetector; @@ -46,6 +46,7 @@ public class StatesmanModule extends AbstractModule { @Override protected void configure() { bind(ActionTemplateStore.class).to(ActionTemplateStoreCommand.class); + bind(MessageConfigStore.class).to(MessageConfigStoreCommand.class); bind(TransitionStore.class).to(TransitionStoreCommand.class); bind(WorkflowProvider.class).to(WorkflowProviderCommand.class); bind(CallbackTemplateProvider.class).to(CallbackTemplateProviderCommand.class); @@ -58,6 +59,7 @@ protected void configure() { .annotatedWith(Names.named("foxtrotEventSender")) .to(FoxtrotEventSender.class); bind(IdExtractor.class).to(CompoundIdExtractor.class); + bind(IMessageConstructor.class).to(MessageConstructor.class); } @Singleton diff --git a/statesman-server/src/main/java/io/appform/statesman/server/resources/TemplateResource.java b/statesman-server/src/main/java/io/appform/statesman/server/resources/TemplateResource.java index 97fa6f97..b967412a 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/resources/TemplateResource.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/resources/TemplateResource.java @@ -4,11 +4,14 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import io.appform.statesman.engine.ActionTemplateStore; +import io.appform.statesman.engine.MessageConfigStore; import io.appform.statesman.engine.TransitionStore; import io.appform.statesman.engine.WorkflowProvider; +import io.appform.statesman.model.MessageConfig; import io.appform.statesman.model.StateTransition; import io.appform.statesman.model.WorkflowTemplate; import io.appform.statesman.model.action.template.ActionTemplate; +import io.appform.statesman.server.dao.message.IMessageConstructor; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -33,14 +36,20 @@ public class TemplateResource { private final ActionTemplateStore actionTemplateStore; private final TransitionStore transitionStore; private final WorkflowProvider workflowProvider; + private final MessageConfigStore messageConfigStore; + private final IMessageConstructor messageConstrutor; @Inject public TemplateResource(final ActionTemplateStore actionTemplateStore, final TransitionStore transitionStore, - final WorkflowProvider workflowProvider) { + final WorkflowProvider workflowProvider, + final MessageConfigStore messageConfigStore, + final IMessageConstructor messageConstrutor) { this.actionTemplateStore = actionTemplateStore; this.transitionStore = transitionStore; this.workflowProvider = workflowProvider; + this.messageConfigStore = messageConfigStore; + this.messageConstrutor = messageConstrutor; } @@ -222,4 +231,32 @@ public Response updateAction(@Valid ActionTemplate actionTemplate) { .build(); } + @POST + @Timed + @Path("/messageconfig") + @ApiOperation("Create Message Config") + public Response createMessageConfig(@Valid MessageConfig messageConfig) { + Optional messageConfigOptional = messageConfigStore.create(messageConfig); + if (!messageConfigOptional.isPresent()) { + return Response.serverError() + .build(); + } + return Response.ok() + .entity(messageConfigOptional.get()) + .build(); + } + + @GET + @Timed + @Path("/messageconfig/{messageId}") + @ApiOperation("Get message config") + public Response getAllStateTransitions(@PathParam("messageId") String messageId, + @DefaultValue("default") @QueryParam("language") String language, + @DefaultValue("default") @QueryParam("state") String state) { + + return Response.ok() + .entity(messageConstrutor.constructMessage(messageId,language,state)) + .build(); + } + } diff --git a/statesman-server/src/main/java/io/appform/statesman/server/utils/MapperUtils.java b/statesman-server/src/main/java/io/appform/statesman/server/utils/MapperUtils.java index 6a941bb6..4e054598 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/utils/MapperUtils.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/utils/MapperUtils.java @@ -2,11 +2,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.appform.statesman.model.exception.ResponseCode; import io.appform.statesman.model.exception.StatesmanError; import javax.annotation.Nullable; +import java.io.IOException; public class MapperUtils { private static ObjectMapper objectMapper; @@ -33,6 +35,7 @@ public static T deserialize( byte[] data, TypeReference typeReference) { return deserialize(objectMapper, data, typeReference); } + @Nullable public static T deserialize(ObjectMapper mapper, byte[] data, Class valueType) { try { @@ -109,4 +112,19 @@ public static byte[] serialize(ObjectMapper mapper, Object data) { } } + + @Nullable + public static JsonNode readTree(byte[] data) { + try { + if (data == null) { + return null; + } + return objectMapper.readTree(data); + } catch (JsonProcessingException e) { + throw StatesmanError.propagate(e, ResponseCode.JSON_ERROR); + + } catch (IOException e) { + throw StatesmanError.propagate(e, ResponseCode.JSON_ERROR); + } + } } diff --git a/statesman-server/src/main/java/io/appform/statesman/server/utils/WorkflowUtils.java b/statesman-server/src/main/java/io/appform/statesman/server/utils/WorkflowUtils.java index 79a1d9e4..f56d15d9 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/utils/WorkflowUtils.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/utils/WorkflowUtils.java @@ -7,11 +7,13 @@ import io.appform.statesman.model.*; import io.appform.statesman.model.action.template.*; import io.appform.statesman.server.dao.action.StoredActionTemplate; +import io.appform.statesman.server.dao.message.StoredMessageConfig; import io.appform.statesman.server.dao.transition.StoredStateTransition; import io.appform.statesman.server.dao.workflow.StoredWorkflowInstance; import io.appform.statesman.server.dao.workflow.StoredWorkflowTemplate; import lombok.extern.slf4j.Slf4j; +import java.io.IOException; import java.util.List; import java.util.UUID; @@ -109,4 +111,15 @@ public static StoredActionTemplate toDao(ActionTemplate actionTemplate) { .data(MapperUtils.serialize(actionTemplate)) .build(); } + + public static StoredMessageConfig toDao(MessageConfig messageConfig) { + try { + return StoredMessageConfig.builder() + .messageId(messageConfig.getMessageId()) + .messageConfigBody(messageConfig.getMessageBody().binaryValue()) + .build(); + } catch (IOException e) { + return null; + } + } } From 1b1802cf4e675c106fe8cd00fa766bab485c44b0 Mon Sep 17 00:00:00 2001 From: Vinay Suresh Date: Wed, 5 May 2021 19:17:20 +0530 Subject: [PATCH 2/2] Addressing PR comments --- .../statesman/engine/MessageConfigStore.java | 3 ++ .../statesman/model/MessageConfig.java | 7 +++-- .../dao/message/IMessageConstructor.java | 4 +++ .../message/MessageConfigStoreCommand.java | 7 +++-- .../dao/message/MessageConstructor.java | 30 +++++++++++++++++++ .../dao/message/StoredMessageConfig.java | 4 +++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java b/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java index c69e8796..12a46c11 100644 --- a/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java +++ b/statesman-engine/src/main/java/io/appform/statesman/engine/MessageConfigStore.java @@ -5,6 +5,9 @@ import java.util.Optional; +/** + * Interface for storing and accessing message config from cache backed by DB + */ public interface MessageConfigStore { Optional create(MessageConfig messageConfig); diff --git a/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java b/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java index 4e14db0e..840fe600 100644 --- a/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java +++ b/statesman-model/src/main/java/io/appform/statesman/model/MessageConfig.java @@ -8,14 +8,17 @@ import javax.validation.constraints.NotNull; +/** + * REST entity for posting the message config resource to the API + */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class MessageConfig { @NotNull - String messageId; + private String messageId; @NotNull - JsonNode messageBody; + private JsonNode messageBody; } diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java index b8faf2b6..755c40d4 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/IMessageConstructor.java @@ -1,5 +1,9 @@ package io.appform.statesman.server.dao.message; +/** + * Interface for constructing the message for a given + * message id,language and state from the config defined + */ public interface IMessageConstructor { String constructMessage(String messageId,String language,String state); } diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java index 4e0219ca..408b665c 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConfigStoreCommand.java @@ -18,6 +18,9 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +/** + * Responsible for storing and accessing message config from cache backed by DB + */ @Slf4j @Singleton public class MessageConfigStoreCommand implements MessageConfigStore { @@ -30,8 +33,8 @@ public MessageConfigStoreCommand(LookupDao messageLookupDao this.messageLookupDao = messageLookupDao; messageConfigCache = Caffeine.newBuilder() .maximumSize(1_000) - .expireAfterWrite(300, TimeUnit.SECONDS) - .refreshAfterWrite(60, TimeUnit.SECONDS) + .expireAfterWrite(120, TimeUnit.MINUTES) + .refreshAfterWrite(15, TimeUnit.MINUTES) .build(key -> { log.debug("Loading data for action for key: {}", key); return getFromDb(key); diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java index 4af82be2..d62bc0a4 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/MessageConstructor.java @@ -11,6 +11,10 @@ import java.util.Optional; +/** + * This class is mainly responsible for constructing the message for a given + * message id,language and state from the config defined + */ @Slf4j public class MessageConstructor implements IMessageConstructor { @@ -23,6 +27,32 @@ public MessageConstructor(MessageConfigStoreCommand messageConfigStoreCommand) { } + /** + * + * @param messageId : id for the message config + * @param language : language in which the message needs to be build + * @param state : state for which the message is intended + * Example Json : + *{ + * "messageId":"welcome", + * "messageBody":{ + * "default":{ + * "KA":"msg1", + * "default":"msg2" + * }, + * "hindi":{ + * "RAJ":"msg3", + * "UP":"msg4", + * "default":"msg5" + * }, + * "marathi":{ + * "MAH":"msg6", + * "default":"msg7" + * } + * } + * } + * @return : Completely constructed message + */ @Override public String constructMessage(String messageId, String language, String state) { diff --git a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java index 168fc776..9c97a81d 100644 --- a/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java +++ b/statesman-server/src/main/java/io/appform/statesman/server/dao/message/StoredMessageConfig.java @@ -8,6 +8,10 @@ import javax.persistence.*; + +/** + * Entity that represents the message config that needs to stored and fetched from the DB + */ @Entity @Table(name = "message_config", uniqueConstraints = { @UniqueConstraint(columnNames = "message_id")