From 6994a1ace7bfdcef9b375f2cada7b980ad170214 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 14 Jun 2023 09:43:48 -0600 Subject: [PATCH 001/157] files upgraded to v5.1.0 --- apps/forms-flow-ai/README.md | 4 +- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 4 +- .../support/ApplicationAccessHandler.java | 37 ++- .../io/event/CamundaEventListener.java | 103 +++++--- .../io/event/TaskEventTopicListener.java | 2 +- .../service/TaskEventMessageService.java | 5 +- .../commons/io/socket/RedisConfig.java | 38 ++- .../io/socket/message/TaskEventMessage.java | 21 ++ .../io/socket/message/TaskMessage.java | 37 +++ .../BPMFormDataPipelineListener.java | 92 ++++--- .../execution/ExternalSubmissionListener.java | 75 +++--- .../task/AccessGrantNotifyListener.java | 60 +++-- .../listeners/task/FormConnectorListener.java | 113 +++++---- .../hooks/services/FormSubmissionService.java | 132 +++++----- .../support/ApplicationAccessHandlerTest.java | 83 ++++--- .../io/event/CamundaEventListenerTest.java | 178 ++++++++------ .../filter/ServiceTaskFilterListDropDown.js | 28 ++- .../forms-flow-web/src/containers/NavBar.jsx | 232 ++++++++++++++---- .../forms-flow-web/src/containers/styles.scss | 21 -- .../forms-flow-web/src/styles.scss | 154 +++++++++++- .../build_configs/api_bc.yaml | 4 +- .../build_configs/camunda_bc.yaml | 4 +- .../build_configs/formio_bc.yaml | 2 +- .../build_configs/web_bc.yaml | 4 +- 24 files changed, 953 insertions(+), 480 deletions(-) rename apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/{socket => message}/service/TaskEventMessageService.java (87%) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskEventMessage.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskMessage.java diff --git a/apps/forms-flow-ai/README.md b/apps/forms-flow-ai/README.md index 4819a120..2c684f3d 100644 --- a/apps/forms-flow-ai/README.md +++ b/apps/forms-flow-ai/README.md @@ -66,7 +66,7 @@ The following files are slated to be removed because we can leverage the open so ### **Required files:** -- `pom-docker.xml` +- `pom-docker.xml` (renamed pom.xml with v5.1.0 upgrade) - Needed for redis dependency; otherwise, the dependencies are largely identical to open source. - `src/main/resources/application.yaml` - Useful to have application.yaml in this repo as it is used for customizing camunda. @@ -186,7 +186,7 @@ Upon a new release of open source, care should be taken to keep all the files al - All files under `src` folder. *forms-flow-bpm* -- `pom-docker.xml` +- `pom-docker.xml` (renamed pom.xml with v5.1.0 upgrade) - Java dependencies' versions may be different. - `application.yaml` - should be checked for updates as well but not all changes are applicable to service BC. Changes should be done on a case by case basis based on Changelog documentation. diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index acb76076..050a57e4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -8,9 +8,9 @@ RUN apt-get update \ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ -#RUN cp /bpm/forms-flow-bpm/pom-docker.xml /tmp/pom.xml +#RUN cp /bpm/forms-flow-bpm/pom.xml /tmp/pom.xml RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ -COPY ./pom-docker.xml /tmp/pom.xml +COPY ./pom.xml /tmp/pom.xml # COPY ./settings-docker.xml /usr/share/maven/ref/ WORKDIR /tmp/ diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 07f08630..cfc9e0ca 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -1,6 +1,8 @@ package org.camunda.bpm.extension.commons.connector.support; import com.google.gson.JsonObject; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -8,46 +10,61 @@ import org.springframework.http.*; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; -import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; +import java.util.Map; +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; /** * This class serves as gateway for all application service interactions. - * This customization exists because the authentication mechanisms has changed between - * forsmflow open source and service bc's implementation. Once Service BC's authentication - * mechanisms are updated, this file can be removed. * * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler implements IAccessHandler { +public class ApplicationAccessHandler extends AbstractAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); - + @Autowired private WebClient unAuthenticatedWebClient; @Autowired private OAuth2RestTemplate oAuth2RestTemplate; - public ResponseEntity exchange(String url, HttpMethod method, String payload) { payload = (payload == null) ? new JsonObject().toString() : payload; - Mono> entityMono = unAuthenticatedWebClient.method(method).uri(url) + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) .accept(MediaType.APPLICATION_JSON) .headers(httpHeaders -> httpHeaders.setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(Mono.just(payload), String.class) .retrieve() - .toEntity(String.class); + .toEntity(String.class) + .block(); - ResponseEntity response = entityMono.block(); + // ResponseEntity response = entityMono.block(); return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } + public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, + Class responseClazz) { + + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + .accept(MediaType.APPLICATION_JSON) + .headers(httpHeaders -> httpHeaders.setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .toEntity(responseClazz) + .block(); + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java index 3dfbf08b..ac174547 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java @@ -8,22 +8,28 @@ import org.camunda.bpm.extension.commons.io.ITaskEvent; import org.camunda.bpm.extension.commons.io.socket.message.TaskEventMessage; import org.camunda.bpm.extension.commons.io.socket.message.TaskMessage; -import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.event.EventListener; - import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.*; - import java.util.logging.Logger; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.FORM_URL; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_STATUS; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_ID; + /** - * This class intercepts all camunda task and push socket messages for web tier updates. + * Camunda Event Listener. + * This class intercepts all camunda task and push socket messages for web tier + * updates. * * @author sumathi.thirumani@aot-technologies.com */ @@ -33,32 +39,57 @@ public class CamundaEventListener implements ITaskEvent { @Autowired private StringRedisTemplate stringRedisTemplate; + // @Autowired + // private SimpMessagingTemplate template; + private final Logger LOGGER = Logger.getLogger(CamundaEventListener.class.getName()); @Value("${websocket.messageType}") private String messageCategory; - - @Value("${websocket.messageEvents}") + + @Value("${websocket.messageEvents}") private String messageEvents; + @Value("${websocket.enableRedis}") + private boolean redisEnabled; + + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; @EventListener public void onTaskEventListener(DelegateTask taskDelegate) { - LOGGER.info("Event triggered:"+taskDelegate.getId() +"-"+ taskDelegate.getEventName() + "-"+ taskDelegate.getProcessInstanceId()); + LOGGER.info("Event triggered:" + taskDelegate.getId() + "-" + taskDelegate.getEventName() + "-" + + taskDelegate.getProcessInstanceId()); try { - if (isRegisteredEvent(taskDelegate.getEventName())) { - if(isAllowed(EventCategory.TASK_EVENT_DETAILS.name())) { - this.stringRedisTemplate.convertAndSend(getTopicNameForTaskDetail(), getObjectMapper().writeValueAsString(getTaskMessage(taskDelegate))); - } - if(isAllowed(EventCategory.TASK_EVENT.name())) { - this.stringRedisTemplate.convertAndSend(getTopicNameForTask(), getObjectMapper().writeValueAsString(getTaskEventMessage(taskDelegate))); - } - } + if (isRegisteredEvent(taskDelegate.getEventName())) { + if (isAllowed(EventCategory.TASK_EVENT_DETAILS.name())) { + this.stringRedisTemplate.convertAndSend(getTopicNameForTaskDetail(), + bpmObjectMapper.writeValueAsString(getTaskMessage(taskDelegate))); + } + if (isAllowed(EventCategory.TASK_EVENT.name())) { + this.stringRedisTemplate.convertAndSend(getTopicNameForTask(), + bpmObjectMapper.writeValueAsString(getTaskEventMessage(taskDelegate))); + } + // convertAndSendMessage(getTopicNameForTaskDetail(), + // getTaskMessage(taskDelegate)); + // if (isAllowed(EventCategory.TASK_EVENT.name())) { + // convertAndSendMessage(getTopicNameForTask(), + // getTaskEventMessage(taskDelegate)); + // } + } } catch (JsonProcessingException e) { e.printStackTrace(); } } + private void convertAndSendMessage(String topicName, Object message) throws JsonProcessingException { + if (redisEnabled) { + this.stringRedisTemplate.convertAndSend(topicName, bpmObjectMapper.writeValueAsString(message)); + } else { + this.stringRedisTemplate.convertAndSend(topicName, bpmObjectMapper.writeValueAsString(message)); + } + } + private TaskMessage getTaskMessage(DelegateTask taskDelegate) { TaskMessage taskObj = new TaskMessage(); BeanUtils.copyProperties(taskDelegate, taskObj); @@ -73,11 +104,13 @@ private TaskEventMessage getTaskEventMessage(DelegateTask taskDelegate) { } private boolean isAllowed(String category) { - return Arrays.asList(StringUtils.split(messageCategory,",")).contains(category); + return Arrays.asList(StringUtils.split(messageCategory, ",")).contains(category); } - - private boolean isRegisteredEvent(String eventName) { - if("ALL".equalsIgnoreCase(messageEvents)) { return true;} + + private boolean isRegisteredEvent(String eventName) { + if ("ALL".equalsIgnoreCase(messageEvents)) { + return true; + } return getRegisteredEvents().contains(eventName); } @@ -85,14 +118,14 @@ private List getRegisteredEvents() { if ("DEFAULT".equalsIgnoreCase(messageEvents)) { return getDefaultRegisteredEvents(); } - return Arrays.asList(StringUtils.split(messageEvents,",")); + return Arrays.asList(StringUtils.split(messageEvents, ",")); } - private Map getVariables(DelegateTask taskDelegate) { - List configMap =getElements(); - Map variables = new HashMap<>(); - for(String entry : configMap) { - if(taskDelegate.getVariables().containsKey(entry)) { + private Map getVariables(DelegateTask taskDelegate) { + List configMap = getElements(); + Map variables = new HashMap<>(); + for (String entry : configMap) { + if (taskDelegate.getVariables().containsKey(entry)) { variables.put(entry, taskDelegate.getVariable(entry)); } } @@ -100,23 +133,23 @@ private Map getVariables(DelegateTask taskDelegate) { } private List getElements() { - return new ArrayList<>(Arrays. asList("applicationId", "formUrl", "applicationStatus")); + return new ArrayList<>(Arrays.asList(APPLICATION_ID, FORM_URL, APPLICATION_STATUS)); } - private List getDefaultRegisteredEvents() { + private List getDefaultRegisteredEvents() { return Arrays.asList(TaskListener.EVENTNAME_CREATE, - TaskListener.EVENTNAME_UPDATE, - TaskListener.EVENTNAME_COMPLETE - ); + TaskListener.EVENTNAME_UPDATE, + TaskListener.EVENTNAME_COMPLETE); } - private ObjectMapper getObjectMapper() { - return new ObjectMapper(); - } + /** + * private ObjectMapper getObjectMapper() { + * return new ObjectMapper(); + * } + */ enum EventCategory { - TASK_EVENT, - TASK_EVENT_DETAILS; + TASK_EVENT, TASK_EVENT_DETAILS; } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/TaskEventTopicListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/TaskEventTopicListener.java index 56b60521..51b2b33d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/TaskEventTopicListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/TaskEventTopicListener.java @@ -1,6 +1,6 @@ package org.camunda.bpm.extension.commons.io.event; -import org.camunda.bpm.extension.commons.io.socket.message.service.TaskEventMessageService; +import org.camunda.bpm.extension.commons.io.message.service.TaskEventMessageService; import org.camunda.bpm.extension.commons.io.socket.message.TaskMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/service/TaskEventMessageService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/message/service/TaskEventMessageService.java similarity index 87% rename from apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/service/TaskEventMessageService.java rename to apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/message/service/TaskEventMessageService.java index d0f06b2b..a41dc42d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/service/TaskEventMessageService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/message/service/TaskEventMessageService.java @@ -1,4 +1,4 @@ -package org.camunda.bpm.extension.commons.io.socket.message.service; +package org.camunda.bpm.extension.commons.io.message.service; import org.camunda.bpm.extension.commons.io.socket.message.TaskMessage; import org.springframework.beans.factory.annotation.Autowired; @@ -28,9 +28,8 @@ public void sendMessage(TaskMessage message) { try { template.convertAndSend("/topic/task-event", objectMapper.writeValueAsString(message)); } catch (JsonProcessingException e) { - LOGGER.log(Level.SEVERE,"Exception Occured in preparing message", e); + LOGGER.log(Level.SEVERE, "Exception Occured in preparing message", e); } } - } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java index 38a1478f..4fbf48f2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java @@ -4,6 +4,8 @@ import org.camunda.bpm.extension.commons.io.event.TaskEventTopicListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -14,7 +16,8 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; -import java.util.Properties; +// import java.util.Properties; +import java.util.logging.Logger; /** * Configuration for Message Broker. @@ -22,29 +25,47 @@ * @author sumathi.thirumani@aot-technologies.com */ @Configuration +@ConditionalOnProperty(prefix = "websocket", name = "enableRedis", havingValue = "true", matchIfMissing = false) public class RedisConfig implements ITaskEvent { + private final Logger LOGGER = Logger.getLogger(RedisConfig.class.getName()); + @Autowired private Properties messageBrokerProperties; + @Value("${websocket.messageBroker.host}") + private String messageBrokerHost; + @Value("${websocket.messageBroker.port}") + private String messageBrokerPort; + @Value("${websocket.messageBroker.passcode}") + private String messageBrokerPasscode; + @Bean RedisConnectionFactory redisConnectionFactory() { - RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(messageBrokerProperties.getProperty("messageBroker.host"), - Integer.valueOf(messageBrokerProperties.getProperty("messageBroker.port"))); - redisStandaloneConfiguration.setPassword(messageBrokerProperties.getProperty("messageBroker.passcode")); + /* + * RedisStandaloneConfiguration redisStandaloneConfiguration = new + * RedisStandaloneConfiguration(messageBrokerProperties.getProperty( + * "messageBroker.host"), + * Integer.valueOf(messageBrokerProperties.getProperty("messageBroker.port"))); + * redisStandaloneConfiguration.setPassword(messageBrokerProperties.getProperty( + * "messageBroker.passcode")); + */ + + RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(messageBrokerHost, + Integer.valueOf(messageBrokerPort)); + redisStandaloneConfiguration.setPassword(messageBrokerPasscode); return new LettuceConnectionFactory(redisStandaloneConfiguration); } @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, - @Qualifier("taskMessageListenerAdapter") MessageListenerAdapter taskMessageListenerAdapter) { + @Qualifier("taskMessageListenerAdapter") MessageListenerAdapter taskMessageListenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(taskMessageListenerAdapter, new PatternTopic(getTopicNameForTask())); return container; } - @Bean("taskMessageListenerAdapter") MessageListenerAdapter chatMessageListenerAdapter(TaskEventTopicListener taskEventTopicListener) { return new MessageListenerAdapter(taskEventTopicListener, getExecutorName()); @@ -55,7 +76,8 @@ StringRedisTemplate template(RedisConnectionFactory redisConnectionFactory) { return new StringRedisTemplate(redisConnectionFactory); } - private String getExecutorName() { return "receiveTaskMessage";} - + private String getExecutorName() { + return "receiveTaskMessage"; + } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskEventMessage.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskEventMessage.java new file mode 100644 index 00000000..521afccc --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskEventMessage.java @@ -0,0 +1,21 @@ +package org.camunda.bpm.extension.commons.io.socket.message; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; + +/** + * Task Event Message. + * Class for holding TaskEvent data. + */ + +@Data +@NoArgsConstructor +@ToString +public class TaskEventMessage implements Serializable { + private String id; + private String eventName; + private String tenantId; +} \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskMessage.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskMessage.java new file mode 100644 index 00000000..02b9be2a --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/message/TaskMessage.java @@ -0,0 +1,37 @@ +package org.camunda.bpm.extension.commons.io.socket.message; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +/** + * Task Message. + * Class for holding Task data. + */ +@Data +@NoArgsConstructor +@ToString +public class TaskMessage implements Serializable { + + private String assignee; + private Date createTime; + private String deleteReason; + private String description; + private Date dueDate; + private String eventName; + private String executionId; + private Date followUpDate; + private String id; + private String name; + private String owner; + private int priority; + private String processDefinitionId; + private String processInstanceId; + private String taskDefinitionKey; + private Map variables; + private String tenantId; +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/BPMFormDataPipelineListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/BPMFormDataPipelineListener.java index 05b0ae87..07f34a18 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/BPMFormDataPipelineListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/BPMFormDataPipelineListener.java @@ -1,6 +1,5 @@ package org.camunda.bpm.extension.hooks.listeners; - import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -10,46 +9,47 @@ import org.camunda.bpm.engine.delegate.TaskListener; import org.camunda.bpm.engine.delegate.DelegateTask; import org.camunda.bpm.extension.commons.connector.HTTPServiceInvoker; - import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; import org.camunda.bpm.extension.hooks.listeners.data.FormElement; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; - +import javax.annotation.Resource; import javax.inject.Named; - import java.io.IOException; import java.util.ArrayList; import java.util.List; - -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.Map; +import java.util.Properties; +import java.util.HashMap; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.FORM_URL; /** - * This class transforms all the form document data into CAM variables - * - * @author sumathi.thirumani@aot-technologies.com + * BPM Form Data Pipeline Listener. + * This class copies all the CAM variables into form document data. */ @Named("BPMFormDataPipelineListener") public class BPMFormDataPipelineListener extends BaseListener implements TaskListener, ExecutionListener { - - private final Logger LOGGER = Logger.getLogger(BPMFormDataPipelineListener.class.getName()); - + // private final Logger LOGGER = + // Logger.getLogger(BPMFormDataPipelineListener.class.getName()); + private final Logger LOGGER = LoggerFactory.getLogger(BPMFormDataPipelineListener.class); private Expression fields; - + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; @Autowired private HTTPServiceInvoker httpServiceInvoker; + @Autowired + private Properties integrationCredentialProperties; @Override public void notify(DelegateExecution execution) { try { patchFormAttributes(execution); } catch (IOException e) { - handleException(execution,ExceptionSource.EXECUTION, e); + handleException(execution, ExceptionSource.EXECUTION, e); } } @@ -63,38 +63,58 @@ public void notify(DelegateTask delegateTask) { } private void patchFormAttributes(DelegateExecution execution) throws IOException { - String formUrl= MapUtils.getString(execution.getVariables(),"formUrl", null); - if(StringUtils.isBlank(formUrl)) { - LOGGER.log(Level.SEVERE,"Unable to read submission for "+execution.getVariables().get("formUrl")); - return; - } - ResponseEntity response = httpServiceInvoker.execute(getUrl(execution), HttpMethod.PATCH, getModifiedFormElements(execution)); - if(response.getStatusCodeValue() != HttpStatus.OK.value()) { - throw new FormioServiceException("Unable to get patch values for: "+ formUrl+ ". Message Body: " + - response.getBody()); + String formUrl = MapUtils.getString(execution.getVariables(), FORM_URL, null); + ResponseEntity response = null; + Boolean enableCustomSubmission = Boolean + .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); + if (StringUtils.isBlank(formUrl)) { + LOGGER.error("Unable to read submission for Empty Url string"); + } else { + if (enableCustomSubmission) { + // Form submission data to custom data store using custom url. + response = httpServiceInvoker.execute(getUrl(execution), HttpMethod.PATCH, + getModifiedFormElementsCustomSubmission(execution)); + } else { + response = httpServiceInvoker.execute(getUrl(execution), HttpMethod.PATCH, + getModifiedFormElements(execution)); + } + if (response.getStatusCodeValue() != HttpStatus.OK.value()) { + throw new FormioServiceException("Unable to get patch values for: " + formUrl + ". Message Body: " + + response.getBody()); + } } } - - private String getUrl(DelegateExecution execution){ - return String.valueOf(execution.getVariables().get("formUrl")); + private String getUrl(DelegateExecution execution) { + return String.valueOf(execution.getVariables().get(FORM_URL)); } private List getModifiedFormElements(DelegateExecution execution) throws IOException { List elements = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - List injectableFields = this.fields != null && this.fields.getValue(execution) != null ? - objectMapper.readValue(String.valueOf(this.fields.getValue(execution)),List.class): null; + List injectableFields = this.fields != null && this.fields.getValue(execution) != null + ? bpmObjectMapper.readValue(String.valueOf(this.fields.getValue(execution)), List.class) + : null; LOGGER.info("Invoking BPMFormDataPipelineListener for applicationId::" + execution.getVariables().get("applicationId") + " process_pid::" + execution.getVariables().get("process_pid")); - for(String entry: injectableFields) { - elements.add(new FormElement(entry,String.valueOf(execution.getVariable(entry)))); + for (String entry : injectableFields) { + elements.add(new FormElement(entry, String.valueOf(execution.getVariable(entry)))); } - return elements; } - -} + private Map> getModifiedFormElementsCustomSubmission(DelegateExecution execution) + throws IOException { + Map paramMap = new HashMap<>(); + Map> dataMap = new HashMap<>(); + List injectableFields = this.fields != null && this.fields.getValue(execution) != null + ? bpmObjectMapper.readValue(String.valueOf(this.fields.getValue(execution)), List.class) + : null; + for (String entry : injectableFields) { + paramMap.put(entry, String.valueOf(execution.getVariable(entry))); + } + dataMap.put("data", paramMap); + return dataMap; + } +} \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/ExternalSubmissionListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/ExternalSubmissionListener.java index 3de3e36f..4d624be7 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/ExternalSubmissionListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/ExternalSubmissionListener.java @@ -18,15 +18,20 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import javax.annotation.Resource; import javax.inject.Named; - import java.io.IOException; import java.util.HashMap; import java.util.Map; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.FORM_URL; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_ID; + /** - * This listener supports creation of form.io submission for instances created from external system + * This class supports creation of submission for instances created from + * external system + * * @author sumathi.thirumani@aot-technologies.com */ @Named("ExternalSubmissionListener") @@ -36,69 +41,70 @@ public class ExternalSubmissionListener extends BaseListener implements Executio @Autowired private FormSubmissionService formSubmissionService; - + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; @Autowired private HTTPServiceInvoker httpServiceInvoker; private Expression formName; - /** - * Communicates with the form.io system to create a submission - * Also, if an applicationId is not available, an applicationId will be created - * and the same will be communicated to the form.io submission. - * - * @param execution The current execution instance - */ @Override public void notify(DelegateExecution execution) { try { String formUrl = getFormUrl(execution); - String submissionId = formSubmissionService.createSubmission(formUrl, formSubmissionService.createFormSubmissionData(execution.getVariables())); + String submissionId = formSubmissionService.createSubmission(formUrl, + formSubmissionService.createFormSubmissionData(execution.getVariables())); LOGGER.info("Creating submission::" + submissionId); - if(StringUtils.isNotBlank(submissionId)){ - execution.setVariable("formUrl", formUrl+"/"+submissionId); - if(execution.getVariable("applicationId") == null) { + if (StringUtils.isNotBlank(submissionId)) { + execution.setVariable(FORM_URL, formUrl + "/" + submissionId); + if (execution.getVariable("applicationId") == null) { createApplication(execution, true); - + // To update submissionId with applicationId - formSubmissionService.updateSubmission(formUrl+"/"+submissionId, formSubmissionService.createFormSubmissionData(execution.getVariables())); + formSubmissionService.updateSubmission(formUrl + "/" + submissionId, + formSubmissionService.createFormSubmissionData(execution.getVariables())); } } - } catch(IOException | RuntimeException ex) { + } catch (IOException | RuntimeException ex) { handleException(execution, ExceptionSource.EXECUTION, ex); } } private String getFormId(DelegateExecution execution) throws IOException { - String formName = String.valueOf(this.formName.getValue(execution)); - return formSubmissionService.getFormIdByName(httpServiceInvoker.getProperties().getProperty("formio.url")+"/"+formName); + String formName = String.valueOf(this.formName.getValue(execution)); + return formSubmissionService + .getFormIdByName(httpServiceInvoker.getProperties().getProperty("formio.url") + "/" + formName); } private String getFormUrl(DelegateExecution execution) throws IOException { - return httpServiceInvoker.getProperties().getProperty("formio.url")+"/form/"+getFormId(execution)+"/submission"; + return httpServiceInvoker.getProperties().getProperty("formio.url") + "/form/" + getFormId(execution) + + "/submission"; } /** * * @param execution - DelegateExecution data - * @param retryOnce - If formsflow api failed to respond 201 then the application will try once again and then it fail. + * @param retryOnce - If formsflow api failed to respond 201 then the + * application will try once again and then it fail. * @throws JsonProcessingException */ private void createApplication(DelegateExecution execution, boolean retryOnce) throws JsonProcessingException { - Map data = new HashMap<>(); - String formUrl = String.valueOf(execution.getVariable("formUrl")); - data.put("formUrl",formUrl); - data.put("formId",StringUtils.substringBetween(formUrl, "/form/", "/submission/")); - data.put("submissionId",StringUtils.substringAfter(formUrl, "/submission/")); - data.put("processInstanceId",execution.getProcessInstanceId()); - ResponseEntity response = httpServiceInvoker.execute(httpServiceInvoker.getProperties().getProperty("api.url")+"/application/create", HttpMethod.POST, getObjectMapper().writeValueAsString(data)); - if(response.getStatusCode().value() == HttpStatus.CREATED.value()) { - JsonNode jsonNode = getObjectMapper().readTree(response.getBody()); + Map data = new HashMap<>(); + String formUrl = String.valueOf(execution.getVariable(FORM_URL)); + data.put(FORM_URL, formUrl); + data.put("formId", StringUtils.substringBetween(formUrl, "/form/", "/submission/")); + data.put("submissionId", StringUtils.substringAfter(formUrl, "/submission/")); + data.put("processInstanceId", execution.getProcessInstanceId()); + ResponseEntity response = httpServiceInvoker.execute( + httpServiceInvoker.getProperties().getProperty("api.url") + "/application/create", HttpMethod.POST, + bpmObjectMapper.writeValueAsString(data)); + if (response.getStatusCode().value() == HttpStatus.CREATED.value()) { + JsonNode jsonNode = bpmObjectMapper.readTree(response.getBody()); String applicationId = jsonNode.get("id").asText(); - execution.setVariable("applicationId", applicationId); + execution.setVariable(APPLICATION_ID, applicationId); } else { - if(retryOnce) { + if (retryOnce) { LOGGER.warn("Retrying the application create once more due to previous failure"); createApplication(execution, false); } else { @@ -107,9 +113,4 @@ private void createApplication(DelegateExecution execution, boolean retryOnce) t } } } - - private ObjectMapper getObjectMapper(){ - return new ObjectMapper(); - } - } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListener.java index 0fcd09fd..0446a88b 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListener.java @@ -19,9 +19,10 @@ import java.util.logging.Logger; /** + * Access Grant Notify Listener. * This component is aimed at sending notification to Access Groups * - * @author sumathi.thirumani@aot-technologies.com + * @author sumathi.thirumani@aot-technologies.com */ @Component public class AccessGrantNotifyListener implements TaskListener, IMessageEvent { @@ -29,7 +30,6 @@ public class AccessGrantNotifyListener implements TaskListener, IMessageEvent { private Expression excludeGroup; private Expression messageId; - private static final Logger LOGGER = Logger.getLogger(AccessGrantNotifyListener.class.getName()); private Expression category; @@ -42,15 +42,17 @@ public class AccessGrantNotifyListener implements TaskListener, IMessageEvent { public void notify(DelegateTask delegateTask) { LOGGER.info("\n\nAccessGrantNotify listener invoked! " + delegateTask.getId()); List notifyGroup = new ArrayList<>(); - String excludeGroupValue = this.excludeGroup != null && this.excludeGroup.getValue(delegateTask.getExecution()) != null ? - String.valueOf(this.excludeGroup.getValue(delegateTask.getExecution())) : null; + String excludeGroupValue = this.excludeGroup != null + && this.excludeGroup.getValue(delegateTask.getExecution()) != null + ? String.valueOf(this.excludeGroup.getValue(delegateTask.getExecution())) + : null; List exclusionGroupList = new ArrayList<>(); LOGGER.info("Excluded group::" + excludeGroupValue); - if(StringUtils.isNotBlank(excludeGroupValue)) { - exclusionGroupList.add(excludeGroupValue.trim()); + if (StringUtils.isNotBlank(excludeGroupValue)) { + exclusionGroupList.add(excludeGroupValue.strip()); } List accessGroupList = getModifiedGroupsForTask(delegateTask, exclusionGroupList); - String accessGroupListString = String.join("|",accessGroupList); + String accessGroupListString = String.join("|", accessGroupList); for (String entry : accessGroupList) { List emailsForGroup = getEmailsForGroup(delegateTask.getExecution(), entry); notifyGroup.addAll(emailsForGroup); @@ -58,7 +60,8 @@ public void notify(DelegateTask delegateTask) { if (isNotify(delegateTask) && StringUtils.isBlank(delegateTask.getAssignee())) { if (CollectionUtils.isNotEmpty(notifyGroup)) { LOGGER.info("Sending an email to ::" + accessGroupListString); - sendEmailNotification(delegateTask.getExecution(), notifyGroup, delegateTask.getId(), getCategory(delegateTask.getExecution())); + sendEmailNotification(delegateTask.getExecution(), notifyGroup, delegateTask.getId(), + getCategory(delegateTask.getExecution())); delegateTask.getExecution().removeVariable("isNotify"); } } @@ -66,6 +69,7 @@ public void notify(DelegateTask delegateTask) { /** * Check if the current update event is a result of Notify action + * * @param delegateTask The current task in context * @return true - if the update event is a result of Notify; false - else */ @@ -76,23 +80,25 @@ private boolean isNotify(DelegateTask delegateTask) { /** * Sends an email. + * * @param execution The current execution instance. - * @param toEmails The recipients. - * @param taskId The task id. - * @param category The email category for the DMN. + * @param toEmails The recipients. + * @param taskId The task id. + * @param category The email category for the DMN. */ - private void sendEmailNotification(DelegateExecution execution, List toEmails, String taskId, String category) { + private void sendEmailNotification(DelegateExecution execution, List toEmails, String taskId, + String category) { Set emails = new HashSet<>(toEmails); - String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(emails,",") : null; - if(StringUtils.isNotEmpty(toAddress)) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(emails, ",") : null; + if (StringUtils.isNotEmpty(toAddress)) { Map emailAttributes = new HashMap<>(); emailAttributes.put("to", toAddress); emailAttributes.put("category", category); - emailAttributes.put("name",getDefaultAddresseName()); - emailAttributes.put("taskid",taskId); + emailAttributes.put("name", getDefaultAddresseName()); + emailAttributes.put("taskid", taskId); log.info("Inside notify attributes:" + emailAttributes); - if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { - sendMessage(execution, emailAttributes,getMessageId(execution)); + if (StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress, "@") > 0) { + sendMessage(execution, emailAttributes, getMessageId(execution)); } } } @@ -101,12 +107,12 @@ private void sendEmailNotification(DelegateExecution execution, List toE * @param execution The current execution instance * @return Returns the message category */ - private String getCategory(DelegateExecution execution){ + private String getCategory(DelegateExecution execution) { return String.valueOf(this.category.getValue(execution)); } /** - * @param delegateTask The task instance to send an email for. + * @param delegateTask The task instance to send an email for. * @param exclusionGroup The groups to be excluded from the emails. * @return The list of groups after removing the excluded groups. */ @@ -115,9 +121,9 @@ private List getModifiedGroupsForTask(DelegateTask delegateTask, List newGroupsAdded = new ArrayList<>(); if (CollectionUtils.isNotEmpty(identityLinks)) { for (IdentityLink entry : identityLinks) { - String grpId = entry.getGroupId().trim(); + String grpId = entry.getGroupId().strip(); if (!exclusionGroup.contains(grpId)) { - newGroupsAdded.add(entry.getGroupId().trim()); + newGroupsAdded.add(entry.getGroupId().strip()); } } } @@ -125,15 +131,17 @@ private List getModifiedGroupsForTask(DelegateTask delegateTask, List superVariables = new HashMap<>(); - List supFields = this.fields != null && this.fields.getValue(delegateTask) != null ? - objectMapper.readValue(String.valueOf(this.fields.getValue(delegateTask)),List.class): null; - for(String entry : supFields) { + Map superVariables = new HashMap<>(); + List supFields = this.fields != null && this.fields.getValue(delegateTask) != null + ? bpmObjectMapper.readValue(String.valueOf(this.fields.getValue(delegateTask)), List.class) + : null; + + for (String entry : supFields) { superVariables.put(entry, delegateTask.getExecution().getVariables().get(entry)); } LOGGER.info("Invoking FormConnectorListener for applicationId::" + delegateTask.getExecution().getVariables().get("applicationId") + " process_pid::" + delegateTask.getExecution().getVariables().get("process_pid")); - return formSubmissionService.createSubmission(targetFormUrl, createFormSubmissionData(submission, superVariables, getPropogateData(delegateTask))); + + return formSubmissionService.createSubmission(targetFormUrl, + createFormSubmissionData(submission, superVariables, getPropogateData(delegateTask))); } /** - * + * * @param submission * @param superVariables * @param propogateData * @return */ - private String createFormSubmissionData(String submission, Map superVariables, String propogateData) { + private String createFormSubmissionData(String submission, Map superVariables, + String propogateData) { try { - JsonNode submissionNode = getObjectMapper().readTree(submission); - JsonNode dataNode =submissionNode.get("data"); - if("Y".equals(propogateData)) { - for(Map.Entry entry : superVariables.entrySet()) { - ((ObjectNode)dataNode).put(entry.getKey(), getObjectMapper().convertValue(entry.getValue(), JsonNode.class)); + JsonNode submissionNode = bpmObjectMapper.readTree(submission); + JsonNode dataNode = submissionNode.get("data"); + if ("Y".equals(propogateData)) { + for (Map.Entry entry : superVariables.entrySet()) { + ((ObjectNode) dataNode).put(entry.getKey(), + bpmObjectMapper.convertValue(entry.getValue(), JsonNode.class)); } - return getObjectMapper().writeValueAsString(new FormSubmission(dataNode)); + return bpmObjectMapper.writeValueAsString(new FormSubmission(dataNode)); } else { - return getObjectMapper().writeValueAsString(new FormSubmission(getObjectMapper().convertValue(superVariables, JsonNode.class))); + return bpmObjectMapper.writeValueAsString( + new FormSubmission(bpmObjectMapper.convertValue(superVariables, JsonNode.class))); } - } catch (JsonProcessingException e) { e.printStackTrace(); } - return null; + return null; } /** * Get the formID for associated name. - * + * * @param delegateTask * @return */ @@ -119,25 +129,28 @@ private String getFormId(DelegateTask delegateTask) throws IOException { .getExtensionElements() .getElementsQuery() .filterByType(CamundaProperties.class).singleResult(); - List userTaskExtensionProperties = camundaProperties.getCamundaProperties() .stream() - .filter(camundaProperty -> - camundaProperty.getCamundaName() - .equals(getFormIdProperty())) + .filter(camundaProperty -> camundaProperty.getCamundaName() + .equals(getFormIdProperty())) .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(userTaskExtensionProperties)) { - if(CollectionUtils.isNotEmpty(userTaskExtensionProperties)) { String formName = userTaskExtensionProperties.get(0).getCamundaValue(); - return formSubmissionService.getFormIdByName(StringUtils.substringBefore(getFormUrl(delegateTask),"/form/")+"/"+formName); + if (StringUtils.startsWith(formName, "$")) { + formName = String.valueOf( + delegateTask.getExecution().getVariable(StringUtils.substringBetween(formName, "${", "}"))); + } + return formSubmissionService + .getFormIdByName(StringUtils.substringBefore(getFormUrl(delegateTask), "/form/") + "/" + formName); } - return null; } /** * Defines the form ID property. + * * @return */ private String getFormIdProperty() { @@ -146,40 +159,33 @@ private String getFormIdProperty() { /** * Returns the data propagation property value. - * + * * @param delegateTask * @return */ - private String getPropogateData(DelegateTask delegateTask){ - if(this.copyDataIndicator != null && + private String getPropogateData(DelegateTask delegateTask) { + if (this.copyDataIndicator != null && StringUtils.isNotBlank(String.valueOf(this.copyDataIndicator.getValue(delegateTask)))) { return String.valueOf(this.copyDataIndicator.getValue(delegateTask)); } return "N"; } - /** - * Returns Object Mapper Instance - * @return - */ - private ObjectMapper getObjectMapper(){ - return new ObjectMapper(); - } - /** * Returns new URL for submission. - * + * * @param delegateTask * @return */ private String getNewFormSubmissionUrl(DelegateTask delegateTask) throws IOException { String formUrl = getFormUrl(delegateTask); - return StringUtils.replace(formUrl, StringUtils.substringBetween(formUrl, "form/", "/submission"), getFormId(delegateTask)); + return StringUtils.replace(formUrl, StringUtils.substringBetween(formUrl, "form/", "/submission"), + getFormId(delegateTask)); } /** * Returns the formURl from execution context - * + * * @param delegateTask * @return */ @@ -189,14 +195,13 @@ private String getFormUrl(DelegateTask delegateTask) { /** * Returns the updated formUrl with new submission ID. - * + * * @param delegateTask * @param submissionId * @return */ private String getModifiedFormUrl(DelegateTask delegateTask, String submissionId) throws IOException { - String formUrl = StringUtils.substringBefore(getFormUrl(delegateTask),"/form/"); - return formUrl+ "/form/" + getFormId(delegateTask) + "/submission/" + submissionId; + String formUrl = StringUtils.substringBefore(getFormUrl(delegateTask), "/form/"); + return formUrl + "/form/" + getFormId(delegateTask) + "/submission/" + submissionId; } - } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java index 658702ee..06831cdc 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java @@ -1,6 +1,5 @@ package org.camunda.bpm.extension.hooks.services; - import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -9,7 +8,7 @@ import org.camunda.bpm.engine.variable.Variables; import org.camunda.bpm.engine.variable.value.FileValue; import org.camunda.bpm.extension.commons.connector.HTTPServiceInvoker; -import org.camunda.bpm.extension.commons.connector.support.FormTokenAccessHandler; +import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -18,7 +17,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; - +import javax.annotation.Resource; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -27,115 +26,120 @@ import java.util.logging.Logger; import java.util.stream.Collectors; - @Qualifier("formSubmissionService") @Service public class FormSubmissionService { private final Logger LOGGER = Logger.getLogger(FormSubmissionService.class.getName()); + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; @Autowired - private FormTokenAccessHandler formTokenAccessHandler; + private FormioTokenServiceProvider formioTokenServiceProvider; @Autowired private HTTPServiceInvoker httpServiceInvoker; public String readSubmission(String formUrl) { - ResponseEntity response = httpServiceInvoker.execute(formUrl, HttpMethod.GET, null); - if(response.getStatusCode().value() == HttpStatus.OK.value()) { + ResponseEntity response = httpServiceInvoker.execute(formUrl, HttpMethod.GET, null); + if (response.getStatusCode().value() == HttpStatus.OK.value()) { return response.getBody(); } else { - throw new FormioServiceException("Unable to read submission for: "+ formUrl+ ". Message Body: " + + throw new FormioServiceException("Unable to read submission for: " + formUrl + ". Message Body: " + response.getBody()); } } public String createRevision(String formUrl) throws IOException { - String submission = readSubmission(formUrl); - if(StringUtils.isBlank(submission)) { - LOGGER.log(Level.SEVERE,"Unable to read submission for "+formUrl); + String submission = readSubmission(formUrl); + if (StringUtils.isBlank(submission)) { + LOGGER.log(Level.SEVERE, "Unable to read submission for " + formUrl); return null; } - ObjectMapper objectMapper = new ObjectMapper(); - ResponseEntity response = httpServiceInvoker.execute(getSubmissionUrl(formUrl), HttpMethod.POST, submission); - if(response.getStatusCode().value() == HttpStatus.CREATED.value()) { - JsonNode jsonNode = objectMapper.readTree(response.getBody()); + + ResponseEntity response = httpServiceInvoker.execute(getSubmissionUrl(formUrl), HttpMethod.POST, + submission); + if (response.getStatusCode().value() == HttpStatus.CREATED.value()) { + JsonNode jsonNode = bpmObjectMapper.readTree(response.getBody()); String submissionId = jsonNode.get("_id").asText(); return submissionId; } else { - throw new FormioServiceException("Unable to create revision for: "+ formUrl+ ". Message Body: " + + throw new FormioServiceException("Unable to create revision for: " + formUrl + ". Message Body: " + response.getBody()); } } public String createSubmission(String formUrl, String submission) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - ResponseEntity response = httpServiceInvoker.execute(getSubmissionUrl(formUrl), HttpMethod.POST, submission); - if(response.getStatusCode().value() == HttpStatus.CREATED.value()) { - JsonNode jsonNode = objectMapper.readTree(response.getBody()); + + ResponseEntity response = httpServiceInvoker.execute(getSubmissionUrl(formUrl), HttpMethod.POST, + submission); + if (response.getStatusCode().value() == HttpStatus.CREATED.value()) { + JsonNode jsonNode = bpmObjectMapper.readTree(response.getBody()); String submissionId = jsonNode.get("_id").asText(); return submissionId; } else { - throw new FormioServiceException("Unable to create submission for: "+ formUrl+ ". Message Body: " + + throw new FormioServiceException("Unable to create submission for: " + formUrl + ". Message Body: " + response.getBody()); } } public void updateSubmission(String submissionUrl, String submission) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - ResponseEntity response = httpServiceInvoker.execute(submissionUrl, HttpMethod.PUT, submission); - if(response.getStatusCode().value() != HttpStatus.OK.value()) { - LOGGER.log(Level.SEVERE,"Unable to update submission for "+submissionUrl + + + ResponseEntity response = httpServiceInvoker.execute(submissionUrl, HttpMethod.PUT, submission); + if (response.getStatusCode().value() != HttpStatus.OK.value()) { + LOGGER.log(Level.SEVERE, "Unable to update submission for " + submissionUrl + " Response code::" + response.getStatusCode().value()); - throw new FormioServiceException("Unable to update submission for: "+ submissionUrl + ". Message Body: " + + throw new FormioServiceException("Unable to update submission for: " + submissionUrl + ". Message Body: " + response.getBody()); } } public String getFormIdByName(String formUrl) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - ResponseEntity response = httpServiceInvoker.execute(formUrl, HttpMethod.GET, null); - if(response.getStatusCode().value() == HttpStatus.OK.value()) { - JsonNode jsonNode = objectMapper.readTree(response.getBody()); + + ResponseEntity response = httpServiceInvoker.execute(formUrl, HttpMethod.GET, null); + if (response.getStatusCode().value() == HttpStatus.OK.value()) { + JsonNode jsonNode = bpmObjectMapper.readTree(response.getBody()); String formId = jsonNode.get("_id").asText(); return formId; } else { - throw new FormioServiceException("Unable to get name for: "+ formUrl+ ". Message Body: " + + throw new FormioServiceException("Unable to get name for: " + formUrl + ". Message Body: " + response.getBody()); } } - private String getSubmissionUrl(String formUrl){ - if(StringUtils.endsWith(formUrl,"submission")) { + private String getSubmissionUrl(String formUrl) { + if (StringUtils.endsWith(formUrl, "submission")) { return formUrl; } - return StringUtils.substringBeforeLast(formUrl,"/"); + return StringUtils.substringBeforeLast(formUrl, "/"); } - public Map retrieveFormValues(String formUrl) throws IOException { - Map fieldValues = new HashMap(); + public Map retrieveFormValues(String formUrl) throws IOException { + Map fieldValues = new HashMap(); String submission = readSubmission(formUrl); - if(StringUtils.isNotEmpty(submission)) { - JsonNode dataNode = getObjectMapper().readTree(submission); + if (StringUtils.isNotEmpty(submission)) { + JsonNode dataNode = bpmObjectMapper.readTree(submission); Iterator> dataElements = dataNode.findPath("data").fields(); while (dataElements.hasNext()) { Map.Entry entry = dataElements.next(); - if(StringUtils.endsWithIgnoreCase(entry.getKey(),"_file")) { + if (StringUtils.endsWithIgnoreCase(entry.getKey(), "_file")) { List fileNames = new ArrayList(); - if(entry.getValue().isArray()) { + if (entry.getValue().isArray()) { for (JsonNode fileNode : entry.getValue()) { - byte[] bytes = Base64.getDecoder().decode(StringUtils.substringAfterLast(fileNode.get("url").asText(), "base64,")); + byte[] bytes = Base64.getDecoder() + .decode(StringUtils.substringAfterLast(fileNode.get("url").asText(), "base64,")); FileValue fileValue = Variables.fileValue(fileNode.get("originalName").asText()) .file(bytes) .mimeType(fileNode.get("type").asText()) .create(); fileNames.add(fileNode.get("originalName").asText()); - fieldValues.put(StringUtils.substringBeforeLast(fileNode.get("originalName").asText(),".")+entry.getKey(), fileValue); - if(fileNames.size() > 0) { - fieldValues.put(entry.getKey()+"_uploadname", StringUtils.join(fileNames, ",")); + fieldValues.put(StringUtils.substringBeforeLast(fileNode.get("originalName").asText(), ".") + + entry.getKey(), fileValue); + if (fileNames.size() > 0) { + fieldValues.put(entry.getKey() + "_uploadname", StringUtils.join(fileNames, ",")); } } } - } else{ + } else { fieldValues.put(entry.getKey(), convertToOriginType(entry.getValue())); } } @@ -145,55 +149,51 @@ public Map retrieveFormValues(String formUrl) throws IOException private Object convertToOriginType(JsonNode value) throws IOException { Object fieldValue; - if(value.isNull()){ + if (value.isNull()) { fieldValue = null; - } else if(value.isBoolean()){ + } else if (value.isBoolean()) { fieldValue = value.booleanValue(); - } else if(value.isInt()){ + } else if (value.isInt()) { fieldValue = value.intValue(); - } else if(value.isBinary()){ + } else if (value.isBinary()) { fieldValue = value.binaryValue(); - } else if(value.isLong()){ + } else if (value.isLong()) { fieldValue = value.asLong(); - } else if(value.isDouble()){ + } else if (value.isDouble()) { fieldValue = value.asDouble(); - } else if(value.isBigDecimal()){ + } else if (value.isBigDecimal()) { fieldValue = value.decimalValue(); - } else if(value.isTextual()){ + } else if (value.isTextual()) { fieldValue = value.asText(); - } else{ + } else { fieldValue = value.toString(); } - if(Objects.equals(fieldValue, "")) { + if (Objects.equals(fieldValue, "")) { fieldValue = null; } return fieldValue; } - public String createFormSubmissionData(Map bpmVariables) throws IOException { + public String createFormSubmissionData(Map bpmVariables) throws IOException { List fileKeys = bpmVariables.keySet().stream() .filter((key) -> key.endsWith("_file")) .collect(Collectors.toList()); - for (String fileKey: fileKeys) { + for (String fileKey : fileKeys) { InputStream file = (InputStream) bpmVariables.get(fileKey); byte[] bytes = IOUtils.toByteArray(file); String fileString = new String(bytes, StandardCharsets.UTF_8); bpmVariables.put(fileKey, fileString); } - Map> data = new HashMap<>(); - data.put("data",bpmVariables); - return getObjectMapper().writeValueAsString(data); - } - - private ObjectMapper getObjectMapper(){ - return new ObjectMapper(); + Map> data = new HashMap<>(); + data.put("data", bpmVariables); + return bpmObjectMapper.writeValueAsString(data); } @Deprecated public String getAccessToken() { - return formTokenAccessHandler.getAccessToken(); + return formioTokenServiceProvider.getAccessToken(); } -} \ No newline at end of file +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java index c20f7207..3b9d0014 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java @@ -2,11 +2,14 @@ import static org.junit.Assert.assertEquals; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.oauth2.client.OAuth2RestTemplate; @@ -17,8 +20,8 @@ import java.util.function.Consumer; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.*; +//import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -28,47 +31,47 @@ @ExtendWith(SpringExtension.class) class ApplicationAccessHandlerTest { - @InjectMocks - private ApplicationAccessHandler applicationAccessHandler; + @InjectMocks + private ApplicationAccessHandler applicationAccessHandler; - @Mock - private WebClient unAuthenticatedWebClient; + @Mock + private WebClient unAuthenticatedWebClient; - @Mock - private OAuth2RestTemplate oAuth2RestTemplate; + @Mock + private OAuth2RestTemplate oAuth2RestTemplate; - /** - * This test perform a positive test over ApplicationAccessHandler - * This will validate the response entity is Success - */ - @Test - public void testExchangeSuccess() { - final String apiUrl = "http://localhost:5000/api/application/123"; - WebClient.RequestBodyUriSpec requestBodyUriSpec = mock(WebClient.RequestBodyUriSpec.class); - when(unAuthenticatedWebClient.method(any(HttpMethod.class))) - .thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.uri(anyString())) - .thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.accept(any(MediaType.class))) - .thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.header(anyString(), anyString())) - .thenReturn(requestBodyUriSpec); - OAuth2AccessToken oAuth2AccessToken = mock(OAuth2AccessToken.class); - when(oAuth2RestTemplate.getAccessToken()) - .thenReturn(oAuth2AccessToken); - when(requestBodyUriSpec.headers(any(Consumer.class))) - .thenReturn(requestBodyUriSpec); - WebClient.RequestHeadersSpec requestHeadersSpec = mock(WebClient.RequestHeadersSpec.class); - when(requestBodyUriSpec.body(any(Mono.class), any(Class.class))) - .thenReturn(requestHeadersSpec); - WebClient.ResponseSpec responseSpec = mock(WebClient.ResponseSpec.class); - when(requestHeadersSpec.retrieve()).thenReturn(responseSpec); - Mono> response = Mono.just(ResponseEntity.ok("Success")); - when(responseSpec.toEntity(String.class)) - .thenReturn(response); + /** + * This test perform a positive test over ApplicationAccessHandler + * This will validate the response entity is Success + */ + @Test + public void testExchangeSuccess() { + final String apiUrl = "http://localhost:5000/api/application/123"; + WebClient.RequestBodyUriSpec requestBodyUriSpec = mock(WebClient.RequestBodyUriSpec.class); + when(unAuthenticatedWebClient.method(any(HttpMethod.class))) + .thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.uri(anyString())) + .thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.accept(any(MediaType.class))) + .thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.header(anyString(), anyString())) + .thenReturn(requestBodyUriSpec); + OAuth2AccessToken oAuth2AccessToken = mock(OAuth2AccessToken.class); + when(oAuth2RestTemplate.getAccessToken()) + .thenReturn(oAuth2AccessToken); + when(requestBodyUriSpec.headers(any(Consumer.class))) + .thenReturn(requestBodyUriSpec); + WebClient.RequestHeadersSpec requestHeadersSpec = mock(WebClient.RequestHeadersSpec.class); + when(requestBodyUriSpec.body(any(Mono.class), any(Class.class))) + .thenReturn(requestHeadersSpec); + WebClient.ResponseSpec responseSpec = mock(WebClient.ResponseSpec.class); + when(requestHeadersSpec.retrieve()).thenReturn(responseSpec); + Mono> response = Mono.just(ResponseEntity.ok("Success")); + when(responseSpec.toEntity(String.class)) + .thenReturn(response); - ResponseEntity data = applicationAccessHandler.exchange(apiUrl, HttpMethod.GET, "{}"); - assertEquals(data.getBody(), "Success"); - } + ResponseEntity data = applicationAccessHandler.exchange(apiUrl, HttpMethod.GET, "{}"); + assertEquals(data.getBody(), "Success"); + } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListenerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListenerTest.java index c650e825..0333ecb5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListenerTest.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListenerTest.java @@ -1,110 +1,128 @@ package org.camunda.bpm.extension.commons.io.event; +import com.fasterxml.jackson.databind.ObjectMapper; import org.camunda.bpm.engine.delegate.DelegateTask; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.data.redis.core.StringRedisTemplate; +//import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; - +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.FORM_URL; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_STATUS; +import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_ID; /** + * Camunda EventListener Test. * Test class for CamundaEventListener */ @ExtendWith(SpringExtension.class) public class CamundaEventListenerTest { + @InjectMocks + public CamundaEventListener camundaEventListener; - @InjectMocks - public CamundaEventListener camundaEventListener; + @Mock + private StringRedisTemplate template; - @Mock - private StringRedisTemplate template; + // @Mock + // private SimpMessagingTemplate template; - /** - * Test perform a positive test over onTaskEventListener - * This test will validate the template - */ - @Test - public void onTaskEventListener_with_defaultEvents(){ - DelegateTask delegateTask = mock(DelegateTask.class); - when(delegateTask.getEventName()) - .thenReturn("create"); + @BeforeEach + public void setup() { + try { + Field field = camundaEventListener.getClass().getDeclaredField("bpmObjectMapper"); + field.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + ObjectMapper objectMapper = new ObjectMapper(); + ReflectionTestUtils.setField(this.camundaEventListener, "bpmObjectMapper", objectMapper); + } - ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); - ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "ALL"); - Map variables = new HashMap<>(); - variables.put("applicationId" , "id1"); - variables.put("formUrl" , "http://localhost:3001"); - variables.put("applicationStatus" , "New"); - when(delegateTask.getVariables()) - .thenReturn(variables); - camundaEventListener.onTaskEventListener(delegateTask); - ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); - verify(template, times(2)).convertAndSend(anyString(), captor.capture()); - assertEquals("{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null}}", - captor.getAllValues().get(0)); - assertEquals("{\"id\":null,\"eventName\":\"create\"}", captor.getAllValues().get(1)); - } + /** + * Test perform a positive test over onTaskEventListener + * This test will validate the template + */ + @Test + public void onTaskEventListener_with_defaultEvents() { + DelegateTask delegateTask = mock(DelegateTask.class); + when(delegateTask.getEventName()) + .thenReturn("create"); + ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); + ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "ALL"); + Map variables = new HashMap<>(); + variables.put(APPLICATION_ID, "id1"); + variables.put(FORM_URL, "http://localhost:3001"); + variables.put(APPLICATION_STATUS, "New"); + when(delegateTask.getVariables()) + .thenReturn(variables); + camundaEventListener.onTaskEventListener(delegateTask); + ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + verify(template, times(2)).convertAndSend(anyString(), captor.capture()); + assertEquals("{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null},\"tenantId\":null}", + captor.getAllValues().get(0)); + assertEquals("{\"id\":null,\"eventName\":\"create\",\"tenantId\":null}", captor.getAllValues().get(1)); + } - /** - * Test perform a positive test with default message events - * This test will validate the template - */ - @Test - public void onTaskEventListener_with_default_messageEvents(){ - DelegateTask delegateTask = mock(DelegateTask.class); - when(delegateTask.getEventName()) - .thenReturn("create"); + /** + * Test perform a positive test with default message events + * This test will validate the template + */ + @Test + public void onTaskEventListener_with_default_messageEvents() { + DelegateTask delegateTask = mock(DelegateTask.class); + when(delegateTask.getEventName()) + .thenReturn("create"); + ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); + ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "DEFAULT"); + Map variables = new HashMap<>(); + variables.put(APPLICATION_ID, "id1"); + variables.put(FORM_URL, "http://localhost:3001"); + variables.put(APPLICATION_STATUS, "New"); + when(delegateTask.getVariables()) + .thenReturn(variables); + camundaEventListener.onTaskEventListener(delegateTask); + ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + verify(template, times(2)).convertAndSend(anyString(), captor.capture()); + assertEquals("{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null},\"tenantId\":null}", + captor.getAllValues().get(0)); + assertEquals("{\"id\":null,\"eventName\":\"create\",\"tenantId\":null}", captor.getAllValues().get(1)); + } - ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); - ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "DEFAULT"); - Map variables = new HashMap<>(); - variables.put("applicationId" , "id1"); - variables.put("formUrl" , "http://localhost:3001"); - variables.put("applicationStatus" , "New"); - when(delegateTask.getVariables()) - .thenReturn(variables); - camundaEventListener.onTaskEventListener(delegateTask); - ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); - verify(template, times(2)).convertAndSend(anyString(), captor.capture()); - assertEquals("{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null}}", - captor.getAllValues().get(0)); - assertEquals("{\"id\":null,\"eventName\":\"create\"}", captor.getAllValues().get(1)); - } + /** + * Test perform a positive test with custom message events + * This test will validate the template + */ + @Test + public void onTaskEventListener_with_custom_messageEvents() { + DelegateTask delegateTask = mock(DelegateTask.class); + when(delegateTask.getEventName()) + .thenReturn("create"); + ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); + ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "create"); + Map variables = new HashMap<>(); + variables.put(APPLICATION_ID, "id1"); + variables.put(FORM_URL, "http://localhost:3001"); + variables.put(APPLICATION_STATUS, "New"); + when(delegateTask.getVariables()) + .thenReturn(variables); + camundaEventListener.onTaskEventListener(delegateTask); + ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); + verify(template, times(2)).convertAndSend(anyString(), captor.capture()); + assertEquals( + "{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null},\"tenantId\":null}", + captor.getAllValues().get(0)); + assertEquals("{\"id\":null,\"eventName\":\"create\",\"tenantId\":null}", captor.getAllValues().get(1)); - /** - * Test perform a positive test with custom message events - * This test will validate the template - */ - @Test - public void onTaskEventListener_with_custom_messageEvents() { - DelegateTask delegateTask = mock(DelegateTask.class); - when(delegateTask.getEventName()) - .thenReturn("create"); + } - ReflectionTestUtils.setField(camundaEventListener, "messageCategory", "TASK_EVENT_DETAILS,TASK_EVENT"); - ReflectionTestUtils.setField(camundaEventListener, "messageEvents", "create"); - Map variables = new HashMap<>(); - variables.put("applicationId", "id1"); - variables.put("formUrl", "http://localhost:3001"); - variables.put("applicationStatus", "New"); - when(delegateTask.getVariables()) - .thenReturn(variables); - camundaEventListener.onTaskEventListener(delegateTask); - ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); - verify(template, times(2)).convertAndSend(anyString(), captor.capture()); - assertEquals( - "{\"assignee\":null,\"createTime\":null,\"deleteReason\":null,\"description\":null,\"dueDate\":null,\"eventName\":\"create\",\"executionId\":null,\"followUpDate\":null,\"id\":null,\"name\":null,\"owner\":null,\"priority\":0,\"processDefinitionId\":null,\"processInstanceId\":null,\"taskDefinitionKey\":null,\"variables\":{\"applicationStatus\":null,\"formUrl\":null,\"applicationId\":null}}", - captor.getAllValues().get(0)); - assertEquals("{\"id\":null,\"eventName\":\"create\"}", captor.getAllValues().get(1)); - } - } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js index f5f5e567..0b73b109 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js @@ -4,6 +4,10 @@ import {useDispatch, useSelector} from "react-redux"; import {setSelectedBPMFilter, setSelectedTaskID} from "../../../actions/bpmTaskActions"; import {Link} from "react-router-dom"; /*import {Link} from "react-router-dom";*/ +import { useTranslation } from "react-i18next"; +import { MULTITENANCY_ENABLED } from "../../../constants/constants"; + +export default ServiceFlowFilterListDropDown; const ServiceFlowFilterListDropDown = React.memo(() => { @@ -11,6 +15,10 @@ const ServiceFlowFilterListDropDown = React.memo(() => { const filterList = useSelector(state=> state.bpmTasks.filterList); const isFilterLoading = useSelector(state=> state.bpmTasks.isFilterLoading); const selectedFilter=useSelector(state=>state.bpmTasks.selectedFilter); + const { t } = useTranslation(); + const tenantKey = useSelector((state) => state.tenants?.tenantId); + const redirectUrl = MULTITENANCY_ENABLED ? `/tenant/${tenantKey}/` : "/"; + const changeFilterSelection = (filter)=>{ dispatch(setSelectedBPMFilter(filter)); @@ -26,7 +34,7 @@ const ServiceFlowFilterListDropDown = React.memo(() => { changeFilterSelection(filter)}> { return ( - No Filters Found + {t("No Filters Found")} ) } - } - return <> - {isFilterLoading? Loading...: renderFilterList()} + }; + return ( + <> + {isFilterLoading ? ( + {t("Loading")}... + ) : ( + renderFilterList() + )} -}); - -export default ServiceFlowFilterListDropDown; + ); +}); \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index 42f231a9..b0810d45 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -1,34 +1,97 @@ -import React from "react"; +import React, { useEffect, useMemo, useState } from "react"; import {Navbar, Dropdown, Container, Nav, NavDropdown} from "react-bootstrap"; import {Link, useLocation} from "react-router-dom"; import {useDispatch, useSelector} from "react-redux"; import UserService from "../services/UserService"; -import {getUserRoleName, getUserRolePermission, getUserInsightsPermission} from "../helper/user"; +import { + getUserRoleName, + getUserRolePermission, + getUserInsightsPermission +} from "../helper/user"; +import createURLPathMatchExp from "../helper/regExp/pathMatch"; +import { useTranslation } from "react-i18next"; import "./styles.scss"; -import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER} from "../constants/constants"; +import { + CLIENT, + STAFF_REVIEWER, + APPLICATION_NAME, + STAFF_DESIGNER, + MULTITENANCY_ENABLED, + } from "../constants/constants"; +import { push } from "connected-react-router"; +import i18n from "../resourceBundles/i18n"; +import { setLanguage } from "../actions/languageSetAction"; +import { updateUserlang } from "../apiManager/services/userservices"; +import { fetchSelectLanguages } from "../apiManager/services/languageServices"; + import ServiceFlowFilterListDropDown from "../components/ServiceFlow/filter/ServiceTaskFilterListDropDown"; -import {push} from "connected-react-router"; const NavBar = React.memo(() => { const isAuthenticated = useSelector((state) => state.user.isAuthenticated); const location = useLocation(); const { pathname } = location; const user = useSelector((state) => state.user.userDetail); + const lang = useSelector((state) => state.user.lang); const userRoles = useSelector((state) => state.user.roles); const showApplications= useSelector((state) => state.user.showApplications); + const applicationTitle = useSelector( + (state) => state.tenants?.tenantData?.details?.applicationTitle + ); + const tenantKey = useSelector((state) => state.tenants?.tenantId); + const formTenant = useSelector((state)=>state.form?.form?.tenantKey); + const baseUrl = MULTITENANCY_ENABLED ? `/tenant/${tenantKey}/` : "/"; + + /** + * For anonymous forms the only way to identify the tenant is through the + * form data with current implementation. To redirect to the correact tenant + * we will use form as the data source for the tenantKey + */ + + const [loginUrl, setLoginUrl] = useState(baseUrl); + + const selectLanguages = useSelector((state) => state.user.selectLanguages); const dispatch = useDispatch(); const logoPath = "/logo.svg"; - const appName = APPLICATION_NAME; + const getAppName = useMemo( + () => () => { + if (!MULTITENANCY_ENABLED) { + return APPLICATION_NAME; + } + // TODO: Need a propper fallback component prefered a skeleton. + return applicationTitle || ""; + }, + [MULTITENANCY_ENABLED, applicationTitle] + ); + const appName = getAppName(); + const { t } = useTranslation(); + + useEffect(()=>{ + if(!isAuthenticated && formTenant && MULTITENANCY_ENABLED){ + setLoginUrl(`/tenant/${formTenant}/`); + } + },[isAuthenticated, formTenant]); + + useEffect(() => { + dispatch(fetchSelectLanguages()); + }, [dispatch]); + + useEffect(() => { + i18n.changeLanguage(lang); + }, [lang]); + const handleOnclick = (selectedLang) => { + dispatch(setLanguage(selectedLang)); + dispatch(updateUserlang(selectedLang)); + }; const logout = () => { - dispatch(push(`/`)); + dispatch(push(baseUrl)); UserService.userLogout(); - } + }; const goToTask = () => { - dispatch(push(`/task`)); - } + dispatch(push(`${baseUrl}task`)); + }; return (
@@ -40,7 +103,7 @@ const NavBar = React.memo(() => { */} - + { */} - {isAuthenticated? + { isAuthenticated ? ( + - :Login} + + ) : ( + + Login + + )}
); }) -export default NavBar; +export default NavBar; \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index 79cc0412..48c52ef7 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -9,25 +9,21 @@ margin-bottom: 40px; box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1); } - & .navbar-btn { box-shadow: none; outline: none !important; border: none; } - & .line { width: 100%; height: 1px; border-bottom: 1px dashed #ddd; margin: 40px 0; } - & i, & span { display: inline-block; } - & .nav-profile { max-width: 229px; margin-bottom: 30px; @@ -40,7 +36,6 @@ display: flex; color: $white; padding: 10px; - & .profile-image { margin-right: 15px; position: relative; @@ -97,77 +92,62 @@ #sidebar.active .CTAs { display: none; } - #sidebar.active .sidebar-header strong { display: block; } - #sidebar ul li a { font-weight: bolder; text-align: left; } - #sidebar.active ul li a { padding: 20px 10px; text-align: center; font-size: 0.85em; } - #sidebar.active ul li a i { margin-right: 0; display: block; font-size: 1.8em; margin-bottom: 5px; } - #sidebar.active ul ul a { padding: 10px !important; } - #sidebar .sidebar-header { padding: 20px; background: $light-grey; } - #sidebar .sidebar-header strong { display: none; font-size: 1.8em; } - #sidebar ul.components { padding: 1px 16px; } - #sidebar ul li a { padding: 10px; font-size: 1.1em; display: block; } - #sidebar ul li a i { margin-right: 10px; } - #sidebar ul li.active > a, #sidebar a[aria-expanded="true"] { color: $light-blue !important; background: $light-grey; } - #sidebar a[data-toggle="collapse"] { position: relative; } - #sidebar ul ul a { font-size: 0.9em !important; padding-left: 30px !important; background: $light-grey; } - #sidebar ul.CTAs { padding: 20px; } - #sidebar ul.CTAs a { text-align: center; font-size: 0.9em !important; @@ -175,7 +155,6 @@ border-radius: 5px; margin-bottom: 5px; } - #sidebar a.article, #sidebar a.article:hover { background: $light-grey !important; diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index d43fffa6..99007860 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -20,7 +20,7 @@ $gray-800: #373a3c; $gray-900: #212529; $black: #000; -$blue: #2780e3; +$blue: #4D61FC; $indigo: #6610f2; $purple: #613d7c; $pink: #e83e8c; @@ -49,6 +49,7 @@ $dark: $gray-800; max-width: 100vw; } .container { + margin-top: 3px; padding-left: 0; padding-right: 0; //height: 100vh; @@ -151,6 +152,13 @@ i.fa.fa-question-circle.text-muted { padding: 0.75rem 1.25rem; margin-bottom: 8px; } +.form-view-wrapper{ + min-height: 75vh; +} +.btn.signature-pad-refresh{ + z-index: 99 !important; +} + .formio-error-wrapper, .has-error { color: red; @@ -424,6 +432,13 @@ i.fa.fa-question-circle.text-muted { height: 30px; width: 100%; } +@media (max-width: 768px) { + .main-header{ + height: 70px; + flex-direction: row; + flex-wrap: wrap; + } +} .back-icon{ display: flex; } @@ -539,6 +554,26 @@ header nav { width: 40px; } +.sort-span { + cursor: pointer; + border: 1px solid #0071EB; + border-radius: 0.25rem; + padding: 4px; + padding-left: 6px; + padding-top: 0px; + border-radius: 6px; + width: 35px; +} + +.sort-span:hover { + + background-color: #0071EB; + + .fa-lg-hover { + color: white; + } +} + .custom-app-name { font-size: 30px; font-weight: 600; @@ -565,6 +600,123 @@ div[disabled] { .classApplicationId{ width: 15%; } +.form_select{ + width: 15%; +} +.form_operation{ + width: 30%; +} .classApplicationName{ width: 20%; } +.form_title{ + width: 40%; +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0,0,0,.9); +} + +// overwriting default styles +.MuiTab-wrapper{ + font-size: 16px; +} +.formcomponents .formcomponent{ + font-size: 1em; +} +.button_font{ + font-size: 14px; + font-weight: bold; +} +.delete_button{ + font-size: 25px; + color:red; + cursor: pointer; +} + +.custom_primary_color{ + color: #0000FF; +} + +.tooltiptext{ + color: #757575; +} + +.select_download{ + display: flex; + flex-direction: row; +} +.select_text{ + font-weight: bold; +} +.select_input{ + width: 15px; + height: 15px; +} +.form_check{ + margin-bottom: 20px; +} +a{ + color: #0000FF; +} +.info-background { + background-color: #FFDBDB; +} + +.formio-wizard-nav-container +{ + display: flex; + flex-wrap: nowrap; + flex-direction: row; +} +.btn-wizard-nav-submit, .btn-wizard-nav-next, .btn-wizard-nav-previous{ + margin-left:5px; +} + +div.upload { + background-color:rgb(239,239,239); + border: 1px solid #ddd; + border-radius:5px; + display:inline-block; + height: 30px; + padding:3px 3px 3px 3px; + position:relative; + width: 140px; + text-align: center; + +} + +div.upload:hover { + opacity:0.95; +} + +div.upload input[type="file"] { + display: input-block; + width: 100%; + height: 30px; + opacity: 0; + cursor:pointer; + position:absolute; + left:0; +} +.uploadButton { + background-color: #425F9C; + border: none; + border-radius: 3px; + color: #FFF; + cursor:pointer; + display: inline-block; + height: 30px; + margin-right:15px; + width: auto; + padding:0 20px; + box-sizing: content-box; +} + +.fileName { + font-family: Arial; + font-size:14px; +} + +.upload + .uploadButton { + height:38px; +} \ No newline at end of file diff --git a/apps/forms-flow-ai/openshift_templates/build_configs/api_bc.yaml b/apps/forms-flow-ai/openshift_templates/build_configs/api_bc.yaml index cc101ad8..8054b54e 100644 --- a/apps/forms-flow-ai/openshift_templates/build_configs/api_bc.yaml +++ b/apps/forms-flow-ai/openshift_templates/build_configs/api_bc.yaml @@ -19,8 +19,8 @@ parameters: description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. value: forms-flow-api - name: FORMIO_SOURCE_REPO_BRANCH - description: AOT branch/version of firmio from which the app is built. - value: v4.0.5 + description: AOT branch/version of formio from which the app is built. + value: v5.1.0 - name: FORMIO_SOURCE_REPO_URL description: AOT formsflow git repository reference . value: https://github.com/AOT-Technologies/forms-flow-ai.git diff --git a/apps/forms-flow-ai/openshift_templates/build_configs/camunda_bc.yaml b/apps/forms-flow-ai/openshift_templates/build_configs/camunda_bc.yaml index 0f924f07..bcb5673d 100644 --- a/apps/forms-flow-ai/openshift_templates/build_configs/camunda_bc.yaml +++ b/apps/forms-flow-ai/openshift_templates/build_configs/camunda_bc.yaml @@ -20,8 +20,8 @@ parameters: description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. value: /apps/forms-flow-ai/forms-flow-bpm - name: FORMIO_SOURCE_REPO_BRANCH - description: AOT branch/version of firmio from which the app is built. - value: v4.0.5 + description: AOT branch/version of formio from which the app is built. + value: v5.1.0 - name: FORMIO_SOURCE_REPO_URL description: AOT formsflow git repository reference . value: https://github.com/AOT-Technologies/forms-flow-ai.git diff --git a/apps/forms-flow-ai/openshift_templates/build_configs/formio_bc.yaml b/apps/forms-flow-ai/openshift_templates/build_configs/formio_bc.yaml index 0fa26c8b..ec8701bd 100644 --- a/apps/forms-flow-ai/openshift_templates/build_configs/formio_bc.yaml +++ b/apps/forms-flow-ai/openshift_templates/build_configs/formio_bc.yaml @@ -13,7 +13,7 @@ parameters: - name: SOURCE_REPOSITORY_REF displayName: Git Reference description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. - value: v4.0.5 + value: v5.1.0 - name: SOURCE_CONTEXT_DIR displayName: Git context directory description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. diff --git a/apps/forms-flow-ai/openshift_templates/build_configs/web_bc.yaml b/apps/forms-flow-ai/openshift_templates/build_configs/web_bc.yaml index 00902260..89c48e92 100644 --- a/apps/forms-flow-ai/openshift_templates/build_configs/web_bc.yaml +++ b/apps/forms-flow-ai/openshift_templates/build_configs/web_bc.yaml @@ -19,8 +19,8 @@ parameters: description: Set this to a branch name, tag or other ref of your repository if you are not using the default branch. value: apps/forms-flow-ai/forms-flow-web - name: FORMIO_SOURCE_REPO_BRANCH - description: AOT branch/version of firmio from which the app is built. - value: v4.0.5 + description: AOT branch/version of formio from which the app is built. + value: v5.1.0 - name: FORMIO_SOURCE_REPO_URL description: AOT formsflow git repository reference . value: https://github.com/AOT-Technologies/forms-flow-ai.git From be2f27ce62048189c4e8f9f48273f22b224a8f86 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 13 Jul 2023 15:44:51 -0600 Subject: [PATCH 002/157] pom.xml & pom-default.xml --- .../forms-flow-bpm/pom-default.xml | 18 +++ .../{pom-docker.xml => pom.xml} | 124 ++++++++++-------- 2 files changed, 87 insertions(+), 55 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/pom-default.xml rename apps/forms-flow-ai/forms-flow-bpm/{pom-docker.xml => pom.xml} (78%) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml new file mode 100644 index 00000000..f22747cc --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + + org.camunda.bpm.extension + formsflow-bpm + 5.1.0 + pom.xml + + + default + + + + \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom.xml similarity index 78% rename from apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml rename to apps/forms-flow-ai/forms-flow-bpm/pom.xml index 7392e00b..406af905 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom.xml @@ -4,31 +4,33 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.camunda.bpm - extension - 2.0.0 + org.camunda.bpm.extension + formsflow-bpm + 5.1.0 + pom Forms flow BPM Extension Forms flow BPM Extension - 11 - 11 - 11 + 17 + 17 + 17 UTF-8 ${encoding} ${encoding} false - 7.15.0 - 7.15.0 - 1.2.2 - 1.2.0 - 2.6.4 - 2.6.4 - 2.13.3 - 2.2.3 + 2.2.3 + 7.17.0 + 1.5.0 + 1.3.0 + 2.6.6 + 2.6.6 + 2.14.0 + @@ -36,7 +38,7 @@ com.h2database h2 - 2.0.206 + 2.0.206 org.camunda.bpm @@ -71,13 +73,18 @@ org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-webapp - ${version.camundaSpringBoot} + ${version.camunda} org.camunda.bpm.springboot camunda-bpm-spring-boot-starter-rest - ${version.camundaSpringBoot} + ${version.camunda} + + + + org.springframework.boot + spring-boot-starter-hateoas @@ -116,7 +123,7 @@ spring-security-oauth2-jose - + org.camunda.bpm.extension camunda-bpm-identity-keycloak @@ -179,8 +186,8 @@ org.postgresql postgresql - - 42.2.5 + + 42.4.3 @@ -249,7 +256,7 @@ org.jsoup jsoup - 1.13.1 + 1.15.3 @@ -290,15 +297,33 @@ org.springframework spring-websocket - 5.3.4 + 5.3.20 org.springframework spring-messaging - 5.3.4 + 5.3.20 + + + + org.graalvm.js + js-scriptengine + 22.1.0.1 + + org.graalvm.js + js + 22.1.0.1 + + + + org.springframework.boot + spring-boot-starter-jersey + + + org.springframework.boot spring-boot-starter-data-redis-reactive @@ -325,12 +350,12 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.0.0-M7 org.jacoco jacoco-maven-plugin - 0.8.7 + 0.8.8 target/jacoco-ut @@ -349,6 +374,18 @@ org/camunda/bpm/extension/commons/connector/auth/FormioContext.class org/camunda/bpm/extension/commons/connector/*.class org/camunda/bpm/extension/CamundaApplication.class + org/camunda/bpm/extension/commons/exceptions/*.class + org/camunda/bpm/extension/commons/utils/*.class + org/camunda/bpm/extension/hooks/controllers/mapper/*.class + org/camunda/bpm/extension/hooks/exceptions/*.class + org/camunda/bpm/extension/hooks/listeners/execution/FormAccessTokenCacheListener.class + org/camunda/bpm/extension/hooks/rest/exception/*.class + org/camunda/bpm/extension/commons/exceptions/*.class + org/camunda/bpm/extension/commons/config/*.class + org/camunda/bpm/extension/hooks/rest/constant/*.class + org/camunda/bpm/extension/hooks/services/IMessageEvent.class + org/camunda/bpm/extension/hooks/rest/dto/*.class + org/camunda/bpm/extension/hooks/rest/impl/*.class @@ -365,6 +402,7 @@ spring-boot-maven-plugin ${version.springBoot} + org.camunda.bpm.extension.CamundaApplication ZIP @@ -389,37 +427,13 @@ default + + pom-default.xml + true - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0-M5 - - - org.jacoco - jacoco-maven-plugin - 0.8.7 - - target/jacoco-ut - - - - - prepare-agent - report - - - - - - - - + - + + \ No newline at end of file From 273c0686a8da1d7397b653a5f716601abfde8d61 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 13 Jul 2023 16:07:03 -0600 Subject: [PATCH 003/157] added pom-default to bpm Dockerfile --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 050a57e4..18147e53 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -11,6 +11,7 @@ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ #RUN cp /bpm/forms-flow-bpm/pom.xml /tmp/pom.xml RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ COPY ./pom.xml /tmp/pom.xml +COPY ./pom-default.xml /tmp/pom-default.xml # COPY ./settings-docker.xml /usr/share/maven/ref/ WORKDIR /tmp/ From 5811fec267aa7d4365c6cdc3d153006c3267e515 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 14 Jul 2023 09:22:17 -0600 Subject: [PATCH 004/157] more changes to some upgrade files --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 7 ++++--- .../bpm/extension/commons/io/socket/RedisConfig.java | 2 +- .../connector/support/ApplicationAccessHandlerTest.java | 2 +- .../forms-flow-web/src/constants/groupConstants.js | 4 ++++ 4 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-web/src/constants/groupConstants.js diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 18147e53..224f2af2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -19,6 +19,7 @@ WORKDIR /tmp/ # This allows Docker to cache most of the maven dependencies RUN mvn -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve dependency:go-offline -B RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ +RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default ARG CUSTOM_SRC_DIR=src/ @@ -29,10 +30,10 @@ RUN mvn -s /usr/share/maven/ref/settings-docker.xml package # Final custom slim java image (for apk command see jdk-11.0.3_7-alpine-slim) -FROM artifacts.developer.gov.bc.ca/docker-remote/adoptopenjdk/openjdk11:jdk-11.0.3_7-alpine +FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine -ENV JAVA_VERSION jdk-11.0.3+7 -ENV JAVA_HOME=/opt/java/openjdk \ +ENV JAVA_VERSION=17-ea+14 +ENV JAVA_HOME=/opt/java/openjdk-17 \ PATH="/opt/java/openjdk/bin:$PATH" EXPOSE 8080 diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java index 4fbf48f2..f7f09bd5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java @@ -16,7 +16,7 @@ import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; -// import java.util.Properties; +import java.util.Properties; import java.util.logging.Logger; /** diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java index 3b9d0014..37dc3eca 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java @@ -21,7 +21,7 @@ import java.util.function.Consumer; import static org.mockito.ArgumentMatchers.*; -//import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/apps/forms-flow-ai/forms-flow-web/src/constants/groupConstants.js b/apps/forms-flow-ai/forms-flow-web/src/constants/groupConstants.js new file mode 100644 index 00000000..3782d41b --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/constants/groupConstants.js @@ -0,0 +1,4 @@ +export const GROUPS={ + applicationsAccess:["/formsflow/access-allow-applications","/formsflow/formsflow-client/access-allow-applications"], + viewSubmissionsAccess:["/formsflow/access-allow-submissions"] + }; \ No newline at end of file From cad95945bcdedc76cc8a3b7aa9a2a59c2270a954 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 14 Jul 2023 10:53:54 -0600 Subject: [PATCH 005/157] updates to keycloak plugin files --- .../KeycloakIdentityProviderSession.java | 63 +++++++++++++++++-- .../keycloak/plugin/KeycloakUserService.java | 21 +++++-- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java index 3f4ff681..e82cda01 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java @@ -4,6 +4,8 @@ import java.util.List; import org.camunda.bpm.engine.identity.Group; +import org.camunda.bpm.engine.identity.Tenant; +import org.camunda.bpm.engine.identity.TenantQuery; import org.camunda.bpm.engine.identity.User; import org.camunda.bpm.engine.impl.interceptor.CommandContext; import org.camunda.bpm.extension.keycloak.*; @@ -19,13 +21,21 @@ public class KeycloakIdentityProviderSession extends org.camunda.bpm.extension.keycloak.KeycloakIdentityProviderSession { + private CustomConfig config; + private TenantService tenantService; + protected QueryCache> tenantQueryCache; + public KeycloakIdentityProviderSession(KeycloakConfiguration keycloakConfiguration, KeycloakRestTemplate restTemplate, KeycloakContextProvider keycloakContextProvider, - QueryCache> userQueryCache, QueryCache> groupQueryCache, + QueryCache> userQueryCache, + QueryCache> groupQueryCache, + QueryCache> tenantQueryCache, QueryCache checkPasswordCache, - String webClientId, boolean enableClientAuth) { + CustomConfig config) { super(keycloakConfiguration, restTemplate, keycloakContextProvider, userQueryCache, groupQueryCache, checkPasswordCache); - this.groupService = new KeycloakGroupService(keycloakConfiguration, restTemplate, keycloakContextProvider, webClientId, enableClientAuth); - this.userService = new KeycloakUserService(keycloakConfiguration, restTemplate, keycloakContextProvider, webClientId, enableClientAuth); + this.config = config; + this.groupService = new KeycloakGroupService(keycloakConfiguration, restTemplate, keycloakContextProvider, config); + this.userService = new KeycloakUserService(keycloakConfiguration, restTemplate, keycloakContextProvider, config); + this.tenantQueryCache = tenantQueryCache; } /** @@ -75,4 +85,47 @@ private List doFindUserByQueryCriteria(CacheableKeycloakUserQuery userQuer this.userService.requestUsersWithoutGroupId(userQuery); } -} \ No newline at end of file + /** + * find groups meeting given group query criteria (with cache lookup and post + * processing). + * + * @param groupQuery the group query + * @return list of matching groups + */ + protected List findGroupByQueryCriteria(KeycloakGroupQuery groupQuery) { + StringBuilder resultLogger = new StringBuilder(); + + if (KeycloakPluginLogger.INSTANCE.isDebugEnabled()) { + resultLogger.append("Keycloak group query results: ["); + } + + List allMatchingGroups = groupQueryCache.getOrCompute(CacheableKeycloakGroupQuery.of(groupQuery), + this::doFindGroupByQueryCriteria); + + List processedGroups = groupService.postProcessResults(groupQuery, allMatchingGroups, resultLogger); + + if (KeycloakPluginLogger.INSTANCE.isDebugEnabled()) { + resultLogger.append("]"); + KeycloakPluginLogger.INSTANCE.groupQueryResult(resultLogger.toString()); + } + + return processedGroups; + } + + /** + * find all groups meeting given group query criteria (without cache lookup or + * post processing). + * + * @param groupQuery the group query + * @return list of matching groups + */ + private List doFindGroupByQueryCriteria(CacheableKeycloakGroupQuery groupQuery) { + if (StringUtils.hasLength(groupQuery.getUserId())) { + // if restriction on userId is provided, we're searching within the groups of a + // single user + return groupService.requestGroupsByUserId(groupQuery); + } else { + return groupService.requestGroupsWithoutUserId(groupQuery); + } + } +} \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java index 1122703c..28808c12 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java @@ -13,6 +13,11 @@ import org.springframework.web.client.RestClientException; import org.springframework.util.StringUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.oidc.user.OidcUser; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; + import java.util.logging.Logger; import org.springframework.http.ResponseEntity; @@ -27,6 +32,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; + import static org.camunda.bpm.extension.keycloak.json.JsonUtil.*; /** @@ -40,12 +46,19 @@ public class KeycloakUserService extends org.camunda.bpm.extension.keycloak.Key private String webClientId; private boolean enableClientAuth; + private boolean enableMultiTenancy; + private TenantService tenantService; public KeycloakUserService(KeycloakConfiguration keycloakConfiguration, KeycloakRestTemplate restTemplate, - KeycloakContextProvider keycloakContextProvider,String webClientId,boolean enableClientAuth) { + KeycloakContextProvider keycloakContextProvider, CustomConfig config) { super(keycloakConfiguration, restTemplate, keycloakContextProvider); - this.webClientId = webClientId; - this.enableClientAuth = enableClientAuth; + + this.webClientId = config.getWebClientId(); + this.enableClientAuth = config.isEnableClientAuth(); + this.enableMultiTenancy = config.isEnableMultiTenancy(); + if (this.enableMultiTenancy) { + this.tenantService = new TenantService(restTemplate, keycloakContextProvider, config); + } } @Override @@ -120,4 +133,4 @@ private UserEntity transformUser(JsonObject result) throws JsonException { user.setLastName(lastName); return user; } -} \ No newline at end of file +} From 9046ab39b9b68bcfd7cdb644f585d2a9f227883d Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 14 Jul 2023 11:49:42 -0600 Subject: [PATCH 006/157] added settings-docker.xml (bpm) --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 18 +++++++------ .../forms-flow-bpm/settings-docker.xml | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 224f2af2..18d978d6 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -8,11 +8,12 @@ RUN apt-get update \ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ -#RUN cp /bpm/forms-flow-bpm/pom.xml /tmp/pom.xml -RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ -COPY ./pom.xml /tmp/pom.xml -COPY ./pom-default.xml /tmp/pom-default.xml -# COPY ./settings-docker.xml /usr/share/maven/ref/ +# RUN cp /bpm/forms-flow-bpm/pom.xml /tmp/pom.xml +# RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ +# COPY ./pom.xml /tmp/pom.xml +# COPY ./pom-default.xml /tmp/pom-default.xml +COPY pom*.xml /tmp/ +COPY settings-docker.xml /usr/share/maven/ref/ WORKDIR /tmp/ @@ -25,7 +26,7 @@ ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ -RUN mvn -s /usr/share/maven/ref/settings-docker.xml package +# RUN mvn -s /usr/share/maven/ref/settings-docker.xml package @@ -34,7 +35,7 @@ FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine ENV JAVA_VERSION=17-ea+14 ENV JAVA_HOME=/opt/java/openjdk-17 \ - PATH="/opt/java/openjdk/bin:$PATH" + PATH="/opt/java/openjdk-17/bin:$PATH" EXPOSE 8080 # OpenShift has /app in the image, but it's missing when doing local development - Create it when missing @@ -45,4 +46,5 @@ COPY --from=MAVEN_TOOL_CHAIN /tmp/target/forms-flow-bpm.jar ./app RUN chmod a+rwx -R /app WORKDIR /app VOLUME /tmp -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file +# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml new file mode 100644 index 00000000..f0a1a600 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml @@ -0,0 +1,27 @@ + + + + + + + + + defaultProfile + + true + + + + + \ No newline at end of file From 2e1bc2a504e3d700d887481180b511a4669f8bb8 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 14 Jul 2023 12:59:44 -0600 Subject: [PATCH 007/157] Dockerfile updated --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 18d978d6..e754d625 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -1,7 +1,8 @@ # Modified by Yichun Zhao and Walter Moar # Maven build -FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3.6.1-jdk-11-slim AS MAVEN_TOOL_CHAIN +# FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN +FROM maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN RUN apt-get update \ && apt-get install -y git @@ -14,6 +15,7 @@ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ # COPY ./pom-default.xml /tmp/pom-default.xml COPY pom*.xml /tmp/ COPY settings-docker.xml /usr/share/maven/ref/ +# COPY ./settings-docker.xml /usr/share/maven/ref/ WORKDIR /tmp/ @@ -31,7 +33,8 @@ COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ # Final custom slim java image (for apk command see jdk-11.0.3_7-alpine-slim) -FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine +# FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine +FROM openjdk:17-jdk-alpine ENV JAVA_VERSION=17-ea+14 ENV JAVA_HOME=/opt/java/openjdk-17 \ From 111687528836a733f6e9dedf6741e5d7d170e86b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 10:17:31 -0600 Subject: [PATCH 008/157] update to application.yaml --- .../src/main/resources/application.yaml | 75 ++++++++++++------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index e37f43a5..bd7efd7c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -9,16 +9,18 @@ formbuilder.pipeline.service.username: ${CAMUNDA_FORMBUILDER_PIPELINE_USERNAME} formbuilder.pipeline.service.password: ${CAMUNDA_FORMBUILDER_PIPELINE_PASSWORD} formbuilder.pipeline.service.bpm-url: ${CAMUNDA_FORMBUILDER_PIPELINE_BPM_URL} -spring.datasource: - jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} - username: ${CAMUNDA_JDBC_USER:sa} - password: ${CAMUNDA_JDBC_PASSWORD:sa} - driverClassName: ${CAMUNDA_JDBC_DRIVER:org.h2.Driver} - type: com.zaxxer.hikari.HikariDataSource - connectionTimeout: ${CAMUNDA_HIKARI_CONN_TIMEOUT:30000} - idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} - maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} - validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} +spring: + datasource: + jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} + username: ${CAMUNDA_JDBC_USER:sa} + password: ${CAMUNDA_JDBC_PASSWORD:sa} + driverClassName: ${CAMUNDA_JDBC_DRIVER:org.h2.Driver} + type: com.zaxxer.hikari.HikariDataSource + minimum-idle: 10 + connectionTimeout: ${CAMUNDA_HIKARI_CONN_TIMEOUT:30000} + idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} + maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} + validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} analytics.datasource: jdbc-url: ${CAMUNDA_JDBC_URL} @@ -33,8 +35,14 @@ analytics.datasource: formsflow.ai: + forms: + enableCustomSubmission: ${CUSTOM_SUBMISSION_ENABLED:false} + custom_submission: + url: ${CUSTOM_SUBMISSION_URL} api: url: ${FORMSFLOW_API_URL} + analysis: + url: ${DATA_ANALYSIS_URL} formio: url: ${FORMIO_URL} security: @@ -69,9 +77,9 @@ info: app: name: "Camunda" description: "formsflow.ai Engine" - version: "7.15" + version: "7.17" java: - version: "11" + version: "17" # Enable the below given block for session management of camunda. This is not required for externalised tasklist. #session.datasource: @@ -86,6 +94,8 @@ info: # validationTimeout: ${CAMUNDA_SESSION_HIKARI_VALID_TIMEOUT:5000} camunda.bpm: + job-execution: + enabled: true history-level: ${CAMUNDA_BPM_HISTORY_LEVEL:none} authorization: enabled: ${CAMUNDA_AUTHORIZATION_FLAG:true} @@ -95,7 +105,7 @@ camunda.bpm: webapp: application-path: / csrf: - enable-secure-cookie: true + enable-secure-cookie: ${SESSION_COOKIE_SECURE:true} header-security: content-security-policy-disabled: false content-security-policy-value: base-uri 'self'; @@ -104,24 +114,27 @@ camunda.bpm: form-action 'self'; frame-ancestors 'none'; object-src 'none' - job-execution: - core-pool-size: ${CAMUNDA_JOB_CORE_POOL_SIZE:3} - lock-time-in-millis: ${CAMUNDA_JOB_LOCK_TIME_MILLIS:300000} - max-jobs-per-acquisition: ${CAMUNDA_JOB_MAXJOBS_PER_ACQUISITION:3} - max-pool-size: ${CAMUNDA_JOB_MAX_POOL_SIZE:10} - queue-capacity: ${CAMUNDA_JOB_QUEUE_SIZE:3} - wait-time-in-millis: ${CAMUNDA_JOB_WAIT_TIME_MILLIS:5000} - max-wait: ${CAMUNDA_JOB_MAX_WAIT:60000} - metrics: - enabled: ${CAMUNDA_METRICS_FLAG:true} + # job-execution: + # core-pool-size: ${CAMUNDA_JOB_CORE_POOL_SIZE:3} + # lock-time-in-millis: ${CAMUNDA_JOB_LOCK_TIME_MILLIS:300000} + # max-jobs-per-acquisition: ${CAMUNDA_JOB_MAXJOBS_PER_ACQUISITION:3} + # max-pool-size: ${CAMUNDA_JOB_MAX_POOL_SIZE:10} + # queue-capacity: ${CAMUNDA_JOB_QUEUE_SIZE:3} + # wait-time-in-millis: ${CAMUNDA_JOB_WAIT_TIME_MILLIS:5000} + # max-wait: ${CAMUNDA_JOB_MAX_WAIT:60000} + # metrics: + # enabled: ${CAMUNDA_METRICS_FLAG:true} server: error: include-message: always port: 8080 - servlet.context-path: /camunda + servlet: + context-path: /camunda session: cookie: - secure: true + secure: ${SESSION_COOKIE_SECURE:true} + max-age: 1800 + http-only: true # Camunda Rest API @@ -203,7 +216,13 @@ websocket: messageType: ${WEBSOCKET_MESSAGE_TYPE:TASK_EVENT} messageEvents: ${WEBSOCKET_MESSAGE_EVENTS:DEFAULT} messageBroker: - host: ${WEBSOCKET_BROKER_HOST} - port: ${WEBSOCKET_BROKER_PORT} - passcode: ${WEBSOCKET_BROKER_PASSCODE} + host: ${REDIS_HOST} + port: ${REDIS_PORT} + passcode: ${REDIS_PASSCODE} + enableRedis: ${REDIS_ENABLED:false} + +# disable redis +spring.data.redis.repositories.enabled: false +spring.autoconfigure.exclude: + - org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration From d29639f138875b630aac732d72f863a54681f648 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 11:04:20 -0600 Subject: [PATCH 009/157] export ServiceFlowFilterListDropDown --- .../ServiceFlow/filter/ServiceTaskFilterListDropDown.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js index 0b73b109..e7569710 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/filter/ServiceTaskFilterListDropDown.js @@ -7,8 +7,6 @@ import {Link} from "react-router-dom"; import { useTranslation } from "react-i18next"; import { MULTITENANCY_ENABLED } from "../../../constants/constants"; -export default ServiceFlowFilterListDropDown; - const ServiceFlowFilterListDropDown = React.memo(() => { const dispatch= useDispatch(); @@ -67,4 +65,6 @@ const ServiceFlowFilterListDropDown = React.memo(() => { )} ); -}); \ No newline at end of file +}); + +export default ServiceFlowFilterListDropDown; \ No newline at end of file From 57ce33b287ceb4310a03f2e2cb3552c26145febb Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 11:31:27 -0600 Subject: [PATCH 010/157] changes to NavBar.jsx --- .../forms-flow-web/src/containers/NavBar.jsx | 257 ++++++++---------- 1 file changed, 110 insertions(+), 147 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index b0810d45..fafeb519 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -1,38 +1,31 @@ import React, { useEffect, useMemo, useState } from "react"; -import {Navbar, Dropdown, Container, Nav, NavDropdown} from "react-bootstrap"; +import { Navbar, Container, Nav, NavDropdown } from "react-bootstrap"; import {Link, useLocation} from "react-router-dom"; import {useDispatch, useSelector} from "react-redux"; import UserService from "../services/UserService"; import { - getUserRoleName, - getUserRolePermission, - getUserInsightsPermission + getUserRoleName, + getUserRolePermission, + getUserInsightsPermission } from "../helper/user"; import createURLPathMatchExp from "../helper/regExp/pathMatch"; import { useTranslation } from "react-i18next"; import "./styles.scss"; -import { - CLIENT, - STAFF_REVIEWER, - APPLICATION_NAME, - STAFF_DESIGNER, - MULTITENANCY_ENABLED, - } from "../constants/constants"; +import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER, MULTITENANCY_ENABLED,} from "../constants/constants"; +import ServiceFlowFilterListDropDown from "../components/ServiceFlow/filter/ServiceTaskFilterListDropDown"; import { push } from "connected-react-router"; import i18n from "../resourceBundles/i18n"; import { setLanguage } from "../actions/languageSetAction"; -import { updateUserlang } from "../apiManager/services/userservices"; +import { updateUserlang } from "../apiManager/services/userservices"; + import { fetchSelectLanguages } from "../apiManager/services/languageServices"; - -import ServiceFlowFilterListDropDown from "../components/ServiceFlow/filter/ServiceTaskFilterListDropDown"; const NavBar = React.memo(() => { const isAuthenticated = useSelector((state) => state.user.isAuthenticated); const location = useLocation(); const { pathname } = location; const user = useSelector((state) => state.user.userDetail); - const lang = useSelector((state) => state.user.lang); const userRoles = useSelector((state) => state.user.roles); const showApplications= useSelector((state) => state.user.showApplications); const applicationTitle = useSelector( @@ -84,15 +77,15 @@ const NavBar = React.memo(() => { dispatch(setLanguage(selectedLang)); dispatch(updateUserlang(selectedLang)); }; + const logout = () => { - dispatch(push(baseUrl)); - UserService.userLogout(); + dispatch(push(baseUrl)); + UserService.userLogout(); }; const goToTask = () => { dispatch(push(`${baseUrl}task`)); }; - return (
@@ -127,37 +120,32 @@ const NavBar = React.memo(() => { */} - { isAuthenticated ? ( + { isAuthenticated ? - {getUserRolePermission(userRoles, STAFF_REVIEWER) ? ( - + {selectLanguages.length === 1 ? ( + selectLanguages.map((e, i) => { + return ( + <> + +

{e.name}

+ + ); + }) + ) : ( + + + {lang ? lang : "LANGUAGE"} + + } + id="basic-nav-dropdown" > - {" "} - - {t("Dashboards")} -
- ) : null} - - + {selectLanguages.map((e, index) => ( + { + handleOnclick(e.name); + }} + > + {e.value}{" "} + + ))} + + )} + + -
- ) : ( - - Login - - )} + {getUserRoleName(userRoles)} + + {t("Logout")}{" "} + + + + :Login}
From 06765eaed2477d36ea124d2b1558f6911a810b08 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 12:44:38 -0600 Subject: [PATCH 011/157] lang defined in NavBar.jsx --- apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index fafeb519..47a30305 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -26,6 +26,7 @@ const NavBar = React.memo(() => { const location = useLocation(); const { pathname } = location; const user = useSelector((state) => state.user.userDetail); + const lang = useSelector((state) => state.user.lang); const userRoles = useSelector((state) => state.user.roles); const showApplications= useSelector((state) => state.user.showApplications); const applicationTitle = useSelector( @@ -35,6 +36,7 @@ const NavBar = React.memo(() => { const formTenant = useSelector((state)=>state.form?.form?.tenantKey); const baseUrl = MULTITENANCY_ENABLED ? `/tenant/${tenantKey}/` : "/"; + /** * For anonymous forms the only way to identify the tenant is through the * form data with current implementation. To redirect to the correact tenant From 4809e7de1bb4d0401acb583ae2e2aa27fc11b13c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 13:24:01 -0600 Subject: [PATCH 012/157] Dockerfile change --- apps/forms-flow-ai/forms-flow-web/Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/Dockerfile b/apps/forms-flow-ai/forms-flow-web/Dockerfile index e0f734e5..8aafbba4 100644 --- a/apps/forms-flow-ai/forms-flow-web/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-web/Dockerfile @@ -1,5 +1,6 @@ # base image -FROM artifacts.developer.gov.bc.ca/docker-remote/node:14.17.0-alpine as build-stage +# FROM artifacts.developer.gov.bc.ca/docker-remote/node:14.17.0-alpine as build-stage +FROM node:14.17.0-alpine as build-stage # set working directory WORKDIR /app @@ -28,7 +29,8 @@ COPY ./${CUSTOM_SVG_DIR}/ /app/${CUSTOM_SVG_DIR}/ RUN npm install RUN npm run build -FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.17 as production-stage +# FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.17 as production-stage +FROM nginx:1.22 as production-stage RUN mkdir /app COPY --from=build-stage /app/build /usr/share/nginx/html COPY --from=build-stage /app/nginx.conf /etc/nginx/nginx.conf From 27fb1a2c55d322553fe06b44e5f6a58653dc1cab Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 14:00:45 -0600 Subject: [PATCH 013/157] Revert "Dockerfile change" This reverts commit 4809e7de1bb4d0401acb583ae2e2aa27fc11b13c. --- apps/forms-flow-ai/forms-flow-web/Dockerfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/Dockerfile b/apps/forms-flow-ai/forms-flow-web/Dockerfile index 8aafbba4..e0f734e5 100644 --- a/apps/forms-flow-ai/forms-flow-web/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-web/Dockerfile @@ -1,6 +1,5 @@ # base image -# FROM artifacts.developer.gov.bc.ca/docker-remote/node:14.17.0-alpine as build-stage -FROM node:14.17.0-alpine as build-stage +FROM artifacts.developer.gov.bc.ca/docker-remote/node:14.17.0-alpine as build-stage # set working directory WORKDIR /app @@ -29,8 +28,7 @@ COPY ./${CUSTOM_SVG_DIR}/ /app/${CUSTOM_SVG_DIR}/ RUN npm install RUN npm run build -# FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.17 as production-stage -FROM nginx:1.22 as production-stage +FROM artifacts.developer.gov.bc.ca/docker-remote/nginx:1.17 as production-stage RUN mkdir /app COPY --from=build-stage /app/build /usr/share/nginx/html COPY --from=build-stage /app/nginx.conf /etc/nginx/nginx.conf From 15f598371c6cb18b15105b6608bea4f065b94a2b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 14:48:56 -0600 Subject: [PATCH 014/157] update navbar & styles.scss --- .../forms-flow-web/src/containers/NavBar.jsx | 224 +++++------------- .../forms-flow-web/src/containers/styles.scss | 87 ++++++- .../forms-flow-web/src/styles.scss | 37 ++- 3 files changed, 175 insertions(+), 173 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index 47a30305..cd9863f7 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -1,20 +1,16 @@ -import React, { useEffect, useMemo, useState } from "react"; -import { Navbar, Container, Nav, NavDropdown } from "react-bootstrap"; +import React from "react"; +import {Navbar, Dropdown, Container, Nav, NavDropdown} from "react-bootstrap"; import {Link, useLocation} from "react-router-dom"; import {useDispatch, useSelector} from "react-redux"; import UserService from "../services/UserService"; -import { - getUserRoleName, - getUserRolePermission, - getUserInsightsPermission -} from "../helper/user"; +import {getUserRoleName, getUserRolePermission, getUserInsightsPermission} from "../helper/user"; + import createURLPathMatchExp from "../helper/regExp/pathMatch"; import { useTranslation } from "react-i18next"; - import "./styles.scss"; -import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER, MULTITENANCY_ENABLED,} from "../constants/constants"; +import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER} from "../constants/constants"; import ServiceFlowFilterListDropDown from "../components/ServiceFlow/filter/ServiceTaskFilterListDropDown"; -import { push } from "connected-react-router"; +import {push} from "connected-react-router"; import i18n from "../resourceBundles/i18n"; import { setLanguage } from "../actions/languageSetAction"; import { updateUserlang } from "../apiManager/services/userservices"; @@ -35,8 +31,6 @@ const NavBar = React.memo(() => { const tenantKey = useSelector((state) => state.tenants?.tenantId); const formTenant = useSelector((state)=>state.form?.form?.tenantKey); const baseUrl = MULTITENANCY_ENABLED ? `/tenant/${tenantKey}/` : "/"; - - /** * For anonymous forms the only way to identify the tenant is through the * form data with current implementation. To redirect to the correact tenant @@ -44,7 +38,6 @@ const NavBar = React.memo(() => { */ const [loginUrl, setLoginUrl] = useState(baseUrl); - const selectLanguages = useSelector((state) => state.user.selectLanguages); const dispatch = useDispatch(); const logoPath = "/logo.svg"; @@ -60,7 +53,6 @@ const NavBar = React.memo(() => { ); const appName = getAppName(); const { t } = useTranslation(); - useEffect(()=>{ if(!isAuthenticated && formTenant && MULTITENANCY_ENABLED){ setLoginUrl(`/tenant/${formTenant}/`); @@ -79,7 +71,6 @@ const NavBar = React.memo(() => { dispatch(setLanguage(selectedLang)); dispatch(updateUserlang(selectedLang)); }; - const logout = () => { dispatch(push(baseUrl)); UserService.userLogout(); @@ -88,6 +79,7 @@ const NavBar = React.memo(() => { const goToTask = () => { dispatch(push(`${baseUrl}task`)); }; + return (
@@ -98,7 +90,7 @@ const NavBar = React.memo(() => { */} - + { */} - { isAuthenticated ? + {isAuthenticated? - - - - - :Login} + {getUserRoleName(userRoles)} + + Logout + + + + :Login}
); }) -export default NavBar; \ No newline at end of file +export default NavBar; diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index 48c52ef7..527b7f45 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -9,21 +9,25 @@ margin-bottom: 40px; box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1); } + & .navbar-btn { box-shadow: none; outline: none !important; border: none; } + & .line { width: 100%; height: 1px; border-bottom: 1px dashed #ddd; margin: 40px 0; } + & i, & span { display: inline-block; } + & .nav-profile { max-width: 229px; margin-bottom: 30px; @@ -36,6 +40,7 @@ display: flex; color: $white; padding: 10px; + & .profile-image { margin-right: 15px; position: relative; @@ -92,62 +97,77 @@ #sidebar.active .CTAs { display: none; } + #sidebar.active .sidebar-header strong { display: block; } + #sidebar ul li a { font-weight: bolder; text-align: left; } + #sidebar.active ul li a { padding: 20px 10px; text-align: center; font-size: 0.85em; } + #sidebar.active ul li a i { margin-right: 0; display: block; font-size: 1.8em; margin-bottom: 5px; } + #sidebar.active ul ul a { padding: 10px !important; } + #sidebar .sidebar-header { padding: 20px; background: $light-grey; } + #sidebar .sidebar-header strong { display: none; font-size: 1.8em; } + #sidebar ul.components { padding: 1px 16px; } + #sidebar ul li a { padding: 10px; font-size: 1.1em; display: block; } + #sidebar ul li a i { margin-right: 10px; } + #sidebar ul li.active > a, #sidebar a[aria-expanded="true"] { color: $light-blue !important; background: $light-grey; } + #sidebar a[data-toggle="collapse"] { position: relative; } + #sidebar ul ul a { font-size: 0.9em !important; padding-left: 30px !important; background: $light-grey; } + #sidebar ul.CTAs { padding: 20px; } + #sidebar ul.CTAs a { text-align: center; font-size: 0.9em !important; @@ -155,6 +175,7 @@ border-radius: 5px; margin-bottom: 5px; } + #sidebar a.article, #sidebar a.article:hover { background: $light-grey !important; @@ -242,8 +263,8 @@ text-decoration: none !important; } .dropdown-toggle{ - margin-right: 1rem; - color: white; +margin-right: 1rem; +color: white; } .form-icons-active:active { // fill: #4d61fc !important; @@ -300,6 +321,68 @@ height: 23px; margin-bottom: 5px; } + +.button_component +{ + background-color: white; + color: black; + border: none; + padding: auto; +} + +.cursor-pointer{ + cursor: pointer; +} + +.head-item { + color: #ABABAB; + cursor: pointer; + padding-bottom: 3rem; +} + +.head-active { + color: #212529; + border-bottom: 4px solid #4d61fc; +} +.padding-left-60 { + margin-left: 60px; +} +.padding-right-60 { + margin-left: -35px; +} +.head-rule{ + margin-top: -10px; + padding-top: -10px; +} + +.application-head +{ + font-weight: bold; + font-size:26px; + display: flex; +} +.application-head-details +{ + font-weight: bold; + font-size:30px; + margin-left: 10px !important; + display: inline-block; +} +.solid-list-icon { + height: 25px; + margin-top: 7px; +} +.application-text{ + margin-left: 10px; +} +.application-count +{ + font-size: 20px; + margin-top: 5px; + margin-left: 5px; +} + +// Service flow custom design .service-bc-navbar-background { background: #003366; } diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index 99007860..8191377c 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -1,3 +1,5 @@ +//style.scss + @charset "UTF-8"; @import url(https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&display=swap); @@ -6,7 +8,6 @@ @import url(https://cdn.jsdelivr.net/npm/formiojs@4.13.1/dist/formio.full.min.css); @import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css); - $white: #fff; $grey: #6c757d; $gray-100: #f8f9fa; @@ -20,7 +21,7 @@ $gray-800: #373a3c; $gray-900: #212529; $black: #000; -$blue: #4D61FC; +$blue: #2780e3; $indigo: #6610f2; $purple: #613d7c; $pink: #e83e8c; @@ -55,6 +56,32 @@ $dark: $gray-800; //height: 100vh; height: 100%; } +.overflow-x-auto{ + overflow-x: auto; + overflow-y: hidden; +} + +.overflow-y-auto{ + overflow-y: auto; + overflow-x: hidden; +} +.text-primary{ + color: $primary; +} +.footer-text{ + font-size: 18px; +} +.btn-primary{ + background-color: $primary; + } +.btn-outline-primary:not(:disabled){ + border-color: #0071EB; + color: #0071EB; + &:hover{ + color: #ffffff; + background-color: $primary; + } +} .task-container{ height: 100% !important; } @@ -110,7 +137,7 @@ body { background-color: #f8f8f8bf; } .formio-component-panel { - border: 1px solid#eeeeee; + border: 1px solid #eeeeee; .panel-heading { background-color: #eeeeee; @@ -159,6 +186,7 @@ i.fa.fa-question-circle.text-muted { z-index: 99 !important; } + .formio-error-wrapper, .has-error { color: red; @@ -346,6 +374,9 @@ i.fa.fa-question-circle.text-muted { .dashboard-icon-dropdown{ margin-bottom: 5px; } + .dasboard-icon-dropdown{ + margin-bottom: 5px; + } .task-dropdown-icon{ margin-bottom: 1px; color: white; From 5b8cfb9d4b959da434d313f2377695f178e569ef Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 14:57:42 -0600 Subject: [PATCH 015/157] bpmTaskServices update --- .../apiManager/services/bpmTaskServices.js | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index db981638..1139e093 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -1,3 +1,4 @@ + /* istanbul ignore file */ import {httpGETRequest, httpPOSTRequest, httpPUTRequest, httpPOSTRequestWithHAL } from "../httpRequestHandler"; import API from "../endpoints"; @@ -36,29 +37,22 @@ let responseData = res.data; const _embedded = responseData['_embedded']; // data._embedded.task is where the task list is. if (!_embedded || !_embedded['task'] || !responseData['count']) { - if (responseData['count'] !== undefined && responseData['count'] === 0) { - const tasks = [] - dispatch(setBPMTaskCount(0)); - dispatch(setBPMTaskList(tasks)); - dispatch(setBPMTaskLoader(false)); - done(null, tasks); - } else { - // Display error if the necessary values are unavailable. - console.log("Error", res); - dispatch(serviceActionError(res)); - dispatch(setBPMTaskLoader(false)); - } + console.log("Error", res); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); + dispatch(serviceActionError(res)); + dispatch(setBPMTaskLoader(false)); } else { const taskListFromResponse = _embedded['task']; // Gets the task array const taskCount = { count: responseData['count'] }; let taskData = taskListFromResponse; - if(taskIdToRemove){ - console.log("task----",taskIdToRemove); + if (taskIdToRemove) { + console.log("task----", taskIdToRemove); //if the list has the task with taskIdToRemove remove that task and decrement - if(taskListFromResponse.find((task)=>task.id===taskIdToRemove)){ - taskData=taskListFromResponse.filter( (task)=>task.id!==taskIdToRemove); + if (taskListFromResponse.find((task) => task.id === taskIdToRemove)) { + taskData = taskListFromResponse.filter((task) => task.id !== taskIdToRemove); taskCount['count']--; // Count has to be decreased since one task id is removed. } } @@ -69,12 +63,16 @@ } } else { console.log("Error", res); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(res)); dispatch(setBPMTaskLoader(false)); } }) .catch((error) => { console.log("Error", error); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(error)); dispatch(setBPMTaskLoader(false)); done(error); @@ -94,6 +92,7 @@ } else { console.log("Error", res); dispatch(serviceActionError(res)); + dispatch(setBPMProcessList([])); //dispatch(setBPMTaskLoader(false)); } }) @@ -139,11 +138,11 @@ //let getReviewerUserListApi = `${API.GET_BPM_USER_LIST}?memberOfGroup=${REVIEWER_GROUP}`; if(searchType && query){ //getReviewerUserListApi = `${getReviewerUserListApi}&${searchType}=%${query||""}%` - paramData[searchType]=`%${query}%`; + paramData[searchType] = `${query}`; } return (dispatch) => { - httpGETRequest(API.GET_BPM_USER_LIST, paramData, UserService.getToken()) + httpGETRequest(API.GET_API_USER_LIST, paramData, UserService.getToken()) .then((res) => { if (res.data) { dispatch(setBPMUserList(res.data)); @@ -217,7 +216,10 @@ let taskDetail=responses[0].data; if(responses[1]?.data){ let taskDetailUpdates = responses[1]?.data; - taskDetail = {...taskDetail,...taskDetailVariableDataFormatter(taskDetailUpdates)}; + taskDetail = { + ...taskDetailVariableDataFormatter(taskDetailUpdates), + ...taskDetail, + }; } dispatch(setBPMTaskDetail(taskDetail)); @@ -445,4 +447,7 @@ }); }; }; - \ No newline at end of file + +apps-fileview.texmex_20230705.06_p1 +bpmTaskServices.txt +Displaying bpmTaskServices.txt. \ No newline at end of file From 080baa29c0992db5b9cbc9dd3cca9559cef9d410 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 15:05:12 -0600 Subject: [PATCH 016/157] multitenancy_enabled defined in NavBar.jsx --- apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index cd9863f7..8c22480c 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -8,7 +8,7 @@ import {getUserRoleName, getUserRolePermission, getUserInsightsPermission} from import createURLPathMatchExp from "../helper/regExp/pathMatch"; import { useTranslation } from "react-i18next"; import "./styles.scss"; -import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER} from "../constants/constants"; +import {CLIENT, STAFF_REVIEWER, APPLICATION_NAME, STAFF_DESIGNER, MULTITENANCY_ENABLED} from "../constants/constants"; import ServiceFlowFilterListDropDown from "../components/ServiceFlow/filter/ServiceTaskFilterListDropDown"; import {push} from "connected-react-router"; import i18n from "../resourceBundles/i18n"; From b04d61d0418c754092b1d1285a83ca359a6eccc0 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 15:34:33 -0600 Subject: [PATCH 017/157] bpmTaskServices.js changes reverted --- .../apiManager/services/bpmTaskServices.js | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index 1139e093..db981638 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -1,4 +1,3 @@ - /* istanbul ignore file */ import {httpGETRequest, httpPOSTRequest, httpPUTRequest, httpPOSTRequestWithHAL } from "../httpRequestHandler"; import API from "../endpoints"; @@ -37,22 +36,29 @@ let responseData = res.data; const _embedded = responseData['_embedded']; // data._embedded.task is where the task list is. if (!_embedded || !_embedded['task'] || !responseData['count']) { - console.log("Error", res); - dispatch(setBPMTaskList([])); - dispatch(setBPMTaskCount(0)); - dispatch(serviceActionError(res)); - dispatch(setBPMTaskLoader(false)); + if (responseData['count'] !== undefined && responseData['count'] === 0) { + const tasks = [] + dispatch(setBPMTaskCount(0)); + dispatch(setBPMTaskList(tasks)); + dispatch(setBPMTaskLoader(false)); + done(null, tasks); + } else { + // Display error if the necessary values are unavailable. + console.log("Error", res); + dispatch(serviceActionError(res)); + dispatch(setBPMTaskLoader(false)); + } } else { const taskListFromResponse = _embedded['task']; // Gets the task array const taskCount = { count: responseData['count'] }; let taskData = taskListFromResponse; - if (taskIdToRemove) { - console.log("task----", taskIdToRemove); + if(taskIdToRemove){ + console.log("task----",taskIdToRemove); //if the list has the task with taskIdToRemove remove that task and decrement - if (taskListFromResponse.find((task) => task.id === taskIdToRemove)) { - taskData = taskListFromResponse.filter((task) => task.id !== taskIdToRemove); + if(taskListFromResponse.find((task)=>task.id===taskIdToRemove)){ + taskData=taskListFromResponse.filter( (task)=>task.id!==taskIdToRemove); taskCount['count']--; // Count has to be decreased since one task id is removed. } } @@ -63,16 +69,12 @@ } } else { console.log("Error", res); - dispatch(setBPMTaskList([])); - dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(res)); dispatch(setBPMTaskLoader(false)); } }) .catch((error) => { console.log("Error", error); - dispatch(setBPMTaskList([])); - dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(error)); dispatch(setBPMTaskLoader(false)); done(error); @@ -92,7 +94,6 @@ } else { console.log("Error", res); dispatch(serviceActionError(res)); - dispatch(setBPMProcessList([])); //dispatch(setBPMTaskLoader(false)); } }) @@ -138,11 +139,11 @@ //let getReviewerUserListApi = `${API.GET_BPM_USER_LIST}?memberOfGroup=${REVIEWER_GROUP}`; if(searchType && query){ //getReviewerUserListApi = `${getReviewerUserListApi}&${searchType}=%${query||""}%` - paramData[searchType] = `${query}`; + paramData[searchType]=`%${query}%`; } return (dispatch) => { - httpGETRequest(API.GET_API_USER_LIST, paramData, UserService.getToken()) + httpGETRequest(API.GET_BPM_USER_LIST, paramData, UserService.getToken()) .then((res) => { if (res.data) { dispatch(setBPMUserList(res.data)); @@ -216,10 +217,7 @@ let taskDetail=responses[0].data; if(responses[1]?.data){ let taskDetailUpdates = responses[1]?.data; - taskDetail = { - ...taskDetailVariableDataFormatter(taskDetailUpdates), - ...taskDetail, - }; + taskDetail = {...taskDetail,...taskDetailVariableDataFormatter(taskDetailUpdates)}; } dispatch(setBPMTaskDetail(taskDetail)); @@ -447,7 +445,4 @@ }); }; }; - -apps-fileview.texmex_20230705.06_p1 -bpmTaskServices.txt -Displaying bpmTaskServices.txt. \ No newline at end of file + \ No newline at end of file From fe64bf0db8b03e7c7554e88bbfdc5890206bdc7d Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 15:53:22 -0600 Subject: [PATCH 018/157] NavBar.jsx update --- apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index 8c22480c..cca8fcb8 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect, useMemo, useState } from "react"; import {Navbar, Dropdown, Container, Nav, NavDropdown} from "react-bootstrap"; import {Link, useLocation} from "react-router-dom"; import {useDispatch, useSelector} from "react-redux"; From 674a37e05ac8ac0aaf53d4c92d66c7d885d80f27 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 17:16:43 -0600 Subject: [PATCH 019/157] updated scss --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index 527b7f45..e8bc36d8 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -411,4 +411,8 @@ color: white; .dropdown-menu.show { max-height: 300px; overflow-y: scroll; +} + +.active-tab-dropdown { + background-color: #003366 !important; } \ No newline at end of file From a4cc6fa2e7e138d6ca39326104815b38b83dcded Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 17 Jul 2023 17:29:50 -0600 Subject: [PATCH 020/157] scss update --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index e8bc36d8..d88e1520 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -415,4 +415,6 @@ color: white; .active-tab-dropdown { background-color: #003366 !important; + filter: none !important; + -webkit-filter: none !important; } \ No newline at end of file From 92f981af9244362080bbb4c68a0abeaecc440276 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 18 Jul 2023 09:01:44 -0600 Subject: [PATCH 021/157] bpmTaskServices.js update(1) --- .../apiManager/services/bpmTaskServices.js | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index db981638..94600ef4 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -1,3 +1,4 @@ + /* istanbul ignore file */ import {httpGETRequest, httpPOSTRequest, httpPUTRequest, httpPOSTRequestWithHAL } from "../httpRequestHandler"; import API from "../endpoints"; @@ -36,29 +37,22 @@ let responseData = res.data; const _embedded = responseData['_embedded']; // data._embedded.task is where the task list is. if (!_embedded || !_embedded['task'] || !responseData['count']) { - if (responseData['count'] !== undefined && responseData['count'] === 0) { - const tasks = [] - dispatch(setBPMTaskCount(0)); - dispatch(setBPMTaskList(tasks)); - dispatch(setBPMTaskLoader(false)); - done(null, tasks); - } else { - // Display error if the necessary values are unavailable. - console.log("Error", res); - dispatch(serviceActionError(res)); - dispatch(setBPMTaskLoader(false)); - } + console.log("Error", res); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); + dispatch(serviceActionError(res)); + dispatch(setBPMTaskLoader(false)); } else { const taskListFromResponse = _embedded['task']; // Gets the task array const taskCount = { count: responseData['count'] }; let taskData = taskListFromResponse; - if(taskIdToRemove){ - console.log("task----",taskIdToRemove); + if (taskIdToRemove) { + console.log("task----", taskIdToRemove); //if the list has the task with taskIdToRemove remove that task and decrement - if(taskListFromResponse.find((task)=>task.id===taskIdToRemove)){ - taskData=taskListFromResponse.filter( (task)=>task.id!==taskIdToRemove); + if (taskListFromResponse.find((task) => task.id === taskIdToRemove)) { + taskData = taskListFromResponse.filter((task) => task.id !== taskIdToRemove); taskCount['count']--; // Count has to be decreased since one task id is removed. } } @@ -69,12 +63,16 @@ } } else { console.log("Error", res); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(res)); dispatch(setBPMTaskLoader(false)); } }) .catch((error) => { console.log("Error", error); + dispatch(setBPMTaskList([])); + dispatch(setBPMTaskCount(0)); dispatch(serviceActionError(error)); dispatch(setBPMTaskLoader(false)); done(error); @@ -94,6 +92,7 @@ } else { console.log("Error", res); dispatch(serviceActionError(res)); + dispatch(setBPMProcessList([])); //dispatch(setBPMTaskLoader(false)); } }) @@ -139,11 +138,11 @@ //let getReviewerUserListApi = `${API.GET_BPM_USER_LIST}?memberOfGroup=${REVIEWER_GROUP}`; if(searchType && query){ //getReviewerUserListApi = `${getReviewerUserListApi}&${searchType}=%${query||""}%` - paramData[searchType]=`%${query}%`; + paramData[searchType] = `${query}`; } return (dispatch) => { - httpGETRequest(API.GET_BPM_USER_LIST, paramData, UserService.getToken()) + httpGETRequest(API.GET_API_USER_LIST, paramData, UserService.getToken()) .then((res) => { if (res.data) { dispatch(setBPMUserList(res.data)); @@ -217,7 +216,10 @@ let taskDetail=responses[0].data; if(responses[1]?.data){ let taskDetailUpdates = responses[1]?.data; - taskDetail = {...taskDetail,...taskDetailVariableDataFormatter(taskDetailUpdates)}; + taskDetail = { + ...taskDetailVariableDataFormatter(taskDetailUpdates), + ...taskDetail, + }; } dispatch(setBPMTaskDetail(taskDetail)); @@ -445,4 +447,3 @@ }); }; }; - \ No newline at end of file From befe7e5ef3eaada2670ec9500beebd7d8bd3b2db Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 18 Jul 2023 10:22:13 -0600 Subject: [PATCH 022/157] NavBar.jsx task icon update --- apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index cca8fcb8..1f899bd1 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -189,13 +189,15 @@ const NavBar = React.memo(() => { ( - Task Icon + /> */} + Date: Tue, 18 Jul 2023 13:13:21 -0600 Subject: [PATCH 023/157] NavBar.jsx update (dashboard) --- apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx index 1f899bd1..0832ca78 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/NavBar.jsx @@ -210,8 +210,8 @@ const NavBar = React.memo(() => { } {getUserRolePermission(userRoles, STAFF_REVIEWER) ? - ( Date: Tue, 18 Jul 2023 15:26:13 -0600 Subject: [PATCH 024/157] container/styles.scss update --- .../forms-flow-ai/forms-flow-web/src/containers/styles.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index d88e1520..f6ad4daa 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -417,4 +417,10 @@ color: white; background-color: #003366 !important; filter: none !important; -webkit-filter: none !important; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; + color: white!important; } \ No newline at end of file From 8355aacb491062e239b9c1ec389c53b9e3b4685b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 19 Jul 2023 14:14:45 -0600 Subject: [PATCH 025/157] Dockerfile & metabase_buildconfig.yaml --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 4 ++-- pilot_apps/metabase/metabase_buildconfig.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index e754d625..b10cdd4c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -49,5 +49,5 @@ COPY --from=MAVEN_TOOL_CHAIN /tmp/target/forms-flow-bpm.jar ./app RUN chmod a+rwx -R /app WORKDIR /app VOLUME /tmp -# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] +# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file diff --git a/pilot_apps/metabase/metabase_buildconfig.yaml b/pilot_apps/metabase/metabase_buildconfig.yaml index 4b2b48f9..2f31b999 100644 --- a/pilot_apps/metabase/metabase_buildconfig.yaml +++ b/pilot_apps/metabase/metabase_buildconfig.yaml @@ -1,7 +1,7 @@ kind: Template apiVersion: v1 metadata: - name: meabase + name: metabase annotations: description: "" tags: metabase,java From 27413eee44385a09da21ac69882c4609b3b0dd38 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 19 Jul 2023 18:03:22 -0600 Subject: [PATCH 026/157] Dockerfile update --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index b10cdd4c..67cec64e 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -13,21 +13,21 @@ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ # RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ # COPY ./pom.xml /tmp/pom.xml # COPY ./pom-default.xml /tmp/pom-default.xml -COPY pom*.xml /tmp/ +COPY pom*.xml /app/ COPY settings-docker.xml /usr/share/maven/ref/ # COPY ./settings-docker.xml /usr/share/maven/ref/ -WORKDIR /tmp/ +WORKDIR /app/ # This allows Docker to cache most of the maven dependencies RUN mvn -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve dependency:go-offline -B -RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ +RUN cp -r /bpm/forms-flow-bpm/src/ /app/src/ RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory -COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ +COPY ./${CUSTOM_SRC_DIR}/ /app/${CUSTOM_SRC_DIR}/ # RUN mvn -s /usr/share/maven/ref/settings-docker.xml package @@ -45,9 +45,9 @@ EXPOSE 8080 RUN test ! -d /app && mkdir /app || : # Add spring boot application RUN mkdir -p /app -COPY --from=MAVEN_TOOL_CHAIN /tmp/target/forms-flow-bpm.jar ./app +COPY --from=MAVEN_TOOL_CHAIN /app/target/forms-flow-bpm.jar ./app RUN chmod a+rwx -R /app WORKDIR /app -VOLUME /tmp +VOLUME /app ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] # ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file From 71eb5f24b5303eb70051d555f9617fa0dd929394 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 19 Jul 2023 18:29:41 -0600 Subject: [PATCH 027/157] Dockerfile update --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 67cec64e..97b5ab21 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -1,8 +1,8 @@ # Modified by Yichun Zhao and Walter Moar # Maven build -# FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN -FROM maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN +FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN +# FROM maven:3.8.1-openjdk-17-slim AS MAVEN_TOOL_CHAIN RUN apt-get update \ && apt-get install -y git @@ -13,28 +13,28 @@ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ # RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ # COPY ./pom.xml /tmp/pom.xml # COPY ./pom-default.xml /tmp/pom-default.xml -COPY pom*.xml /app/ +COPY pom*.xml /tmp/ COPY settings-docker.xml /usr/share/maven/ref/ # COPY ./settings-docker.xml /usr/share/maven/ref/ -WORKDIR /app/ +WORKDIR /tmp/ # This allows Docker to cache most of the maven dependencies RUN mvn -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve dependency:go-offline -B -RUN cp -r /bpm/forms-flow-bpm/src/ /app/src/ +RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory -COPY ./${CUSTOM_SRC_DIR}/ /app/${CUSTOM_SRC_DIR}/ +COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ # RUN mvn -s /usr/share/maven/ref/settings-docker.xml package # Final custom slim java image (for apk command see jdk-11.0.3_7-alpine-slim) -# FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine -FROM openjdk:17-jdk-alpine +FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17-jdk-alpine +# FROM openjdk:17-jdk-alpine ENV JAVA_VERSION=17-ea+14 ENV JAVA_HOME=/opt/java/openjdk-17 \ @@ -45,9 +45,9 @@ EXPOSE 8080 RUN test ! -d /app && mkdir /app || : # Add spring boot application RUN mkdir -p /app -COPY --from=MAVEN_TOOL_CHAIN /app/target/forms-flow-bpm.jar ./app +COPY --from=MAVEN_TOOL_CHAIN /tmp/target/forms-flow-bpm.jar ./app RUN chmod a+rwx -R /app WORKDIR /app -VOLUME /app -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] -# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file +VOLUME /tmp +# ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/forms-flow-bpm.jar"] +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dpolyglot.js.nashorn-compat=true", "-Dpolyglot.engine.WarnInterpreterOnly=false", "-jar","/app/forms-flow-bpm.jar"] \ No newline at end of file From 587b8b73c32906cfef8844d8a0640d52bca55b0f Mon Sep 17 00:00:00 2001 From: dinesh Date: Wed, 19 Jul 2023 20:02:50 -0700 Subject: [PATCH 028/157] query user by attribute --- .../bpm/extension/hooks/services/IUser.java | 9 ++- .../extension/hooks/services/UserService.java | 60 +++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index 539cdb95..6e43d23b 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -6,6 +6,7 @@ import org.camunda.bpm.engine.delegate.DelegateTask; import org.camunda.bpm.engine.identity.User; import org.camunda.bpm.engine.task.IdentityLink; +import org.springframework.beans.factory.annotation.Autowired; import org.joda.time.DateTime; import java.util.ArrayList; @@ -19,6 +20,9 @@ */ public interface IUser { + @Autowired + private UserService userService; + default String getName(DelegateExecution execution, String userId) { User user = getUser(execution, userId); return user.getFirstName()+" "+user.getLastName(); @@ -30,8 +34,9 @@ default String getEmail(DelegateExecution execution, String userId) { } default User getUser(DelegateExecution execution, String userId) { - userId = execution.getVariable("provider_idir_userid").toString(); - return execution.getProcessEngine().getIdentityService().createUserQuery().userId(userId).singleResult(); + // userId = execution.getVariable("provider_idir_userid").toString(); + // return execution.getProcessEngine().getIdentityService().createUserQuery().userId(userId).singleResult(); + return userService.searchUserByAttribute("userid", userId); } default String getDefaultAddresseName() { diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java new file mode 100644 index 00000000..5cc78a7e --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -0,0 +1,60 @@ +package org.camunda.bpm.extension.hooks.services; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.camunda.bpm.engine.impl.identity.IdentityProviderException; +import org.camunda.bpm.engine.impl.persistence.entity.UserEntity; +import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; +import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; +import org.camunda.bpm.engine.identity.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import static org.camunda.bpm.extension.keycloak.json.JsonUtil.getJsonString; +import static org.camunda.bpm.extension.keycloak.json.JsonUtil.parseAsJsonArray; + +@Qualifier("userService") +@Service +public class UserService { + + private static final Logger LOG = LoggerFactory.getLogger(UserService.class); + private KeycloakRestTemplate restTemplate; + private KeycloakConfiguration keycloakConfiguration; + public UserService(KeycloakConfiguration keycloakConfiguration, KeycloakRestTemplate restTemplate){ + this.restTemplate = restTemplate; + this.keycloakConfiguration = keycloakConfiguration; + } + + public User searchUserByAttribute(String attributeName, String attributeValue) { + try { + ResponseEntity response = restTemplate.exchange(keycloakConfiguration.getKeycloakAdminUrl() + + "/users/?q="+attributeName+":"+attributeValue+"", HttpMethod.GET, + String.class); + if (!response.getStatusCode().equals(HttpStatus.OK)) { + throw new IdentityProviderException( + "Unable to read user data from " + keycloakConfiguration.getKeycloakAdminUrl() + + ": HTTP status code " + response.getStatusCodeValue()); + } + JsonArray resultList = parseAsJsonArray(response.getBody()); + JsonObject result = resultList.get(0).getAsJsonObject(); + UserEntity user = new UserEntity(); + String username = getJsonString(result, "username"); + String email = getJsonString(result, "email"); + String firstName = getJsonString(result, "firstName"); + String lastName = getJsonString(result, "lastName"); + user.setId(username); + user.setEmail(email); + user.setFirstName(firstName); + user.setLastName(lastName); + return user; + }catch(Exception e) { + e.printStackTrace(); + LOG.error(e.getMessage()); + } + return null; + } +} From 8d7631d69af0829a1916e5c185ba0464be2bd91e Mon Sep 17 00:00:00 2001 From: Dinesh Date: Thu, 20 Jul 2023 13:26:42 -0700 Subject: [PATCH 029/157] docker file changes --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 12 +- .../forms-flow-bpm/pom-default.xml | 18 - .../{pom.xml => pom-docker.xml} | 5 + .../forms-flow-bpm/settings-docker.xml | 27 -- .../io/event/CamundaEventListener.java | 95 ++--- .../commons/io/socket/RedisConfig.java | 1 - .../hooks/listeners/AnalyticsListener.java | 7 +- .../listeners/task/TimeoutNotifyListener.java | 108 ++++++ .../bpm/extension/hooks/services/IUser.java | 23 +- .../extension/hooks/services/UserService.java | 51 ++- .../keycloak/CamundaExtConfiguration.java | 75 ++-- .../KeycloakIdentityProviderSession.java | 35 ++ .../keycloak/plugin/KeycloakUserService.java | 188 ++++++++-- .../src/main/resources/application.yaml | 55 ++- .../task/AccessGrantNotifyListenerTest.java | 125 ++++++ .../task/TimeoutNotifyListenerTest.java | 355 ++++++++++++++++++ 16 files changed, 947 insertions(+), 233 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/pom-default.xml rename apps/forms-flow-ai/forms-flow-bpm/{pom.xml => pom-docker.xml} (98%) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListenerTest.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListenerTest.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 97b5ab21..0f9d58c1 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -10,25 +10,21 @@ RUN apt-get update \ RUN git clone -b ${FORMIO_SOURCE_REPO_BRANCH} ${FORMIO_SOURCE_REPO_URL} /bpm/ # RUN cp /bpm/forms-flow-bpm/pom.xml /tmp/pom.xml -# RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ -# COPY ./pom.xml /tmp/pom.xml -# COPY ./pom-default.xml /tmp/pom-default.xml -COPY pom*.xml /tmp/ -COPY settings-docker.xml /usr/share/maven/ref/ -# COPY ./settings-docker.xml /usr/share/maven/ref/ +RUN cp /bpm/forms-flow-bpm/settings-docker.xml /usr/share/maven/ref/ +RUN cp /bpm/forms-flow-bpm/pom-default.xml /tmp/pom-default.xml +COPY ./pom-docker.xml /tmp/pom.xml WORKDIR /tmp/ # This allows Docker to cache most of the maven dependencies RUN mvn -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve dependency:go-offline -B RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ -RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ -# RUN mvn -s /usr/share/maven/ref/settings-docker.xml package +RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml deleted file mode 100644 index f22747cc..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-default.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 4.0.0 - - - org.camunda.bpm.extension - formsflow-bpm - 5.1.0 - pom.xml - - - default - - - - \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml similarity index 98% rename from apps/forms-flow-ai/forms-flow-bpm/pom.xml rename to apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index 406af905..dc2b9ceb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -65,6 +65,11 @@
+ + org.keycloak + keycloak-admin-client + 21.0.1 + org.springframework.boot spring-boot-starter-webflux diff --git a/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml deleted file mode 100644 index f0a1a600..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/settings-docker.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - defaultProfile - - true - - - - - \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java index ac174547..76275e8f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/event/CamundaEventListener.java @@ -8,18 +8,18 @@ import org.camunda.bpm.extension.commons.io.ITaskEvent; import org.camunda.bpm.extension.commons.io.socket.message.TaskEventMessage; import org.camunda.bpm.extension.commons.io.socket.message.TaskMessage; - import org.springframework.beans.BeanUtils; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.event.EventListener; + import org.springframework.data.redis.core.StringRedisTemplate; -//import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; - import javax.annotation.Resource; import java.util.*; + import java.util.logging.Logger; import static org.camunda.bpm.extension.commons.utils.VariableConstants.FORM_URL; @@ -27,9 +27,7 @@ import static org.camunda.bpm.extension.commons.utils.VariableConstants.APPLICATION_ID; /** - * Camunda Event Listener. - * This class intercepts all camunda task and push socket messages for web tier - * updates. + * This class intercepts all camunda task and push socket messages for web tier updates. * * @author sumathi.thirumani@aot-technologies.com */ @@ -39,57 +37,35 @@ public class CamundaEventListener implements ITaskEvent { @Autowired private StringRedisTemplate stringRedisTemplate; - // @Autowired - // private SimpMessagingTemplate template; - private final Logger LOGGER = Logger.getLogger(CamundaEventListener.class.getName()); @Value("${websocket.messageType}") private String messageCategory; - - @Value("${websocket.messageEvents}") + + @Value("${websocket.messageEvents}") private String messageEvents; - @Value("${websocket.enableRedis}") - private boolean redisEnabled; - @Resource(name = "bpmObjectMapper") private ObjectMapper bpmObjectMapper; + @EventListener public void onTaskEventListener(DelegateTask taskDelegate) { - LOGGER.info("Event triggered:" + taskDelegate.getId() + "-" + taskDelegate.getEventName() + "-" - + taskDelegate.getProcessInstanceId()); + LOGGER.info("Event triggered:"+taskDelegate.getId() +"-"+ taskDelegate.getEventName() + "-"+ taskDelegate.getProcessInstanceId()); try { - if (isRegisteredEvent(taskDelegate.getEventName())) { - if (isAllowed(EventCategory.TASK_EVENT_DETAILS.name())) { - this.stringRedisTemplate.convertAndSend(getTopicNameForTaskDetail(), - bpmObjectMapper.writeValueAsString(getTaskMessage(taskDelegate))); - } - if (isAllowed(EventCategory.TASK_EVENT.name())) { - this.stringRedisTemplate.convertAndSend(getTopicNameForTask(), - bpmObjectMapper.writeValueAsString(getTaskEventMessage(taskDelegate))); - } - // convertAndSendMessage(getTopicNameForTaskDetail(), - // getTaskMessage(taskDelegate)); - // if (isAllowed(EventCategory.TASK_EVENT.name())) { - // convertAndSendMessage(getTopicNameForTask(), - // getTaskEventMessage(taskDelegate)); - // } - } + if (isRegisteredEvent(taskDelegate.getEventName())) { + if(isAllowed(EventCategory.TASK_EVENT_DETAILS.name())) { + this.stringRedisTemplate.convertAndSend(getTopicNameForTaskDetail(), bpmObjectMapper.writeValueAsString(getTaskMessage(taskDelegate))); + } + if(isAllowed(EventCategory.TASK_EVENT.name())) { + this.stringRedisTemplate.convertAndSend(getTopicNameForTask(), bpmObjectMapper.writeValueAsString(getTaskEventMessage(taskDelegate))); + } + } } catch (JsonProcessingException e) { e.printStackTrace(); } } - private void convertAndSendMessage(String topicName, Object message) throws JsonProcessingException { - if (redisEnabled) { - this.stringRedisTemplate.convertAndSend(topicName, bpmObjectMapper.writeValueAsString(message)); - } else { - this.stringRedisTemplate.convertAndSend(topicName, bpmObjectMapper.writeValueAsString(message)); - } - } - private TaskMessage getTaskMessage(DelegateTask taskDelegate) { TaskMessage taskObj = new TaskMessage(); BeanUtils.copyProperties(taskDelegate, taskObj); @@ -104,13 +80,11 @@ private TaskEventMessage getTaskEventMessage(DelegateTask taskDelegate) { } private boolean isAllowed(String category) { - return Arrays.asList(StringUtils.split(messageCategory, ",")).contains(category); + return Arrays.asList(StringUtils.split(messageCategory,",")).contains(category); } - - private boolean isRegisteredEvent(String eventName) { - if ("ALL".equalsIgnoreCase(messageEvents)) { - return true; - } + + private boolean isRegisteredEvent(String eventName) { + if("ALL".equalsIgnoreCase(messageEvents)) { return true;} return getRegisteredEvents().contains(eventName); } @@ -118,14 +92,15 @@ private List getRegisteredEvents() { if ("DEFAULT".equalsIgnoreCase(messageEvents)) { return getDefaultRegisteredEvents(); } - return Arrays.asList(StringUtils.split(messageEvents, ",")); + String events = messageEvents != null ? messageEvents : ""; + return Arrays.asList(StringUtils.split(events, ",")); } - private Map getVariables(DelegateTask taskDelegate) { - List configMap = getElements(); - Map variables = new HashMap<>(); - for (String entry : configMap) { - if (taskDelegate.getVariables().containsKey(entry)) { + private Map getVariables(DelegateTask taskDelegate) { + List configMap =getElements(); + Map variables = new HashMap<>(); + for(String entry : configMap) { + if(taskDelegate.getVariables().containsKey(entry)) { variables.put(entry, taskDelegate.getVariable(entry)); } } @@ -136,20 +111,16 @@ private List getElements() { return new ArrayList<>(Arrays.asList(APPLICATION_ID, FORM_URL, APPLICATION_STATUS)); } - private List getDefaultRegisteredEvents() { + private List getDefaultRegisteredEvents() { return Arrays.asList(TaskListener.EVENTNAME_CREATE, - TaskListener.EVENTNAME_UPDATE, - TaskListener.EVENTNAME_COMPLETE); + TaskListener.EVENTNAME_UPDATE, + TaskListener.EVENTNAME_COMPLETE + ); } - /** - * private ObjectMapper getObjectMapper() { - * return new ObjectMapper(); - * } - */ - enum EventCategory { - TASK_EVENT, TASK_EVENT_DETAILS; + TASK_EVENT, + TASK_EVENT_DETAILS; } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java index f7f09bd5..53c15c10 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/io/socket/RedisConfig.java @@ -25,7 +25,6 @@ * @author sumathi.thirumani@aot-technologies.com */ @Configuration -@ConditionalOnProperty(prefix = "websocket", name = "enableRedis", havingValue = "true", matchIfMissing = false) public class RedisConfig implements ITaskEvent { private final Logger LOGGER = Logger.getLogger(RedisConfig.class.getName()); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java index 891cbe67..cc0fc00f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java @@ -12,6 +12,7 @@ import org.camunda.bpm.extension.hooks.services.analytics.SimpleDBDataPipeline; import org.glassfish.jersey.internal.util.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.camunda.bpm.extension.hooks.services.UserService; import javax.inject.Named; import java.util.HashMap; @@ -34,6 +35,10 @@ public class AnalyticsListener implements TaskListener, ExecutionListener, IMess @Autowired private SimpleDBDataPipeline dbdatapipeline; + @Autowired + private UserService userService; + + private final Logger LOGGER = Logger.getLogger(AnalyticsListener.class.getName()); @@ -108,7 +113,7 @@ private Map injectAdditionalProcessingFields(DelegateExecution ex if (StringUtils.isNotEmpty(idir)) { prcMap.put(entry.getKey(),entry.getValue()); if(!execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"))) { - String idirName = getName(execution, variables.get("provider_idir_userid").toString()); + String idirName = getName(execution, userService, variables.get("provider_idir_userid").toString()); execution.setVariable(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); prcMap.put(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"),idirName); } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java new file mode 100644 index 00000000..bdc484a1 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -0,0 +1,108 @@ +package org.camunda.bpm.extension.hooks.listeners.task; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import com.nimbusds.oauth2.sdk.util.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.engine.delegate.*; +import org.camunda.bpm.engine.identity.User; +import org.camunda.bpm.extension.hooks.listeners.BaseListener; +import org.camunda.bpm.extension.hooks.services.IMessageEvent; +import org.camunda.bpm.extension.hooks.services.UserService; +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Timeout Notify Listener. + * Timeout Task Listener to start a message event when the deadline is due + */ +@Component +public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { + + @Autowired + private UserService userService; + private Expression escalationGroup; + private Expression messageName; + private Expression currentDate; + private static final Logger log = Logger.getLogger(TimeoutNotifyListener.class.getName()); + + + /** + * This calculates time logic + * and provides the necessary information to send message. + * + * @param delegateTask: The task which sends the message + */ + public void notify(DelegateTask delegateTask) { + DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null ? + new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) : new DateTime(); + DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) + : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); + String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null ? + String.valueOf(this.escalationGroup.getValue(delegateTask)) : null; + DateTime remindDate = addBusinessDays(dueDate, -1); + DateTime escalateDate = addBusinessDays(dueDate,1); + log.info("Timeout Notify listener invoked for pid="+delegateTask.getProcessInstanceId() + +"|due Date=" +dueDate.toLocalDate()+"|current Date="+currentDate.toLocalDate() + +"|escalation Date="+escalateDate.toLocalDate() + +"|reminder Date="+remindDate.toLocalDate()); + // Check if escalate first because reminder date is before escalation date + if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { + validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); + } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { + validateAssigneeAndNotify(delegateTask, "activity_reminder", null); + } + } + + private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { + List escalationGrpEmails = new ArrayList<>(); + if(StringUtils.isNotEmpty(escalationGroup)) { + escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(),escalationGroup)); + } + if(StringUtils.isNotEmpty(delegateTask.getAssignee())) { + User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); + delegateTask.getExecution().setVariable("firstname",user.getFirstName()); + delegateTask.getExecution().setVariable("lastname",user.getLastName()); + delegateTask.getExecution().setVariable("name",user.getFirstName()+" "+user.getLastName()); + List userEmails = new ArrayList<>(); + if(StringUtils.isNotEmpty(user.getEmail())) { + userEmails.add(user.getEmail()); + sendEmailNotification(delegateTask.getExecution(), category,userEmails + , escalationGrpEmails,delegateTask.getId()); + } + } else { + delegateTask.getExecution().setVariable("name",getDefaultAddresseName()); + sendEmailNotification(delegateTask.getExecution(),category, + getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails,delegateTask.getId()); + } + } + + private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, List ccEmails,String taskId) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails,",") : null; + String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails,",") : null; + if(StringUtils.isNotEmpty(toAddress)) { + Map emailAttributes = new HashMap<>(); + emailAttributes.put("to", toAddress); + if(StringUtils.isNotEmpty(ccAddress)) { + emailAttributes.put("cc", ccAddress); + } + emailAttributes.put("category", category); + emailAttributes.put("taskid", taskId); + log.info("Inside notify attributes:" + emailAttributes); + if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { + sendMessage(execution, emailAttributes,getMessageName(execution)); + } + } + } + + + private String getMessageName(DelegateExecution execution){ + return String.valueOf(this.messageName.getValue(execution)); + } + +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index 6e43d23b..56b3912b 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -20,23 +20,24 @@ */ public interface IUser { - @Autowired - private UserService userService; - - default String getName(DelegateExecution execution, String userId) { - User user = getUser(execution, userId); + default String getName(DelegateExecution execution,UserService userService, String userId) { + User user = getUser(execution, userService, userId); return user.getFirstName()+" "+user.getLastName(); } - default String getEmail(DelegateExecution execution, String userId) { - User user = getUser(execution, userId); + default String getEmail(DelegateExecution execution,UserService userService, String userId) { + User user = getUser(execution, userService, userId); return user.getEmail(); } - default User getUser(DelegateExecution execution, String userId) { - // userId = execution.getVariable("provider_idir_userid").toString(); - // return execution.getProcessEngine().getIdentityService().createUserQuery().userId(userId).singleResult(); - return userService.searchUserByAttribute("userid", userId); + default User getUser(DelegateExecution execution,UserService userService, String userId) { + String providerIdirUserId = execution.getVariable("provider_idir_userid").toString(); + User user = execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId).singleResult(); + user = userService.searchUserByAttribute("userid", userId); + if(user == null) { + user = userService.searchUserByAttribute("userid", userId); + } + return user; } default String getDefaultAddresseName() { diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 5cc78a7e..4c99ea4c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -6,14 +6,20 @@ import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import java.util.List; + import static org.camunda.bpm.extension.keycloak.json.JsonUtil.getJsonString; import static org.camunda.bpm.extension.keycloak.json.JsonUtil.parseAsJsonArray; @@ -22,35 +28,28 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - private KeycloakRestTemplate restTemplate; - private KeycloakConfiguration keycloakConfiguration; - public UserService(KeycloakConfiguration keycloakConfiguration, KeycloakRestTemplate restTemplate){ - this.restTemplate = restTemplate; - this.keycloakConfiguration = keycloakConfiguration; - } + @Autowired + private Keycloak keycloak; + @Value("${keycloak.url.realm}") + private String keycloakRealm; public User searchUserByAttribute(String attributeName, String attributeValue) { try { - ResponseEntity response = restTemplate.exchange(keycloakConfiguration.getKeycloakAdminUrl() - + "/users/?q="+attributeName+":"+attributeValue+"", HttpMethod.GET, - String.class); - if (!response.getStatusCode().equals(HttpStatus.OK)) { - throw new IdentityProviderException( - "Unable to read user data from " + keycloakConfiguration.getKeycloakAdminUrl() - + ": HTTP status code " + response.getStatusCodeValue()); - } - JsonArray resultList = parseAsJsonArray(response.getBody()); - JsonObject result = resultList.get(0).getAsJsonObject(); - UserEntity user = new UserEntity(); - String username = getJsonString(result, "username"); - String email = getJsonString(result, "email"); - String firstName = getJsonString(result, "firstName"); - String lastName = getJsonString(result, "lastName"); - user.setId(username); - user.setEmail(email); - user.setFirstName(firstName); - user.setLastName(lastName); - return user; + List users = keycloak + .realm(keycloakRealm) + .users() + .searchByAttributes(attributeName+":"+attributeValue); + UserRepresentation user = users.get(0); + UserEntity result = new UserEntity(); + String username = user.getUsername(); + String email = user.getEmail(); + String firstName = user.getFirstName(); + String lastName = user.getLastName(); + result.setId(username); + result.setEmail(email); + result.setFirstName(firstName); + result.setLastName(lastName); + return result; }catch(Exception e) { e.printStackTrace(); LOG.error(e.getMessage()); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index 2f004a61..abb79591 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -2,7 +2,11 @@ +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; @@ -19,33 +23,50 @@ @Configuration public class CamundaExtConfiguration { - /** - * Secondary datasource. - * This is used only for publishing data to analytics. - * @return - */ - @Bean("analyticsDS") - @ConfigurationProperties("analytics.datasource") - public DataSource analyticsDS(){ - return DataSourceBuilder.create().build(); - } - - - /** - * JDBC template for analytics datasource interaction. - * @param analyticsDS - * @return - */ - @Bean("analyticsJdbcTemplate") - public NamedParameterJdbcTemplate analyticsJdbcTemplate(@Qualifier("analyticsDS") DataSource analyticsDS) { - return new NamedParameterJdbcTemplate(analyticsDS); - } - - @Bean - @ConfigurationProperties(prefix = "websocket") - public Properties messageBrokerProperties() { - return new Properties(); - } + @Value("${keycloak.url}") + private String keycloakUrl; + @Value("${keycloak.url.realm}") + private String keycloakRealm; + @Value("${keycloak.clientId}") + private String keycloakClientId; + @Value("${keycloak.clientSecret}") + private String keycloakClientSecret; + /** + * Secondary datasource. + * This is used only for publishing data to analytics. + * @return + */ + @Bean("analyticsDS") + @ConfigurationProperties("analytics.datasource") + public DataSource analyticsDS(){ + return DataSourceBuilder.create().build(); + } + /** + * JDBC template for analytics datasource interaction. + * @param analyticsDS + * @return + */ + @Bean("analyticsJdbcTemplate") + public NamedParameterJdbcTemplate analyticsJdbcTemplate(@Qualifier("analyticsDS") DataSource analyticsDS) { + return new NamedParameterJdbcTemplate(analyticsDS); + } + + @Bean + @ConfigurationProperties(prefix = "websocket") + public Properties messageBrokerProperties() { + return new Properties(); + } + @Bean + Keycloak keycloak() { + return KeycloakBuilder.builder() + .serverUrl(keycloakUrl) + .realm(keycloakRealm) + .clientId(keycloakClientId) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .clientSecret(keycloakClientSecret) + .build(); + } + } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java index e82cda01..1352d0e5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakIdentityProviderSession.java @@ -128,4 +128,39 @@ private List doFindGroupByQueryCriteria(CacheableKeycloakGroupQuery group return groupService.requestGroupsWithoutUserId(groupQuery); } } + @Override + public TenantQuery createTenantQuery() { + return new CustomKeycloakTenantQuery(org.camunda.bpm.engine.impl.context.Context.getProcessEngineConfiguration() + .getCommandExecutorTxRequired()); + } + + @Override + public TenantQuery createTenantQuery(CommandContext commandContext) { + return new CustomKeycloakTenantQuery(); + } + + protected long findTenantCountByQueryCriteria(CustomKeycloakTenantQuery tenantQuery) { + return findTenantByQueryCriteria(tenantQuery).size(); + } + + private List doFindTenantByQueryCriteria(CacheableKeycloakTenantQuery tenantQuery) { + if (!config.isEnableMultiTenancy()) { + return Collections.emptyList(); + } + return tenantService.requestTenantsByUserId(tenantQuery.getUserId()); + } + + protected List findTenantByQueryCriteria(CustomKeycloakTenantQuery tenantQuery) { + + List allMatchingTenants = tenantQueryCache.getOrCompute(CacheableKeycloakTenantQuery.of(tenantQuery), + this::doFindTenantByQueryCriteria); + + return allMatchingTenants; + } + + @Override + public Tenant findTenantById(String id) { + return createTenantQuery(org.camunda.bpm.engine.impl.context.Context.getCommandContext()).tenantId(id) + .singleResult(); + } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java index 28808c12..f37e5405 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/plugin/KeycloakUserService.java @@ -1,37 +1,36 @@ package org.camunda.bpm.extension.keycloak.plugin; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + import org.camunda.bpm.engine.identity.User; +import org.camunda.bpm.engine.impl.identity.IdentityProviderException; +import org.apache.commons.lang3.StringUtils; import org.camunda.bpm.engine.impl.persistence.entity.UserEntity; +import org.camunda.bpm.extension.keycloak.CacheableKeycloakUserQuery; import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; -import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.extension.keycloak.KeycloakContextProvider; -import org.camunda.bpm.extension.keycloak.KeycloakGroupNotFoundException; -import org.camunda.bpm.extension.keycloak.CacheableKeycloakUserQuery; -import org.camunda.bpm.engine.impl.identity.IdentityProviderException; +import org.camunda.bpm.extension.keycloak.KeycloakUserNotFoundException; import org.camunda.bpm.extension.keycloak.json.JsonException; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestClientException; -import org.springframework.util.StringUtils; - +import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; - -import java.util.logging.Logger; - -import org.springframework.http.ResponseEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; +import org.camunda.bpm.extension.keycloak.KeycloakGroupNotFoundException; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestClientException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - import static org.camunda.bpm.extension.keycloak.json.JsonUtil.*; @@ -42,7 +41,7 @@ public class KeycloakUserService extends org.camunda.bpm.extension.keycloak.KeycloakUserService { /** This class' logger. */ - private final Logger LOGGER = Logger.getLogger(KeycloakUserService.class.getName()); + private static final Logger LOG = LoggerFactory.getLogger(KeycloakUserService.class); private String webClientId; private boolean enableClientAuth; @@ -90,14 +89,14 @@ public List requestUsersByGroupId(CacheableKeycloakUserQuery query) { for (int i = 0; i < searchResult.size(); i++) { JsonObject keycloakUser = getJsonObjectAtIndex(searchResult, i); if (keycloakConfiguration.isUseEmailAsCamundaUserId() && - !StringUtils.hasLength(getJsonString(keycloakUser, "email"))) { + !StringUtils.isNotBlank(getJsonString(keycloakUser, "email"))) { continue; } if (keycloakConfiguration.isUseUsernameAsCamundaUserId() && - !StringUtils.hasLength(getJsonString(keycloakUser, "username"))) { + !StringUtils.isNotBlank(getJsonString(keycloakUser, "username"))) { continue; } - userList.add(transformUser(keycloakUser)); + userList.add(transformUser(keycloakUser, null)); } } catch (HttpClientErrorException hcee) { @@ -112,10 +111,155 @@ public List requestUsersByGroupId(CacheableKeycloakUserQuery query) { return userList; } + @Override + public List requestUsersWithoutGroupId(CacheableKeycloakUserQuery query) { + List users; + if (enableClientAuth) { + if (enableMultiTenancy) { + users = this.requestUsersByClientRoleAndTenantId(); + } else { + users = this.requestUsersByClientRole(); + } + } else { + users = super.requestUsersWithoutGroupId(query); + } + return users; + } + + /** + * requestUsersByClientRole + * @return + */ + protected List requestUsersByClientRole(){ + List userList = new ArrayList<>(); + try { + // get Keycloak specific userID + String keycloakClientID; + try { + keycloakClientID = getKeycloakClientID(webClientId); + } catch (KeycloakUserNotFoundException e) { + // user not found: empty search result + return Collections.emptyList(); + } - private UserEntity transformUser(JsonObject result) throws JsonException { + // get groups of this user + ResponseEntity response = restTemplate.exchange(keycloakConfiguration.getKeycloakAdminUrl() + + "/clients/" + keycloakClientID + "/roles/formsflow-reviewer/users", HttpMethod.GET, + String.class); + if (!response.getStatusCode().equals(HttpStatus.OK)) { + throw new IdentityProviderException( + "Unable to read user data from " + keycloakConfiguration.getKeycloakAdminUrl() + + ": HTTP status code " + response.getStatusCodeValue()); + } + + JsonArray searchResult = parseAsJsonArray(response.getBody()); + for (int i = 0; i < searchResult.size(); i++) { + userList.add(transformUser(getJsonObjectAtIndex(searchResult, i), null)); + } + + } catch (HttpClientErrorException hcee) { + // if userID is unknown server answers with HTTP 404 not found + if (hcee.getStatusCode().equals(HttpStatus.NOT_FOUND)) { + return Collections.emptyList(); + } + throw hcee; + } catch (RestClientException | JsonException rce) { + throw new IdentityProviderException("Unable to query roles for client " + webClientId, rce); + } + + return userList; + } + + + + protected List requestUsersByClientRoleAndTenantId(){ + List userList = new ArrayList<>(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Map claims = null; + if (authentication instanceof JwtAuthenticationToken) { + claims = ((JwtAuthenticationToken)authentication).getToken().getClaims(); + } else if (authentication.getPrincipal() instanceof OidcUser) { + claims = ((OidcUser)authentication.getPrincipal()).getClaims(); + } + String tenantKey = null; + if (claims != null && claims.containsKey("tenantKey")) { + tenantKey = claims.get("tenantKey").toString(); + } + // IF tenantKey is null, it means user is logging into camunda cockpit. Return empty list. + if (tenantKey == null) + return userList; + + try { + // get Keycloak specific userID + String keycloakClientID; + try { + keycloakClientID = getKeycloakClientID(tenantKey+"-"+webClientId); + } catch (KeycloakUserNotFoundException e) { + // user not found: empty search result + return Collections.emptyList(); + } + + // get groups of this user + ResponseEntity response = restTemplate.exchange(keycloakConfiguration.getKeycloakAdminUrl() + + "/clients/" + keycloakClientID + "/roles/formsflow-reviewer/users", HttpMethod.GET, + String.class); + if (!response.getStatusCode().equals(HttpStatus.OK)) { + throw new IdentityProviderException( + "Unable to read user data from " + keycloakConfiguration.getKeycloakAdminUrl() + + ": HTTP status code " + response.getStatusCodeValue()); + } + + JsonArray searchResult = parseAsJsonArray(response.getBody()); + for (int i = 0; i < searchResult.size(); i++) { + User user = transformUser(getJsonObjectAtIndex(searchResult, i),tenantKey); + userList.add(user); + } + + } catch (HttpClientErrorException hcee) { + // if userID is unknown server answers with HTTP 404 not found + if (hcee.getStatusCode().equals(HttpStatus.NOT_FOUND)) { + return Collections.emptyList(); + } + throw hcee; + } catch (RestClientException | JsonException rce) { + throw new IdentityProviderException("Unable to query roles for client " + webClientId, rce); + } + return userList; + } + + + /** + * Gets the Keycloak internal ID of client. + * + * @param clientId the client ID + * @return the Keycloak internal ID + * @throws KeycloakUserNotFoundException in case the user cannot be found + * @throws RestClientException in case of technical errors + */ + protected String getKeycloakClientID(String clientId) throws KeycloakUserNotFoundException, RestClientException { + try { + ResponseEntity response = restTemplate.exchange( + keycloakConfiguration.getKeycloakAdminUrl() + "/clients?clientId="+clientId, HttpMethod.GET, + String.class); + JsonArray resultList = parseAsJsonArray(response.getBody()); + JsonObject result = resultList.get(0).getAsJsonObject(); + if (result != null) { + return getJsonString(result, "id"); + } + throw new KeycloakUserNotFoundException(clientId + ": Client Not found"); + } catch (JsonException je) { + throw new KeycloakUserNotFoundException(clientId + ": Client Not found"); + } + } + + private UserEntity transformUser(JsonObject result, String prefix) throws JsonException { UserEntity user = new UserEntity(); String userId = getJsonString(result, "username"); + if(prefix != null){ + if(userId.contains(prefix)){ + userId = StringUtils.substringAfter(userId, prefix+"-"); + } + } JsonObject attributes = getJsonObject(result, "attributes"); if(attributes != null) { JsonArray userIds = attributes.getAsJsonArray("userid"); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index bd7efd7c..36a174ce 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -9,19 +9,6 @@ formbuilder.pipeline.service.username: ${CAMUNDA_FORMBUILDER_PIPELINE_USERNAME} formbuilder.pipeline.service.password: ${CAMUNDA_FORMBUILDER_PIPELINE_PASSWORD} formbuilder.pipeline.service.bpm-url: ${CAMUNDA_FORMBUILDER_PIPELINE_BPM_URL} -spring: - datasource: - jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} - username: ${CAMUNDA_JDBC_USER:sa} - password: ${CAMUNDA_JDBC_PASSWORD:sa} - driverClassName: ${CAMUNDA_JDBC_DRIVER:org.h2.Driver} - type: com.zaxxer.hikari.HikariDataSource - minimum-idle: 10 - connectionTimeout: ${CAMUNDA_HIKARI_CONN_TIMEOUT:30000} - idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} - maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} - validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} - analytics.datasource: jdbc-url: ${CAMUNDA_JDBC_URL} username: ${CAMUNDA_JDBC_USER} @@ -93,9 +80,7 @@ info: # maximumPoolSize: ${CAMUNDA_SESSION_HIKARI_MAX_POOLSIZE:10} # validationTimeout: ${CAMUNDA_SESSION_HIKARI_VALID_TIMEOUT:5000} -camunda.bpm: - job-execution: - enabled: true +camunda.bpm: history-level: ${CAMUNDA_BPM_HISTORY_LEVEL:none} authorization: enabled: ${CAMUNDA_AUTHORIZATION_FLAG:true} @@ -114,16 +99,16 @@ camunda.bpm: form-action 'self'; frame-ancestors 'none'; object-src 'none' - # job-execution: - # core-pool-size: ${CAMUNDA_JOB_CORE_POOL_SIZE:3} - # lock-time-in-millis: ${CAMUNDA_JOB_LOCK_TIME_MILLIS:300000} - # max-jobs-per-acquisition: ${CAMUNDA_JOB_MAXJOBS_PER_ACQUISITION:3} - # max-pool-size: ${CAMUNDA_JOB_MAX_POOL_SIZE:10} - # queue-capacity: ${CAMUNDA_JOB_QUEUE_SIZE:3} - # wait-time-in-millis: ${CAMUNDA_JOB_WAIT_TIME_MILLIS:5000} - # max-wait: ${CAMUNDA_JOB_MAX_WAIT:60000} - # metrics: - # enabled: ${CAMUNDA_METRICS_FLAG:true} + job-execution: + core-pool-size: ${CAMUNDA_JOB_CORE_POOL_SIZE:3} + lock-time-in-millis: ${CAMUNDA_JOB_LOCK_TIME_MILLIS:300000} + max-jobs-per-acquisition: ${CAMUNDA_JOB_MAXJOBS_PER_ACQUISITION:3} + max-pool-size: ${CAMUNDA_JOB_MAX_POOL_SIZE:10} + queue-capacity: ${CAMUNDA_JOB_QUEUE_SIZE:3} + wait-time-in-millis: ${CAMUNDA_JOB_WAIT_TIME_MILLIS:5000} + max-wait: ${CAMUNDA_JOB_MAX_WAIT:60000} + metrics: + enabled: ${CAMUNDA_METRICS_FLAG:true} server: error: include-message: always @@ -144,6 +129,17 @@ rest.security: required-audience: camunda-rest-api spring: + datasource: + jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} + username: ${CAMUNDA_JDBC_USER:sa} + password: ${CAMUNDA_JDBC_PASSWORD:sa} + driverClassName: ${CAMUNDA_JDBC_DRIVER:org.h2.Driver} + type: com.zaxxer.hikari.HikariDataSource + minimum-idle: 10 + connectionTimeout: ${CAMUNDA_HIKARI_CONN_TIMEOUT:30000} + idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} + maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} + validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} jersey: application-path: /engine-rest security: @@ -216,10 +212,9 @@ websocket: messageType: ${WEBSOCKET_MESSAGE_TYPE:TASK_EVENT} messageEvents: ${WEBSOCKET_MESSAGE_EVENTS:DEFAULT} messageBroker: - host: ${REDIS_HOST} - port: ${REDIS_PORT} - passcode: ${REDIS_PASSCODE} - enableRedis: ${REDIS_ENABLED:false} + host: ${WEBSOCKET_BROKER_HOST} + port: ${WEBSOCKET_BROKER_PORT} + passcode: ${WEBSOCKET_BROKER_PASSCODE} # disable redis spring.data.redis.repositories.enabled: false diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListenerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListenerTest.java new file mode 100644 index 00000000..981ba946 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/AccessGrantNotifyListenerTest.java @@ -0,0 +1,125 @@ +package org.camunda.bpm.extension.hooks.listeners.task; + +import org.camunda.bpm.engine.IdentityService; +import org.camunda.bpm.engine.ProcessEngine; +import org.camunda.bpm.engine.ProcessEngineServices; +import org.camunda.bpm.engine.RuntimeService; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.DelegateTask; +import org.camunda.bpm.engine.delegate.Expression; +import org.camunda.bpm.engine.identity.User; +import org.camunda.bpm.engine.identity.UserQuery; +import org.camunda.bpm.engine.task.IdentityLink; +import org.camunda.bpm.extension.hooks.listeners.stubs.IdentityStub; +import org.camunda.bpm.extension.hooks.listeners.stubs.UserStub; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.*; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@ExtendWith(SpringExtension.class) +public class AccessGrantNotifyListenerTest { + + @InjectMocks + private AccessGrantNotifyListener accessGrantNotifyListener; + + @Mock + private DelegateTask delegateTask; + + @Mock + private DelegateExecution delegateExecution; + + @Mock + private Expression excludeGroup; + + @Mock + private Expression messageId; + + @Mock + private Expression category; + + @Mock + ProcessEngine processEngine; + + @Mock + IdentityService identityService; + + @Mock + ProcessEngineServices processEngineServices; + + @Mock + RuntimeService runtimeService; + + @Test + public void invoke_notify() { + String id = "id1"; + String exclusionGroup = "GROUP2"; + String assignee = ""; + Map variables = new HashMap<>(); + variables.put("key_notify_sent_to","GROUP3"); + Set identityList = new HashSet(); + identityList.add(new IdentityStub("1", "CANDIDATE", "GROUP1", "TASK1", "PROCESS1", "TENANT-1", "Honai")); + when(delegateTask.getCandidates()) + .thenReturn(identityList); + when(delegateTask.getExecution()) + .thenReturn(delegateExecution); + when(delegateTask.getExecution().getVariables()) + .thenReturn(variables); + when(delegateTask.getExecution().getVariable("isNotify")) + .thenReturn(true); + when(delegateTask.getId()) + .thenReturn(id); + when(excludeGroup.getValue(delegateTask.getExecution())) + .thenReturn(exclusionGroup); + when(delegateTask.getTaskDefinitionKey()) + .thenReturn("key"); + when(delegateTask.getAssignee()) + .thenReturn(assignee); + List userList = new ArrayList<>(); + userList.add(new UserStub("1", "John", "Honai", "john.honai@aot-technologies.com", "password")); + userList.add(new UserStub("2", "Peter", "Scots", "peter.scots@aot-technologies.com", "password")); + when(delegateExecution.getProcessEngine()) + .thenReturn(processEngine); + when(processEngine.getIdentityService()) + .thenReturn(identityService); + UserQuery userQuery = mock(UserQuery.class); + UserQuery userQuery1 = mock(UserQuery.class); + when(identityService.createUserQuery()) + .thenReturn(userQuery); + when(userQuery.memberOfGroup(anyString())) + .thenReturn(userQuery1); + when(userQuery1.list()) + .thenReturn(userList); + when(delegateExecution.getProcessEngineServices()) + .thenReturn(processEngineServices); + when(delegateExecution.getProcessEngineServices().getRuntimeService()) + .thenReturn(runtimeService); + when(messageId.getValue(delegateExecution)) + .thenReturn("id1"); + when(category.getValue(delegateExecution)) + .thenReturn("category1"); + + accessGrantNotifyListener.notify(delegateTask); + ArgumentCaptor messageIdCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageVariableCaptor = ArgumentCaptor.forClass(Map.class); + verify(runtimeService).startProcessInstanceByMessage(messageIdCaptor.capture(), + messageVariableCaptor.capture()); + Map eMessageVariables = new HashMap<>(); + eMessageVariables.put("to", "john.honai@aot-technologies.com,peter.scots@aot-technologies.com"); + eMessageVariables.put("name", "Team"); + eMessageVariables.put("category", "category1"); + eMessageVariables.put("taskid", "id1"); + eMessageVariables.put("key_notify_sent_to","GROUP3"); + assertEquals("id1", messageIdCaptor.getValue()); + assertEquals(eMessageVariables, messageVariableCaptor.getValue()); + } + +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListenerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListenerTest.java new file mode 100644 index 00000000..8d2f523e --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListenerTest.java @@ -0,0 +1,355 @@ +package org.camunda.bpm.extension.hooks.listeners.task; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.camunda.bpm.engine.IdentityService; +import org.camunda.bpm.engine.ProcessEngine; +import org.camunda.bpm.engine.ProcessEngineServices; +import org.camunda.bpm.engine.RuntimeService; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.DelegateTask; +import org.camunda.bpm.engine.delegate.Expression; +import org.camunda.bpm.engine.identity.User; +import org.camunda.bpm.engine.identity.UserQuery; +import org.camunda.bpm.engine.task.IdentityLink; +import org.camunda.bpm.extension.hooks.listeners.stubs.IdentityStub; +import org.camunda.bpm.extension.hooks.listeners.stubs.UserStub; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.camunda.bpm.extension.hooks.services.UserService; +import org.camunda.bpm.engine.impl.persistence.entity.UserEntity; + +/** + * Timeout Notify Listener Test. + * Test class for TimeoutNotifyListener + */ +@ExtendWith(SpringExtension.class) +public class TimeoutNotifyListenerTest { + + @InjectMocks + private TimeoutNotifyListener timeoutNotifyListener; + + @Mock + private Expression escalationGroup; + + @Mock + private Expression messageName; + + @Mock + private Expression currentDate; + + @Mock + private DelegateTask delegateTask; + + @Mock + private DelegateExecution delegateExecution; + + @Mock + private ProcessEngine processEngine; + + @Mock + private IdentityService identityService; + + @Mock + private UserService userService; + + @Mock + private UserQuery user; + + @Mock + private ProcessEngineServices processEngineServices; + + @Mock + private RuntimeService runtimeService; + + /** + * This test case perform a positive test over notify method in TimeoutNotifyListener + * Assignee is not blank and escalation true. + * This test will validate the send message. + */ + @Test + public void notify_with_DelegateTask_and_validateAssignee_escalation_assignee_not_blank() throws Exception { + when(currentDate.getValue(delegateTask)) + .thenReturn("2021-11-01T16:38:34.144+05:30"); + when(delegateTask.getExecution()) + .thenReturn(delegateExecution); + when(delegateTask.getExecution().getVariable(anyString())) + .thenReturn("2021-10-30T16:39:53.041+05:30"); + when(escalationGroup.getValue(delegateTask)) + .thenReturn("someGroup"); + + List userList = new ArrayList<>(); + userList.add(new UserStub("1", "John", "Honai", "john.honai@aot-technologies.com", "password")); + userList.add(new UserStub("2", "Peter", "Scots", "peter.scots@aot-technologies.com", "password")); + when(delegateExecution.getProcessEngine()) + .thenReturn(processEngine); + when(processEngine.getIdentityService()) + .thenReturn(identityService); + UserQuery userQuery = mock(UserQuery.class); + UserQuery userQuery1 = mock(UserQuery.class); + when(identityService.createUserQuery()) + .thenReturn(userQuery); + when(userQuery.memberOfGroup(anyString())) + .thenReturn(userQuery1); + when(userQuery1.list()) + .thenReturn(userList); + User userId = userList.get(0); + when(delegateTask.getAssignee()) + .thenReturn("assigneeId1"); + when(userQuery.userId(anyString())) + .thenReturn(user); + when(userService.searchUserByAttribute("userid","assigneeId1")) + .thenReturn(userId); + when(userQuery.userId(anyString()).singleResult()) + .thenReturn(userId); + when(delegateTask.getId()) + .thenReturn("taskId-1"); + + when(delegateExecution.getProcessEngineServices()) + .thenReturn(processEngineServices); + when(delegateExecution.getProcessEngineServices().getRuntimeService()) + .thenReturn(runtimeService); + Map variables = new HashMap<>(); + variables.put("_file", new Object()); + when(delegateExecution.getVariables()) + .thenReturn(variables); + when(messageName.getValue(delegateExecution)) + .thenReturn("Success"); + timeoutNotifyListener.notify(delegateTask); + + ArgumentCaptor messageNameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageVariableCaptor = ArgumentCaptor.forClass(Map.class); + verify(runtimeService).startProcessInstanceByMessage(messageNameCaptor.capture(), + messageVariableCaptor.capture()); + Map eMessageVariables = new HashMap<>(); + eMessageVariables.put("cc", "john.honai@aot-technologies.com,peter.scots@aot-technologies.com"); + eMessageVariables.put("to", "john.honai@aot-technologies.com"); + eMessageVariables.put("category", "activity_escalation"); + eMessageVariables.put("taskid", "taskId-1"); + assertEquals("Success", messageNameCaptor.getValue()); + assertEquals(eMessageVariables, messageVariableCaptor.getValue()); + } + + /** + * This test case perform over notify method in TimeoutNotifyListener + * Assignee is blank and escalation true. + * This test will validate the send message. + */ + @Test + public void notify_with_DelegateTask_and_validateAssignee_escalation_and_assignee_blank() throws Exception { + when(currentDate.getValue(delegateTask)) + .thenReturn("2021-11-01T16:38:34.144+05:30"); + when(delegateTask.getExecution()) + .thenReturn(delegateExecution); + when(delegateTask.getExecution().getVariable(anyString())) + .thenReturn("2021-10-30T16:39:53.041+05:30"); + when(escalationGroup.getValue(delegateTask)) + .thenReturn("someGroup"); + + Set identityList = new HashSet(); + identityList.add(new IdentityStub("1", "CANDIDATE", "GROUP1", "TASK1", "PROCESS1", "TENANT-1", "Honai")); + when(delegateTask.getCandidates()) + .thenReturn(identityList); + + List userList = new ArrayList<>(); + userList.add(new UserStub("1", "John", "Honai", "john.honai@aot-technologies.com", "password")); + userList.add(new UserStub("2", "Peter", "Scots", "peter.scots@aot-technologies.com", "password")); + when(delegateExecution.getProcessEngine()) + .thenReturn(processEngine); + when(processEngine.getIdentityService()) + .thenReturn(identityService); + UserQuery userQuery = mock(UserQuery.class); + UserQuery userQuery1 = mock(UserQuery.class); + when(identityService.createUserQuery()) + .thenReturn(userQuery); + when(userQuery.memberOfGroup(anyString())) + .thenReturn(userQuery1); + when(userQuery1.list()) + .thenReturn(userList); + User userId = userList.get(0); + when(delegateTask.getAssignee()) + .thenReturn(""); + when(userQuery.userId(anyString())) + .thenReturn(user); + when(userQuery.userId(anyString()).singleResult()) + .thenReturn(userId); + when(delegateTask.getId()) + .thenReturn("taskId-1"); + when(delegateExecution.getProcessEngineServices()) + .thenReturn(processEngineServices); + when(delegateExecution.getProcessEngineServices().getRuntimeService()) + .thenReturn(runtimeService); + Map variables = new HashMap<>(); + variables.put("_file", new Object()); + when(delegateExecution.getVariables()) + .thenReturn(variables); + when(messageName.getValue(delegateExecution)) + .thenReturn("Success"); + timeoutNotifyListener.notify(delegateTask); + + ArgumentCaptor messageNameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageVariableCaptor = ArgumentCaptor.forClass(Map.class); + verify(runtimeService).startProcessInstanceByMessage(messageNameCaptor.capture(), + messageVariableCaptor.capture()); + Map eMessageVariables = new HashMap<>(); + eMessageVariables.put("cc", "john.honai@aot-technologies.com,peter.scots@aot-technologies.com"); + eMessageVariables.put("to", "john.honai@aot-technologies.com,peter.scots@aot-technologies.com"); + eMessageVariables.put("category", "activity_escalation"); + eMessageVariables.put("taskid", "taskId-1"); + assertEquals("Success", messageNameCaptor.getValue()); + assertEquals(eMessageVariables, messageVariableCaptor.getValue()); + } + + /** + * This test case perform a positive test over notify method in TimeoutNotifyListener + * Assignee is not blank and reminder true. + * This test will validate the send message. + */ + @Test + public void notify_with_DelegateTask_and_validateAssignee_reminder_and_assignee_not_blank() throws Exception { + when(currentDate.getValue(delegateTask)) + .thenReturn("2021-10-30T16:51:29.115+05:30"); + when(delegateTask.getExecution()) + .thenReturn(delegateExecution); + when(delegateTask.getExecution().getVariable(anyString())) + .thenReturn("2021-10-31T16:51:29.183+05:30"); + when(escalationGroup.getValue(delegateTask)) + .thenReturn("someGroup"); + + List userList = new ArrayList<>(); + userList.add(new UserStub("1", "John", "Honai", "john.honai@aot-technologies.com", "password")); + userList.add(new UserStub("2", "Peter", "Scots", "peter.scots@aot-technologies.com", "password")); + when(delegateExecution.getProcessEngine()) + .thenReturn(processEngine); + when(processEngine.getIdentityService()) + .thenReturn(identityService); + UserQuery userQuery = mock(UserQuery.class); + UserQuery userQuery1 = mock(UserQuery.class); + when(identityService.createUserQuery()) + .thenReturn(userQuery); + when(userQuery.memberOfGroup(anyString())) + .thenReturn(userQuery1); + when(userQuery1.list()) + .thenReturn(userList); + User userId = userList.get(0); + when(delegateTask.getAssignee()) + .thenReturn("assigneeId1"); + when(userQuery.userId(anyString())) + .thenReturn(user); + when(userService.searchUserByAttribute("userid","assigneeId1")) + .thenReturn(userId); + when(userQuery.userId(anyString()).singleResult()) + .thenReturn(userId); + when(delegateTask.getId()) + .thenReturn("taskId-1"); + + when(delegateExecution.getProcessEngineServices()) + .thenReturn(processEngineServices); + when(delegateExecution.getProcessEngineServices().getRuntimeService()) + .thenReturn(runtimeService); + Map variables = new HashMap<>(); + variables.put("_file", new Object()); + when(delegateExecution.getVariables()) + .thenReturn(variables); + when(messageName.getValue(delegateExecution)) + .thenReturn("Success"); + timeoutNotifyListener.notify(delegateTask); + + ArgumentCaptor messageNameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageVariableCaptor = ArgumentCaptor.forClass(Map.class); + verify(runtimeService).startProcessInstanceByMessage(messageNameCaptor.capture(), + messageVariableCaptor.capture()); + Map eMessageVariables = new HashMap<>(); + eMessageVariables.put("to", "john.honai@aot-technologies.com"); + eMessageVariables.put("category", "activity_reminder"); + eMessageVariables.put("taskid", "taskId-1"); + assertEquals("Success", messageNameCaptor.getValue()); + assertEquals(eMessageVariables, messageVariableCaptor.getValue()); + } + + /** + * This test case perform over notify method in TimeoutNotifyListener + * Assignee is blank and reminder true. + * This test will validate the send message. + */ + @Test + public void notify_with_DelegateTask_and_validateAssignee_reminder_and_assignee_blank() throws Exception { + when(currentDate.getValue(delegateTask)) + .thenReturn("2021-10-30T16:51:29.115+05:30"); + when(delegateTask.getExecution()) + .thenReturn(delegateExecution); + when(delegateTask.getExecution().getVariable(anyString())) + .thenReturn("2021-10-31T16:51:29.183+05:30"); + when(escalationGroup.getValue(delegateTask)) + .thenReturn("someGroup"); + + Set identityList = new HashSet(); + identityList.add(new IdentityStub("1", "CANDIDATE", "GROUP1", "TASK1", "PROCESS1", "TENANT-1", "Honai")); + when(delegateTask.getCandidates()) + .thenReturn(identityList); + + List userList = new ArrayList<>(); + userList.add(new UserStub("1", "John", "Honai", "john.honai@aot-technologies.com", "password")); + userList.add(new UserStub("2", "Peter", "Scots", "peter.scots@aot-technologies.com", "password")); + when(delegateExecution.getProcessEngine()) + .thenReturn(processEngine); + when(processEngine.getIdentityService()) + .thenReturn(identityService); + UserQuery userQuery = mock(UserQuery.class); + UserQuery userQuery1 = mock(UserQuery.class); + when(identityService.createUserQuery()) + .thenReturn(userQuery); + when(userQuery.memberOfGroup(anyString())) + .thenReturn(userQuery1); + when(userQuery1.list()) + .thenReturn(userList); + User userId = userList.get(0); + when(delegateTask.getAssignee()) + .thenReturn(""); + when(userQuery.userId(anyString())) + .thenReturn(user); + when(userQuery.userId(anyString()).singleResult()) + .thenReturn(userId); + when(delegateTask.getId()) + .thenReturn("taskId-1"); + + when(delegateExecution.getProcessEngineServices()) + .thenReturn(processEngineServices); + when(delegateExecution.getProcessEngineServices().getRuntimeService()) + .thenReturn(runtimeService); + Map variables = new HashMap<>(); + variables.put("_file", new Object()); + when(delegateExecution.getVariables()) + .thenReturn(variables); + when(messageName.getValue(delegateExecution)) + .thenReturn("Success"); + timeoutNotifyListener.notify(delegateTask); + + ArgumentCaptor messageNameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor messageVariableCaptor = ArgumentCaptor.forClass(Map.class); + verify(runtimeService).startProcessInstanceByMessage(messageNameCaptor.capture(), + messageVariableCaptor.capture()); + Map eMessageVariables = new HashMap<>(); + eMessageVariables.put("to", "john.honai@aot-technologies.com,peter.scots@aot-technologies.com"); + eMessageVariables.put("category", "activity_reminder"); + eMessageVariables.put("taskid", "taskId-1"); + assertEquals("Success", messageNameCaptor.getValue()); + assertEquals(eMessageVariables, messageVariableCaptor.getValue()); + } + +} From 373eaae69161e6d0251c9464d10a9fb57d800411 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 24 Jul 2023 14:02:10 -0600 Subject: [PATCH 030/157] dockerfile update --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index 0f9d58c1..ba75fc8e 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -20,10 +20,12 @@ WORKDIR /tmp/ RUN mvn -s /usr/share/maven/ref/settings-docker.xml dependency:resolve-plugins dependency:resolve dependency:go-offline -B RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ +# ARG CUSTOM_SRC_DIR=src/ ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory -COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ +# COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ +COPY ${CUSTOM_SRC_DIR} /tmp/${CUSTOM_SRC_DIR}/ RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default From 39cf723b62c0996e28e0f9e39ff39910c7056514 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 24 Jul 2023 19:18:01 -0600 Subject: [PATCH 031/157] new files added --- .../apiManager/services/endpoints/config.js | 48 ++++++++++++ .../apiManager/services/endpoints/index.js | 74 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js create mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js new file mode 100644 index 00000000..9409477c --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js @@ -0,0 +1,48 @@ +// export const INSIGHTS_BASE_API = `${(window._env_ && window._env_.REACT_APP_INSIGHT_API_BASE) || +// process.env.REACT_APP_INSIGHT_API_BASE}/api`; +// export const INSIGHTS_API_KEY = +// (window._env_ && window._env_.REACT_APP_INSIGHTS_API_KEY) || +// process.env.REACT_APP_INSIGHTS_API_KEY; +export const WEB_BASE_URL = + (window._env_ && window._env_.REACT_APP_WEB_BASE_URL) || + process.env.REACT_APP_WEB_BASE_URL; + + export const DOCUMENT_SERVICE_URL = + (window._env_ && window._env_.REACT_APP_DOCUMENT_SERVICE_URL) || + process.env.REACT_APP_DOCUMENT_SERVICE_URL; + +export const OPENTELEMETRY_SERVICE = + (window._env_ && window._env_.REACT_APP_OPENTELEMETRY_SERVICE) || + process.env.REACT_APP_OPENTELEMETRY_SERVICE; + +export const WEB_BASE_CUSTOM_URL = + (window._env_ && window._env_.REACT_APP_WEB_BASE_CUSTOM_URL) || + process.env.REACT_APP_WEB_BASE_CUSTOM_URL; + + +export const CUSTOM_SUBMISSION_URL = + (window._env_ && window._env_.REACT_APP_CUSTOM_SUBMISSION_URL) || + process.env.REACT_APP_CUSTOM_SUBMISSION_URL; + + export const BPM_BASE_URL_EXT = `${ + (window._env_ && window._env_.REACT_APP_BPM_URL) || + process.env.REACT_APP_BPM_URL + }/engine-rest`; + +export const BPM_API_URL_WITH_VERSION = `${BPM_BASE_URL_EXT}/v1`; + +export const BPM_BASE_URL_SOCKET_IO = `${ + (window._env_ && window._env_.REACT_APP_BPM_URL) || + process.env.REACT_APP_BPM_URL +}/forms-flow-bpm-socket`; + +export const MT_ADMIN_BASE_URL = `${ + (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL) || + process.env.REACT_APP_MT_ADMIN_BASE_URL +}`; + +export const MT_ADMIN_BASE_URL_VERSION = `${ + (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL_VERSION) || + process.env.REACT_APP_MT_ADMIN_BASE_URL_VERSION || + "v1" +}`; diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js new file mode 100644 index 00000000..c6dc07ae --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js @@ -0,0 +1,74 @@ +/* eslint-disable max-len */ +import { + WEB_BASE_URL, + MT_ADMIN_BASE_URL, + MT_ADMIN_BASE_URL_VERSION, + BPM_BASE_URL_EXT, + CUSTOM_SUBMISSION_URL, + DOCUMENT_SERVICE_URL +} from "./config"; + +import { AppConfig } from "../../config"; + +const API = { + GET_DASHBOARDS: `${WEB_BASE_URL}/dashboards`, + METRICS_SUBMISSIONS: `${WEB_BASE_URL}/metrics`, + APPLICATION_START: `${WEB_BASE_URL}/application/create`, + PUBLIC_APPLICATION_START: `${WEB_BASE_URL}/public/application/create`, + PUBLIC_APPLICATION_STATUS: `${WEB_BASE_URL}/public/form`, + PROCESS_STATE: `${WEB_BASE_URL}/process//task//state`, + GET_APPLICATION: `${WEB_BASE_URL}/application/`, + GET_APPLICATION_HISTORY_API: `${WEB_BASE_URL}/application//history`, + GET_ALL_APPLICATIONS_FROM_FORM_ID: `${WEB_BASE_URL}/application/formid`, + GET_ALL_APPLICATIONS_COUNT_BY_FORM_ID: `${WEB_BASE_URL}/application/formid/
/count`, + GET_ALL_APPLICATIONS: `${WEB_BASE_URL}/application`, + GET_ALL_APPLICATIONS_STATUS: `${WEB_BASE_URL}/application/status/list`, + GET_PROCESS_DEFINITION: `${BPM_BASE_URL_EXT}/process-definition/key/`, + PROCESSES_XML: `${BPM_BASE_URL_EXT}/process-definition/key//xml`, + DMN_XML: `${BPM_BASE_URL_EXT}/decision-definition/key//xml`, + PROCESS_ACTIVITIES: `${BPM_BASE_URL_EXT}/process-instance//activity-instances`, + FORM: `${WEB_BASE_URL}/form`, + FORM_DESIGN: `${WEB_BASE_URL}/form/form-design`, + FORM_HISTORY: `${WEB_BASE_URL}/form/form-history`, + LANG_UPDATE: `${WEB_BASE_URL}/user/locale`, + FORM_PROCESSES: `${WEB_BASE_URL}/form/formid`, + APPLICATION_EVENT_UPDATE: `${BPM_BASE_URL_EXT}/message`, + GET_BPM_TASKS: `${BPM_BASE_URL_EXT}/task`, + GET_BPM_TASK_DETAIL: `${BPM_BASE_URL_EXT}/task/`, + GET_BPM_TASK_VARIABLES: `${BPM_BASE_URL_EXT}/task//variables`, + CLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/task//claim`, + UNCLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/task//unclaim`, + GET_BPM_PROCESS_LIST: `${BPM_BASE_URL_EXT}/process-definition`, + GET_DMN_PROCESS_LIST: `${BPM_BASE_URL_EXT}/decision-definition`, + GET_API_USER_LIST: `${WEB_BASE_URL}/user`, + GET_BPM_FILTERS: `${BPM_BASE_URL_EXT}/filter`, + GET_BPM_TASK_LIST_WITH_FILTER: `${BPM_BASE_URL_EXT}/filter//list`, + GET_BPM_TASK_LIST_COUNT_WITH_FILTER: `${BPM_BASE_URL_EXT}/filter//count`, + BPM_GROUP: `${BPM_BASE_URL_EXT}/task//identity-links`, + DELETE_BPM_GROUP: `${BPM_BASE_URL_EXT}/task//identity-links/delete`, + BPM_FORM_SUBMIT: `${BPM_BASE_URL_EXT}/task//submit-form`, + GET_BPM_FORM_LIST: `${WEB_BASE_URL}/form`, + UPDATE_ASSIGNEE_BPM_TASK: `${BPM_BASE_URL_EXT}/task//assignee`, + GET_FORM_BY_ALIAS: `${AppConfig.projectUrl}/`, + GET_FORM_BY_ID: `${AppConfig.projectUrl}/form`, + + GET_GROUPS: `${WEB_BASE_URL}/groups`, + GET_FORM_COUNT: `${WEB_BASE_URL}/form//application/count`, + UNPUBLISH_FORMS: `${WEB_BASE_URL}/form/`, + DEPLOY_BPM: `${BPM_BASE_URL_EXT}/deployment/create`, + GET_TENANT_DATA: `${MT_ADMIN_BASE_URL}/${MT_ADMIN_BASE_URL_VERSION}/tenant`, + EXPORT_FORM_PDF: `${DOCUMENT_SERVICE_URL}/form//submission//export/pdf`, + CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/form//submission`, + PUBLIC_CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/public/form//submission`, + DRAFT_BASE: `${WEB_BASE_URL}/draft`, + DRAFT_PUBLIC_CREATE: `${WEB_BASE_URL}/draft/public/create`, + DRAFT_UPDATE: `${WEB_BASE_URL}/draft/`, + DRAFT_UPDATE_PUBLIC: `${WEB_BASE_URL}/draft/public/`, + DRAFT_APPLICATION_CREATE: `${WEB_BASE_URL}/draft//submit`, + DRAFT_APPLICATION_CREATE_PUBLIC: `${WEB_BASE_URL}/draft/public//submit`, + FORMIO_ROLES: `${WEB_BASE_URL}/formio/roles`, + DASHBOARD_AUTHORIZATION: `${WEB_BASE_URL}/authorizations/dashboard`, + USER_DASHBOARDS: `${WEB_BASE_URL}/authorizations/users/dashboard`, +}; + +export default API; From 020c79fbb77795d7a38b67ef6cb99ca37c02bb27 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 24 Jul 2023 19:29:31 -0600 Subject: [PATCH 032/157] update folder structure --- .../src/apiManager/{services => }/endpoints/config.js | 0 .../src/apiManager/{services => }/endpoints/index.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename apps/forms-flow-ai/forms-flow-web/src/apiManager/{services => }/endpoints/config.js (100%) rename apps/forms-flow-ai/forms-flow-web/src/apiManager/{services => }/endpoints/index.js (100%) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js similarity index 100% rename from apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js rename to apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js similarity index 100% rename from apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js rename to apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js From 9cebb73539d8b653d674a7deed17bbed1b0d8fca Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 09:07:58 -0600 Subject: [PATCH 033/157] 2 files removed --- .../src/apiManager/endpoints/config.js | 48 ------------ .../src/apiManager/endpoints/index.js | 74 ------------------- 2 files changed, 122 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js delete mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js deleted file mode 100644 index 9409477c..00000000 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js +++ /dev/null @@ -1,48 +0,0 @@ -// export const INSIGHTS_BASE_API = `${(window._env_ && window._env_.REACT_APP_INSIGHT_API_BASE) || -// process.env.REACT_APP_INSIGHT_API_BASE}/api`; -// export const INSIGHTS_API_KEY = -// (window._env_ && window._env_.REACT_APP_INSIGHTS_API_KEY) || -// process.env.REACT_APP_INSIGHTS_API_KEY; -export const WEB_BASE_URL = - (window._env_ && window._env_.REACT_APP_WEB_BASE_URL) || - process.env.REACT_APP_WEB_BASE_URL; - - export const DOCUMENT_SERVICE_URL = - (window._env_ && window._env_.REACT_APP_DOCUMENT_SERVICE_URL) || - process.env.REACT_APP_DOCUMENT_SERVICE_URL; - -export const OPENTELEMETRY_SERVICE = - (window._env_ && window._env_.REACT_APP_OPENTELEMETRY_SERVICE) || - process.env.REACT_APP_OPENTELEMETRY_SERVICE; - -export const WEB_BASE_CUSTOM_URL = - (window._env_ && window._env_.REACT_APP_WEB_BASE_CUSTOM_URL) || - process.env.REACT_APP_WEB_BASE_CUSTOM_URL; - - -export const CUSTOM_SUBMISSION_URL = - (window._env_ && window._env_.REACT_APP_CUSTOM_SUBMISSION_URL) || - process.env.REACT_APP_CUSTOM_SUBMISSION_URL; - - export const BPM_BASE_URL_EXT = `${ - (window._env_ && window._env_.REACT_APP_BPM_URL) || - process.env.REACT_APP_BPM_URL - }/engine-rest`; - -export const BPM_API_URL_WITH_VERSION = `${BPM_BASE_URL_EXT}/v1`; - -export const BPM_BASE_URL_SOCKET_IO = `${ - (window._env_ && window._env_.REACT_APP_BPM_URL) || - process.env.REACT_APP_BPM_URL -}/forms-flow-bpm-socket`; - -export const MT_ADMIN_BASE_URL = `${ - (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL) || - process.env.REACT_APP_MT_ADMIN_BASE_URL -}`; - -export const MT_ADMIN_BASE_URL_VERSION = `${ - (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL_VERSION) || - process.env.REACT_APP_MT_ADMIN_BASE_URL_VERSION || - "v1" -}`; diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js deleted file mode 100644 index c6dc07ae..00000000 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable max-len */ -import { - WEB_BASE_URL, - MT_ADMIN_BASE_URL, - MT_ADMIN_BASE_URL_VERSION, - BPM_BASE_URL_EXT, - CUSTOM_SUBMISSION_URL, - DOCUMENT_SERVICE_URL -} from "./config"; - -import { AppConfig } from "../../config"; - -const API = { - GET_DASHBOARDS: `${WEB_BASE_URL}/dashboards`, - METRICS_SUBMISSIONS: `${WEB_BASE_URL}/metrics`, - APPLICATION_START: `${WEB_BASE_URL}/application/create`, - PUBLIC_APPLICATION_START: `${WEB_BASE_URL}/public/application/create`, - PUBLIC_APPLICATION_STATUS: `${WEB_BASE_URL}/public/form`, - PROCESS_STATE: `${WEB_BASE_URL}/process//task//state`, - GET_APPLICATION: `${WEB_BASE_URL}/application/`, - GET_APPLICATION_HISTORY_API: `${WEB_BASE_URL}/application//history`, - GET_ALL_APPLICATIONS_FROM_FORM_ID: `${WEB_BASE_URL}/application/formid`, - GET_ALL_APPLICATIONS_COUNT_BY_FORM_ID: `${WEB_BASE_URL}/application/formid//count`, - GET_ALL_APPLICATIONS: `${WEB_BASE_URL}/application`, - GET_ALL_APPLICATIONS_STATUS: `${WEB_BASE_URL}/application/status/list`, - GET_PROCESS_DEFINITION: `${BPM_BASE_URL_EXT}/process-definition/key/`, - PROCESSES_XML: `${BPM_BASE_URL_EXT}/process-definition/key//xml`, - DMN_XML: `${BPM_BASE_URL_EXT}/decision-definition/key//xml`, - PROCESS_ACTIVITIES: `${BPM_BASE_URL_EXT}/process-instance//activity-instances`, - FORM: `${WEB_BASE_URL}/form`, - FORM_DESIGN: `${WEB_BASE_URL}/form/form-design`, - FORM_HISTORY: `${WEB_BASE_URL}/form/form-history`, - LANG_UPDATE: `${WEB_BASE_URL}/user/locale`, - FORM_PROCESSES: `${WEB_BASE_URL}/form/formid`, - APPLICATION_EVENT_UPDATE: `${BPM_BASE_URL_EXT}/message`, - GET_BPM_TASKS: `${BPM_BASE_URL_EXT}/task`, - GET_BPM_TASK_DETAIL: `${BPM_BASE_URL_EXT}/task/`, - GET_BPM_TASK_VARIABLES: `${BPM_BASE_URL_EXT}/task//variables`, - CLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/task//claim`, - UNCLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/task//unclaim`, - GET_BPM_PROCESS_LIST: `${BPM_BASE_URL_EXT}/process-definition`, - GET_DMN_PROCESS_LIST: `${BPM_BASE_URL_EXT}/decision-definition`, - GET_API_USER_LIST: `${WEB_BASE_URL}/user`, - GET_BPM_FILTERS: `${BPM_BASE_URL_EXT}/filter`, - GET_BPM_TASK_LIST_WITH_FILTER: `${BPM_BASE_URL_EXT}/filter//list`, - GET_BPM_TASK_LIST_COUNT_WITH_FILTER: `${BPM_BASE_URL_EXT}/filter//count`, - BPM_GROUP: `${BPM_BASE_URL_EXT}/task//identity-links`, - DELETE_BPM_GROUP: `${BPM_BASE_URL_EXT}/task//identity-links/delete`, - BPM_FORM_SUBMIT: `${BPM_BASE_URL_EXT}/task//submit-form`, - GET_BPM_FORM_LIST: `${WEB_BASE_URL}/form`, - UPDATE_ASSIGNEE_BPM_TASK: `${BPM_BASE_URL_EXT}/task//assignee`, - GET_FORM_BY_ALIAS: `${AppConfig.projectUrl}/`, - GET_FORM_BY_ID: `${AppConfig.projectUrl}/form`, - - GET_GROUPS: `${WEB_BASE_URL}/groups`, - GET_FORM_COUNT: `${WEB_BASE_URL}/form//application/count`, - UNPUBLISH_FORMS: `${WEB_BASE_URL}/form/`, - DEPLOY_BPM: `${BPM_BASE_URL_EXT}/deployment/create`, - GET_TENANT_DATA: `${MT_ADMIN_BASE_URL}/${MT_ADMIN_BASE_URL_VERSION}/tenant`, - EXPORT_FORM_PDF: `${DOCUMENT_SERVICE_URL}/form//submission//export/pdf`, - CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/form//submission`, - PUBLIC_CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/public/form//submission`, - DRAFT_BASE: `${WEB_BASE_URL}/draft`, - DRAFT_PUBLIC_CREATE: `${WEB_BASE_URL}/draft/public/create`, - DRAFT_UPDATE: `${WEB_BASE_URL}/draft/`, - DRAFT_UPDATE_PUBLIC: `${WEB_BASE_URL}/draft/public/`, - DRAFT_APPLICATION_CREATE: `${WEB_BASE_URL}/draft//submit`, - DRAFT_APPLICATION_CREATE_PUBLIC: `${WEB_BASE_URL}/draft/public//submit`, - FORMIO_ROLES: `${WEB_BASE_URL}/formio/roles`, - DASHBOARD_AUTHORIZATION: `${WEB_BASE_URL}/authorizations/dashboard`, - USER_DASHBOARDS: `${WEB_BASE_URL}/authorizations/users/dashboard`, -}; - -export default API; From f7b56358c4d2e4791c8920e9a2aad130cee6367d Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 13:05:14 -0600 Subject: [PATCH 034/157] 2 files changed --- .../extension/hooks/services/UserService.java | 8 +++-- .../keycloak/CamundaExtConfiguration.java | 29 +++++++++---------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 4c99ea4c..877261d4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -1,4 +1,5 @@ package org.camunda.bpm.extension.hooks.services; + import com.google.gson.JsonArray; import com.google.gson.JsonObject; import org.camunda.bpm.engine.impl.identity.IdentityProviderException; @@ -29,16 +30,17 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - @Autowired + @Autowired(required = false) private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; + public User searchUserByAttribute(String attributeName, String attributeValue) { try { List users = keycloak .realm(keycloakRealm) .users() - .searchByAttributes(attributeName+":"+attributeValue); + .searchByAttributes(attributeName + ":" + attributeValue); UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); String username = user.getUsername(); @@ -50,7 +52,7 @@ public User searchUserByAttribute(String attributeName, String attributeValue) { result.setFirstName(firstName); result.setLastName(lastName); return result; - }catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); LOG.error(e.getMessage()); } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index abb79591..e8a9c4fe 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -1,7 +1,5 @@ package org.camunda.bpm.extension.keycloak; - - import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; @@ -16,7 +14,6 @@ import javax.sql.DataSource; import java.util.Properties; - /** * The Camunda Showcase Spring Boot application. */ @@ -31,20 +28,22 @@ public class CamundaExtConfiguration { private String keycloakClientId; @Value("${keycloak.clientSecret}") private String keycloakClientSecret; + /** * Secondary datasource. * This is used only for publishing data to analytics. + * * @return */ @Bean("analyticsDS") @ConfigurationProperties("analytics.datasource") - public DataSource analyticsDS(){ + public DataSource analyticsDS() { return DataSourceBuilder.create().build(); } - /** * JDBC template for analytics datasource interaction. + * * @param analyticsDS * @return */ @@ -58,15 +57,15 @@ public NamedParameterJdbcTemplate analyticsJdbcTemplate(@Qualifier("analyticsDS" public Properties messageBrokerProperties() { return new Properties(); } - @Bean - Keycloak keycloak() { - return KeycloakBuilder.builder() - .serverUrl(keycloakUrl) - .realm(keycloakRealm) - .clientId(keycloakClientId) - .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - .clientSecret(keycloakClientSecret) - .build(); - } + // @Bean + // Keycloak keycloak() { + // return KeycloakBuilder.builder() + // .serverUrl(keycloakUrl) + // .realm(keycloakRealm) + // .clientId(keycloakClientId) + // .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + // .clientSecret(keycloakClientSecret) + // .build(); + // } } From f34a9c7d7532b30e66d5d71b3f0c86654c16c905 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 15:19:43 -0600 Subject: [PATCH 035/157] remove jersey --- .../forms-flow-bpm/src/main/resources/application.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 36a174ce..dd14f745 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -139,9 +139,7 @@ spring: connectionTimeout: ${CAMUNDA_HIKARI_CONN_TIMEOUT:30000} idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} - validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} - jersey: - application-path: /engine-rest + validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} security: oauth2: client: From 5b9ecfc2d99019066cccfb203356e8a0967015c9 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 18:03:23 -0600 Subject: [PATCH 036/157] 2 files updated --- .../forms-flow-bpm/src/main/resources/application.yaml | 1 + .../forms-flow-web/src/apiManager/services/bpmTaskServices.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index dd14f745..1facd2ba 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -100,6 +100,7 @@ camunda.bpm: frame-ancestors 'none'; object-src 'none' job-execution: + enabled: true core-pool-size: ${CAMUNDA_JOB_CORE_POOL_SIZE:3} lock-time-in-millis: ${CAMUNDA_JOB_LOCK_TIME_MILLIS:300000} max-jobs-per-acquisition: ${CAMUNDA_JOB_MAXJOBS_PER_ACQUISITION:3} diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index 94600ef4..bf81dd47 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -133,7 +133,7 @@ export const fetchUserListWithSearch = ({searchType,query},...rest) => { const done = rest.length ? rest[0] : () => {}; - const paramData={memberOfGroup:REVIEWER_GROUP}; + const paramData={memberOfGroup: REVIEWER_GROUP}; /*TODO search with query /user?lastNameLike=%${lastName}%&memberOfGroup=${group}*/ //let getReviewerUserListApi = `${API.GET_BPM_USER_LIST}?memberOfGroup=${REVIEWER_GROUP}`; if(searchType && query){ From f6ef4ee3ad0e757a6a2f13ff8a879e3729979042 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 19:09:00 -0600 Subject: [PATCH 037/157] add query params. --- .../forms-flow-web/src/apiManager/services/bpmTaskServices.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index bf81dd47..d507e369 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -165,7 +165,7 @@ export const fetchFilterList = (...rest) => { const done = rest.length ? rest[0] : () => {}; - const getTaskFiltersAPI = `${API.GET_BPM_FILTERS}?resourceType=Task&itemCount=true` + const getTaskFiltersAPI = `${API.GET_BPM_FILTERS}?resourceType=Task&itemCount=true&firstResult=0&maxResults=10` return (dispatch) => { httpGETRequest(getTaskFiltersAPI, {}, UserService.getToken()) .then((res) => { From 58306c4119591da9b5aab4c43738576bdfc017fb Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 25 Jul 2023 19:31:16 -0600 Subject: [PATCH 038/157] 'add query params' reverted --- .../forms-flow-web/src/apiManager/services/bpmTaskServices.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js index d507e369..bf81dd47 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/bpmTaskServices.js @@ -165,7 +165,7 @@ export const fetchFilterList = (...rest) => { const done = rest.length ? rest[0] : () => {}; - const getTaskFiltersAPI = `${API.GET_BPM_FILTERS}?resourceType=Task&itemCount=true&firstResult=0&maxResults=10` + const getTaskFiltersAPI = `${API.GET_BPM_FILTERS}?resourceType=Task&itemCount=true` return (dispatch) => { httpGETRequest(getTaskFiltersAPI, {}, UserService.getToken()) .then((res) => { From 9f6399532b44f77271349bdc044b516293854e79 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 26 Jul 2023 13:27:32 -0600 Subject: [PATCH 039/157] application.yaml update --- .../src/main/resources/application.yaml | 126 +++++++++--------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 1facd2ba..388a55b4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -21,6 +21,18 @@ analytics.datasource: validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} +server: + error: + include-message: always + port: 8080 + servlet: + context-path: /camunda + session: + cookie: + secure: ${SESSION_COOKIE_SECURE:true} + max-age: 1800 + http-only: true + formsflow.ai: forms: enableCustomSubmission: ${CUSTOM_SUBMISSION_ENABLED:false} @@ -42,44 +54,6 @@ formsflow.ai: maxInMemorySize: ${DATA_BUFFER_SIZE} connectionTimeout: 5000 - -# session: -# jdbc.initialize-schema: always -# store-type: ${CAMUNDA_SESSION_STORE_TYPE:none} -# timeout.seconds: ${CAMUNDA_SESSION_STORE_TIMEOUT:28800} - -management: - health: - db: - enabled: true - endpoints: - web: - exposure: - include: "health,info,loggers" - endpoint: - loggers: - enabled: true - -info: - app: - name: "Camunda" - description: "formsflow.ai Engine" - version: "7.17" - java: - version: "17" - -# Enable the below given block for session management of camunda. This is not required for externalised tasklist. -#session.datasource: -# jdbc-url: ${CAMUNDA_SESSION_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} -# username: ${CAMUNDA_SESSION_JDBC_USER:sa} -# password: ${CAMUNDA_SESSION_JDBC_PASSWORD:sa} -# driverClassName: ${CAMUNDA_SESSION_JDBC_DRIVER:org.h2.Driver} -# type: com.zaxxer.hikari.HikariDataSource -# connectionTimeout: ${CAMUNDA_SESSION_HIKARI_CONN_TIMEOUT:30000} -# idleTimeout: ${CAMUNDA_SESSION_HIKARI_IDLE_TIMEOUT:600000} -# maximumPoolSize: ${CAMUNDA_SESSION_HIKARI_MAX_POOLSIZE:10} -# validationTimeout: ${CAMUNDA_SESSION_HIKARI_VALID_TIMEOUT:5000} - camunda.bpm: history-level: ${CAMUNDA_BPM_HISTORY_LEVEL:none} authorization: @@ -110,24 +84,7 @@ camunda.bpm: max-wait: ${CAMUNDA_JOB_MAX_WAIT:60000} metrics: enabled: ${CAMUNDA_METRICS_FLAG:true} -server: - error: - include-message: always - port: 8080 - servlet: - context-path: /camunda - session: - cookie: - secure: ${SESSION_COOKIE_SECURE:true} - max-age: 1800 - http-only: true - -# Camunda Rest API -rest.security: - enabled: true - provider: keycloak - required-audience: camunda-rest-api spring: datasource: @@ -175,13 +132,13 @@ spring: main: allow-bean-definition-overriding: true -logging: - level: - org.springframework.security: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} - org.springframework.web: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} - org.springframework.jdbc: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} - org.camunda: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} - org.camunda.bpm.extension: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + +# Camunda Rest API +rest.security: + enabled: true + provider: keycloak + required-audience: camunda-rest-api + plugin.identity.keycloak.rest: userNameClaim: preferred_username @@ -220,3 +177,48 @@ spring.data.redis.repositories.enabled: false spring.autoconfigure.exclude: - org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration +# session: +# jdbc.initialize-schema: always +# store-type: ${CAMUNDA_SESSION_STORE_TYPE:none} +# timeout.seconds: ${CAMUNDA_SESSION_STORE_TIMEOUT:28800} + +management: + health: + db: + enabled: true + endpoints: + web: + exposure: + include: "health,info,loggers" + endpoint: + loggers: + enabled: true + +info: + app: + name: "Camunda" + description: "formsflow.ai Engine" + version: "7.17" + java: + version: "17" + + +logging: + level: + org.springframework.security: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + org.springframework.web: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + org.springframework.jdbc: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + org.camunda: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + org.camunda.bpm.extension: ${CAMUNDA_APP_ROOT_LOG_FLAG:ERROR} + +# Enable the below given block for session management of camunda. This is not required for externalised tasklist. +#session.datasource: +# jdbc-url: ${CAMUNDA_SESSION_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} +# username: ${CAMUNDA_SESSION_JDBC_USER:sa} +# password: ${CAMUNDA_SESSION_JDBC_PASSWORD:sa} +# driverClassName: ${CAMUNDA_SESSION_JDBC_DRIVER:org.h2.Driver} +# type: com.zaxxer.hikari.HikariDataSource +# connectionTimeout: ${CAMUNDA_SESSION_HIKARI_CONN_TIMEOUT:30000} +# idleTimeout: ${CAMUNDA_SESSION_HIKARI_IDLE_TIMEOUT:600000} +# maximumPoolSize: ${CAMUNDA_SESSION_HIKARI_MAX_POOLSIZE:10} +# validationTimeout: ${CAMUNDA_SESSION_HIKARI_VALID_TIMEOUT:5000} \ No newline at end of file From 54c7e7e83521f3b7ef8dc593a662a55b29024d47 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 26 Jul 2023 15:47:39 -0600 Subject: [PATCH 040/157] include jersey and app path. --- .../src/main/resources/application.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 388a55b4..62e04e04 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -27,11 +27,11 @@ server: port: 8080 servlet: context-path: /camunda - session: - cookie: - secure: ${SESSION_COOKIE_SECURE:true} - max-age: 1800 - http-only: true + session: + cookie: + secure: ${SESSION_COOKIE_SECURE:true} + max-age: 1800 + http-only: true formsflow.ai: forms: @@ -98,6 +98,8 @@ spring: idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} + jersey: + application-path: /engine-rest-ext/v1 security: oauth2: client: From db213586c886298fadc0406f2fc676cfd624d23f Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 26 Jul 2023 18:42:35 -0600 Subject: [PATCH 041/157] update app yaml and add endpoints --- .../src/main/resources/application.yaml | 2 - .../apiManager/services/endpoints/config.js | 48 ++++++++++++ .../apiManager/services/endpoints/index.js | 74 +++++++++++++++++++ 3 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js create mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 62e04e04..8e66920e 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -98,8 +98,6 @@ spring: idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} - jersey: - application-path: /engine-rest-ext/v1 security: oauth2: client: diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js new file mode 100644 index 00000000..9409477c --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js @@ -0,0 +1,48 @@ +// export const INSIGHTS_BASE_API = `${(window._env_ && window._env_.REACT_APP_INSIGHT_API_BASE) || +// process.env.REACT_APP_INSIGHT_API_BASE}/api`; +// export const INSIGHTS_API_KEY = +// (window._env_ && window._env_.REACT_APP_INSIGHTS_API_KEY) || +// process.env.REACT_APP_INSIGHTS_API_KEY; +export const WEB_BASE_URL = + (window._env_ && window._env_.REACT_APP_WEB_BASE_URL) || + process.env.REACT_APP_WEB_BASE_URL; + + export const DOCUMENT_SERVICE_URL = + (window._env_ && window._env_.REACT_APP_DOCUMENT_SERVICE_URL) || + process.env.REACT_APP_DOCUMENT_SERVICE_URL; + +export const OPENTELEMETRY_SERVICE = + (window._env_ && window._env_.REACT_APP_OPENTELEMETRY_SERVICE) || + process.env.REACT_APP_OPENTELEMETRY_SERVICE; + +export const WEB_BASE_CUSTOM_URL = + (window._env_ && window._env_.REACT_APP_WEB_BASE_CUSTOM_URL) || + process.env.REACT_APP_WEB_BASE_CUSTOM_URL; + + +export const CUSTOM_SUBMISSION_URL = + (window._env_ && window._env_.REACT_APP_CUSTOM_SUBMISSION_URL) || + process.env.REACT_APP_CUSTOM_SUBMISSION_URL; + + export const BPM_BASE_URL_EXT = `${ + (window._env_ && window._env_.REACT_APP_BPM_URL) || + process.env.REACT_APP_BPM_URL + }/engine-rest`; + +export const BPM_API_URL_WITH_VERSION = `${BPM_BASE_URL_EXT}/v1`; + +export const BPM_BASE_URL_SOCKET_IO = `${ + (window._env_ && window._env_.REACT_APP_BPM_URL) || + process.env.REACT_APP_BPM_URL +}/forms-flow-bpm-socket`; + +export const MT_ADMIN_BASE_URL = `${ + (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL) || + process.env.REACT_APP_MT_ADMIN_BASE_URL +}`; + +export const MT_ADMIN_BASE_URL_VERSION = `${ + (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL_VERSION) || + process.env.REACT_APP_MT_ADMIN_BASE_URL_VERSION || + "v1" +}`; diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js new file mode 100644 index 00000000..ecaa1948 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js @@ -0,0 +1,74 @@ +/* eslint-disable max-len */ +import { + WEB_BASE_URL, + MT_ADMIN_BASE_URL, + MT_ADMIN_BASE_URL_VERSION, + BPM_BASE_URL_EXT, + CUSTOM_SUBMISSION_URL, + DOCUMENT_SERVICE_URL +} from "./config"; + +import { AppConfig } from "../../config"; + +const API = { + GET_DASHBOARDS: `${WEB_BASE_URL}/dashboards`, + METRICS_SUBMISSIONS: `${WEB_BASE_URL}/metrics`, + APPLICATION_START: `${WEB_BASE_URL}/application/create`, + PUBLIC_APPLICATION_START: `${WEB_BASE_URL}/public/application/create`, + PUBLIC_APPLICATION_STATUS: `${WEB_BASE_URL}/public/form`, + PROCESS_STATE: `${WEB_BASE_URL}/process//task//state`, + GET_APPLICATION: `${WEB_BASE_URL}/application/`, + GET_APPLICATION_HISTORY_API: `${WEB_BASE_URL}/application//history`, + GET_ALL_APPLICATIONS_FROM_FORM_ID: `${WEB_BASE_URL}/application/formid`, + GET_ALL_APPLICATIONS_COUNT_BY_FORM_ID: `${WEB_BASE_URL}/application/formid//count`, + GET_ALL_APPLICATIONS: `${WEB_BASE_URL}/application`, + GET_ALL_APPLICATIONS_STATUS: `${WEB_BASE_URL}/application/status/list`, + GET_PROCESS_DEFINITION: `${BPM_BASE_URL_EXT}/v1/process-definition/key/`, + PROCESSES_XML: `${BPM_BASE_URL_EXT}/v1/process-definition/key//xml`, + DMN_XML: `${BPM_BASE_URL_EXT}/v1/decision-definition/key//xml`, + PROCESS_ACTIVITIES: `${BPM_BASE_URL_EXT}/v1/process-instance//activity-instances`, + FORM: `${WEB_BASE_URL}/form`, + FORM_DESIGN: `${WEB_BASE_URL}/form/form-design`, + FORM_HISTORY: `${WEB_BASE_URL}/form/form-history`, + LANG_UPDATE: `${WEB_BASE_URL}/user/locale`, + FORM_PROCESSES: `${WEB_BASE_URL}/form/formid`, + APPLICATION_EVENT_UPDATE: `${BPM_BASE_URL_EXT}/v1/message`, + GET_BPM_TASKS: `${BPM_BASE_URL_EXT}/v1/task`, + GET_BPM_TASK_DETAIL: `${BPM_BASE_URL_EXT}/v1/task/`, + GET_BPM_TASK_VARIABLES: `${BPM_BASE_URL_EXT}/v1/task//variables`, + CLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//claim`, + UNCLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//unclaim`, + GET_BPM_PROCESS_LIST: `${BPM_BASE_URL_EXT}/v1/process-definition`, + GET_DMN_PROCESS_LIST: `${BPM_BASE_URL_EXT}/v1/decision-definition`, + GET_API_USER_LIST: `${WEB_BASE_URL}/user`, + GET_BPM_FILTERS: `${BPM_BASE_URL_EXT}/filter`, + GET_BPM_TASK_LIST_WITH_FILTER: `${BPM_BASE_URL_EXT}/v1/filter//list`, + GET_BPM_TASK_LIST_COUNT_WITH_FILTER: `${BPM_BASE_URL_EXT}/v1/filter//count`, + BPM_GROUP: `${BPM_BASE_URL_EXT}/v1/task//identity-links`, + DELETE_BPM_GROUP: `${BPM_BASE_URL_EXT}/v1/task//identity-links/delete`, + BPM_FORM_SUBMIT: `${BPM_BASE_URL_EXT}/v1/task//submit-form`, + GET_BPM_FORM_LIST: `${WEB_BASE_URL}/form`, + UPDATE_ASSIGNEE_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//assignee`, + GET_FORM_BY_ALIAS: `${AppConfig.projectUrl}/`, + GET_FORM_BY_ID: `${AppConfig.projectUrl}/form`, + + GET_GROUPS: `${WEB_BASE_URL}/groups`, + GET_FORM_COUNT: `${WEB_BASE_URL}/form//application/count`, + UNPUBLISH_FORMS: `${WEB_BASE_URL}/form/`, + DEPLOY_BPM: `${BPM_BASE_URL_EXT}/v1/deployment/create`, + GET_TENANT_DATA: `${MT_ADMIN_BASE_URL}/${MT_ADMIN_BASE_URL_VERSION}/tenant`, + EXPORT_FORM_PDF: `${DOCUMENT_SERVICE_URL}/form//submission//export/pdf`, + CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/form//submission`, + PUBLIC_CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/public/form//submission`, + DRAFT_BASE: `${WEB_BASE_URL}/draft`, + DRAFT_PUBLIC_CREATE: `${WEB_BASE_URL}/draft/public/create`, + DRAFT_UPDATE: `${WEB_BASE_URL}/draft/`, + DRAFT_UPDATE_PUBLIC: `${WEB_BASE_URL}/draft/public/`, + DRAFT_APPLICATION_CREATE: `${WEB_BASE_URL}/draft//submit`, + DRAFT_APPLICATION_CREATE_PUBLIC: `${WEB_BASE_URL}/draft/public//submit`, + FORMIO_ROLES: `${WEB_BASE_URL}/formio/roles`, + DASHBOARD_AUTHORIZATION: `${WEB_BASE_URL}/authorizations/dashboard`, + USER_DASHBOARDS: `${WEB_BASE_URL}/authorizations/users/dashboard`, +}; + +export default API; From 9004be3eff8ac605513d91e831ec5849ac6b47c5 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 26 Jul 2023 19:12:08 -0600 Subject: [PATCH 042/157] add jersey path --- .../forms-flow-bpm/src/main/resources/application.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 8e66920e..f54d7baf 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -98,6 +98,8 @@ spring: idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} + jersey: + application-path: /engine-rest security: oauth2: client: From ddd04bd87034740900053cf6c9edbcf8905af949 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 26 Jul 2023 19:29:07 -0600 Subject: [PATCH 043/157] move api mgr folder --- .../src/apiManager/{services => }/endpoints/config.js | 0 .../src/apiManager/{services => }/endpoints/index.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename apps/forms-flow-ai/forms-flow-web/src/apiManager/{services => }/endpoints/config.js (100%) rename apps/forms-flow-ai/forms-flow-web/src/apiManager/{services => }/endpoints/index.js (100%) diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js similarity index 100% rename from apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/config.js rename to apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js similarity index 100% rename from apps/forms-flow-ai/forms-flow-web/src/apiManager/services/endpoints/index.js rename to apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js From 0f35d67b622f93a45f950aa066d91522f406cbff Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 27 Jul 2023 14:58:27 -0600 Subject: [PATCH 044/157] pom-docker & UserService changes --- .../forms-flow-bpm/pom-docker.xml | 4 +-- .../extension/hooks/services/UserService.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index dc2b9ceb..3cd2fc72 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -65,11 +65,11 @@ - + org.springframework.boot spring-boot-starter-webflux diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 877261d4..82a13f83 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -7,7 +7,7 @@ import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; -import org.keycloak.admin.client.Keycloak; +//import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,27 +30,27 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - @Autowired(required = false) - private Keycloak keycloak; + // @Autowired(required = false) + // private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; public User searchUserByAttribute(String attributeName, String attributeValue) { try { - List users = keycloak - .realm(keycloakRealm) - .users() - .searchByAttributes(attributeName + ":" + attributeValue); - UserRepresentation user = users.get(0); + // List users = keycloak + // .realm(keycloakRealm) + // .users() + // .searchByAttributes(attributeName + ":" + attributeValue); + // UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); - String username = user.getUsername(); - String email = user.getEmail(); - String firstName = user.getFirstName(); - String lastName = user.getLastName(); - result.setId(username); - result.setEmail(email); - result.setFirstName(firstName); - result.setLastName(lastName); + // String username = user.getUsername(); + // String email = user.getEmail(); + // String firstName = user.getFirstName(); + // String lastName = user.getLastName(); + // result.setId(username); + // result.setEmail(email); + // result.setFirstName(firstName); + // result.setLastName(lastName); return result; } catch (Exception e) { e.printStackTrace(); From 0c7f21d1377a6a78a68cb2a271094caaa67e0d0f Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 27 Jul 2023 15:27:49 -0600 Subject: [PATCH 045/157] files updated --- .../camunda/bpm/extension/hooks/services/UserService.java | 2 +- .../bpm/extension/keycloak/CamundaExtConfiguration.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 82a13f83..a90abf98 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -8,7 +8,7 @@ import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; //import org.keycloak.admin.client.Keycloak; -import org.keycloak.representations.idm.UserRepresentation; +//import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index e8a9c4fe..6094197c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -1,8 +1,8 @@ package org.camunda.bpm.extension.keycloak; -import org.keycloak.OAuth2Constants; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.KeycloakBuilder; +//import org.keycloak.OAuth2Constants; +//import org.keycloak.admin.client.Keycloak; +//import org.keycloak.admin.client.KeycloakBuilder; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; From 63f80a708d4d27a7a21bf2afb256393bc28519e7 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 28 Jul 2023 13:43:05 -0600 Subject: [PATCH 046/157] file updates reverted and endpoints removed --- .../forms-flow-bpm/pom-docker.xml | 4 +- .../extension/hooks/services/UserService.java | 34 ++++----- .../keycloak/CamundaExtConfiguration.java | 6 +- .../src/apiManager/endpoints/config.js | 48 ------------ .../src/apiManager/endpoints/index.js | 74 ------------------- 5 files changed, 22 insertions(+), 144 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js delete mode 100644 apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index 3cd2fc72..dc2b9ceb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -65,11 +65,11 @@ - + org.springframework.boot spring-boot-starter-webflux diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index a90abf98..877261d4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -7,8 +7,8 @@ import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; -//import org.keycloak.admin.client.Keycloak; -//import org.keycloak.representations.idm.UserRepresentation; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -30,27 +30,27 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - // @Autowired(required = false) - // private Keycloak keycloak; + @Autowired(required = false) + private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; public User searchUserByAttribute(String attributeName, String attributeValue) { try { - // List users = keycloak - // .realm(keycloakRealm) - // .users() - // .searchByAttributes(attributeName + ":" + attributeValue); - // UserRepresentation user = users.get(0); + List users = keycloak + .realm(keycloakRealm) + .users() + .searchByAttributes(attributeName + ":" + attributeValue); + UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); - // String username = user.getUsername(); - // String email = user.getEmail(); - // String firstName = user.getFirstName(); - // String lastName = user.getLastName(); - // result.setId(username); - // result.setEmail(email); - // result.setFirstName(firstName); - // result.setLastName(lastName); + String username = user.getUsername(); + String email = user.getEmail(); + String firstName = user.getFirstName(); + String lastName = user.getLastName(); + result.setId(username); + result.setEmail(email); + result.setFirstName(firstName); + result.setLastName(lastName); return result; } catch (Exception e) { e.printStackTrace(); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index 6094197c..e8a9c4fe 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -1,8 +1,8 @@ package org.camunda.bpm.extension.keycloak; -//import org.keycloak.OAuth2Constants; -//import org.keycloak.admin.client.Keycloak; -//import org.keycloak.admin.client.KeycloakBuilder; +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js deleted file mode 100644 index 9409477c..00000000 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/config.js +++ /dev/null @@ -1,48 +0,0 @@ -// export const INSIGHTS_BASE_API = `${(window._env_ && window._env_.REACT_APP_INSIGHT_API_BASE) || -// process.env.REACT_APP_INSIGHT_API_BASE}/api`; -// export const INSIGHTS_API_KEY = -// (window._env_ && window._env_.REACT_APP_INSIGHTS_API_KEY) || -// process.env.REACT_APP_INSIGHTS_API_KEY; -export const WEB_BASE_URL = - (window._env_ && window._env_.REACT_APP_WEB_BASE_URL) || - process.env.REACT_APP_WEB_BASE_URL; - - export const DOCUMENT_SERVICE_URL = - (window._env_ && window._env_.REACT_APP_DOCUMENT_SERVICE_URL) || - process.env.REACT_APP_DOCUMENT_SERVICE_URL; - -export const OPENTELEMETRY_SERVICE = - (window._env_ && window._env_.REACT_APP_OPENTELEMETRY_SERVICE) || - process.env.REACT_APP_OPENTELEMETRY_SERVICE; - -export const WEB_BASE_CUSTOM_URL = - (window._env_ && window._env_.REACT_APP_WEB_BASE_CUSTOM_URL) || - process.env.REACT_APP_WEB_BASE_CUSTOM_URL; - - -export const CUSTOM_SUBMISSION_URL = - (window._env_ && window._env_.REACT_APP_CUSTOM_SUBMISSION_URL) || - process.env.REACT_APP_CUSTOM_SUBMISSION_URL; - - export const BPM_BASE_URL_EXT = `${ - (window._env_ && window._env_.REACT_APP_BPM_URL) || - process.env.REACT_APP_BPM_URL - }/engine-rest`; - -export const BPM_API_URL_WITH_VERSION = `${BPM_BASE_URL_EXT}/v1`; - -export const BPM_BASE_URL_SOCKET_IO = `${ - (window._env_ && window._env_.REACT_APP_BPM_URL) || - process.env.REACT_APP_BPM_URL -}/forms-flow-bpm-socket`; - -export const MT_ADMIN_BASE_URL = `${ - (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL) || - process.env.REACT_APP_MT_ADMIN_BASE_URL -}`; - -export const MT_ADMIN_BASE_URL_VERSION = `${ - (window._env_ && window._env_.REACT_APP_MT_ADMIN_BASE_URL_VERSION) || - process.env.REACT_APP_MT_ADMIN_BASE_URL_VERSION || - "v1" -}`; diff --git a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js b/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js deleted file mode 100644 index ecaa1948..00000000 --- a/apps/forms-flow-ai/forms-flow-web/src/apiManager/endpoints/index.js +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable max-len */ -import { - WEB_BASE_URL, - MT_ADMIN_BASE_URL, - MT_ADMIN_BASE_URL_VERSION, - BPM_BASE_URL_EXT, - CUSTOM_SUBMISSION_URL, - DOCUMENT_SERVICE_URL -} from "./config"; - -import { AppConfig } from "../../config"; - -const API = { - GET_DASHBOARDS: `${WEB_BASE_URL}/dashboards`, - METRICS_SUBMISSIONS: `${WEB_BASE_URL}/metrics`, - APPLICATION_START: `${WEB_BASE_URL}/application/create`, - PUBLIC_APPLICATION_START: `${WEB_BASE_URL}/public/application/create`, - PUBLIC_APPLICATION_STATUS: `${WEB_BASE_URL}/public/form`, - PROCESS_STATE: `${WEB_BASE_URL}/process//task//state`, - GET_APPLICATION: `${WEB_BASE_URL}/application/`, - GET_APPLICATION_HISTORY_API: `${WEB_BASE_URL}/application//history`, - GET_ALL_APPLICATIONS_FROM_FORM_ID: `${WEB_BASE_URL}/application/formid`, - GET_ALL_APPLICATIONS_COUNT_BY_FORM_ID: `${WEB_BASE_URL}/application/formid//count`, - GET_ALL_APPLICATIONS: `${WEB_BASE_URL}/application`, - GET_ALL_APPLICATIONS_STATUS: `${WEB_BASE_URL}/application/status/list`, - GET_PROCESS_DEFINITION: `${BPM_BASE_URL_EXT}/v1/process-definition/key/`, - PROCESSES_XML: `${BPM_BASE_URL_EXT}/v1/process-definition/key//xml`, - DMN_XML: `${BPM_BASE_URL_EXT}/v1/decision-definition/key//xml`, - PROCESS_ACTIVITIES: `${BPM_BASE_URL_EXT}/v1/process-instance//activity-instances`, - FORM: `${WEB_BASE_URL}/form`, - FORM_DESIGN: `${WEB_BASE_URL}/form/form-design`, - FORM_HISTORY: `${WEB_BASE_URL}/form/form-history`, - LANG_UPDATE: `${WEB_BASE_URL}/user/locale`, - FORM_PROCESSES: `${WEB_BASE_URL}/form/formid`, - APPLICATION_EVENT_UPDATE: `${BPM_BASE_URL_EXT}/v1/message`, - GET_BPM_TASKS: `${BPM_BASE_URL_EXT}/v1/task`, - GET_BPM_TASK_DETAIL: `${BPM_BASE_URL_EXT}/v1/task/`, - GET_BPM_TASK_VARIABLES: `${BPM_BASE_URL_EXT}/v1/task//variables`, - CLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//claim`, - UNCLAIM_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//unclaim`, - GET_BPM_PROCESS_LIST: `${BPM_BASE_URL_EXT}/v1/process-definition`, - GET_DMN_PROCESS_LIST: `${BPM_BASE_URL_EXT}/v1/decision-definition`, - GET_API_USER_LIST: `${WEB_BASE_URL}/user`, - GET_BPM_FILTERS: `${BPM_BASE_URL_EXT}/filter`, - GET_BPM_TASK_LIST_WITH_FILTER: `${BPM_BASE_URL_EXT}/v1/filter//list`, - GET_BPM_TASK_LIST_COUNT_WITH_FILTER: `${BPM_BASE_URL_EXT}/v1/filter//count`, - BPM_GROUP: `${BPM_BASE_URL_EXT}/v1/task//identity-links`, - DELETE_BPM_GROUP: `${BPM_BASE_URL_EXT}/v1/task//identity-links/delete`, - BPM_FORM_SUBMIT: `${BPM_BASE_URL_EXT}/v1/task//submit-form`, - GET_BPM_FORM_LIST: `${WEB_BASE_URL}/form`, - UPDATE_ASSIGNEE_BPM_TASK: `${BPM_BASE_URL_EXT}/v1/task//assignee`, - GET_FORM_BY_ALIAS: `${AppConfig.projectUrl}/`, - GET_FORM_BY_ID: `${AppConfig.projectUrl}/form`, - - GET_GROUPS: `${WEB_BASE_URL}/groups`, - GET_FORM_COUNT: `${WEB_BASE_URL}/form//application/count`, - UNPUBLISH_FORMS: `${WEB_BASE_URL}/form/`, - DEPLOY_BPM: `${BPM_BASE_URL_EXT}/v1/deployment/create`, - GET_TENANT_DATA: `${MT_ADMIN_BASE_URL}/${MT_ADMIN_BASE_URL_VERSION}/tenant`, - EXPORT_FORM_PDF: `${DOCUMENT_SERVICE_URL}/form//submission//export/pdf`, - CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/form//submission`, - PUBLIC_CUSTOM_SUBMISSION: `${CUSTOM_SUBMISSION_URL}/public/form//submission`, - DRAFT_BASE: `${WEB_BASE_URL}/draft`, - DRAFT_PUBLIC_CREATE: `${WEB_BASE_URL}/draft/public/create`, - DRAFT_UPDATE: `${WEB_BASE_URL}/draft/`, - DRAFT_UPDATE_PUBLIC: `${WEB_BASE_URL}/draft/public/`, - DRAFT_APPLICATION_CREATE: `${WEB_BASE_URL}/draft//submit`, - DRAFT_APPLICATION_CREATE_PUBLIC: `${WEB_BASE_URL}/draft/public//submit`, - FORMIO_ROLES: `${WEB_BASE_URL}/formio/roles`, - DASHBOARD_AUTHORIZATION: `${WEB_BASE_URL}/authorizations/dashboard`, - USER_DASHBOARDS: `${WEB_BASE_URL}/authorizations/users/dashboard`, -}; - -export default API; From 5cbdc2e76094a10d7384a178cb58831627d286e7 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 28 Jul 2023 13:56:32 -0600 Subject: [PATCH 047/157] RestApiSecurityConfig.java updated --- .../keycloak/rest/RestApiSecurityConfig.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/rest/RestApiSecurityConfig.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/rest/RestApiSecurityConfig.java index be500b74..309be0d4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/rest/RestApiSecurityConfig.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/rest/RestApiSecurityConfig.java @@ -24,7 +24,6 @@ import javax.ws.rs.HttpMethod; import java.util.Properties; - /** * Optional Security Configuration for Camunda REST Api. */ @@ -61,11 +60,12 @@ public void configure(final HttpSecurity http) throws Exception { String jwkSetUri = applicationContext.getEnvironment().getRequiredProperty( "spring.security.oauth2.client.provider." + configProps.getProvider() + ".jwk-set-uri"); - http.requestMatchers().antMatchers("/engine-rest/**","/engine-rest-ext/**","/forms-flow-bpm-socket/**", "/actuator/**"). - and().authorizeRequests().antMatchers(HttpMethod.OPTIONS,"/engine-rest/**").permitAll() - .and().authorizeRequests().antMatchers(HttpMethod.OPTIONS,"/engine-rest-ext/**").permitAll() - .and().authorizeRequests().antMatchers(HttpMethod.OPTIONS,"/forms-flow-bpm-socket/**").permitAll() - .antMatchers("/engine-rest/**","/engine-rest-ext/**") + http.requestMatchers() + .antMatchers("/engine-rest/**", "/engine-rest-ext/**", "/forms-flow-bpm-socket/**", "/actuator/**").and() + .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/engine-rest/**").permitAll() + .and().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/engine-rest-ext/**").permitAll() + .and().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/forms-flow-bpm-socket/**").permitAll() + .antMatchers("/engine-rest/**", "/engine-rest-ext/**") .authenticated().and().csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() @@ -74,9 +74,9 @@ public void configure(final HttpSecurity http) throws Exception { .jwkSetUri(jwkSetUri); } - /** * Create a JWT decoder with issuer and audience claim validation. + * * @return the JWT decoder */ @Bean @@ -84,8 +84,7 @@ public JwtDecoder jwtDecoder() { String issuerUri = applicationContext.getEnvironment().getRequiredProperty( "spring.security.oauth2.client.provider." + configProps.getProvider() + ".issuer-uri"); - NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) - JwtDecoders.fromOidcIssuerLocation(issuerUri); + NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(issuerUri); OAuth2TokenValidator audienceValidator = new AudienceValidator(configProps.getRequiredAudience()); OAuth2TokenValidator withIssuer = JwtValidators.createDefaultWithIssuer(issuerUri); @@ -96,24 +95,25 @@ public JwtDecoder jwtDecoder() { return jwtDecoder; } - /** * Registers the REST Api Keycloak Authentication Filter. + * * @return filter registration */ @SuppressWarnings({ "unchecked", "rawtypes" }) @Bean - public FilterRegistrationBean keycloakAuthenticationFilter(){ + public FilterRegistrationBean keycloakAuthenticationFilter() { FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); filterRegistration.setFilter(new KeycloakAuthenticationFilter(identityService, clientService)); filterRegistration.setOrder(102); // make sure the filter is registered after the Spring Security Filter Chain filterRegistration.addUrlPatterns("/engine-rest/*"); + filterRegistration.addUrlPatterns("/engine-rest-ext/*"); return filterRegistration; } @Bean public OAuth2RestTemplate getOAuth2RestTemplate() { - ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails (); + ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails(); resourceDetails.setClientId(clientCredentialProperties.getProperty("registration.keycloak.client-id")); resourceDetails.setClientSecret(clientCredentialProperties.getProperty("registration.keycloak.client-secret")); resourceDetails.setAccessTokenUri(clientCredentialProperties.getProperty("provider.keycloak.token-uri")); From c4153427e132fdefec7d6544f72104774580dc53 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 31 Jul 2023 11:41:39 -0600 Subject: [PATCH 048/157] Dockerfile update --- apps/forms-flow-ai/forms-flow-bpm/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile index ba75fc8e..8d0666cb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/Dockerfile +++ b/apps/forms-flow-ai/forms-flow-bpm/Dockerfile @@ -24,8 +24,8 @@ RUN cp -r /bpm/forms-flow-bpm/src/ /tmp/src/ ARG CUSTOM_SRC_DIR=src/ # Override these files they have custom changes in the sbc_divapps directory -# COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ -COPY ${CUSTOM_SRC_DIR} /tmp/${CUSTOM_SRC_DIR}/ +COPY ./${CUSTOM_SRC_DIR}/ /tmp/${CUSTOM_SRC_DIR}/ +# COPY ${CUSTOM_SRC_DIR} /tmp/${CUSTOM_SRC_DIR}/ RUN mvn -s /usr/share/maven/ref/settings-docker.xml package -P default From f0d1348bae4296ead2821f4f4f2d826f4b23f52a Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 31 Jul 2023 12:10:47 -0600 Subject: [PATCH 049/157] FormBuilderPipelineController.java updated --- .../FormBuilderPipelineController.java | 173 ++++++++++-------- 1 file changed, 101 insertions(+), 72 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java index af7f7ece..4d7171f2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java @@ -36,7 +36,8 @@ import java.util.logging.Logger; /** - * This class is intended to perform the data transformation from different source systems. + * This class is intended to perform the data transformation from different + * source systems. * Supported sources : Orbeon - Customer Feedback Form * * @author sumathi.thirumani@aot-technologies.com @@ -55,13 +56,14 @@ public class FormBuilderPipelineController { /** * Creates a camunda process instance for the orbeon form data given. + * * @param request The request object containing the CCII form data. */ - @PostMapping(value = "/orbeon/data",consumes = MediaType.APPLICATION_XML_VALUE) + @PostMapping(value = "/orbeon/data", consumes = MediaType.APPLICATION_XML_VALUE) public void createProcess(HttpServletRequest request) { - LOGGER.info("Inside Data transformation controller" +request.getParameterMap()); + LOGGER.info("Inside Data transformation controller" + request.getParameterMap()); String formXML = null; - try(InputStream is = request.getInputStream();BufferedInputStream bis = new BufferedInputStream(is)) { + try (InputStream is = request.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is)) { byte[] xmlData = new byte[request.getContentLength()]; bis.read(xmlData, 0, xmlData.length); if (request.getCharacterEncoding() != null) { @@ -69,43 +71,45 @@ public void createProcess(HttpServletRequest request) { } else { formXML = new String(xmlData); } - LOGGER.info("Received XML Document-------->"+formXML); - Map processVariables = prepareRequestVariableMap(formXML); - for (String key: processVariables.keySet()) { - if(StringUtils.endsWith(key,"_date") || StringUtils.endsWith(key,"_date_time")) { + LOGGER.info("Received XML Document-------->" + formXML); + Map processVariables = prepareRequestVariableMap(formXML); + for (String key : processVariables.keySet()) { + if (StringUtils.endsWith(key, "_date") || StringUtils.endsWith(key, "_date_time")) { VariableData valueVariableData = (VariableData) processVariables.get(key); - if(!isDateValid((String) valueVariableData.getValue())) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "The value for " + key + " is invalid"); + if (!isDateValid((String) valueVariableData.getValue())) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, + "The value for " + key + " is invalid"); } } } Boolean status = createProcessInstance(processVariables); - if(status == false) { - //Email the form to support group for manual processing - sendEmail(formXML,request.getParameter("document"),null); - LOGGER.log(Level.SEVERE,"Unable to create process instance"); - throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Unable to create process instance"); + if (status == false) { + // Email the form to support group for manual processing + sendEmail(formXML, request.getParameter("document"), null); + LOGGER.log(Level.SEVERE, "Unable to create process instance"); + throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, + "Unable to create process instance"); } } catch (IOException exception) { - sendEmail(formXML,request.getParameter("document"), null); - LOGGER.log(Level.SEVERE,"Unable to parse the XML from orbeon"); - LOGGER.log(Level.SEVERE,"Exception occurred:"+ ExceptionUtils.exceptionStackTraceAsString(exception)); + sendEmail(formXML, request.getParameter("document"), null); + LOGGER.log(Level.SEVERE, "Unable to parse the XML from orbeon"); + LOGGER.log(Level.SEVERE, "Exception occurred:" + ExceptionUtils.exceptionStackTraceAsString(exception)); throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Unable to parse the XML from orbeon"); } catch (ResponseStatusException exception) { - sendEmail(formXML,request.getParameter("document"), null); - LOGGER.log(Level.SEVERE,exception.getMessage()); - LOGGER.log(Level.SEVERE,"Exception occurred:"+ ExceptionUtils.exceptionStackTraceAsString(exception)); + sendEmail(formXML, request.getParameter("document"), null); + LOGGER.log(Level.SEVERE, exception.getMessage()); + LOGGER.log(Level.SEVERE, "Exception occurred:" + ExceptionUtils.exceptionStackTraceAsString(exception)); throw exception; } catch (Exception ex) { - sendEmail(formXML,request.getParameter("document"), null); + sendEmail(formXML, request.getParameter("document"), null); LOGGER.log(Level.SEVERE, ex.getMessage()); - LOGGER.log(Level.SEVERE,"Exception occurred:"+ ExceptionUtils.exceptionStackTraceAsString(ex)); + LOGGER.log(Level.SEVERE, "Exception occurred:" + ExceptionUtils.exceptionStackTraceAsString(ex)); throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Internal Server Error"); } } - private void sendEmail(String formXML,String documentId, String exceptionTrace){ - Map variables = new HashMap<>(); + private void sendEmail(String formXML, String documentId, String exceptionTrace) { + Map variables = new HashMap<>(); try { HttpHeaders headers = new HttpHeaders(); ObjectMapper mapper = new ObjectMapper(); @@ -115,19 +119,19 @@ private void sendEmail(String formXML,String documentId, String exceptionTrace){ variables.put("category", new VariableData("api_start_failure")); variables.put("orbeon_document_id", new VariableData(documentId)); variables.put("formXML", new VariableData(formXML)); - //Include exception if any - if(StringUtils.isNotBlank(exceptionTrace)) { - StringValue exceptionDataValue = Variables.stringValue(exceptionTrace,true); + // Include exception if any + if (StringUtils.isNotBlank(exceptionTrace)) { + StringValue exceptionDataValue = Variables.stringValue(exceptionTrace, true); variables.put("exception", exceptionDataValue); } msgRequest.setMessageName("Service_Api_Message_Email"); msgRequest.setProcessVariables(variables); HttpEntity msgReq = new HttpEntity(mapper.writeValueAsString(msgRequest), headers); ResponseEntity msgResponse = getOAuth2RestTemplate().postForEntity( - getAPIContextURL() + "/engine-rest/message", msgReq, String.class); - LOGGER.info("Message response code:"+msgResponse.getStatusCode()); + getAPIContextURL() + "/engine-rest-ext/message", msgReq, String.class); + LOGGER.info("Message response code:" + msgResponse.getStatusCode()); } catch (Exception ex) { - LOGGER.log(Level.SEVERE,"Exception occurred:"+ExceptionUtils.exceptionStackTraceAsString(ex)); + LOGGER.log(Level.SEVERE, "Exception occurred:" + ExceptionUtils.exceptionStackTraceAsString(ex)); } } @@ -145,31 +149,30 @@ private boolean isDateValid(String dateStr) { return true; } - private Boolean createProcessInstance(Map processVariables) throws JsonProcessingException { - //HTTP Headers + private Boolean createProcessInstance(Map processVariables) throws JsonProcessingException { + // HTTP Headers HttpHeaders headers = new HttpHeaders(); ObjectMapper mapper = new ObjectMapper(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + getOAuth2RestTemplate().getAccessToken()); CreateProcessRequest procReq = new CreateProcessRequest(); procReq.setVariables(processVariables); - HttpEntity prcReq = - new HttpEntity(mapper.writeValueAsString(procReq), headers); + HttpEntity prcReq = new HttpEntity(mapper.writeValueAsString(procReq), headers); ResponseEntity wrsp = getOAuth2RestTemplate().postForEntity( - getAPIContextURL() + "/engine-rest/process-definition/key/CC_Process/start", prcReq, String.class); + getAPIContextURL() + "/engine-rest-ext/process-definition/key/CC_Process/start", prcReq, String.class); Map responseMap = mapper.readValue(wrsp.getBody(), HashMap.class); LOGGER.info("Response Map post instance creation-------->" + responseMap); - String instanceId = responseMap != null && responseMap.containsKey("id") ? String.valueOf(responseMap.get("id")) : null; + String instanceId = responseMap != null && responseMap.containsKey("id") ? String.valueOf(responseMap.get("id")) + : null; if (StringUtils.isNotBlank(instanceId)) { return true; } return false; } - private OAuth2RestTemplate getOAuth2RestTemplate() { - ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails (); + ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails(); resourceDetails.setClientId(clientCredentialProperties.getProperty("registration.keycloak.client-id")); resourceDetails.setClientSecret(clientCredentialProperties.getProperty("registration.keycloak.client-secret")); resourceDetails.setAccessTokenUri(clientCredentialProperties.getProperty("registration.keycloak.token-uri")); @@ -180,35 +183,35 @@ private OAuth2RestTemplate getOAuth2RestTemplate() { return new OAuth2RestTemplate(resourceDetails); } - private Map prepareRequestVariableMap(String formXML) throws IOException { - Map variables = new HashMap<>(); - if(StringUtils.isNotBlank(formXML)) { + private Map prepareRequestVariableMap(String formXML) throws IOException { + Map variables = new HashMap<>(); + if (StringUtils.isNotBlank(formXML)) { XmlMapper xmlMapper = new XmlMapper(); JsonNode node = xmlMapper.readTree(formXML.getBytes()); ObjectMapper mapper = new ObjectMapper(); - Map values = mapper.readValue(node.get("Main").toString(), HashMap.class); - for(Map.Entry entry : values.entrySet()) { - LOGGER.info("KEY: "+entry.getKey()+" VALUE : "+entry.getValue().toString()); - variables.put(entry.getKey(),new VariableData(entry.getValue())); + Map values = mapper.readValue(node.get("Main").toString(), HashMap.class); + for (Map.Entry entry : values.entrySet()) { + LOGGER.info("KEY: " + entry.getKey() + " VALUE : " + entry.getValue().toString()); + variables.put(entry.getKey(), new VariableData(entry.getValue())); } - //Inject custom attributes + // Inject custom attributes variables.put("form_key", new VariableData("CCII")); variables.put("entity_key", new VariableData("CCII")); variables.put("subprocess_entity_key", new VariableData("cciiissue")); variables.put("files_entity_key", new VariableData("cciifiles")); variables.put("submit_date_time", new VariableData(new DateTime().toString())); variables.put("entered_by", new VariableData("orbeon")); - VariableData serviceMethodData = (VariableData)variables.get("service_method"); + VariableData serviceMethodData = (VariableData) variables.get("service_method"); variables.put("engagement_source", new VariableData(serviceMethodData.getValue().toString())); - VariableData serviceChannelData = (VariableData)variables.get("service_channel"); - if(serviceChannelData.getValue().toString().equals("Service BC Location")){ + VariableData serviceChannelData = (VariableData) variables.get("service_channel"); + if (serviceChannelData.getValue().toString().equals("Service BC Location")) { variables.put("service_location_type", new VariableData("service_centre")); - }else if(serviceChannelData.getValue().equals("Mobile Outreach Location")){ + } else if (serviceChannelData.getValue().equals("Mobile Outreach Location")) { variables.put("service_location_type", new VariableData("mobile_outreach")); } variables.put("service_channel", new VariableData("Service BC Location")); - // Check if Orbeon is submitted with a value for "mobile-location" - if(variables.containsKey("mobile_location")) { + // Check if Orbeon is submitted with a value for "mobile-location" + if (variables.containsKey("mobile_location")) { // Set location parameter to "Mobile Outreach" variables.put("location", new VariableData("Mobile Outreach")); } @@ -216,46 +219,72 @@ private Map prepareRequestVariableMap(String formXML) throws IOEx return variables; } - public class CreateProcessRequest{ - Map variables; - public Map getVariables() { return variables; } - public void setVariables(Map variables) { this.variables = variables; } + public class CreateProcessRequest { + Map variables; + + public Map getVariables() { + return variables; + } + + public void setVariables(Map variables) { + this.variables = variables; + } } - public class CreateProcessMessageRequest{ + public class CreateProcessMessageRequest { private String messageName; - Map processVariables; - public String getMessageName() { return messageName; } - public void setMessageName(String messageName) { this.messageName = messageName; } - public Map getProcessVariables() { return processVariables; } - public void setProcessVariables(Map processVariables) { this.processVariables = processVariables; } + Map processVariables; + + public String getMessageName() { + return messageName; + } + + public void setMessageName(String messageName) { + this.messageName = messageName; + } + + public Map getProcessVariables() { + return processVariables; + } + + public void setProcessVariables(Map processVariables) { + this.processVariables = processVariables; + } } public class VariableData { private Object value; + VariableData(Object value) { // To handle incoming boolean parameters as string values - if(value!=null && (value.toString().toLowerCase().equals("true") || value.toString().toLowerCase().equals("false"))) { + if (value != null && (value.toString().toLowerCase().equals("true") + || value.toString().toLowerCase().equals("false"))) { this.value = Boolean.parseBoolean(value.toString()); - }else { - this.value=value; + } else { + this.value = value; } } - public Object getValue() { return value; } - public void setValue(Object value) { this.value = value; } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } } private String getAPIClientUsername() { - return StringUtils.substringBefore(StringUtils.substringBetween(appcontexturl,"://","@"),":"); + return StringUtils.substringBefore(StringUtils.substringBetween(appcontexturl, "://", "@"), ":"); } private String getAPIClientPassword() { - return StringUtils.substringAfter(StringUtils.substringBetween(appcontexturl,"://","@"),":"); + return StringUtils.substringAfter(StringUtils.substringBetween(appcontexturl, "://", "@"), ":"); } private String getAPIContextURL() { - return StringUtils.remove(StringUtils.remove(appcontexturl, StringUtils.substringBetween(appcontexturl,"://","@")),"@"); + return StringUtils.remove( + StringUtils.remove(appcontexturl, StringUtils.substringBetween(appcontexturl, "://", "@")), "@"); } - } From 1a64c40b676cc59120d0461b893a31181ad06746 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 31 Jul 2023 13:32:36 -0600 Subject: [PATCH 050/157] files updated --- .../forms-flow-bpm/pom-docker.xml | 4 +-- .../extension/hooks/services/UserService.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index dc2b9ceb..3cd2fc72 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -65,11 +65,11 @@ - + org.springframework.boot spring-boot-starter-webflux diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 877261d4..5c4fa358 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -7,7 +7,7 @@ import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; -import org.keycloak.admin.client.Keycloak; +// import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,27 +30,27 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - @Autowired(required = false) - private Keycloak keycloak; + // @Autowired(required = false) + // private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; public User searchUserByAttribute(String attributeName, String attributeValue) { try { - List users = keycloak - .realm(keycloakRealm) - .users() - .searchByAttributes(attributeName + ":" + attributeValue); - UserRepresentation user = users.get(0); + // List users = keycloak + // .realm(keycloakRealm) + // .users() + // .searchByAttributes(attributeName + ":" + attributeValue); + // UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); - String username = user.getUsername(); - String email = user.getEmail(); - String firstName = user.getFirstName(); - String lastName = user.getLastName(); - result.setId(username); - result.setEmail(email); - result.setFirstName(firstName); - result.setLastName(lastName); + // String username = user.getUsername(); + // String email = user.getEmail(); + // String firstName = user.getFirstName(); + // String lastName = user.getLastName(); + // result.setId(username); + // result.setEmail(email); + // result.setFirstName(firstName); + // result.setLastName(lastName); return result; } catch (Exception e) { e.printStackTrace(); From 2ef124a54e5dec8ef53bdcd3c811223741baf89c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 31 Jul 2023 13:51:07 -0600 Subject: [PATCH 051/157] UserService.java & CamundaExtConfiguration.java updated --- .../camunda/bpm/extension/hooks/services/UserService.java | 2 +- .../bpm/extension/keycloak/CamundaExtConfiguration.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 5c4fa358..5100dbe7 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -8,7 +8,7 @@ import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; // import org.keycloak.admin.client.Keycloak; -import org.keycloak.representations.idm.UserRepresentation; +// import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index e8a9c4fe..3a101a54 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -1,8 +1,8 @@ package org.camunda.bpm.extension.keycloak; -import org.keycloak.OAuth2Constants; -import org.keycloak.admin.client.Keycloak; -import org.keycloak.admin.client.KeycloakBuilder; +// import org.keycloak.OAuth2Constants; +// import org.keycloak.admin.client.Keycloak; +// import org.keycloak.admin.client.KeycloakBuilder; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; From e6def91988f81086bad358c34982f067c7ae4bbe Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 31 Jul 2023 15:54:30 -0600 Subject: [PATCH 052/157] application.yaml update --- .../forms-flow-bpm/src/main/resources/application.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index f54d7baf..004ba795 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -98,8 +98,7 @@ spring: idleTimeout: ${CAMUNDA_HIKARI_IDLE_TIMEOUT:600000} maximumPoolSize: ${CAMUNDA_HIKARI_MAX_POOLSIZE:10} validationTimeout: ${CAMUNDA_HIKARI_VALID_TIMEOUT:5000} - jersey: - application-path: /engine-rest + security: oauth2: client: From 33da17ce85654f5c38b82fa78caff2c2c2a18396 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 2 Aug 2023 13:19:46 -0600 Subject: [PATCH 053/157] ApplicationAccessHandler.java update --- .../support/ApplicationAccessHandler.java | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index cfc9e0ca..82c9a2b9 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -25,46 +25,49 @@ * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler extends AbstractAccessHandler { +public class ApplicationAccessHandler implements IAccessHandler { - private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); + private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); - @Autowired - private WebClient unAuthenticatedWebClient; + @Autowired + private WebClient unAuthenticatedWebClient; - @Autowired - private OAuth2RestTemplate oAuth2RestTemplate; + @Autowired + private OAuth2RestTemplate oAuth2RestTemplate; - public ResponseEntity exchange(String url, HttpMethod method, String payload) { + public ResponseEntity exchange(String url, HttpMethod method, String payload) { - payload = (payload == null) ? new JsonObject().toString() : payload; + payload = (payload == null) ? new JsonObject().toString() : payload; - ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) - .accept(MediaType.APPLICATION_JSON) - .headers(httpHeaders -> httpHeaders.setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(Mono.just(payload), String.class) - .retrieve() - .toEntity(String.class) - .block(); + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + .accept(MediaType.APPLICATION_JSON) + .headers(httpHeaders -> httpHeaders + .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(Mono.just(payload), String.class) + .retrieve() + .toEntity(String.class) + .block(); - // ResponseEntity response = entityMono.block(); - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } + // ResponseEntity response = entityMono.block(); + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } - public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, - Class responseClazz) { + public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, + Class responseClazz) { - ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) - .accept(MediaType.APPLICATION_JSON) - .headers(httpHeaders -> httpHeaders.setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .toEntity(responseClazz) - .block(); - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + .accept(MediaType.APPLICATION_JSON) + .headers(httpHeaders -> httpHeaders + .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error( + new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .toEntity(responseClazz) + .block(); + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } } \ No newline at end of file From 729ab086b011a7dc1dcd13851ab78592ac6ff7c4 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 2 Aug 2023 13:42:33 -0600 Subject: [PATCH 054/157] ApplicationAccessHandler.java changes reverted --- .../support/ApplicationAccessHandler.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 82c9a2b9..f4969e1b 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -6,9 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; -import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.stereotype.Service; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.reactive.function.BodyInserters; @@ -20,46 +18,59 @@ import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; /** + * Application Access Handler. * This class serves as gateway for all application service interactions. - * - * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler implements IAccessHandler { +public class ApplicationAccessHandler extends AbstractAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); @Autowired - private WebClient unAuthenticatedWebClient; - - @Autowired - private OAuth2RestTemplate oAuth2RestTemplate; + private WebClient webClient; + /** + * exchange function using json - string payload / string response + * + * @param url + * @param method + * @param payload + * @return + */ public ResponseEntity exchange(String url, HttpMethod method, String payload) { payload = (payload == null) ? new JsonObject().toString() : payload; - ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + ResponseEntity response = webClient.method(method).uri(url) + .attributes(clientRegistrationId("keycloak-client")) .accept(MediaType.APPLICATION_JSON) - .headers(httpHeaders -> httpHeaders - .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(Mono.just(payload), String.class) .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error( + new HttpClientErrorException(HttpStatus.BAD_REQUEST))) .toEntity(String.class) .block(); - // ResponseEntity response = entityMono.block(); return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } + /** + * exchange function using the custom class + * + * @param url + * @param method + * @param payload + * @param responseClazz + * @return + */ public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { - ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + ResponseEntity response = webClient.method(method).uri(url) + .attributes(clientRegistrationId("keycloak-client")) .accept(MediaType.APPLICATION_JSON) - .headers(httpHeaders -> httpHeaders - .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) .retrieve() From ecefa732d908022a9cd7b7b658a1877bdfd53db8 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 2 Aug 2023 14:02:37 -0600 Subject: [PATCH 055/157] ApplicationAccessHandlerTest.java update reverted --- .../connector/support/ApplicationAccessHandlerTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java index 37dc3eca..3de105bb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java @@ -2,14 +2,11 @@ import static org.junit.Assert.assertEquals; -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.oauth2.client.OAuth2RestTemplate; @@ -20,7 +17,7 @@ import java.util.function.Consumer; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; From 9ca10978d29487a276deeb762da9f0e6da4a5001 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 2 Aug 2023 14:31:41 -0600 Subject: [PATCH 056/157] ApplicationAccessHandler.java updates reverted --- .../support/ApplicationAccessHandler.java | 68 ++++++------------- 1 file changed, 19 insertions(+), 49 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index f4969e1b..37b2e33a 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -1,84 +1,54 @@ package org.camunda.bpm.extension.commons.connector.support; import com.google.gson.JsonObject; -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; -import java.util.Map; - import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; /** - * Application Access Handler. * This class serves as gateway for all application service interactions. + * This customization exists because the authentication mechanisms has changed + * between + * forsmflow open source and service bc's implementation. Once Service BC's + * authentication + * mechanisms are updated, this file can be removed. + * + * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler extends AbstractAccessHandler { +public class ApplicationAccessHandler implements IAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); @Autowired - private WebClient webClient; + private WebClient unAuthenticatedWebClient; + + @Autowired + private OAuth2RestTemplate oAuth2RestTemplate; - /** - * exchange function using json - string payload / string response - * - * @param url - * @param method - * @param payload - * @return - */ public ResponseEntity exchange(String url, HttpMethod method, String payload) { payload = (payload == null) ? new JsonObject().toString() : payload; - ResponseEntity response = webClient.method(method).uri(url) - .attributes(clientRegistrationId("keycloak-client")) + Mono> entityMono = unAuthenticatedWebClient.method(method).uri(url) .accept(MediaType.APPLICATION_JSON) + .headers(httpHeaders -> httpHeaders + .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(Mono.just(payload), String.class) .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error( - new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .toEntity(String.class) - .block(); + .toEntity(String.class); + ResponseEntity response = entityMono.block(); return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - /** - * exchange function using the custom class - * - * @param url - * @param method - * @param payload - * @param responseClazz - * @return - */ - public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, - Class responseClazz) { - - ResponseEntity response = webClient.method(method).uri(url) - .attributes(clientRegistrationId("keycloak-client")) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error( - new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .toEntity(responseClazz) - .block(); - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } } \ No newline at end of file From ec8c45f1eb8956047aeb184a25ba2b96feaa9df6 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 2 Aug 2023 15:43:43 -0600 Subject: [PATCH 057/157] files updated --- .../support/ApplicationAccessHandler.java | 39 ++++++++++++++----- .../support/ApplicationAccessHandlerTest.java | 5 ++- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 37b2e33a..92886497 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -1,30 +1,31 @@ package org.camunda.bpm.extension.commons.connector.support; import com.google.gson.JsonObject; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; +// import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import java.util.Map; + import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; /** * This class serves as gateway for all application service interactions. - * This customization exists because the authentication mechanisms has changed - * between - * forsmflow open source and service bc's implementation. Once Service BC's - * authentication - * mechanisms are updated, this file can be removed. * * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler implements IAccessHandler { +public class ApplicationAccessHandler extends AbstractAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); @@ -38,17 +39,35 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay payload = (payload == null) ? new JsonObject().toString() : payload; - Mono> entityMono = unAuthenticatedWebClient.method(method).uri(url) + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) .accept(MediaType.APPLICATION_JSON) .headers(httpHeaders -> httpHeaders .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .body(Mono.just(payload), String.class) .retrieve() - .toEntity(String.class); + .toEntity(String.class) + .block(); - ResponseEntity response = entityMono.block(); + // ResponseEntity response = entityMono.block(); return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } + public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, + Class responseClazz) { + + ResponseEntity response = unAuthenticatedWebClient.method(method).uri(url) + .accept(MediaType.APPLICATION_JSON) + .headers(httpHeaders -> httpHeaders + .setBearerAuth(oAuth2RestTemplate.getAccessToken().getValue())) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error( + new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .toEntity(responseClazz) + .block(); + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java index 3de105bb..37dc3eca 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/test/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandlerTest.java @@ -2,11 +2,14 @@ import static org.junit.Assert.assertEquals; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.oauth2.client.OAuth2RestTemplate; @@ -17,7 +20,7 @@ import java.util.function.Consumer; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; From 2a12ffed947b746d5c2456c5d3b406ef7584bcdd Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 3 Aug 2023 11:20:32 -0600 Subject: [PATCH 058/157] 2 files added --- .../support/AbstractAccessHandler.java | 31 +++++++++++++++ .../connector/support/IAccessHandler.java | 38 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java new file mode 100644 index 00000000..1982145b --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java @@ -0,0 +1,31 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; + +import java.util.Map; + +public abstract class AbstractAccessHandler { + + @Override + public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, + IRequest payload) { + return null; + } + + public String getUserBasedAccessToken() { + + String token = null; + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication instanceof JwtAuthenticationToken jwtAuthenticationToken) { + token = jwtAuthenticationToken.getToken().getTokenValue(); + } + return token; + } +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java new file mode 100644 index 00000000..02c9735c --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java @@ -0,0 +1,38 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; + +import java.util.Map; + +/** + * IAccess Handler. + * This class defines the AccessHandler implementation. + */ +public interface IAccessHandler { + + /** + * exchange function using json - string payload / string response + * + * @param url + * @param method + * @param payload + * @return + */ + ResponseEntity exchange(String url, HttpMethod method, String payload); + + /** + * exchange function using the custom class + * + * @param url + * @param method + * @param payload + * @param responseClazz + * @return + */ + ResponseEntity exchange(String url, HttpMethod method, IRequest payload, + Class responseClazz); + +} From 3d959764d63a7dfde9db45c64a6d00094cbe5070 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 3 Aug 2023 12:50:09 -0600 Subject: [PATCH 059/157] files removed; ApplicationAccessHandler updated --- .../support/AbstractAccessHandler.java | 31 --------------- .../support/ApplicationAccessHandler.java | 3 +- .../connector/support/IAccessHandler.java | 38 ------------------- 3 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java deleted file mode 100644 index 1982145b..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; - -import java.util.Map; - -public abstract class AbstractAccessHandler { - - @Override - public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, - IRequest payload) { - return null; - } - - public String getUserBasedAccessToken() { - - String token = null; - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - if (authentication instanceof JwtAuthenticationToken jwtAuthenticationToken) { - token = jwtAuthenticationToken.getToken().getTokenValue(); - } - return token; - } -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 92886497..4854849c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -24,8 +24,9 @@ * * @author sumathi.thirumani@aot-technologies.com */ + @Service("applicationAccessHandler") -public class ApplicationAccessHandler extends AbstractAccessHandler { +public class ApplicationAccessHandler extends AbstractAccessHandler implements IAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java deleted file mode 100644 index 02c9735c..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/IAccessHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; - -import java.util.Map; - -/** - * IAccess Handler. - * This class defines the AccessHandler implementation. - */ -public interface IAccessHandler { - - /** - * exchange function using json - string payload / string response - * - * @param url - * @param method - * @param payload - * @return - */ - ResponseEntity exchange(String url, HttpMethod method, String payload); - - /** - * exchange function using the custom class - * - * @param url - * @param method - * @param payload - * @param responseClazz - * @return - */ - ResponseEntity exchange(String url, HttpMethod method, IRequest payload, - Class responseClazz); - -} From 48e9da9cb46972b6c5bd9137f6c5623a41c439b7 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 4 Aug 2023 10:34:14 -0600 Subject: [PATCH 060/157] ApplicationAccessHandler.java updated --- .../commons/connector/support/ApplicationAccessHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 4854849c..f079b2d9 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -14,6 +14,7 @@ import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import org.springframework.context.annotation.Primary; import java.util.Map; @@ -24,7 +25,7 @@ * * @author sumathi.thirumani@aot-technologies.com */ - +@Primary @Service("applicationAccessHandler") public class ApplicationAccessHandler extends AbstractAccessHandler implements IAccessHandler { From 2ca943e6a5428075d290c6160921c7411745b469 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 4 Aug 2023 12:45:28 -0600 Subject: [PATCH 061/157] ApplicationAccessHandler changed --- .../commons/connector/support/ApplicationAccessHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index f079b2d9..72c88618 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -25,9 +25,8 @@ * * @author sumathi.thirumani@aot-technologies.com */ -@Primary @Service("applicationAccessHandler") -public class ApplicationAccessHandler extends AbstractAccessHandler implements IAccessHandler { +public class ApplicationAccessHandler implements IAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); From eda9e4ac0c60c70354c49b53c61ce0b7e7ca7e43 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 4 Aug 2023 13:15:47 -0600 Subject: [PATCH 062/157] ApplicationAccessHandler.java update --- .../connector/support/ApplicationAccessHandler.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 72c88618..c1bbe821 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -36,6 +36,7 @@ public class ApplicationAccessHandler implements IAccessHandler { @Autowired private OAuth2RestTemplate oAuth2RestTemplate; + @Override public ResponseEntity exchange(String url, HttpMethod method, String payload) { payload = (payload == null) ? new JsonObject().toString() : payload; @@ -54,6 +55,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } + @Override public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { @@ -71,4 +73,11 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques .block(); return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } + + @Override + public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, + IRequest payload) { + return null; + } + } \ No newline at end of file From 617b70534cfa827ec9e803a20e62cdd41806af16 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 4 Aug 2023 13:53:54 -0600 Subject: [PATCH 063/157] FormAccessHandler.java added --- .../connector/support/FormAccessHandler.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java new file mode 100644 index 00000000..362c0219 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -0,0 +1,91 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import com.google.gson.JsonObject; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; +import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Properties; +import org.springframework.context.annotation.Primary; + +/** + * Form Access Handler. + * This class serves as gateway for all formio interactions. + */ +@Primary +@Service("formAccessHandler") +public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { + + private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); + + static final int TOKEN_EXPIRY_CODE = 404; + + @Autowired + private Properties integrationCredentialProperties; + @Autowired + private WebClient unauthenticatedWebClient; + @Autowired + private FormioTokenServiceProvider formioTokenServiceProvider; + + public ResponseEntity exchange(String url, HttpMethod method, String payload) { + String accessToken = formioTokenServiceProvider.getAccessToken(); + if (StringUtils.isBlank(accessToken)) { + logger.info("Access token is blank. Cannot invoke service:{}", url); + return null; + } + ResponseEntity response = exchange(url, method, payload, accessToken); + if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { + exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); + } + logger.info("Response code for service invocation: {}", response.getStatusCode()); + return response; + } + + public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { + + payload = (payload == null) ? new JsonObject().toString() : payload; + + if (HttpMethod.PATCH.name().equals(method.name())) { + logger.info("payload=" + payload); + Mono> entityMono = unauthenticatedWebClient.patch() + .uri(url) + .bodyValue(payload) + .header("x-jwt-token", accessToken) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class); + + ResponseEntity response = entityMono.block(); + if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { + return new ResponseEntity<>(response.getBody(), HttpStatus.valueOf(TOKEN_EXPIRY_CODE)); + } + return response; + } else { + return unauthenticatedWebClient.method(method) + .uri(url) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("x-jwt-token", accessToken) + .body(Mono.just(payload), String.class) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class) + .block(); + } + } +} From bb86c6e37921b69d739b437bbe52622344e6d358 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 11:17:45 -0600 Subject: [PATCH 064/157] GroupNotifyListener.java update --- .../execution/GroupNotifyListener.java | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java index 4bf05a0c..a306268f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java @@ -19,7 +19,8 @@ * Assignment Task Listener to start a message event when a task is created * Extended to emails to additional groups of interest. * - * @author yichun.zhao@aot-technologies.com, sumathi.thirumani@aot-technologies.com + * @author yichun.zhao@aot-technologies.com, + * sumathi.thirumani@aot-technologies.com */ @Component public class GroupNotifyListener implements ExecutionListener, IMessageEvent { @@ -31,6 +32,9 @@ public class GroupNotifyListener implements ExecutionListener, IMessageEvent { private Expression emailGroups; + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; + /** * This provides the necessary information to send message. * @@ -38,37 +42,38 @@ public class GroupNotifyListener implements ExecutionListener, IMessageEvent { */ @Override public void notify(DelegateExecution execution) throws Exception { - List toEmails = new ArrayList<>(); + List toEmails = new ArrayList<>(); if (CollectionUtils.isNotEmpty(getEmailGroups(execution))) { for (String entry : getEmailGroups(execution)) { toEmails.addAll(getEmailsForGroup(execution, entry)); } } - sendEmailNotification(execution, toEmails ,String.valueOf(execution.getVariables().get("taskId"))); - + sendEmailNotification(execution, toEmails, String.valueOf(execution.getVariables().get("taskId"))); } + /** * * @param execution * @param toEmails * @param taskId */ - private void sendEmailNotification(DelegateExecution execution,List toEmails,String taskId) { - String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails,",") : null; - if(StringUtils.isNotEmpty(toAddress)) { + private void sendEmailNotification(DelegateExecution execution, List toEmails, String taskId) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails, ",") : null; + if (StringUtils.isNotEmpty(toAddress)) { Map emailAttributes = new HashMap<>(); emailAttributes.put("email_to", toAddress); emailAttributes.put("category", getCategory(execution)); - emailAttributes.put("name",getDefaultAddresseName()); - emailAttributes.put("taskid",taskId); - if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { - sendMessage(execution, emailAttributes,getMessageId(execution)); + emailAttributes.put("name", getDefaultAddresseName()); + emailAttributes.put("taskid", taskId); + if (StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress, "@") > 0) { + sendMessage(execution, emailAttributes, getMessageId(execution)); } } } - private String getCategory(DelegateExecution delegateExecution){ + + private String getCategory(DelegateExecution delegateExecution) { return String.valueOf(this.category.getValue(delegateExecution)); } @@ -77,31 +82,32 @@ private String getCategory(DelegateExecution delegateExecution){ * @param delegateExecution * @return */ - private String getMessageId(DelegateExecution delegateExecution){ + private String getMessageId(DelegateExecution delegateExecution) { return String.valueOf(this.messageId.getValue(delegateExecution)); } - private List getEmailGroups(DelegateExecution delegateExecution){ + private List getEmailGroups(DelegateExecution delegateExecution) { List emailGroups = new ArrayList<>(); try { - if(this.emailGroups != null && + if (this.emailGroups != null && StringUtils.isNotBlank(String.valueOf(this.emailGroups.getValue(delegateExecution)))) { - emailGroups = this.emailGroups != null && this.emailGroups.getValue(delegateExecution) != null ? - getObjectMapper().readValue(String.valueOf(this.emailGroups.getValue(delegateExecution)), List.class) : null; + emailGroups = this.emailGroups != null && this.emailGroups.getValue(delegateExecution) != null + ? bpmObjectMapper.readValue(String.valueOf(this.emailGroups.getValue(delegateExecution)), + List.class) + : null; } } catch (JsonProcessingException e) { - LOGGER.log(Level.SEVERE, "Exception occured in reading additionalEmailGroups" , e); + LOGGER.log(Level.SEVERE, "Exception occured in reading additionalEmailGroups", e); } - return emailGroups; + return emailGroups; } /** * Returns Object Mapper Instance + * * @return */ - private ObjectMapper getObjectMapper(){ - return new ObjectMapper(); - } - + // private ObjectMapper getObjectMapper() { + // return new ObjectMapper(); } } From f363c5cd59b49cae9c53848da22ee0852da88fac Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 12:18:36 -0600 Subject: [PATCH 065/157] add class Resource to GroupNotifyListener.java --- .../extension/hooks/listeners/execution/GroupNotifyListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java index a306268f..4c22cd0f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/execution/GroupNotifyListener.java @@ -8,6 +8,7 @@ import org.camunda.bpm.extension.hooks.services.IMessageEvent; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; From ca8b82de1253279f3703b412e4710acecda82912 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 14:26:57 -0600 Subject: [PATCH 066/157] commit 1a64c40b reversed --- .../forms-flow-bpm/pom-docker.xml | 4 +-- .../extension/hooks/services/UserService.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index 3cd2fc72..dc2b9ceb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -65,11 +65,11 @@ - + org.springframework.boot spring-boot-starter-webflux diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 5100dbe7..b5340cf5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -7,7 +7,7 @@ import org.camunda.bpm.extension.keycloak.KeycloakConfiguration; import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; -// import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.Keycloak; // import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,27 +30,27 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - // @Autowired(required = false) - // private Keycloak keycloak; + @Autowired(required = false) + private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; public User searchUserByAttribute(String attributeName, String attributeValue) { try { - // List users = keycloak - // .realm(keycloakRealm) - // .users() - // .searchByAttributes(attributeName + ":" + attributeValue); - // UserRepresentation user = users.get(0); + List users = keycloak + .realm(keycloakRealm) + .users() + .searchByAttributes(attributeName + ":" + attributeValue); + UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); - // String username = user.getUsername(); - // String email = user.getEmail(); - // String firstName = user.getFirstName(); - // String lastName = user.getLastName(); - // result.setId(username); - // result.setEmail(email); - // result.setFirstName(firstName); - // result.setLastName(lastName); + String username = user.getUsername(); + String email = user.getEmail(); + String firstName = user.getFirstName(); + String lastName = user.getLastName(); + result.setId(username); + result.setEmail(email); + result.setFirstName(firstName); + result.setLastName(lastName); return result; } catch (Exception e) { e.printStackTrace(); From 76bfcca60af8cbf987a22cc885ce872cecf1d48f Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 14:39:31 -0600 Subject: [PATCH 067/157] commit 2ef124a5 reversed --- .../camunda/bpm/extension/hooks/services/UserService.java | 2 +- .../bpm/extension/keycloak/CamundaExtConfiguration.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index b5340cf5..877261d4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -8,7 +8,7 @@ import org.camunda.bpm.extension.keycloak.rest.KeycloakRestTemplate; import org.camunda.bpm.engine.identity.User; import org.keycloak.admin.client.Keycloak; -// import org.keycloak.representations.idm.UserRepresentation; +import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index 3a101a54..e8a9c4fe 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -1,8 +1,8 @@ package org.camunda.bpm.extension.keycloak; -// import org.keycloak.OAuth2Constants; -// import org.keycloak.admin.client.Keycloak; -// import org.keycloak.admin.client.KeycloakBuilder; +import org.keycloak.OAuth2Constants; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; From e7c6a60458c80f883fa7cb2bcae51a88fb125a03 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 15:16:17 -0600 Subject: [PATCH 068/157] test jersey and app path --- .../forms-flow-bpm/src/main/resources/application.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 004ba795..3324c10f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -87,6 +87,8 @@ camunda.bpm: spring: + jersey: + application-path: /engine-rest datasource: jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} username: ${CAMUNDA_JDBC_USER:sa} From c7ebaff90d9a1bcd58e8e952104d66fee7001364 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 8 Aug 2023 15:56:05 -0600 Subject: [PATCH 069/157] commit e7c6a604 reversed --- .../forms-flow-bpm/src/main/resources/application.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml index 3324c10f..004ba795 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/resources/application.yaml @@ -87,8 +87,6 @@ camunda.bpm: spring: - jersey: - application-path: /engine-rest datasource: jdbc-url: ${CAMUNDA_JDBC_URL:jdbc:h2:./camunda-db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE} username: ${CAMUNDA_JDBC_USER:sa} From e33e2b617be4bbfbeaa97e0d1c34a16b262e58dd Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 9 Aug 2023 12:03:22 -0600 Subject: [PATCH 070/157] jackson version changed --- apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index dc2b9ceb..de23aeac 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -29,7 +29,7 @@ 2.6.6 2.6.6 - 2.14.0 + 2.13.3 From 394f994fa022475809dd1beb50bc1db15fc4ebf4 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 9 Aug 2023 12:45:04 -0600 Subject: [PATCH 071/157] jackson version change reverted --- apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml | 2 +- .../bpm/extension/hooks/services/FormSubmissionService.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index de23aeac..dc2b9ceb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -29,7 +29,7 @@ 2.6.6 2.6.6 - 2.13.3 + 2.14.0 diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java index 06831cdc..ee8ebce3 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java @@ -116,6 +116,7 @@ private String getSubmissionUrl(String formUrl) { public Map retrieveFormValues(String formUrl) throws IOException { Map fieldValues = new HashMap(); String submission = readSubmission(formUrl); + System.out.println("submission: " + submission); if (StringUtils.isNotEmpty(submission)) { JsonNode dataNode = bpmObjectMapper.readTree(submission); Iterator> dataElements = dataNode.findPath("data").fields(); From 8a67a91d8a4d162af742de1d8c2eb3a97f996422 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 9 Aug 2023 13:25:27 -0600 Subject: [PATCH 072/157] FormSubmissionService.java updated --- .../bpm/extension/hooks/services/FormSubmissionService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java index ee8ebce3..3a01af73 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/FormSubmissionService.java @@ -116,7 +116,8 @@ private String getSubmissionUrl(String formUrl) { public Map retrieveFormValues(String formUrl) throws IOException { Map fieldValues = new HashMap(); String submission = readSubmission(formUrl); - System.out.println("submission: " + submission); + LOGGER.log(Level.INFO, "Submitted_payload" + submission); + // System.out.println("submission: " + submission); if (StringUtils.isNotEmpty(submission)) { JsonNode dataNode = bpmObjectMapper.readTree(submission); Iterator> dataElements = dataNode.findPath("data").fields(); From d7a1b1978c84fcc4cf0ddfda97ae80b4eea1f941 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 9 Aug 2023 16:53:12 -0600 Subject: [PATCH 073/157] HTTPServiceInvoker.java added --- .../commons/connector/HTTPServiceInvoker.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java new file mode 100644 index 00000000..bb5d3304 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -0,0 +1,99 @@ +package org.camunda.bpm.extension.commons.connector; + +import org.apache.commons.lang3.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * Http Service Invoker. + * This class prepares the payload and invokes the respective access handler + * based on the service ID. + */ +@Component("httpServiceInvoker") +public class HTTPServiceInvoker { + + private static final String FORMIO_URL = "formio.url"; + private static final String API_URL = "api.url"; + private static final String BPM_URL = "bpm.url"; + private static final String ANALYSIS_URL = "analysis.url"; + private static final String APPLICATION_ACCESS_HANDLER = "applicationAccessHandler"; + private static final String BPM_ACCESS_HANDLER = "bpmAccessHandler"; + private static final String TEXT_ANALYZER_ACCESS_HANDLER = "textAnalyzerAccessHandler"; + private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; + private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; + + private final Logger LOGGER = Logger.getLogger(HTTPServiceInvoker.class.getName()); + + @Autowired + private AccessHandlerFactory accessHandlerFactory; + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; + @Autowired + private Properties integrationCredentialProperties; + + public ResponseEntity execute(String url, HttpMethod method, Object payload) throws IOException { + String dataJson = payload != null ? new ObjectMapper().writeValueAsString(payload) : null; + return execute(url, method, dataJson); + } + + public ResponseEntity execute(String url, HttpMethod method, String payload) { + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); + } + + public ResponseEntity execute(String url, HttpMethod method, IRequest payload, + Class responseClazz) { + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); + } + + public ResponseEntity executeWithParamsAndPayload(String url, HttpMethod method, + Map requestParams, IRequest payload) { + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, requestParams, payload); + } + + private String getServiceId(String url) { + + // Boolean enableCustomSubmission = Boolean + // .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); + // if (isUrlValid(url, fetchUrlFromProperty(API_URL))) { + // return APPLICATION_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(BPM_URL))) { + // return BPM_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(ANALYSIS_URL))) { + // return TEXT_ANALYZER_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(FORMIO_URL))) { + // if (enableCustomSubmission && StringUtils.contains(url, "/submission")) { + // return CUSTOM_SUBMISSION_ACCESS_HANDLER; + // } else { + // return FORM_ACCESS_HANDLER; + // } + // } + // return ""; + if (StringUtils.contains(url, getProperties().getProperty("api.url"))) { + return "applicationAccessHandler"; + } + return "formAccessHandler"; + } + + private String fetchUrlFromProperty(String key) { + return getProperties().getProperty(key); + } + + private boolean isUrlValid(String sourceUrl, String targetUrl) { + return StringUtils.isNotBlank(targetUrl) && StringUtils.contains(sourceUrl, targetUrl) ? true : false; + } + + public Properties getProperties() { + return integrationCredentialProperties; + } + +} \ No newline at end of file From 3925b2b48c93ce65bf33c906d37535935645463c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 9 Aug 2023 17:24:03 -0600 Subject: [PATCH 074/157] jackson version changed --- apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index dc2b9ceb..de23aeac 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -29,7 +29,7 @@ 2.6.6 2.6.6 - 2.14.0 + 2.13.3 From 0d3955bda43096ff03d9746f169bd8aeb9edc3e3 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 10:39:06 -0600 Subject: [PATCH 075/157] BPMAccessHandler added; FormAccessHandler removed --- .../forms-flow-bpm/pom-docker.xml | 2 +- .../connector/support/BPMAccessHandler.java | 78 ++++++++++++++++ .../connector/support/FormAccessHandler.java | 91 ------------------- 3 files changed, 79 insertions(+), 92 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml index de23aeac..dc2b9ceb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml +++ b/apps/forms-flow-ai/forms-flow-bpm/pom-docker.xml @@ -29,7 +29,7 @@ 2.6.6 2.6.6 - 2.13.3 + 2.14.0 diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java new file mode 100644 index 00000000..e9170deb --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java @@ -0,0 +1,78 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import com.google.gson.JsonObject; +import org.apache.commons.lang.StringUtils; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.util.UriBuilder; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.util.Map; +import java.util.Properties; +import org.springframework.context.annotation.Primary; + +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; + +@Primary +@Service("bpmAccessHandler") +public class BPMAccessHandler extends AbstractAccessHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(BPMAccessHandler.class); + private final Properties properties; + private final WebClient webClient; + + public BPMAccessHandler(Properties integrationCredentialProperties, WebClient unauthenticatedWebClient) { + this.properties = integrationCredentialProperties; + this.webClient = unauthenticatedWebClient; + } + + @Override + public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, + IRequest payload) { + + String host = getBpmHostAddress(); + + ResponseEntity response = webClient + .method(method) + .uri(host, builder -> buildQueryParams(builder, url, queryParams)) + .headers(h -> h.setBearerAuth(getUserBasedAccessToken())) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .onStatus(HttpStatus::is5xxServerError, + clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR))) + .toEntity(String.class) + .block(); + + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } + + private URI buildQueryParams(UriBuilder builder, String url, Map queryParams) { + + String host = properties.getProperty("bpm.url"); + builder = builder.path(StringUtils.substringAfter(url, host)); + for (Map.Entry entry : queryParams.entrySet()) { + builder = builder.queryParam(entry.getKey(), entry.getValue()); + } + return builder.build(); + } + + private String getBpmHostAddress() { + String host = properties.getProperty("bpm.url"); + return StringUtils.substringBefore(host, "/engine-bpm"); + } +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java deleted file mode 100644 index 362c0219..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import com.google.gson.JsonObject; -import org.apache.commons.lang3.StringUtils; -import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; -import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Properties; -import org.springframework.context.annotation.Primary; - -/** - * Form Access Handler. - * This class serves as gateway for all formio interactions. - */ -@Primary -@Service("formAccessHandler") -public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { - - private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); - - static final int TOKEN_EXPIRY_CODE = 404; - - @Autowired - private Properties integrationCredentialProperties; - @Autowired - private WebClient unauthenticatedWebClient; - @Autowired - private FormioTokenServiceProvider formioTokenServiceProvider; - - public ResponseEntity exchange(String url, HttpMethod method, String payload) { - String accessToken = formioTokenServiceProvider.getAccessToken(); - if (StringUtils.isBlank(accessToken)) { - logger.info("Access token is blank. Cannot invoke service:{}", url); - return null; - } - ResponseEntity response = exchange(url, method, payload, accessToken); - if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { - exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); - } - logger.info("Response code for service invocation: {}", response.getStatusCode()); - return response; - } - - public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { - - payload = (payload == null) ? new JsonObject().toString() : payload; - - if (HttpMethod.PATCH.name().equals(method.name())) { - logger.info("payload=" + payload); - Mono> entityMono = unauthenticatedWebClient.patch() - .uri(url) - .bodyValue(payload) - .header("x-jwt-token", accessToken) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class); - - ResponseEntity response = entityMono.block(); - if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { - return new ResponseEntity<>(response.getBody(), HttpStatus.valueOf(TOKEN_EXPIRY_CODE)); - } - return response; - } else { - return unauthenticatedWebClient.method(method) - .uri(url) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .header("x-jwt-token", accessToken) - .body(Mono.just(payload), String.class) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class) - .block(); - } - } -} From 2f9ff07cf6ef403a1676180963fde1d832769ecf Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 11:17:45 -0600 Subject: [PATCH 076/157] CustomSubmissionAccessHandler added; --- .../connector/support/BPMAccessHandler.java | 78 --------------- .../CustomSubmissionAccessHandler.java | 94 +++++++++++++++++++ 2 files changed, 94 insertions(+), 78 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java deleted file mode 100644 index e9170deb..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/BPMAccessHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import com.google.gson.JsonObject; -import org.apache.commons.lang.StringUtils; -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.util.UriBuilder; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.net.URI; -import java.util.Map; -import java.util.Properties; -import org.springframework.context.annotation.Primary; - -import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; - -@Primary -@Service("bpmAccessHandler") -public class BPMAccessHandler extends AbstractAccessHandler { - - private static final Logger LOGGER = LoggerFactory.getLogger(BPMAccessHandler.class); - private final Properties properties; - private final WebClient webClient; - - public BPMAccessHandler(Properties integrationCredentialProperties, WebClient unauthenticatedWebClient) { - this.properties = integrationCredentialProperties; - this.webClient = unauthenticatedWebClient; - } - - @Override - public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, - IRequest payload) { - - String host = getBpmHostAddress(); - - ResponseEntity response = webClient - .method(method) - .uri(host, builder -> buildQueryParams(builder, url, queryParams)) - .headers(h -> h.setBearerAuth(getUserBasedAccessToken())) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .onStatus(HttpStatus::is5xxServerError, - clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR))) - .toEntity(String.class) - .block(); - - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } - - private URI buildQueryParams(UriBuilder builder, String url, Map queryParams) { - - String host = properties.getProperty("bpm.url"); - builder = builder.path(StringUtils.substringAfter(url, host)); - for (Map.Entry entry : queryParams.entrySet()) { - builder = builder.queryParam(entry.getKey(), entry.getValue()); - } - return builder.build(); - } - - private String getBpmHostAddress() { - String host = properties.getProperty("bpm.url"); - return StringUtils.substringBefore(host, "/engine-bpm"); - } -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java new file mode 100644 index 00000000..97037539 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java @@ -0,0 +1,94 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import com.google.gson.JsonObject; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Properties; +import java.util.logging.Logger; +import org.springframework.context.annotation.Primary; + +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; + +/** + * Application Access Handler. + * This class serves as gateway for custom submission interactions. + */ +@Primary +@Service("CustomSubmissionAccessHandler") +public class CustomSubmissionAccessHandler extends AbstractAccessHandler { + + private final Logger LOGGER = Logger.getLogger(CustomSubmissionAccessHandler.class.getName()); + + @Autowired + private WebClient webClient; + + @Autowired + private Properties integrationCredentialProperties; + + /** + * exchange function using json - string payload / string response + * + * @param url + * @param method + * @param payload + * @return + */ + public ResponseEntity exchange(String url, HttpMethod method, String payload) { + + payload = (payload == null) ? new JsonObject().toString() : payload; + + ResponseEntity response = webClient.method(method).uri(getUrl(url)) + .attributes(clientRegistrationId("keycloak-client")) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body(Mono.just(payload), String.class) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .toEntity(String.class) + .block(); + + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } + + /** + * exchange function using the custom class + * + * @param url + * @param method + * @param payload + * @param responseClazz + * @return + */ + public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, + Class responseClazz) { + ResponseEntity response = webClient.method(method).uri(getUrl(url)) + .attributes(clientRegistrationId("keycloak-client")) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) + .toEntity(responseClazz) + .block(); + return new ResponseEntity<>(response.getBody(), response.getStatusCode()); + } + + private String getUrl(String url) { + if (StringUtils.contains(url, "/form/")) { + return integrationCredentialProperties.getProperty("forms.custom_submission.url") + "/form/" + + StringUtils.substringAfter(url, "/form/"); + } + return url; + } +} From 710f38c587331ecd296f6a7eb5b9fb013e46d24e Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 11:51:01 -0600 Subject: [PATCH 077/157] AbstractAccessHandler added --- .../support/AbstractAccessHandler.java | 39 ++++++++ .../CustomSubmissionAccessHandler.java | 94 ------------------- 2 files changed, 39 insertions(+), 94 deletions(-) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java new file mode 100644 index 00000000..7f66a63e --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java @@ -0,0 +1,39 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; + +import java.util.Map; + +public abstract class AbstractAccessHandler implements IAccessHandler{ + @Override + public ResponseEntity exchange(String url, HttpMethod method, String payload) { + return null; + } + + @Override + public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { + return null; + } + + @Override + public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, IRequest payload) { + return null; + } + + public String getUserBasedAccessToken() { + + String token = null; + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication instanceof JwtAuthenticationToken jwtAuthenticationToken) { + token = jwtAuthenticationToken.getToken().getTokenValue(); + } + return token; + } +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java deleted file mode 100644 index 97037539..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/CustomSubmissionAccessHandler.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import com.google.gson.JsonObject; -import org.apache.commons.lang3.StringUtils; -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Properties; -import java.util.logging.Logger; -import org.springframework.context.annotation.Primary; - -import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; - -/** - * Application Access Handler. - * This class serves as gateway for custom submission interactions. - */ -@Primary -@Service("CustomSubmissionAccessHandler") -public class CustomSubmissionAccessHandler extends AbstractAccessHandler { - - private final Logger LOGGER = Logger.getLogger(CustomSubmissionAccessHandler.class.getName()); - - @Autowired - private WebClient webClient; - - @Autowired - private Properties integrationCredentialProperties; - - /** - * exchange function using json - string payload / string response - * - * @param url - * @param method - * @param payload - * @return - */ - public ResponseEntity exchange(String url, HttpMethod method, String payload) { - - payload = (payload == null) ? new JsonObject().toString() : payload; - - ResponseEntity response = webClient.method(method).uri(getUrl(url)) - .attributes(clientRegistrationId("keycloak-client")) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body(Mono.just(payload), String.class) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .toEntity(String.class) - .block(); - - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } - - /** - * exchange function using the custom class - * - * @param url - * @param method - * @param payload - * @param responseClazz - * @return - */ - public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, - Class responseClazz) { - ResponseEntity response = webClient.method(method).uri(getUrl(url)) - .attributes(clientRegistrationId("keycloak-client")) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .body((payload == null ? BodyInserters.empty() : BodyInserters.fromValue(payload))) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - clientResponse -> Mono.error(new HttpClientErrorException(HttpStatus.BAD_REQUEST))) - .toEntity(responseClazz) - .block(); - return new ResponseEntity<>(response.getBody(), response.getStatusCode()); - } - - private String getUrl(String url) { - if (StringUtils.contains(url, "/form/")) { - return integrationCredentialProperties.getProperty("forms.custom_submission.url") + "/form/" - + StringUtils.substringAfter(url, "/form/"); - } - return url; - } -} From aadbb61c7dafb07d7f4182e0c793ed5b91205e1b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 12:51:04 -0600 Subject: [PATCH 078/157] reverted to FormAccessHandler.java --- .../commons/connector/HTTPServiceInvoker.java | 99 ------------------- .../support/AbstractAccessHandler.java | 39 -------- .../connector/support/FormAccessHandler.java | 91 +++++++++++++++++ 3 files changed, 91 insertions(+), 138 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java deleted file mode 100644 index bb5d3304..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.camunda.bpm.extension.commons.connector; - -import org.apache.commons.lang3.StringUtils; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.io.IOException; -import java.util.Map; -import java.util.Properties; -import java.util.logging.Logger; - -/** - * Http Service Invoker. - * This class prepares the payload and invokes the respective access handler - * based on the service ID. - */ -@Component("httpServiceInvoker") -public class HTTPServiceInvoker { - - private static final String FORMIO_URL = "formio.url"; - private static final String API_URL = "api.url"; - private static final String BPM_URL = "bpm.url"; - private static final String ANALYSIS_URL = "analysis.url"; - private static final String APPLICATION_ACCESS_HANDLER = "applicationAccessHandler"; - private static final String BPM_ACCESS_HANDLER = "bpmAccessHandler"; - private static final String TEXT_ANALYZER_ACCESS_HANDLER = "textAnalyzerAccessHandler"; - private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; - private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; - - private final Logger LOGGER = Logger.getLogger(HTTPServiceInvoker.class.getName()); - - @Autowired - private AccessHandlerFactory accessHandlerFactory; - @Resource(name = "bpmObjectMapper") - private ObjectMapper bpmObjectMapper; - @Autowired - private Properties integrationCredentialProperties; - - public ResponseEntity execute(String url, HttpMethod method, Object payload) throws IOException { - String dataJson = payload != null ? new ObjectMapper().writeValueAsString(payload) : null; - return execute(url, method, dataJson); - } - - public ResponseEntity execute(String url, HttpMethod method, String payload) { - return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); - } - - public ResponseEntity execute(String url, HttpMethod method, IRequest payload, - Class responseClazz) { - return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); - } - - public ResponseEntity executeWithParamsAndPayload(String url, HttpMethod method, - Map requestParams, IRequest payload) { - return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, requestParams, payload); - } - - private String getServiceId(String url) { - - // Boolean enableCustomSubmission = Boolean - // .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); - // if (isUrlValid(url, fetchUrlFromProperty(API_URL))) { - // return APPLICATION_ACCESS_HANDLER; - // } else if (isUrlValid(url, fetchUrlFromProperty(BPM_URL))) { - // return BPM_ACCESS_HANDLER; - // } else if (isUrlValid(url, fetchUrlFromProperty(ANALYSIS_URL))) { - // return TEXT_ANALYZER_ACCESS_HANDLER; - // } else if (isUrlValid(url, fetchUrlFromProperty(FORMIO_URL))) { - // if (enableCustomSubmission && StringUtils.contains(url, "/submission")) { - // return CUSTOM_SUBMISSION_ACCESS_HANDLER; - // } else { - // return FORM_ACCESS_HANDLER; - // } - // } - // return ""; - if (StringUtils.contains(url, getProperties().getProperty("api.url"))) { - return "applicationAccessHandler"; - } - return "formAccessHandler"; - } - - private String fetchUrlFromProperty(String key) { - return getProperties().getProperty(key); - } - - private boolean isUrlValid(String sourceUrl, String targetUrl) { - return StringUtils.isNotBlank(targetUrl) && StringUtils.contains(sourceUrl, targetUrl) ? true : false; - } - - public Properties getProperties() { - return integrationCredentialProperties; - } - -} \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java deleted file mode 100644 index 7f66a63e..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/AbstractAccessHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import org.camunda.bpm.extension.commons.ro.req.IRequest; -import org.camunda.bpm.extension.commons.ro.res.IResponse; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; - -import java.util.Map; - -public abstract class AbstractAccessHandler implements IAccessHandler{ - @Override - public ResponseEntity exchange(String url, HttpMethod method, String payload) { - return null; - } - - @Override - public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { - return null; - } - - @Override - public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, IRequest payload) { - return null; - } - - public String getUserBasedAccessToken() { - - String token = null; - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - if (authentication instanceof JwtAuthenticationToken jwtAuthenticationToken) { - token = jwtAuthenticationToken.getToken().getTokenValue(); - } - return token; - } -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java new file mode 100644 index 00000000..362c0219 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -0,0 +1,91 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import com.google.gson.JsonObject; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; +import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Properties; +import org.springframework.context.annotation.Primary; + +/** + * Form Access Handler. + * This class serves as gateway for all formio interactions. + */ +@Primary +@Service("formAccessHandler") +public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { + + private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); + + static final int TOKEN_EXPIRY_CODE = 404; + + @Autowired + private Properties integrationCredentialProperties; + @Autowired + private WebClient unauthenticatedWebClient; + @Autowired + private FormioTokenServiceProvider formioTokenServiceProvider; + + public ResponseEntity exchange(String url, HttpMethod method, String payload) { + String accessToken = formioTokenServiceProvider.getAccessToken(); + if (StringUtils.isBlank(accessToken)) { + logger.info("Access token is blank. Cannot invoke service:{}", url); + return null; + } + ResponseEntity response = exchange(url, method, payload, accessToken); + if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { + exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); + } + logger.info("Response code for service invocation: {}", response.getStatusCode()); + return response; + } + + public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { + + payload = (payload == null) ? new JsonObject().toString() : payload; + + if (HttpMethod.PATCH.name().equals(method.name())) { + logger.info("payload=" + payload); + Mono> entityMono = unauthenticatedWebClient.patch() + .uri(url) + .bodyValue(payload) + .header("x-jwt-token", accessToken) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class); + + ResponseEntity response = entityMono.block(); + if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { + return new ResponseEntity<>(response.getBody(), HttpStatus.valueOf(TOKEN_EXPIRY_CODE)); + } + return response; + } else { + return unauthenticatedWebClient.method(method) + .uri(url) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("x-jwt-token", accessToken) + .body(Mono.just(payload), String.class) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class) + .block(); + } + } +} From bac84997ad8393ac1d73a9bc024f2545aeae42e2 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 15:03:34 -0600 Subject: [PATCH 079/157] access handler files updated --- .../support/ApplicationAccessHandler.java | 13 ++--- .../connector/support/FormAccessHandler.java | 47 +++++++++++++++---- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index c1bbe821..fb98be72 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -55,7 +55,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - @Override + // @Override public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { @@ -74,10 +74,11 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - @Override - public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, - IRequest payload) { - return null; - } + // @Override + // public ResponseEntity exchange(String url, HttpMethod method, + // Map queryParams, + // IRequest payload) { + // return null; + // } } \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 362c0219..aee56a31 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -64,10 +64,23 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay .header("x-jwt-token", accessToken) .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class); + .exchangeToMono(response -> { + if (response.statusCode().is4xxClientError()) { + return response.bodyToMono(String.class) + .flatMap(errorBody -> Mono.error(new FormioServiceException(errorBody))); + } else { + Flux body = response.bodyToFlux(DataBuffer.class); + return DataBufferUtils.join(body) + .map(dataBuffer -> { + byte[] bytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(bytes); + DataBufferUtils.release(dataBuffer); // Release the buffer to avoid memory leaks + String responseBody = new String(bytes, StandardCharsets.UTF_8); + HttpStatus httpStatus = response.statusCode(); + return ResponseEntity.status(httpStatus).body(responseBody); + }); + } + }); ResponseEntity response = entityMono.block(); if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { @@ -75,17 +88,31 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay } return response; } else { - return unauthenticatedWebClient.method(method) + Mono> entityMono = unauthenticatedWebClient.method(method) .uri(url) .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .header("x-jwt-token", accessToken) .body(Mono.just(payload), String.class) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class) - .block(); + .exchangeToMono(response -> { + if (response.statusCode().is4xxClientError()) { + return response.bodyToMono(String.class) + .flatMap(errorBody -> Mono.error(new FormioServiceException(errorBody))); + } else { + Flux body = response.bodyToFlux(DataBuffer.class); + return DataBufferUtils.join(body) + .map(dataBuffer -> { + byte[] bytes = new byte[dataBuffer.readableByteCount()]; + dataBuffer.read(bytes); + DataBufferUtils.release(dataBuffer); // Release the buffer to avoid memory leaks + String responseBody = new String(bytes, StandardCharsets.UTF_8); + HttpStatus httpStatus = response.statusCode(); + return ResponseEntity.status(httpStatus).body(responseBody); + }); + } + }); + ResponseEntity response = entityMono.block(); + return response; } } } From 83b174eb38a214f8c15fe5e33f09a5844bbe6146 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 15:09:19 -0600 Subject: [PATCH 080/157] FormAccessHandler.java updated --- .../commons/connector/support/FormAccessHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index aee56a31..7ef23742 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -7,6 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpHeaders; @@ -14,8 +16,10 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.nio.charset.StandardCharsets; import java.util.Properties; import org.springframework.context.annotation.Primary; From 7a10a9e2e46308fbcc7382cec5850ba699821a29 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 15:19:06 -0600 Subject: [PATCH 081/157] ApplicationAccessHandler.java update --- .../connector/support/ApplicationAccessHandler.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index fb98be72..13fe57d6 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -75,10 +75,9 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques } // @Override - // public ResponseEntity exchange(String url, HttpMethod method, - // Map queryParams, - // IRequest payload) { - // return null; - // } + public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, + IRequest payload) { + return null; + } } \ No newline at end of file From 50d88287d39893f59a7bb36fc265f42b2fed836b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 10 Aug 2023 16:07:56 -0600 Subject: [PATCH 082/157] commit bac8499 reversed --- .../support/ApplicationAccessHandler.java | 4 +- .../connector/support/FormAccessHandler.java | 53 ++++--------------- 2 files changed, 12 insertions(+), 45 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 13fe57d6..c1bbe821 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -55,7 +55,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - // @Override + @Override public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { @@ -74,7 +74,7 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - // @Override + @Override public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, IRequest payload) { return null; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 7ef23742..ba844896 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -7,8 +7,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpHeaders; @@ -16,18 +14,14 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.nio.charset.StandardCharsets; import java.util.Properties; -import org.springframework.context.annotation.Primary; /** * Form Access Handler. * This class serves as gateway for all formio interactions. */ -@Primary @Service("formAccessHandler") public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { @@ -68,23 +62,10 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay .header("x-jwt-token", accessToken) .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .exchangeToMono(response -> { - if (response.statusCode().is4xxClientError()) { - return response.bodyToMono(String.class) - .flatMap(errorBody -> Mono.error(new FormioServiceException(errorBody))); - } else { - Flux body = response.bodyToFlux(DataBuffer.class); - return DataBufferUtils.join(body) - .map(dataBuffer -> { - byte[] bytes = new byte[dataBuffer.readableByteCount()]; - dataBuffer.read(bytes); - DataBufferUtils.release(dataBuffer); // Release the buffer to avoid memory leaks - String responseBody = new String(bytes, StandardCharsets.UTF_8); - HttpStatus httpStatus = response.statusCode(); - return ResponseEntity.status(httpStatus).body(responseBody); - }); - } - }); + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class); ResponseEntity response = entityMono.block(); if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { @@ -92,31 +73,17 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay } return response; } else { - Mono> entityMono = unauthenticatedWebClient.method(method) + return unauthenticatedWebClient.method(method) .uri(url) .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .header("x-jwt-token", accessToken) .body(Mono.just(payload), String.class) - .exchangeToMono(response -> { - if (response.statusCode().is4xxClientError()) { - return response.bodyToMono(String.class) - .flatMap(errorBody -> Mono.error(new FormioServiceException(errorBody))); - } else { - Flux body = response.bodyToFlux(DataBuffer.class); - return DataBufferUtils.join(body) - .map(dataBuffer -> { - byte[] bytes = new byte[dataBuffer.readableByteCount()]; - dataBuffer.read(bytes); - DataBufferUtils.release(dataBuffer); // Release the buffer to avoid memory leaks - String responseBody = new String(bytes, StandardCharsets.UTF_8); - HttpStatus httpStatus = response.statusCode(); - return ResponseEntity.status(httpStatus).body(responseBody); - }); - } - }); - ResponseEntity response = entityMono.block(); - return response; + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class) + .block(); } } } From ecfb3d52da5c435cff63c920e243c08468ef6500 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 14 Aug 2023 11:59:18 -0600 Subject: [PATCH 083/157] FormAccessHandler.java update --- .../extension/commons/connector/support/FormAccessHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index ba844896..ad402de6 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; +import org.springframework.context.annotation.Primary; import java.util.Properties; @@ -22,6 +23,7 @@ * Form Access Handler. * This class serves as gateway for all formio interactions. */ +@Primary @Service("formAccessHandler") public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { From 8523c59444674ee92615c3c3e415a05f02d49520 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 14 Aug 2023 12:26:59 -0600 Subject: [PATCH 084/157] commit ecfb3d5 reversed --- .../extension/commons/connector/support/FormAccessHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index ad402de6..ba844896 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -15,7 +15,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; -import org.springframework.context.annotation.Primary; import java.util.Properties; @@ -23,7 +22,6 @@ * Form Access Handler. * This class serves as gateway for all formio interactions. */ -@Primary @Service("formAccessHandler") public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { From da8fdded1925271db58dbac4094e58ec368c4ab4 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 14 Aug 2023 12:55:07 -0600 Subject: [PATCH 085/157] FormAccessHandler.java removed --- .../connector/support/FormAccessHandler.java | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java deleted file mode 100644 index ba844896..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.camunda.bpm.extension.commons.connector.support; - -import com.google.gson.JsonObject; -import org.apache.commons.lang3.StringUtils; -import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; -import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.util.Properties; - -/** - * Form Access Handler. - * This class serves as gateway for all formio interactions. - */ -@Service("formAccessHandler") -public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { - - private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); - - static final int TOKEN_EXPIRY_CODE = 404; - - @Autowired - private Properties integrationCredentialProperties; - @Autowired - private WebClient unauthenticatedWebClient; - @Autowired - private FormioTokenServiceProvider formioTokenServiceProvider; - - public ResponseEntity exchange(String url, HttpMethod method, String payload) { - String accessToken = formioTokenServiceProvider.getAccessToken(); - if (StringUtils.isBlank(accessToken)) { - logger.info("Access token is blank. Cannot invoke service:{}", url); - return null; - } - ResponseEntity response = exchange(url, method, payload, accessToken); - if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { - exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); - } - logger.info("Response code for service invocation: {}", response.getStatusCode()); - return response; - } - - public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { - - payload = (payload == null) ? new JsonObject().toString() : payload; - - if (HttpMethod.PATCH.name().equals(method.name())) { - logger.info("payload=" + payload); - Mono> entityMono = unauthenticatedWebClient.patch() - .uri(url) - .bodyValue(payload) - .header("x-jwt-token", accessToken) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class); - - ResponseEntity response = entityMono.block(); - if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { - return new ResponseEntity<>(response.getBody(), HttpStatus.valueOf(TOKEN_EXPIRY_CODE)); - } - return response; - } else { - return unauthenticatedWebClient.method(method) - .uri(url) - .accept(MediaType.APPLICATION_JSON) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .header("x-jwt-token", accessToken) - .body(Mono.just(payload), String.class) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, - response -> Mono.error(new FormioServiceException(response.toString()))) - .toEntity(String.class) - .block(); - } - } -} From aab2eda3f54512641ad1dd47c6bf09446e5a490f Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 15 Aug 2023 15:26:53 -0600 Subject: [PATCH 086/157] ApplicationAccessHandler.java updated --- .../connector/support/ApplicationAccessHandler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index c1bbe821..73e64250 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -26,7 +26,8 @@ * @author sumathi.thirumani@aot-technologies.com */ @Service("applicationAccessHandler") -public class ApplicationAccessHandler implements IAccessHandler { +public class ApplicationAccessHandler extends AbstractAccessHandler { + // public class ApplicationAccessHandler implements IAccessHandler { private final Logger LOGGER = LoggerFactory.getLogger(ApplicationAccessHandler.class); @@ -55,7 +56,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - @Override + // @Override public ResponseEntity exchange(String url, HttpMethod method, IRequest payload, Class responseClazz) { @@ -74,7 +75,7 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques return new ResponseEntity<>(response.getBody(), response.getStatusCode()); } - @Override + // @Override public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, IRequest payload) { return null; From 79659b0c80916bdae369c1f7dab4cee2cbe7fcf6 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 15 Aug 2023 16:12:49 -0600 Subject: [PATCH 087/157] ApplicationAccessHandler.java changed --- .../connector/support/ApplicationAccessHandler.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java index 73e64250..55201dfe 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/ApplicationAccessHandler.java @@ -37,7 +37,7 @@ public class ApplicationAccessHandler extends AbstractAccessHandler { @Autowired private OAuth2RestTemplate oAuth2RestTemplate; - @Override + // @Override public ResponseEntity exchange(String url, HttpMethod method, String payload) { payload = (payload == null) ? new JsonObject().toString() : payload; @@ -76,9 +76,12 @@ public ResponseEntity exchange(String url, HttpMethod method, IReques } // @Override - public ResponseEntity exchange(String url, HttpMethod method, Map queryParams, - IRequest payload) { - return null; - } + /** + * public ResponseEntity exchange(String url, HttpMethod method, + * Map queryParams, + * IRequest payload) { + * return null; + * } + **/ } \ No newline at end of file From 5b81a0296d68a57c28ad4c7fd12f5285ff32c1bc Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 09:02:30 -0600 Subject: [PATCH 088/157] HTTPServiceInvoker & FormAccessHandlr added --- .../commons/connector/HTTPServiceInvoker.java | 99 +++++++++++++++++++ .../connector/support/FormAccessHandler.java | 91 +++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java new file mode 100644 index 00000000..ed927e3a --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -0,0 +1,99 @@ +package org.camunda.bpm.extension.commons.connector; + +import org.apache.commons.lang3.StringUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.extension.commons.ro.req.IRequest; +import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * Http Service Invoker. + * This class prepares the payload and invokes the respective access handler + * based on the service ID. + */ +@Component("httpServiceInvoker") +public class HTTPServiceInvoker { + + private static final String FORMIO_URL = "formio.url"; + private static final String API_URL = "api.url"; + private static final String BPM_URL = "bpm.url"; + private static final String ANALYSIS_URL = "analysis.url"; + private static final String APPLICATION_ACCESS_HANDLER = "applicationAccessHandler"; + private static final String BPM_ACCESS_HANDLER = "bpmAccessHandler"; + private static final String TEXT_ANALYZER_ACCESS_HANDLER = "textAnalyzerAccessHandler"; + private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; + private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; + + private final Logger LOGGER = Logger.getLogger(HTTPServiceInvoker.class.getName()); + + @Autowired + private AccessHandlerFactory accessHandlerFactory; + @Resource(name = "bpmObjectMapper") + private ObjectMapper bpmObjectMapper; + @Autowired + private Properties integrationCredentialProperties; + + public ResponseEntity execute(String url, HttpMethod method, Object payload) throws IOException { + String dataJson = payload != null ? bpmObjectMapper.writeValueAsString(payload) : null; + return execute(url, method, dataJson); + } + + public ResponseEntity execute(String url, HttpMethod method, String payload) { + logger.info("LOGGER SERVICE ID", getServiceId(url)); + logger.info("LOGGER SERVICE PAYLOAD", getServiceId(payload)); + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); + } + + public ResponseEntity execute(String url, HttpMethod method, IRequest payload, + Class responseClazz) { + logger.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); + logger.info("IREQUEST LOGGER SERVICE PAYLOAD", getServiceId(payload)); + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); + } + + public ResponseEntity executeWithParamsAndPayload(String url, HttpMethod method, + Map requestParams, IRequest payload) { + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, requestParams, payload); + } + + private String getServiceId(String url) { + + Boolean enableCustomSubmission = Boolean + .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); + if (isUrlValid(url, fetchUrlFromProperty(API_URL))) { + return APPLICATION_ACCESS_HANDLER; + } else if (isUrlValid(url, fetchUrlFromProperty(BPM_URL))) { + return BPM_ACCESS_HANDLER; + } else if (isUrlValid(url, fetchUrlFromProperty(ANALYSIS_URL))) { + return TEXT_ANALYZER_ACCESS_HANDLER; + } else if (isUrlValid(url, fetchUrlFromProperty(FORMIO_URL))) { + if (enableCustomSubmission && StringUtils.contains(url, "/submission")) { + return CUSTOM_SUBMISSION_ACCESS_HANDLER; + } else { + return FORM_ACCESS_HANDLER; + } + } + return ""; + } + + private String fetchUrlFromProperty(String key) { + return getProperties().getProperty(key); + } + + private boolean isUrlValid(String sourceUrl, String targetUrl) { + return StringUtils.isNotBlank(targetUrl) && StringUtils.contains(sourceUrl, targetUrl) ? true : false; + } + + public Properties getProperties() { + return integrationCredentialProperties; + } + +} \ No newline at end of file diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java new file mode 100644 index 00000000..362c0219 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -0,0 +1,91 @@ +package org.camunda.bpm.extension.commons.connector.support; + +import com.google.gson.JsonObject; +import org.apache.commons.lang3.StringUtils; +import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; +import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.Properties; +import org.springframework.context.annotation.Primary; + +/** + * Form Access Handler. + * This class serves as gateway for all formio interactions. + */ +@Primary +@Service("formAccessHandler") +public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { + + private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); + + static final int TOKEN_EXPIRY_CODE = 404; + + @Autowired + private Properties integrationCredentialProperties; + @Autowired + private WebClient unauthenticatedWebClient; + @Autowired + private FormioTokenServiceProvider formioTokenServiceProvider; + + public ResponseEntity exchange(String url, HttpMethod method, String payload) { + String accessToken = formioTokenServiceProvider.getAccessToken(); + if (StringUtils.isBlank(accessToken)) { + logger.info("Access token is blank. Cannot invoke service:{}", url); + return null; + } + ResponseEntity response = exchange(url, method, payload, accessToken); + if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { + exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); + } + logger.info("Response code for service invocation: {}", response.getStatusCode()); + return response; + } + + public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { + + payload = (payload == null) ? new JsonObject().toString() : payload; + + if (HttpMethod.PATCH.name().equals(method.name())) { + logger.info("payload=" + payload); + Mono> entityMono = unauthenticatedWebClient.patch() + .uri(url) + .bodyValue(payload) + .header("x-jwt-token", accessToken) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class); + + ResponseEntity response = entityMono.block(); + if (response != null && "Token Expired".equalsIgnoreCase(response.getBody())) { + return new ResponseEntity<>(response.getBody(), HttpStatus.valueOf(TOKEN_EXPIRY_CODE)); + } + return response; + } else { + return unauthenticatedWebClient.method(method) + .uri(url) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .header("x-jwt-token", accessToken) + .body(Mono.just(payload), String.class) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, + response -> Mono.error(new FormioServiceException(response.toString()))) + .toEntity(String.class) + .block(); + } + } +} From de57144d8f47884e0765e32c1baf446a35d42732 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 09:19:13 -0600 Subject: [PATCH 089/157] HTTPServiceInvoker.java update --- .../extension/commons/connector/HTTPServiceInvoker.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index ed927e3a..993490eb 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -47,15 +47,15 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl } public ResponseEntity execute(String url, HttpMethod method, String payload) { - logger.info("LOGGER SERVICE ID", getServiceId(url)); - logger.info("LOGGER SERVICE PAYLOAD", getServiceId(payload)); + LOGGER.info("LOGGER SERVICE ID", getServiceId(url)); + LOGGER.info("LOGGER SERVICE PAYLOAD", getServiceId(payload)); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, Class responseClazz) { - logger.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); - logger.info("IREQUEST LOGGER SERVICE PAYLOAD", getServiceId(payload)); + LOGGER.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); + LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", getServiceId(payload)); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); } From 5fe681d0cd56b125ee637bdfe0b131f094d08388 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 09:32:49 -0600 Subject: [PATCH 090/157] HTTPServiceInvoker.java updated --- .../bpm/extension/commons/connector/HTTPServiceInvoker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 993490eb..984f8be5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -48,14 +48,14 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl public ResponseEntity execute(String url, HttpMethod method, String payload) { LOGGER.info("LOGGER SERVICE ID", getServiceId(url)); - LOGGER.info("LOGGER SERVICE PAYLOAD", getServiceId(payload)); + LOGGER.info("LOGGER SERVICE PAYLOAD", payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, Class responseClazz) { LOGGER.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); - LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", getServiceId(payload)); + LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); } From 1af8193fb8e11f64cc5be40477b9afdd348f8189 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 09:57:12 -0600 Subject: [PATCH 091/157] logging script corrected --- .../commons/connector/HTTPServiceInvoker.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 984f8be5..95857752 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -46,16 +46,33 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl return execute(url, method, dataJson); } + // public ResponseEntity execute(String url, HttpMethod method, String + // payload) { + // LOGGER.info("LOGGER SERVICE ID", getServiceId(url)); + // LOGGER.info("LOGGER SERVICE PAYLOAD", payload); + // return accessHandlerFactory.getService(getServiceId(url)).exchange(url, + // method, payload); + // } + + // public ResponseEntity execute(String url, HttpMethod method, + // IRequest payload, + // Class responseClazz) { + // LOGGER.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); + // LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", payload); + // return accessHandlerFactory.getService(getServiceId(url)).exchange(url, + // method, payload, responseClazz); + // } + public ResponseEntity execute(String url, HttpMethod method, String payload) { - LOGGER.info("LOGGER SERVICE ID", getServiceId(url)); - LOGGER.info("LOGGER SERVICE PAYLOAD", payload); - return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); + LOGGER.info("Service ID: {}", getServiceId(url)); + LOGGER.info("Service Payload: {}", payload); + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, String.class); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, Class responseClazz) { - LOGGER.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); - LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", payload); + LOGGER.info("Service ID: {}", getServiceId(url)); + LOGGER.info("Service Payload: {}", payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); } From d0ac82ae8300265a9c5794aacde73b80e8cd2e99 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 10:05:38 -0600 Subject: [PATCH 092/157] update logger. --- .../extension/commons/connector/HTTPServiceInvoker.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 95857752..69977690 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -64,15 +64,14 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl // } public ResponseEntity execute(String url, HttpMethod method, String payload) { - LOGGER.info("Service ID: {}", getServiceId(url)); - LOGGER.info("Service Payload: {}", payload); + LOGGER.info("String Service ID: {}", getServiceId(url)); + LOGGER.info("String Service Payload: {}", payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, String.class); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, Class responseClazz) { - LOGGER.info("Service ID: {}", getServiceId(url)); - LOGGER.info("Service Payload: {}", payload); + LOGGER.info("IRequest Service ID: {}", getServiceId(url)); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); } From e66d1bdb5c2c97bc9d642c95a7a69b0d10a1c3be Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 10:24:10 -0600 Subject: [PATCH 093/157] update logger. --- .../extension/commons/connector/HTTPServiceInvoker.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 69977690..0dc26dc8 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -2,6 +2,8 @@ import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.camunda.bpm.extension.commons.connector.support.FormAccessHandler; import org.camunda.bpm.extension.commons.ro.req.IRequest; import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -12,7 +14,8 @@ import java.io.IOException; import java.util.Map; import java.util.Properties; -import java.util.logging.Logger; +//import java.util.logging.Logger; +import org.slf4j.LoggerFactory; /** * Http Service Invoker. @@ -32,7 +35,9 @@ public class HTTPServiceInvoker { private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; - private final Logger LOGGER = Logger.getLogger(HTTPServiceInvoker.class.getName()); + // private final Logger LOGGER = + // Logger.getLogger(HTTPServiceInvoker.class.getName()); + private final Logger LOGGER = LoggerFactory.getLogger(HTTPServiceInvoker.class.getName()); @Autowired private AccessHandlerFactory accessHandlerFactory; From d3981e917124448070e04f2b9db9430fbc6307a2 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 10:44:59 -0600 Subject: [PATCH 094/157] import org.slf4j.Logger --- .../bpm/extension/commons/connector/HTTPServiceInvoker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 0dc26dc8..5ff1a915 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -16,6 +16,7 @@ import java.util.Properties; //import java.util.logging.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.Logger; /** * Http Service Invoker. From 18da4c1839703111449df902199d52b60ec52af9 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 11:27:58 -0600 Subject: [PATCH 095/157] update file. --- .../commons/connector/HTTPServiceInvoker.java | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 5ff1a915..f3cee317 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -2,8 +2,6 @@ import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; - -import org.camunda.bpm.extension.commons.connector.support.FormAccessHandler; import org.camunda.bpm.extension.commons.ro.req.IRequest; import org.camunda.bpm.extension.commons.ro.res.IResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -36,8 +34,6 @@ public class HTTPServiceInvoker { private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; - // private final Logger LOGGER = - // Logger.getLogger(HTTPServiceInvoker.class.getName()); private final Logger LOGGER = LoggerFactory.getLogger(HTTPServiceInvoker.class.getName()); @Autowired @@ -52,27 +48,10 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl return execute(url, method, dataJson); } - // public ResponseEntity execute(String url, HttpMethod method, String - // payload) { - // LOGGER.info("LOGGER SERVICE ID", getServiceId(url)); - // LOGGER.info("LOGGER SERVICE PAYLOAD", payload); - // return accessHandlerFactory.getService(getServiceId(url)).exchange(url, - // method, payload); - // } - - // public ResponseEntity execute(String url, HttpMethod method, - // IRequest payload, - // Class responseClazz) { - // LOGGER.info("IREQUEST LOGGER SERVICE ID", getServiceId(url)); - // LOGGER.info("IREQUEST LOGGER SERVICE PAYLOAD", payload); - // return accessHandlerFactory.getService(getServiceId(url)).exchange(url, - // method, payload, responseClazz); - // } - public ResponseEntity execute(String url, HttpMethod method, String payload) { LOGGER.info("String Service ID: {}", getServiceId(url)); LOGGER.info("String Service Payload: {}", payload); - return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, String.class); + return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, From 3f7c91c2bf2092b63a7bc00b7fcd787cc57a3968 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 14:41:20 -0600 Subject: [PATCH 096/157] add logging. --- .../extension/commons/connector/support/FormAccessHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 362c0219..eff051d5 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -55,6 +55,8 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { payload = (payload == null) ? new JsonObject().toString() : payload; + logger.info("HttpMethod=" + HttpMethod.PATCH.name()); + logger.info("method.name()=" + method.name()); if (HttpMethod.PATCH.name().equals(method.name())) { logger.info("payload=" + payload); From fa4cf5df72e525362fa739f98110de97e3b370fb Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 15:06:56 -0600 Subject: [PATCH 097/157] add more logs --- .../bpm/extension/commons/connector/HTTPServiceInvoker.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index f3cee317..6d7dfeca 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -44,7 +44,9 @@ public class HTTPServiceInvoker { private Properties integrationCredentialProperties; public ResponseEntity execute(String url, HttpMethod method, Object payload) throws IOException { + LOGGER.info("StringUrl=", url); String dataJson = payload != null ? bpmObjectMapper.writeValueAsString(payload) : null; + LOGGER.info("dataJson=", dataJson); return execute(url, method, dataJson); } From c9cd2cf8fcd23aab84ddf02c4bc2ff52a2b3c3ac Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 16:04:43 -0600 Subject: [PATCH 098/157] update logger. --- .../commons/connector/HTTPServiceInvoker.java | 24 ++++++++++++------- .../connector/support/FormAccessHandler.java | 18 ++++++++++---- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 6d7dfeca..747477ed 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.camunda.bpm.extension.commons.ro.req.IRequest; import org.camunda.bpm.extension.commons.ro.res.IResponse; +import org.camunda.bpm.extension.hooks.services.FormSubmissionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Component; @@ -12,9 +13,9 @@ import java.io.IOException; import java.util.Map; import java.util.Properties; -//import java.util.logging.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.Logger; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Http Service Invoker. @@ -34,7 +35,9 @@ public class HTTPServiceInvoker { private static final String FORM_ACCESS_HANDLER = "formAccessHandler"; private static final String CUSTOM_SUBMISSION_ACCESS_HANDLER = "CustomSubmissionAccessHandler"; - private final Logger LOGGER = LoggerFactory.getLogger(HTTPServiceInvoker.class.getName()); + // private final Logger LOGGER = + // LoggerFactory.getLogger(HTTPServiceInvoker.class.getName()); + private final Logger LOGGER = Logger.getLogger(FormSubmissionService.class.getName()); @Autowired private AccessHandlerFactory accessHandlerFactory; @@ -44,21 +47,24 @@ public class HTTPServiceInvoker { private Properties integrationCredentialProperties; public ResponseEntity execute(String url, HttpMethod method, Object payload) throws IOException { - LOGGER.info("StringUrl=", url); + // LOGGER.log("StringUrl=", url); + LOGGER.log(Level.INFO, "StringUrl=" + url); String dataJson = payload != null ? bpmObjectMapper.writeValueAsString(payload) : null; - LOGGER.info("dataJson=", dataJson); + LOGGER.log(Level.INFO, "dataJson=" + dataJson); return execute(url, method, dataJson); } public ResponseEntity execute(String url, HttpMethod method, String payload) { - LOGGER.info("String Service ID: {}", getServiceId(url)); - LOGGER.info("String Service Payload: {}", payload); + // LOGGER.info("String Service ID: {}", getServiceId(url)); + LOGGER.log(Level.INFO, "String Service ID: {}" + getServiceId(url)); + LOGGER.log(Level.INFO, "String Service Payload: {}" + payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); } public ResponseEntity execute(String url, HttpMethod method, IRequest payload, Class responseClazz) { - LOGGER.info("IRequest Service ID: {}", getServiceId(url)); + // LOGGER.info("IRequest Service ID: {}", getServiceId(url)); + LOGGER.log(Level.INFO, "IRequest Service ID: {}" + getServiceId(url)); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload, responseClazz); } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index eff051d5..096a06af 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; +import org.camunda.bpm.extension.hooks.services.FormSubmissionService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +28,9 @@ @Service("formAccessHandler") public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { - private final Logger logger = LoggerFactory.getLogger(FormAccessHandler.class.getName()); + // private final Logger logger = + // LoggerFactory.getLogger(FormAccessHandler.class.getName()); + private final Logger LOGGER = Logger.getLogger(FormAccessHandler.class.getName()); static final int TOKEN_EXPIRY_CODE = 404; @@ -48,18 +51,23 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay if (response.getStatusCodeValue() == TOKEN_EXPIRY_CODE) { exchange(url, method, payload, formioTokenServiceProvider.getAccessToken()); } - logger.info("Response code for service invocation: {}", response.getStatusCode()); + // logger.info("Response code for service invocation: {}", + // response.getStatusCode()); + LOGGER.log(Level.INFO, "Response code for service invocation: {}" + response.getStatusCode()); return response; } public ResponseEntity exchange(String url, HttpMethod method, String payload, String accessToken) { payload = (payload == null) ? new JsonObject().toString() : payload; - logger.info("HttpMethod=" + HttpMethod.PATCH.name()); - logger.info("method.name()=" + method.name()); + LOGGER.log(Level.INFO, "HttpMethod=" + HttpMethod.PATCH.name()); + LOGGER.log(Level.INFO, "method.name" + method.name()); + // logger.info("HttpMethod=" + HttpMethod.PATCH.name()); + // logger.info("method.name()=" + method.name()); if (HttpMethod.PATCH.name().equals(method.name())) { - logger.info("payload=" + payload); + LOGGER.log(Level.INFO, "payload" + payload); + // logger.info("payload=" + payload); Mono> entityMono = unauthenticatedWebClient.patch() .uri(url) .bodyValue(payload) From 7d47dfa70ba7beefefd5fc5a0af4197bc424b91c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 16:20:50 -0600 Subject: [PATCH 099/157] FormAccessHandler.java update --- .../commons/connector/support/FormAccessHandler.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 096a06af..7980c27f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -5,8 +5,8 @@ import org.camunda.bpm.extension.commons.connector.FormioTokenServiceProvider; import org.camunda.bpm.extension.hooks.exceptions.FormioServiceException; import org.camunda.bpm.extension.hooks.services.FormSubmissionService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +// import org.slf4j.Logger; +// import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpMethod; @@ -20,6 +20,10 @@ import java.util.Properties; import org.springframework.context.annotation.Primary; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * Form Access Handler. * This class serves as gateway for all formio interactions. From d356317c6545396be57059f40d609fca1235b2fa Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 16:32:12 -0600 Subject: [PATCH 100/157] FormAccessHandler updated --- .../extension/commons/connector/support/FormAccessHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 7980c27f..0e3a1aec 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -48,7 +48,7 @@ public class FormAccessHandler extends AbstractAccessHandler implements IAccessH public ResponseEntity exchange(String url, HttpMethod method, String payload) { String accessToken = formioTokenServiceProvider.getAccessToken(); if (StringUtils.isBlank(accessToken)) { - logger.info("Access token is blank. Cannot invoke service:{}", url); + // logger.info("Access token is blank. Cannot invoke service:{}", url); return null; } ResponseEntity response = exchange(url, method, payload, accessToken); From 920afb97112a88f69507faf898dd99f771d88e57 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 17:05:36 -0600 Subject: [PATCH 101/157] files updated. --- .../bpm/extension/commons/connector/HTTPServiceInvoker.java | 1 + .../commons/connector/support/FormAccessHandler.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 747477ed..535197b9 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -56,6 +56,7 @@ public ResponseEntity execute(String url, HttpMethod method, Object payl public ResponseEntity execute(String url, HttpMethod method, String payload) { // LOGGER.info("String Service ID: {}", getServiceId(url)); + LOGGER.log(Level.INFO, "StringUrl=" + url); LOGGER.log(Level.INFO, "String Service ID: {}" + getServiceId(url)); LOGGER.log(Level.INFO, "String Service Payload: {}" + payload); return accessHandlerFactory.getService(getServiceId(url)).exchange(url, method, payload); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 0e3a1aec..283bbf0e 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -65,11 +65,11 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay payload = (payload == null) ? new JsonObject().toString() : payload; LOGGER.log(Level.INFO, "HttpMethod=" + HttpMethod.PATCH.name()); - LOGGER.log(Level.INFO, "method.name" + method.name()); + LOGGER.log(Level.INFO, "method.name=" + method.name()); // logger.info("HttpMethod=" + HttpMethod.PATCH.name()); // logger.info("method.name()=" + method.name()); - if (HttpMethod.PATCH.name().equals(method.name())) { + if (HttpMethod.GET.name().equals(method.name())) { LOGGER.log(Level.INFO, "payload" + payload); // logger.info("payload=" + payload); Mono> entityMono = unauthenticatedWebClient.patch() From 0a2f37febd972f3a5f731561f2e3b74ad7a06169 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 17:27:35 -0600 Subject: [PATCH 102/157] files updated. --- .../commons/connector/HTTPServiceInvoker.java | 35 ++++++++++--------- .../connector/support/FormAccessHandler.java | 2 +- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java index 535197b9..69f93693 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/HTTPServiceInvoker.java @@ -75,23 +75,26 @@ public ResponseEntity executeWithParamsAndPayload(String url, HttpMethod } private String getServiceId(String url) { - - Boolean enableCustomSubmission = Boolean - .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); - if (isUrlValid(url, fetchUrlFromProperty(API_URL))) { - return APPLICATION_ACCESS_HANDLER; - } else if (isUrlValid(url, fetchUrlFromProperty(BPM_URL))) { - return BPM_ACCESS_HANDLER; - } else if (isUrlValid(url, fetchUrlFromProperty(ANALYSIS_URL))) { - return TEXT_ANALYZER_ACCESS_HANDLER; - } else if (isUrlValid(url, fetchUrlFromProperty(FORMIO_URL))) { - if (enableCustomSubmission && StringUtils.contains(url, "/submission")) { - return CUSTOM_SUBMISSION_ACCESS_HANDLER; - } else { - return FORM_ACCESS_HANDLER; - } + if (StringUtils.contains(url, getProperties().getProperty("api.url"))) { + return "applicationAccessHandler"; } - return ""; + return "formAccessHandler"; + // Boolean enableCustomSubmission = Boolean + // .valueOf(integrationCredentialProperties.getProperty("forms.enableCustomSubmission")); + // if (isUrlValid(url, fetchUrlFromProperty(API_URL))) { + // return APPLICATION_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(BPM_URL))) { + // return BPM_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(ANALYSIS_URL))) { + // return TEXT_ANALYZER_ACCESS_HANDLER; + // } else if (isUrlValid(url, fetchUrlFromProperty(FORMIO_URL))) { + // if (enableCustomSubmission && StringUtils.contains(url, "/submission")) { + // return CUSTOM_SUBMISSION_ACCESS_HANDLER; + // } else { + // return FORM_ACCESS_HANDLER; + // } + // } + // return ""; } private String fetchUrlFromProperty(String key) { diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 283bbf0e..3c6894b3 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -69,7 +69,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay // logger.info("HttpMethod=" + HttpMethod.PATCH.name()); // logger.info("method.name()=" + method.name()); - if (HttpMethod.GET.name().equals(method.name())) { + if (HttpMethod.PATCH.name().equals(method.name())) { LOGGER.log(Level.INFO, "payload" + payload); // logger.info("payload=" + payload); Mono> entityMono = unauthenticatedWebClient.patch() From e661f9045e74cb1145ccb5577de66c7dabdd7953 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 17:55:47 -0600 Subject: [PATCH 103/157] get decorated server url --- .../commons/connector/support/FormAccessHandler.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 3c6894b3..87786547 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -73,7 +73,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay LOGGER.log(Level.INFO, "payload" + payload); // logger.info("payload=" + payload); Mono> entityMono = unauthenticatedWebClient.patch() - .uri(url) + .uri(getDecoratedServerUrl(url)) .bodyValue(payload) .header("x-jwt-token", accessToken) .accept(MediaType.APPLICATION_JSON) @@ -102,4 +102,13 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay .block(); } } + + private String getDecoratedServerUrl(String url) { + if (StringUtils.contains(url, "/form/")) { + return getIntegrationCredentialProperties().getProperty("formio.url") + "/form/" + + StringUtils.substringAfter(url, "/form/"); + } + return getIntegrationCredentialProperties().getProperty("formio.url") + "/" + + StringUtils.substringAfterLast(url, "/"); + } } From 8130d2886808f592e88c052861d5abebf93b4644 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 18:36:40 -0600 Subject: [PATCH 104/157] getIntegrationCredentialProperties method added --- .../commons/connector/support/FormAccessHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 87786547..60c9b046 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -45,6 +45,10 @@ public class FormAccessHandler extends AbstractAccessHandler implements IAccessH @Autowired private FormioTokenServiceProvider formioTokenServiceProvider; + protected Properties getIntegrationCredentialProperties() { + return integrationCredentialProperties; + } + public ResponseEntity exchange(String url, HttpMethod method, String payload) { String accessToken = formioTokenServiceProvider.getAccessToken(); if (StringUtils.isBlank(accessToken)) { From c1e9c4fdd5a6c7e22e91acf12ef3652d396cf49d Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 18:59:30 -0600 Subject: [PATCH 105/157] FormAccessHandler.java updated --- .../extension/commons/connector/support/FormAccessHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index 60c9b046..dce47408 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -94,7 +94,7 @@ public ResponseEntity exchange(String url, HttpMethod method, String pay return response; } else { return unauthenticatedWebClient.method(method) - .uri(url) + .uri(getDecoratedServerUrl(url)) .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .header("x-jwt-token", accessToken) From db5f3f3f20e6ee308915312ebd904376b9c1052c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 16 Aug 2023 19:20:05 -0600 Subject: [PATCH 106/157] remove @Primary --- .../extension/commons/connector/support/FormAccessHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java index dce47408..6c8d3f3d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/commons/connector/support/FormAccessHandler.java @@ -18,7 +18,6 @@ import reactor.core.publisher.Mono; import java.util.Properties; -import org.springframework.context.annotation.Primary; import java.util.*; import java.util.logging.Level; @@ -28,7 +27,7 @@ * Form Access Handler. * This class serves as gateway for all formio interactions. */ -@Primary + @Service("formAccessHandler") public class FormAccessHandler extends AbstractAccessHandler implements IAccessHandler { From 4169d998cb5452daf6af317e8d788118a8175fde Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 17 Aug 2023 14:55:05 -0600 Subject: [PATCH 107/157] add logging for variables. --- .../hooks/listeners/AnalyticsListener.java | 193 ++++++++++-------- 1 file changed, 108 insertions(+), 85 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java index cc0fc00f..71c1506f 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java @@ -22,10 +22,11 @@ import java.util.logging.Logger; /** - * Java component for pushing the data to downstream analytics system. - * This invokes the database pipeline component for publishing data. + * Java component for pushing the data to downstream analytics system. + * This invokes the database pipeline component for publishing data. * - * Futuristic place-holder to inject the appropriate pipeline using service location pattern. + * Futuristic place-holder to inject the appropriate pipeline using service + * location pattern. * * @author sumathi.thirumani@aot-technologies.com */ @@ -38,18 +39,16 @@ public class AnalyticsListener implements TaskListener, ExecutionListener, IMess @Autowired private UserService userService; - - private final Logger LOGGER = Logger.getLogger(AnalyticsListener.class.getName()); - /** * This would be invoked by all the user based task services. * Invocation point is marked with value "COMPLETE" in process diagram. + * * @param task */ @Override - public void notify(DelegateTask task) { + public void notify(DelegateTask task) { LOGGER.info("\n\n ... AnalyticsDelegate invoked by task listener for " + "processDefinitionId=" + task.getProcessDefinitionId() + ", assignee=" + task.getAssignee() @@ -58,9 +57,10 @@ public void notify(DelegateTask task) { + " \n\n"); DelegateExecution execution = task.getExecution(); try { - Map rspVariableMap = dbdatapipeline.execute(injectAdditionalProcessingFields(execution,execution.getVariables())); + Map rspVariableMap = dbdatapipeline + .execute(injectAdditionalProcessingFields(execution, execution.getVariables())); if (IDataPipeline.ResponseStatus.FAILURE.name().equals(rspVariableMap.get("code"))) { - notifyForAttention(execution,rspVariableMap); + notifyForAttention(execution, rspVariableMap); } } catch (Exception e) { LOGGER.warning("Unable to insert record into analytics DB"); @@ -72,6 +72,7 @@ public void notify(DelegateTask task) { /** * This would be invoked during form submission. * Invocation point is marked with value "END" in process diagram. + * * @param execution * @throws Exception */ @@ -83,9 +84,10 @@ public void notify(DelegateExecution execution) throws Exception { + ", variables=" + execution.getVariables() + " \n\n"); try { - Map rspVariableMap = dbdatapipeline.execute(injectAdditionalProcessingFields(execution,execution.getVariables())); + Map rspVariableMap = dbdatapipeline + .execute(injectAdditionalProcessingFields(execution, execution.getVariables())); if (IDataPipeline.ResponseStatus.FAILURE.name().equals(rspVariableMap.get("code"))) { - notifyForAttention(execution,rspVariableMap); + notifyForAttention(execution, rspVariableMap); } } catch (Exception e) { LOGGER.warning("Unable to insert record into analytics DB"); @@ -96,66 +98,83 @@ public void notify(DelegateExecution execution) throws Exception { /** * This method is intended to inject additional fields for processing. - * Injected Fields : File Name, MimeType, Size, Pid. + * Injected Fields : File Name, MimeType, Size, Pid. + * * @param execution * @param rawMap * @return */ - private Map injectAdditionalProcessingFields(DelegateExecution execution,Map rawMap) { - Map variables = injectPrimaryKey(execution,rawMap); - Map prcMap = new HashMap<>(); + private Map injectAdditionalProcessingFields(DelegateExecution execution, + Map rawMap) { + Map variables = injectPrimaryKey(execution, rawMap); + Map prcMap = new HashMap<>(); String pid = execution.getId(); try { // Handles file & authenticated user information. - for(Map.Entry entry : variables.entrySet()) { - if(entry.getKey().endsWith("_idir")) { + for (Map.Entry entry : variables.entrySet()) { + if (entry.getKey().endsWith("_idir")) { String idir = entry.getValue() != null ? String.valueOf(entry.getValue()) : null; if (StringUtils.isNotEmpty(idir)) { - prcMap.put(entry.getKey(),entry.getValue()); - if(!execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"))) { - String idirName = getName(execution, userService, variables.get("provider_idir_userid").toString()); - execution.setVariable(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); - prcMap.put(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"),idirName); + prcMap.put(entry.getKey(), entry.getValue()); + if (!execution.getVariables() + .containsKey(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"))) { + String idirName = getName(execution, userService, + variables.get("provider_idir_userid").toString()); + execution.setVariable(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), + idirName); + prcMap.put(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); } } - } else if(!StringUtils.endsWith(entry.getKey(),"_file")) { - prcMap.put(entry.getKey(),entry.getValue()); + } else if (!StringUtils.endsWith(entry.getKey(), "_file")) { + LOGGER.info("ANALYTICS_VARIABLES" + + "key=" + entry.getKey() + + ", value=" + entry.getValue()); + prcMap.put(entry.getKey(), entry.getValue()); } // Commenting out the file handling for analytics listener. /** - if(StringUtils.endsWith(entry.getKey(),"_file")) { - if(!execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(),"_file").concat("_stream_id"))) { - String filePrefix = StringUtils.substringBefore(entry.getKey(), "_file"); - FileValue retrievedTypedFileValue = execution.getProcessEngineServices().getRuntimeService().getVariableTyped(pid, entry.getKey()); - if (retrievedTypedFileValue != null && retrievedTypedFileValue.getValue() != null) { - InputStream fileContent = retrievedTypedFileValue.getValue(); - String fileName = retrievedTypedFileValue.getFilename(); - String mimeType = retrievedTypedFileValue.getMimeType(); - byte[] fileBytes = IOUtils.toByteArray(fileContent); - int fileSize = fileBytes.length; - if (StringUtils.isNotEmpty(fileName) && fileSize > 0) { - prcMap.put(filePrefix.concat("_name"), fileName); - prcMap.put(filePrefix.concat("_mimetype"), mimeType); - prcMap.put(entry.getKey(), fileBytes); - prcMap.put(filePrefix.concat("_size"), fileSize); - String fileId = getUniqueIdentifierForFile(); - prcMap.put(filePrefix.concat("_stream_id"), fileId); - execution.setVariable(filePrefix.concat("_stream_id"), fileId); - } - } - } - } else if(entry.getKey().endsWith("_idir")) { - String idir = entry.getValue() != null ? String.valueOf(entry.getValue()) : null; - if (StringUtils.isNotEmpty(idir) && - !execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"))) { - String idirName = getName(execution, idir); - execution.setVariable(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); - prcMap.put(entry.getKey(),entry.getValue()); - prcMap.put(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"),idirName); - } - } else { - prcMap.put(entry.getKey(),entry.getValue()); - } */ + * if(StringUtils.endsWith(entry.getKey(),"_file")) { + * if(!execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(),"_file").concat("_stream_id"))) + * { + * String filePrefix = StringUtils.substringBefore(entry.getKey(), "_file"); + * FileValue retrievedTypedFileValue = + * execution.getProcessEngineServices().getRuntimeService().getVariableTyped(pid, + * entry.getKey()); + * if (retrievedTypedFileValue != null && retrievedTypedFileValue.getValue() != + * null) { + * InputStream fileContent = retrievedTypedFileValue.getValue(); + * String fileName = retrievedTypedFileValue.getFilename(); + * String mimeType = retrievedTypedFileValue.getMimeType(); + * byte[] fileBytes = IOUtils.toByteArray(fileContent); + * int fileSize = fileBytes.length; + * if (StringUtils.isNotEmpty(fileName) && fileSize > 0) { + * prcMap.put(filePrefix.concat("_name"), fileName); + * prcMap.put(filePrefix.concat("_mimetype"), mimeType); + * prcMap.put(entry.getKey(), fileBytes); + * prcMap.put(filePrefix.concat("_size"), fileSize); + * String fileId = getUniqueIdentifierForFile(); + * prcMap.put(filePrefix.concat("_stream_id"), fileId); + * execution.setVariable(filePrefix.concat("_stream_id"), fileId); + * } + * } + * } + * } else if(entry.getKey().endsWith("_idir")) { + * String idir = entry.getValue() != null ? String.valueOf(entry.getValue()) : + * null; + * if (StringUtils.isNotEmpty(idir) && + * !execution.getVariables().containsKey(StringUtils.substringBefore(entry.getKey(), + * "_idir").concat("_name"))) { + * String idirName = getName(execution, idir); + * execution.setVariable(StringUtils.substringBefore(entry.getKey(), + * "_idir").concat("_name"), idirName); + * prcMap.put(entry.getKey(),entry.getValue()); + * prcMap.put(StringUtils.substringBefore(entry.getKey(), + * "_idir").concat("_name"),idirName); + * } + * } else { + * prcMap.put(entry.getKey(),entry.getValue()); + * } + */ } } catch (Exception e) { e.printStackTrace(); @@ -165,50 +184,54 @@ private Map injectAdditionalProcessingFields(DelegateExecution ex /** * Evaluate this being injected from process diagram. + * * @return */ - private Map injectPrimaryKey(DelegateExecution execution,Map variables) { - if(execution.getVariables().containsKey("feature_by") && "task".equals(String.valueOf(execution.getVariable("feature_by")))) { - variables.put("pid",execution.getVariable("pid")); + private Map injectPrimaryKey(DelegateExecution execution, Map variables) { + if (execution.getVariables().containsKey("feature_by") + && "task".equals(String.valueOf(execution.getVariable("feature_by")))) { + variables.put("pid", execution.getVariable("pid")); } else { - if(!variables.containsKey("pid")) { + if (!variables.containsKey("pid")) { variables.put("pid", execution.getProcessInstanceId()); } } return variables; } - private void notifyForAttention(DelegateExecution execution, Exception exception){ - Map variables = new HashMap<>(); + private void notifyForAttention(DelegateExecution execution, Exception exception) { + Map variables = new HashMap<>(); try { - Map exVarMap = new HashMap<>(); - //Additional Response Fields - BEGIN - exVarMap.put("pid",execution.getId()); - exVarMap.put("subject",("Exception for ".concat(execution.getId()))); - exVarMap.put("category","analytics_service_exception"); - //Additional Response Fields - END - sendMessage(execution,exVarMap,getMessageName()); + Map exVarMap = new HashMap<>(); + // Additional Response Fields - BEGIN + exVarMap.put("pid", execution.getId()); + exVarMap.put("subject", ("Exception for ".concat(execution.getId()))); + exVarMap.put("category", "analytics_service_exception"); + // Additional Response Fields - END + sendMessage(execution, exVarMap, getMessageName()); LOGGER.info("\n\nMessage sent! " + "\n\n"); } catch (Exception ex) { - LOGGER.log(Level.SEVERE,"Exception occurred:"+ ExceptionUtils.exceptionStackTraceAsString(ex)); + LOGGER.log(Level.SEVERE, "Exception occurred:" + ExceptionUtils.exceptionStackTraceAsString(ex)); } } - private void notifyForAttention(DelegateExecution execution,Map rspVariableMap){ - if(IDataPipeline.ResponseStatus.FAILURE.name().equals(rspVariableMap.get("code"))) { - Map exVarMap = new HashMap<>(); - //Additional Response Fields - BEGIN - exVarMap.put("pid",execution.getId()); - exVarMap.put("subject",(String.valueOf(rspVariableMap.get("message")).concat(" for ").concat(execution.getId()))); - exVarMap.put("category","analytics_service_exception"); - for(Map.Entry entry : rspVariableMap.entrySet()) { - if(StringUtils.startsWith(entry.getKey(),"exception")) { - StringValue exceptionDataValue = Variables.stringValue(String.valueOf(rspVariableMap.get("exception")),true); - exVarMap.put(entry.getKey(),exceptionDataValue); + private void notifyForAttention(DelegateExecution execution, Map rspVariableMap) { + if (IDataPipeline.ResponseStatus.FAILURE.name().equals(rspVariableMap.get("code"))) { + Map exVarMap = new HashMap<>(); + // Additional Response Fields - BEGIN + exVarMap.put("pid", execution.getId()); + exVarMap.put("subject", + (String.valueOf(rspVariableMap.get("message")).concat(" for ").concat(execution.getId()))); + exVarMap.put("category", "analytics_service_exception"); + for (Map.Entry entry : rspVariableMap.entrySet()) { + if (StringUtils.startsWith(entry.getKey(), "exception")) { + StringValue exceptionDataValue = Variables + .stringValue(String.valueOf(rspVariableMap.get("exception")), true); + exVarMap.put(entry.getKey(), exceptionDataValue); } } - //Additional Response Fields - END - sendMessage(execution,exVarMap,getMessageName()); + // Additional Response Fields - END + sendMessage(execution, exVarMap, getMessageName()); LOGGER.info("\n\nMessage sent! " + "\n\n"); } } @@ -217,7 +240,7 @@ private String getUniqueIdentifierForFile() { return UUID.randomUUID().toString(); } - private String getMessageName(){ + private String getMessageName() { return "Service_Api_Message_Email"; } } From 24416365aa81709f98ace3a46602751b4696436c Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 17 Aug 2023 16:00:35 -0600 Subject: [PATCH 108/157] enable keycloak. --- .../extension/hooks/services/UserService.java | 2 +- .../keycloak/CamundaExtConfiguration.java | 21 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 877261d4..3b1dc223 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -30,7 +30,7 @@ public class UserService { private static final Logger LOG = LoggerFactory.getLogger(UserService.class); - @Autowired(required = false) + @Autowired private Keycloak keycloak; @Value("${keycloak.url.realm}") private String keycloakRealm; diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index e8a9c4fe..6fcf1516 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -57,15 +57,16 @@ public NamedParameterJdbcTemplate analyticsJdbcTemplate(@Qualifier("analyticsDS" public Properties messageBrokerProperties() { return new Properties(); } - // @Bean - // Keycloak keycloak() { - // return KeycloakBuilder.builder() - // .serverUrl(keycloakUrl) - // .realm(keycloakRealm) - // .clientId(keycloakClientId) - // .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - // .clientSecret(keycloakClientSecret) - // .build(); - // } + + @Bean + Keycloak keycloak() { + return KeycloakBuilder.builder() + .serverUrl(keycloakUrl) + .realm(keycloakRealm) + .clientId(keycloakClientId) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .clientSecret(keycloakClientSecret) + .build(); + } } From 7f540b3d598066f6597f8717b540b59e841d0358 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 17 Aug 2023 17:32:56 -0600 Subject: [PATCH 109/157] CamundaExtConfiguration.java updated --- .../extension/keycloak/CamundaExtConfiguration.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index 6fcf1516..e86c180d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -61,11 +61,11 @@ public Properties messageBrokerProperties() { @Bean Keycloak keycloak() { return KeycloakBuilder.builder() - .serverUrl(keycloakUrl) - .realm(keycloakRealm) - .clientId(keycloakClientId) - .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - .clientSecret(keycloakClientSecret) + .serverUrl("https://dev.loginproxy.gov.bc.ca") + .realm("servicebc") + .clientId("forms-flow-bpm") + .grantType("client_credentials") + .clientSecret("fYdhYzqQcBUQB2oRe0MuauIH4CvBmf4B") .build(); } From 076080c3841123f887172b3b695828513603e09a Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 17 Aug 2023 17:58:54 -0600 Subject: [PATCH 110/157] commit 7f540b3 reverted --- .../extension/keycloak/CamundaExtConfiguration.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index e86c180d..6fcf1516 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -61,11 +61,11 @@ public Properties messageBrokerProperties() { @Bean Keycloak keycloak() { return KeycloakBuilder.builder() - .serverUrl("https://dev.loginproxy.gov.bc.ca") - .realm("servicebc") - .clientId("forms-flow-bpm") - .grantType("client_credentials") - .clientSecret("fYdhYzqQcBUQB2oRe0MuauIH4CvBmf4B") + .serverUrl(keycloakUrl) + .realm(keycloakRealm) + .clientId(keycloakClientId) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .clientSecret(keycloakClientSecret) .build(); } From 2c8bc043ef437c4473d68daef2c7ea7c10850cf1 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 21 Aug 2023 14:48:14 -0600 Subject: [PATCH 111/157] CamundaExtConfiguration.java updated --- .../keycloak/CamundaExtConfiguration.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index 6fcf1516..a547eea8 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -61,12 +61,19 @@ public Properties messageBrokerProperties() { @Bean Keycloak keycloak() { return KeycloakBuilder.builder() - .serverUrl(keycloakUrl) - .realm(keycloakRealm) - .clientId(keycloakClientId) - .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - .clientSecret(keycloakClientSecret) + .serverUrl("https://dev.loginproxy.gov.bc.ca/auth") + .realm("servicebc") + .clientId("forms-flow-bpm") + .grantType("client_credentials") + .clientSecret("fYdhYzqQcBUQB2oRe0MuauIH4CvBmf4B") .build(); + // return KeycloakBuilder.builder() + // .serverUrl(keycloakUrl) + // .realm(keycloakRealm) + // .clientId(keycloakClientId) + // .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + // .clientSecret(keycloakClientSecret) + // .build(); } } From 8f8980c0686e25f0e4e3f028ef63ea5643aa83f1 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 21 Aug 2023 15:46:46 -0600 Subject: [PATCH 112/157] add realm --- .../org/camunda/bpm/extension/hooks/services/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 3b1dc223..ec6a4c3c 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -38,7 +38,7 @@ public class UserService { public User searchUserByAttribute(String attributeName, String attributeValue) { try { List users = keycloak - .realm(keycloakRealm) + .realm("servicebc") .users() .searchByAttributes(attributeName + ":" + attributeValue); UserRepresentation user = users.get(0); From ede5d1dba655d61ba8372db3da4b0222bf264813 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 21 Aug 2023 16:46:12 -0600 Subject: [PATCH 113/157] bug fix in UserService.java --- .../camunda/bpm/extension/hooks/services/UserService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index ec6a4c3c..4827acff 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -37,10 +37,14 @@ public class UserService { public User searchUserByAttribute(String attributeName, String attributeValue) { try { + // List users = keycloak + // .realm("servicebc") + // .users() + // .searchByAttributes(attributeName + ":" + attributeValue); List users = keycloak .realm("servicebc") .users() - .searchByAttributes(attributeName + ":" + attributeValue); + .searchByUsername(attributeValue, true); UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); String username = user.getUsername(); From 3360f349671256bc051454cf42db952c5d16b570 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 21 Aug 2023 17:50:27 -0600 Subject: [PATCH 114/157] revert back to variables --- .../extension/hooks/services/UserService.java | 2 +- .../keycloak/CamundaExtConfiguration.java | 17 +++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index 4827acff..f93b5f50 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -42,7 +42,7 @@ public User searchUserByAttribute(String attributeName, String attributeValue) { // .users() // .searchByAttributes(attributeName + ":" + attributeValue); List users = keycloak - .realm("servicebc") + .realm(keycloakRealm) .users() .searchByUsername(attributeValue, true); UserRepresentation user = users.get(0); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java index a547eea8..feb73f79 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/keycloak/CamundaExtConfiguration.java @@ -61,19 +61,12 @@ public Properties messageBrokerProperties() { @Bean Keycloak keycloak() { return KeycloakBuilder.builder() - .serverUrl("https://dev.loginproxy.gov.bc.ca/auth") - .realm("servicebc") - .clientId("forms-flow-bpm") - .grantType("client_credentials") - .clientSecret("fYdhYzqQcBUQB2oRe0MuauIH4CvBmf4B") + .serverUrl(keycloakUrl + "/auth") + .realm(keycloakRealm) + .clientId(keycloakClientId) + .grantType(OAuth2Constants.CLIENT_CREDENTIALS) + .clientSecret(keycloakClientSecret) .build(); - // return KeycloakBuilder.builder() - // .serverUrl(keycloakUrl) - // .realm(keycloakRealm) - // .clientId(keycloakClientId) - // .grantType(OAuth2Constants.CLIENT_CREDENTIALS) - // .clientSecret(keycloakClientSecret) - // .build(); } } From 3c8de76f7e88b85ce08a0c629b2aacf235b3a512 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 22 Aug 2023 09:11:40 -0600 Subject: [PATCH 115/157] add id to .nav-link --- .../forms-flow-web/src/containers/styles.scss | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index f6ad4daa..0c75bc4e 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -419,8 +419,10 @@ color: white; -webkit-filter: none !important; } -.nav-link { - display: block; - padding: 0.5rem 1rem; - color: white!important; -} \ No newline at end of file +#main-menu-nav { + .nav-link { + display: block; + padding: 0.5rem 1rem; + color: white!important; + } +} From 856a9a8b483e0e5d98373db0bf6a7617f1dd235f Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 28 Aug 2023 17:00:00 -0600 Subject: [PATCH 116/157] IUser.java updated --- .../bpm/extension/hooks/services/IUser.java | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index 56b3912b..c93951b4 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -12,29 +12,37 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; /** * This class aimed at centralizing all user related information. * - * @author sumathi.thirumani@aot-technologies.com, yichun.zhao@aot-technologies.com + * @author sumathi.thirumani@aot-technologies.com, + * yichun.zhao@aot-technologies.com */ public interface IUser { - default String getName(DelegateExecution execution,UserService userService, String userId) { + private final Logger LOGGER = Logger.getLogger(IUser.class.getName()); + + default String getName(DelegateExecution execution, UserService userService, String userId) { User user = getUser(execution, userService, userId); - return user.getFirstName()+" "+user.getLastName(); + return user.getFirstName() + " " + user.getLastName(); } - default String getEmail(DelegateExecution execution,UserService userService, String userId) { + default String getEmail(DelegateExecution execution, UserService userService, String userId) { User user = getUser(execution, userService, userId); return user.getEmail(); } - default User getUser(DelegateExecution execution,UserService userService, String userId) { + default User getUser(DelegateExecution execution, UserService userService, String userId) { String providerIdirUserId = execution.getVariable("provider_idir_userid").toString(); - User user = execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId).singleResult(); - user = userService.searchUserByAttribute("userid", userId); - if(user == null) { + User user = execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId) + .singleResult(); + // user = userService.searchUserByAttribute("userid", userId); + LOGGER.log(Level.INFO, "user" + user); + if (user == null) { user = userService.searchUserByAttribute("userid", userId); } return user; @@ -47,7 +55,7 @@ default String getDefaultAddresseName() { default List getEmailsOfUnassignedTask(DelegateTask delegateTask) { Set identityLinks = delegateTask.getCandidates(); List emails = new ArrayList<>(); - if(CollectionUtils.isNotEmpty(identityLinks)) { + if (CollectionUtils.isNotEmpty(identityLinks)) { for (IdentityLink entry : identityLinks) { if (StringUtils.isNotEmpty(entry.getGroupId())) { emails.addAll(getEmailsForGroup(delegateTask.getExecution(), entry.getGroupId())); @@ -59,10 +67,11 @@ default List getEmailsOfUnassignedTask(DelegateTask delegateTask) { default List getEmailsForGroup(DelegateExecution execution, String groupName) { List emails = new ArrayList<>(); - if(StringUtils.isNotBlank(groupName)) { - List users = execution.getProcessEngine().getIdentityService().createUserQuery().memberOfGroup(StringUtils.trim(groupName)).list(); - for(User entry : users) { - if(StringUtils.isNotEmpty(entry.getEmail())) { + if (StringUtils.isNotBlank(groupName)) { + List users = execution.getProcessEngine().getIdentityService().createUserQuery() + .memberOfGroup(StringUtils.trim(groupName)).list(); + for (User entry : users) { + if (StringUtils.isNotEmpty(entry.getEmail())) { emails.add(entry.getEmail()); } } @@ -72,18 +81,19 @@ default List getEmailsForGroup(DelegateExecution execution, String group /** * This adds business days to a Date object. - * Adapted from https://stackoverflow.com/questions/1044688/addbusinessdays-and-getbusinessdays + * Adapted from + * https://stackoverflow.com/questions/1044688/addbusinessdays-and-getbusinessdays * * @param date: The date to be changed * @param days: The number of days to be added */ default DateTime addBusinessDays(DateTime date, int days) { - if (days == 0) return date; + if (days == 0) + return date; if (date.getDayOfWeek() == 6) { date = date.plusDays(2); days -= 1; - } - else if (date.getDayOfWeek() == 7) { + } else if (date.getDayOfWeek() == 7) { date = date.plusDays(1); days -= 1; } @@ -96,5 +106,4 @@ else if (date.getDayOfWeek() == 7) { return date.plusDays(extraDays); } - } From 626e412537e0689f13f1896b81b2c9d4b8737556 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 28 Aug 2023 17:14:46 -0600 Subject: [PATCH 117/157] IUser.java changed --- .../java/org/camunda/bpm/extension/hooks/services/IUser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index c93951b4..f8a8c3f2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -24,8 +24,6 @@ */ public interface IUser { - private final Logger LOGGER = Logger.getLogger(IUser.class.getName()); - default String getName(DelegateExecution execution, UserService userService, String userId) { User user = getUser(execution, userService, userId); return user.getFirstName() + " " + user.getLastName(); @@ -41,6 +39,7 @@ default User getUser(DelegateExecution execution, UserService userService, Strin User user = execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId) .singleResult(); // user = userService.searchUserByAttribute("userid", userId); + Logger LOGGER = Logger.getLogger(IUser.class.getName()); LOGGER.log(Level.INFO, "user" + user); if (user == null) { user = userService.searchUserByAttribute("userid", userId); From 789c7e00ed08507d03992fa5d71130224d3b1d39 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 15:19:26 -0600 Subject: [PATCH 118/157] changes to AnalyticsListener & IUser.java --- .../hooks/listeners/AnalyticsListener.java | 2 +- .../bpm/extension/hooks/services/IUser.java | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java index 71c1506f..d2cc5049 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/AnalyticsListener.java @@ -119,7 +119,7 @@ private Map injectAdditionalProcessingFields(DelegateExecution e if (!execution.getVariables() .containsKey(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"))) { String idirName = getName(execution, userService, - variables.get("provider_idir_userid").toString()); + idir); execution.setVariable(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); prcMap.put(StringUtils.substringBefore(entry.getKey(), "_idir").concat("_name"), idirName); diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index f8a8c3f2..0642ec70 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -35,15 +35,19 @@ default String getEmail(DelegateExecution execution, UserService userService, St } default User getUser(DelegateExecution execution, UserService userService, String userId) { - String providerIdirUserId = execution.getVariable("provider_idir_userid").toString(); - User user = execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId) - .singleResult(); - // user = userService.searchUserByAttribute("userid", userId); - Logger LOGGER = Logger.getLogger(IUser.class.getName()); + User user = userService.searchUserByAttribute("userid", userId); LOGGER.log(Level.INFO, "user" + user); - if (user == null) { - user = userService.searchUserByAttribute("userid", userId); - } + // String providerIdirUserId = + // execution.getVariable("provider_idir_userid").toString(); + // User user = + // execution.getProcessEngine().getIdentityService().createUserQuery().userId(providerIdirUserId) + // .singleResult(); + // // user = userService.searchUserByAttribute("userid", userId); + // Logger LOGGER = Logger.getLogger(IUser.class.getName()); + // LOGGER.log(Level.INFO, "user" + user); + // if (user == null) { + // user = userService.searchUserByAttribute("userid", userId); + // } return user; } From 57e9972280e539a815656cbd3969c99b8bff686b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 15:54:53 -0600 Subject: [PATCH 119/157] variable LOGGER added --- .../java/org/camunda/bpm/extension/hooks/services/IUser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index 0642ec70..16154ea2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -36,6 +36,7 @@ default String getEmail(DelegateExecution execution, UserService userService, St default User getUser(DelegateExecution execution, UserService userService, String userId) { User user = userService.searchUserByAttribute("userid", userId); + Logger LOGGER = Logger.getLogger(IUser.class.getName()); LOGGER.log(Level.INFO, "user" + user); // String providerIdirUserId = // execution.getVariable("provider_idir_userid").toString(); From faa41d14e87c4a662ec5f2e650f4e9b5223e2f24 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 16:31:07 -0600 Subject: [PATCH 120/157] logger description changed --- .../java/org/camunda/bpm/extension/hooks/services/IUser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java index 16154ea2..577a317a 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/IUser.java @@ -37,7 +37,7 @@ default String getEmail(DelegateExecution execution, UserService userService, St default User getUser(DelegateExecution execution, UserService userService, String userId) { User user = userService.searchUserByAttribute("userid", userId); Logger LOGGER = Logger.getLogger(IUser.class.getName()); - LOGGER.log(Level.INFO, "user" + user); + LOGGER.log(Level.INFO, "UNIQUE_USER" + user); // String providerIdirUserId = // execution.getVariable("provider_idir_userid").toString(); // User user = From beda050a78561fe12deab43f5fd4cea48bd3b8e5 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 17:17:29 -0600 Subject: [PATCH 121/157] log info 'getAssignee' --- .../listeners/task/TimeoutNotifyListener.java | 87 ++++++++++--------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index bdc484a1..d88e47ee 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -1,9 +1,11 @@ package org.camunda.bpm.extension.hooks.listeners.task; +import java.beans.Expression; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import com.nimbusds.oauth2.sdk.util.CollectionUtils; @@ -22,7 +24,7 @@ * Timeout Task Listener to start a message event when the deadline is due */ @Component -public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { +public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { @Autowired private UserService userService; @@ -31,7 +33,6 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener private Expression currentDate; private static final Logger log = Logger.getLogger(TimeoutNotifyListener.class.getName()); - /** * This calculates time logic * and provides the necessary information to send message. @@ -39,69 +40,73 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener * @param delegateTask: The task which sends the message */ public void notify(DelegateTask delegateTask) { - DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null ? - new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) : new DateTime(); - DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) - : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); - String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null ? - String.valueOf(this.escalationGroup.getValue(delegateTask)) : null; - DateTime remindDate = addBusinessDays(dueDate, -1); - DateTime escalateDate = addBusinessDays(dueDate,1); - log.info("Timeout Notify listener invoked for pid="+delegateTask.getProcessInstanceId() - +"|due Date=" +dueDate.toLocalDate()+"|current Date="+currentDate.toLocalDate() - +"|escalation Date="+escalateDate.toLocalDate() - +"|reminder Date="+remindDate.toLocalDate()); - // Check if escalate first because reminder date is before escalation date - if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { - validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); - } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { - validateAssigneeAndNotify(delegateTask, "activity_reminder", null); - } + DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null + ? new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) + : new DateTime(); + DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) + : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); + String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null + ? String.valueOf(this.escalationGroup.getValue(delegateTask)) + : null; + DateTime remindDate = addBusinessDays(dueDate, -1); + DateTime escalateDate = addBusinessDays(dueDate, 1); + log.info("Timeout Notify listener invoked for pid=" + delegateTask.getProcessInstanceId() + + "|due Date=" + dueDate.toLocalDate() + "|current Date=" + currentDate.toLocalDate() + + "|escalation Date=" + escalateDate.toLocalDate() + + "|reminder Date=" + remindDate.toLocalDate()); + // Check if escalate first because reminder date is before escalation date + if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { + validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); + } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { + validateAssigneeAndNotify(delegateTask, "activity_reminder", null); + } } private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { List escalationGrpEmails = new ArrayList<>(); - if(StringUtils.isNotEmpty(escalationGroup)) { - escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(),escalationGroup)); + if (StringUtils.isNotEmpty(escalationGroup)) { + escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); } - if(StringUtils.isNotEmpty(delegateTask.getAssignee())) { + if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { + // LOGGER.log(Level.INFO, "GetAssignee" + delegateTask.getAssignee()); + log.info("GetAssignee" + delegateTask.getAssignee()); User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); - delegateTask.getExecution().setVariable("firstname",user.getFirstName()); - delegateTask.getExecution().setVariable("lastname",user.getLastName()); - delegateTask.getExecution().setVariable("name",user.getFirstName()+" "+user.getLastName()); + delegateTask.getExecution().setVariable("firstname", user.getFirstName()); + delegateTask.getExecution().setVariable("lastname", user.getLastName()); + delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); List userEmails = new ArrayList<>(); - if(StringUtils.isNotEmpty(user.getEmail())) { + if (StringUtils.isNotEmpty(user.getEmail())) { userEmails.add(user.getEmail()); - sendEmailNotification(delegateTask.getExecution(), category,userEmails - , escalationGrpEmails,delegateTask.getId()); + sendEmailNotification(delegateTask.getExecution(), category, userEmails, escalationGrpEmails, + delegateTask.getId()); } } else { - delegateTask.getExecution().setVariable("name",getDefaultAddresseName()); - sendEmailNotification(delegateTask.getExecution(),category, - getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails,delegateTask.getId()); + delegateTask.getExecution().setVariable("name", getDefaultAddresseName()); + sendEmailNotification(delegateTask.getExecution(), category, + getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails, delegateTask.getId()); } } - private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, List ccEmails,String taskId) { - String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails,",") : null; - String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails,",") : null; - if(StringUtils.isNotEmpty(toAddress)) { + private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, + List ccEmails, String taskId) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails, ",") : null; + String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails, ",") : null; + if (StringUtils.isNotEmpty(toAddress)) { Map emailAttributes = new HashMap<>(); emailAttributes.put("to", toAddress); - if(StringUtils.isNotEmpty(ccAddress)) { + if (StringUtils.isNotEmpty(ccAddress)) { emailAttributes.put("cc", ccAddress); } emailAttributes.put("category", category); emailAttributes.put("taskid", taskId); log.info("Inside notify attributes:" + emailAttributes); - if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { - sendMessage(execution, emailAttributes,getMessageName(execution)); + if (StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress, "@") > 0) { + sendMessage(execution, emailAttributes, getMessageName(execution)); } } } - - private String getMessageName(DelegateExecution execution){ + private String getMessageName(DelegateExecution execution) { return String.valueOf(this.messageName.getValue(execution)); } From 8d6e517d899f4c3e651639ce22e776ddccd1f8ab Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 17:46:25 -0600 Subject: [PATCH 122/157] Revert "log info 'getAssignee'" This reverts commit beda050a78561fe12deab43f5fd4cea48bd3b8e5. --- .../listeners/task/TimeoutNotifyListener.java | 87 +++++++++---------- 1 file changed, 41 insertions(+), 46 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index d88e47ee..bdc484a1 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -1,11 +1,9 @@ package org.camunda.bpm.extension.hooks.listeners.task; -import java.beans.Expression; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; import com.nimbusds.oauth2.sdk.util.CollectionUtils; @@ -24,7 +22,7 @@ * Timeout Task Listener to start a message event when the deadline is due */ @Component -public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { +public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { @Autowired private UserService userService; @@ -33,6 +31,7 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener, private Expression currentDate; private static final Logger log = Logger.getLogger(TimeoutNotifyListener.class.getName()); + /** * This calculates time logic * and provides the necessary information to send message. @@ -40,73 +39,69 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener, * @param delegateTask: The task which sends the message */ public void notify(DelegateTask delegateTask) { - DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null - ? new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) - : new DateTime(); - DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) - : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); - String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null - ? String.valueOf(this.escalationGroup.getValue(delegateTask)) - : null; - DateTime remindDate = addBusinessDays(dueDate, -1); - DateTime escalateDate = addBusinessDays(dueDate, 1); - log.info("Timeout Notify listener invoked for pid=" + delegateTask.getProcessInstanceId() - + "|due Date=" + dueDate.toLocalDate() + "|current Date=" + currentDate.toLocalDate() - + "|escalation Date=" + escalateDate.toLocalDate() - + "|reminder Date=" + remindDate.toLocalDate()); - // Check if escalate first because reminder date is before escalation date - if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { - validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); - } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { - validateAssigneeAndNotify(delegateTask, "activity_reminder", null); - } + DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null ? + new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) : new DateTime(); + DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) + : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); + String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null ? + String.valueOf(this.escalationGroup.getValue(delegateTask)) : null; + DateTime remindDate = addBusinessDays(dueDate, -1); + DateTime escalateDate = addBusinessDays(dueDate,1); + log.info("Timeout Notify listener invoked for pid="+delegateTask.getProcessInstanceId() + +"|due Date=" +dueDate.toLocalDate()+"|current Date="+currentDate.toLocalDate() + +"|escalation Date="+escalateDate.toLocalDate() + +"|reminder Date="+remindDate.toLocalDate()); + // Check if escalate first because reminder date is before escalation date + if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { + validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); + } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { + validateAssigneeAndNotify(delegateTask, "activity_reminder", null); + } } private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { List escalationGrpEmails = new ArrayList<>(); - if (StringUtils.isNotEmpty(escalationGroup)) { - escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); + if(StringUtils.isNotEmpty(escalationGroup)) { + escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(),escalationGroup)); } - if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { - // LOGGER.log(Level.INFO, "GetAssignee" + delegateTask.getAssignee()); - log.info("GetAssignee" + delegateTask.getAssignee()); + if(StringUtils.isNotEmpty(delegateTask.getAssignee())) { User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); - delegateTask.getExecution().setVariable("firstname", user.getFirstName()); - delegateTask.getExecution().setVariable("lastname", user.getLastName()); - delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); + delegateTask.getExecution().setVariable("firstname",user.getFirstName()); + delegateTask.getExecution().setVariable("lastname",user.getLastName()); + delegateTask.getExecution().setVariable("name",user.getFirstName()+" "+user.getLastName()); List userEmails = new ArrayList<>(); - if (StringUtils.isNotEmpty(user.getEmail())) { + if(StringUtils.isNotEmpty(user.getEmail())) { userEmails.add(user.getEmail()); - sendEmailNotification(delegateTask.getExecution(), category, userEmails, escalationGrpEmails, - delegateTask.getId()); + sendEmailNotification(delegateTask.getExecution(), category,userEmails + , escalationGrpEmails,delegateTask.getId()); } } else { - delegateTask.getExecution().setVariable("name", getDefaultAddresseName()); - sendEmailNotification(delegateTask.getExecution(), category, - getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails, delegateTask.getId()); + delegateTask.getExecution().setVariable("name",getDefaultAddresseName()); + sendEmailNotification(delegateTask.getExecution(),category, + getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails,delegateTask.getId()); } } - private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, - List ccEmails, String taskId) { - String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails, ",") : null; - String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails, ",") : null; - if (StringUtils.isNotEmpty(toAddress)) { + private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, List ccEmails,String taskId) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails,",") : null; + String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails,",") : null; + if(StringUtils.isNotEmpty(toAddress)) { Map emailAttributes = new HashMap<>(); emailAttributes.put("to", toAddress); - if (StringUtils.isNotEmpty(ccAddress)) { + if(StringUtils.isNotEmpty(ccAddress)) { emailAttributes.put("cc", ccAddress); } emailAttributes.put("category", category); emailAttributes.put("taskid", taskId); log.info("Inside notify attributes:" + emailAttributes); - if (StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress, "@") > 0) { - sendMessage(execution, emailAttributes, getMessageName(execution)); + if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { + sendMessage(execution, emailAttributes,getMessageName(execution)); } } } - private String getMessageName(DelegateExecution execution) { + + private String getMessageName(DelegateExecution execution){ return String.valueOf(this.messageName.getValue(execution)); } From 2e68b7a672c9b8b7b8f77928f74ef25d88287588 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 18:29:19 -0600 Subject: [PATCH 123/157] TimeoutNotifyListener.java updated --- .../listeners/task/TimeoutNotifyListener.java | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index bdc484a1..70174dac 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -22,7 +22,7 @@ * Timeout Task Listener to start a message event when the deadline is due */ @Component -public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { +public class TimeoutNotifyListener extends BaseListener implements TaskListener, IMessageEvent { @Autowired private UserService userService; @@ -31,7 +31,6 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener private Expression currentDate; private static final Logger log = Logger.getLogger(TimeoutNotifyListener.class.getName()); - /** * This calculates time logic * and provides the necessary information to send message. @@ -39,69 +38,72 @@ public class TimeoutNotifyListener extends BaseListener implements TaskListener * @param delegateTask: The task which sends the message */ public void notify(DelegateTask delegateTask) { - DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null ? - new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) : new DateTime(); - DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) - : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); - String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null ? - String.valueOf(this.escalationGroup.getValue(delegateTask)) : null; - DateTime remindDate = addBusinessDays(dueDate, -1); - DateTime escalateDate = addBusinessDays(dueDate,1); - log.info("Timeout Notify listener invoked for pid="+delegateTask.getProcessInstanceId() - +"|due Date=" +dueDate.toLocalDate()+"|current Date="+currentDate.toLocalDate() - +"|escalation Date="+escalateDate.toLocalDate() - +"|reminder Date="+remindDate.toLocalDate()); - // Check if escalate first because reminder date is before escalation date - if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { - validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); - } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { - validateAssigneeAndNotify(delegateTask, "activity_reminder", null); - } + DateTime currentDate = this.currentDate != null && this.currentDate.getValue(delegateTask) != null + ? new DateTime(String.valueOf(this.currentDate.getValue(delegateTask))) + : new DateTime(); + DateTime dueDate = delegateTask.getDueDate() != null ? new DateTime(delegateTask.getDueDate()) + : new DateTime(delegateTask.getExecution().getVariable("task_due_date")); + String escalationGroup = this.escalationGroup != null && this.escalationGroup.getValue(delegateTask) != null + ? String.valueOf(this.escalationGroup.getValue(delegateTask)) + : null; + DateTime remindDate = addBusinessDays(dueDate, -1); + DateTime escalateDate = addBusinessDays(dueDate, 1); + log.info("Timeout Notify listener invoked for pid=" + delegateTask.getProcessInstanceId() + + "|due Date=" + dueDate.toLocalDate() + "|current Date=" + currentDate.toLocalDate() + + "|escalation Date=" + escalateDate.toLocalDate() + + "|reminder Date=" + remindDate.toLocalDate()); + // Check if escalate first because reminder date is before escalation date + if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { + validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); + } else if (currentDate.toLocalDate().equals(remindDate.toLocalDate())) { + validateAssigneeAndNotify(delegateTask, "activity_reminder", null); + } } private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { List escalationGrpEmails = new ArrayList<>(); - if(StringUtils.isNotEmpty(escalationGroup)) { - escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(),escalationGroup)); + if (StringUtils.isNotEmpty(escalationGroup)) { + escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); } - if(StringUtils.isNotEmpty(delegateTask.getAssignee())) { + if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { + log.info("GetAssigneeInfo" + delegateTask.getAssignee()); User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); - delegateTask.getExecution().setVariable("firstname",user.getFirstName()); - delegateTask.getExecution().setVariable("lastname",user.getLastName()); - delegateTask.getExecution().setVariable("name",user.getFirstName()+" "+user.getLastName()); + delegateTask.getExecution().setVariable("firstname", user.getFirstName()); + delegateTask.getExecution().setVariable("lastname", user.getLastName()); + delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); List userEmails = new ArrayList<>(); - if(StringUtils.isNotEmpty(user.getEmail())) { + if (StringUtils.isNotEmpty(user.getEmail())) { userEmails.add(user.getEmail()); - sendEmailNotification(delegateTask.getExecution(), category,userEmails - , escalationGrpEmails,delegateTask.getId()); + sendEmailNotification(delegateTask.getExecution(), category, userEmails, escalationGrpEmails, + delegateTask.getId()); } } else { - delegateTask.getExecution().setVariable("name",getDefaultAddresseName()); - sendEmailNotification(delegateTask.getExecution(),category, - getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails,delegateTask.getId()); + delegateTask.getExecution().setVariable("name", getDefaultAddresseName()); + sendEmailNotification(delegateTask.getExecution(), category, + getEmailsOfUnassignedTask(delegateTask), escalationGrpEmails, delegateTask.getId()); } } - private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, List ccEmails,String taskId) { - String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails,",") : null; - String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails,",") : null; - if(StringUtils.isNotEmpty(toAddress)) { + private void sendEmailNotification(DelegateExecution execution, String category, List toEmails, + List ccEmails, String taskId) { + String toAddress = CollectionUtils.isNotEmpty(toEmails) ? StringUtils.join(toEmails, ",") : null; + String ccAddress = CollectionUtils.isNotEmpty(ccEmails) ? StringUtils.join(ccEmails, ",") : null; + if (StringUtils.isNotEmpty(toAddress)) { Map emailAttributes = new HashMap<>(); emailAttributes.put("to", toAddress); - if(StringUtils.isNotEmpty(ccAddress)) { + if (StringUtils.isNotEmpty(ccAddress)) { emailAttributes.put("cc", ccAddress); } emailAttributes.put("category", category); emailAttributes.put("taskid", taskId); log.info("Inside notify attributes:" + emailAttributes); - if(StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress,"@") > 0) { - sendMessage(execution, emailAttributes,getMessageName(execution)); + if (StringUtils.isNotBlank(toAddress) && StringUtils.indexOf(toAddress, "@") > 0) { + sendMessage(execution, emailAttributes, getMessageName(execution)); } } } - - private String getMessageName(DelegateExecution execution){ + private String getMessageName(DelegateExecution execution) { return String.valueOf(this.messageName.getValue(execution)); } From 2dc81b2f8d8ac3080ccf02ee8c29d0ef4bbb8bfe Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 19:17:10 -0600 Subject: [PATCH 124/157] TimeoutNotifyListener updated --- .../hooks/listeners/task/TimeoutNotifyListener.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index 70174dac..f12d433a 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -1,9 +1,11 @@ package org.camunda.bpm.extension.hooks.listeners.task; +import java.beans.Expression; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import com.nimbusds.oauth2.sdk.util.CollectionUtils; @@ -66,8 +68,9 @@ private void validateAssigneeAndNotify(DelegateTask delegateTask, String categor escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); } if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { - log.info("GetAssigneeInfo" + delegateTask.getAssignee()); User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); + log.info("Assignee Info: " + delegateTask.getAssignee()); + LOGGER.log(Level.INFO, "Assignee Info: " + delegateTask.getAssignee()); delegateTask.getExecution().setVariable("firstname", user.getFirstName()); delegateTask.getExecution().setVariable("lastname", user.getLastName()); delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); From 01c7a7c3d6a699aec5b78b238b56d12306774e91 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 19:31:22 -0600 Subject: [PATCH 125/157] LOGGER variable corrected --- .../extension/hooks/listeners/task/TimeoutNotifyListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index f12d433a..5d721f36 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -70,7 +70,7 @@ private void validateAssigneeAndNotify(DelegateTask delegateTask, String categor if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); log.info("Assignee Info: " + delegateTask.getAssignee()); - LOGGER.log(Level.INFO, "Assignee Info: " + delegateTask.getAssignee()); + Logger.log(Level.INFO, "Assignee Info: " + delegateTask.getAssignee()); delegateTask.getExecution().setVariable("firstname", user.getFirstName()); delegateTask.getExecution().setVariable("lastname", user.getLastName()); delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); From 74a416de71a499e5c2b940d60328f3f851ec37c9 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 20:14:59 -0600 Subject: [PATCH 126/157] add log --- .../hooks/listeners/task/TimeoutNotifyListener.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index 5d721f36..54f84102 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -1,11 +1,9 @@ package org.camunda.bpm.extension.hooks.listeners.task; -import java.beans.Expression; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; import com.nimbusds.oauth2.sdk.util.CollectionUtils; @@ -64,13 +62,12 @@ public void notify(DelegateTask delegateTask) { private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { List escalationGrpEmails = new ArrayList<>(); + log.info("DELEGATE_TASK_USER:" + delegateTask.getAssignee()); if (StringUtils.isNotEmpty(escalationGroup)) { escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); } if (StringUtils.isNotEmpty(delegateTask.getAssignee())) { User user = getUser(delegateTask.getExecution(), userService, delegateTask.getAssignee()); - log.info("Assignee Info: " + delegateTask.getAssignee()); - Logger.log(Level.INFO, "Assignee Info: " + delegateTask.getAssignee()); delegateTask.getExecution().setVariable("firstname", user.getFirstName()); delegateTask.getExecution().setVariable("lastname", user.getLastName()); delegateTask.getExecution().setVariable("name", user.getFirstName() + " " + user.getLastName()); From e3e43b51628ec8dc547553f02637bc70796075c1 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 7 Sep 2023 20:52:22 -0600 Subject: [PATCH 127/157] add log before escalate --- .../extension/hooks/listeners/task/TimeoutNotifyListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java index 54f84102..bd11beb2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/listeners/task/TimeoutNotifyListener.java @@ -52,6 +52,8 @@ public void notify(DelegateTask delegateTask) { + "|due Date=" + dueDate.toLocalDate() + "|current Date=" + currentDate.toLocalDate() + "|escalation Date=" + escalateDate.toLocalDate() + "|reminder Date=" + remindDate.toLocalDate()); + + log.info("DELEGATE_TASK_USER_BEFORE_ESCALATE:" + delegateTask.getAssignee()); // Check if escalate first because reminder date is before escalation date if (currentDate.toLocalDate().equals(escalateDate.toLocalDate()) && StringUtils.isNotEmpty(escalationGroup)) { validateAssigneeAndNotify(delegateTask, "activity_escalation", escalationGroup); @@ -62,7 +64,7 @@ public void notify(DelegateTask delegateTask) { private void validateAssigneeAndNotify(DelegateTask delegateTask, String category, String escalationGroup) { List escalationGrpEmails = new ArrayList<>(); - log.info("DELEGATE_TASK_USER:" + delegateTask.getAssignee()); + log.info("DELEGATE_TASK_USER_AFTER_ESCALATE:" + delegateTask.getAssignee()); if (StringUtils.isNotEmpty(escalationGroup)) { escalationGrpEmails.addAll(getEmailsForGroup(delegateTask.getExecution(), escalationGroup)); } From 2eb9070e67377a02b78a061357ec1f4e8086ae54 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 8 Sep 2023 09:51:43 -0600 Subject: [PATCH 128/157] .active-tab-dropdown bg changed --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index 0c75bc4e..c5051e56 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -414,7 +414,7 @@ color: white; } .active-tab-dropdown { - background-color: #003366 !important; + //background-color: #003366 !important; filter: none !important; -webkit-filter: none !important; } From a2467a2d3377231aa22683f10670dd1dce090d1d Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 8 Sep 2023 10:19:10 -0600 Subject: [PATCH 129/157] dropdown-toggle color changed --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 2 +- apps/forms-flow-ai/forms-flow-web/src/styles.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index c5051e56..635881a4 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -264,7 +264,7 @@ } .dropdown-toggle{ margin-right: 1rem; -color: white; +//color: white; } .form-icons-active:active { // fill: #4d61fc !important; diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index 8191377c..373b4077 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -214,7 +214,7 @@ i.fa.fa-question-circle.text-muted { box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); } .dropdown-toggle { - color: white !important; + //color: white !important; a { text-decoration: none; } From eca614d98b825a7fba75fa931b990a524851fe5b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 8 Sep 2023 12:29:15 -0600 Subject: [PATCH 130/157] UserService.java updated --- .../org/camunda/bpm/extension/hooks/services/UserService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java index f93b5f50..9b65c63d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/UserService.java @@ -44,7 +44,8 @@ public User searchUserByAttribute(String attributeName, String attributeValue) { List users = keycloak .realm(keycloakRealm) .users() - .searchByUsername(attributeValue, true); + .searchByAttributes(attributeName + ":" + attributeValue); + // .searchByUsername(attributeValue, true); UserRepresentation user = users.get(0); UserEntity result = new UserEntity(); String username = user.getUsername(); From ed98251ed35d3c9acdeb9e7a05fc379d20201d99 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 10 Oct 2023 14:13:32 -0600 Subject: [PATCH 131/157] add TaskHeader.js --- .../ServiceFlow/details/TaskHeader.js | 362 ++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js new file mode 100644 index 00000000..3dcfa298 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -0,0 +1,362 @@ +import React, { useEffect, useState } from "react"; +import { Row, Col } from "react-bootstrap"; +import { + getISODateTime, + getFormattedDateAndTime, + getProcessDataObjectFromList, +} from "../../../apiManager/services/formatterService"; +import { useDispatch, useSelector } from "react-redux"; +import DatePicker from "react-datepicker"; +import moment from "moment"; +import "react-datepicker/dist/react-datepicker.css"; +import "./../ServiceFlow.scss"; +import AddGroupModal from "./AddGroupModal"; +import { + claimBPMTask, + // fetchFilterList, + fetchServiceTaskList, + getBPMTaskDetail, + unClaimBPMTask, + updateAssigneeBPMTask, + updateBPMTask, +} from "../../../apiManager/services/bpmTaskServices"; +import { setBPMTaskDetailUpdating } from "../../../actions/bpmTaskActions"; +//import UserSelection from "./UserSelection"; +import UserSelectionDebounce from "./UserSelectionDebounce"; +import SocketIOService from "../../../services/SocketIOService"; +import { useTranslation } from "react-i18next"; + +const TaskHeader = React.memo(() => { + const task = useSelector((state) => state.bpmTasks.taskDetail); + const taskId = useSelector((state) => state.bpmTasks.taskId); + const processList = useSelector((state) => state.bpmTasks.processList); + const username = useSelector( + (state) => state.user?.userDetail?.preferred_username || "" + ); + const taskGroups = useSelector((state) => state.bpmTasks.taskGroups); + const selectedFilter = useSelector((state) => state.bpmTasks.selectedFilter); + const reqData = useSelector((state) => state.bpmTasks.listReqParams); + const firstResult = useSelector((state) => state.bpmTasks.firstResult); + const [followUpDate, setFollowUpDate] = useState(null); + const [dueDate, setDueDate] = useState(null); + const [showModal, setModal] = useState(false); + const [isEditAssignee, setIsEditAssignee] = useState(false); + const dispatch = useDispatch(); + const { t } = useTranslation(); + useEffect(() => { + const followUp = task?.followUp ? new Date(task?.followUp) : null; + setFollowUpDate(followUp); + }, [task?.followUp]); + + useEffect(() => { + const due = task?.due ? new Date(task?.due) : null; + setDueDate(due); + }, [task?.due]); + + const onClaim = () => { + dispatch(setBPMTaskDetailUpdating(true)); + dispatch( + // eslint-disable-next-line no-unused-vars + claimBPMTask(taskId, username, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + if (selectedFilter) { + dispatch(getBPMTaskDetail(taskId)); + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + dispatch(setBPMTaskDetailUpdating(false)); + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + } + if(selectedFilter){ + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + dispatch(setBPMTaskDetailUpdating(false)); + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + const onChangeClaim = (userId) => { + setIsEditAssignee(false); + if (userId && userId !== task.assignee) { + dispatch(setBPMTaskDetailUpdating(true)); + dispatch( + // eslint-disable-next-line no-unused-vars + updateAssigneeBPMTask(taskId, userId, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + if (selectedFilter) { + dispatch(getBPMTaskDetail(taskId)); + dispatch(setBPMTaskDetailUpdating(false)); + } + } + if(selectedFilter){ + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + dispatch(setBPMTaskDetailUpdating(false)); + + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + } + }; + + const onUnClaimTask = () => { + dispatch(setBPMTaskDetailUpdating(true)); + dispatch( + // eslint-disable-next-line no-unused-vars + unClaimBPMTask(taskId, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + if (selectedFilter) { + dispatch(getBPMTaskDetail(taskId)); + dispatch(setBPMTaskDetailUpdating(false)); + } + } + if(selectedFilter){ + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + dispatch(setBPMTaskDetailUpdating(false)); + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + + const onFollowUpDateUpdate = (followUpDate) => { + setFollowUpDate(followUpDate); + dispatch(setBPMTaskDetailUpdating(true)); + const updatedTask = { + ...task, + ...{ followUp: followUpDate ? getISODateTime(followUpDate) : null }, + }; + dispatch( + // eslint-disable-next-line no-unused-vars + updateBPMTask(taskId, updatedTask, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + dispatch(getBPMTaskDetail(taskId)); + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + + const onDueDateUpdate = (dueDate) => { + setDueDate(dueDate); + dispatch(setBPMTaskDetailUpdating(true)); + const updatedTask = { + ...task, + ...{ due: dueDate ? getISODateTime(dueDate) : null }, + }; + dispatch( + // eslint-disable-next-line no-unused-vars + updateBPMTask(taskId, updatedTask, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + dispatch(getBPMTaskDetail(taskId)); + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + + // eslint-disable-next-line no-unused-vars + const FollowUpDateInput = React.forwardRef(({ value, onClick }, ref) => { + return ( +
+ {" "} + {followUpDate ? ( + {moment(followUpDate).fromNow()} + ) : ( + t("Set follow-up Date") + )} +
+ ); + }); + + // eslint-disable-next-line no-unused-vars + const DueDateInput = React.forwardRef(({ value, onClick }, ref) => { + return ( +
+ {" "} + {dueDate ? ( + {moment(dueDate).fromNow()} + ) : ( + t("Set Due date") + )} +
+ ); + }); + + const getGroups = (groups) => { + return groups?.map((group) => group.groupId).join(", "); + }; + + return ( + <> + setModal(false)} + groups={taskGroups} + /> + {task?.name} + + + {" "} + { + getProcessDataObjectFromList(processList, task?.processDefinitionId) + ?.name + } + + + + + {t("Application ID")}# {task?.applicationId} + + + + + } + /> + + + } + /> + + setModal(true)} + data-title={t("groups")} + > + + {taskGroups.length === 0 ? ( + {t("Add groups")} + ) : ( + {getGroups(taskGroups)} + )} + + + {isEditAssignee ? ( + task?.assignee ? ( + + setIsEditAssignee(false)} + currentUser={task.assignee} + onChangeClaim={onChangeClaim} + /> + + ) : ( + + {" "} + {t("Claim")} + + ) + ) : ( + <> + + {task?.assignee ? ( + + setIsEditAssignee(true)} + data-title={t("Click to Change Assignee")} + > + {task.assignee} + + + + ) : ( + + {t("Claim")} + + )} + + )} + + + + ); +}); + +export default TaskHeader; From a265de09cd70abececd8384bc3e2bb290a0f8d59 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 11 Oct 2023 11:06:12 -0600 Subject: [PATCH 132/157] add logging for error & response --- .../src/components/ServiceFlow/details/TaskHeader.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index 3dcfa298..85749be0 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -58,6 +58,8 @@ const TaskHeader = React.memo(() => { dispatch( // eslint-disable-next-line no-unused-vars claimBPMTask(taskId, username, (err, response) => { + console.log("claimBPMTaskErr", err); + console.log("claimBPMTaskResponse", response); if (!err) { if (!SocketIOService.isConnected()) { if (selectedFilter) { From 93ec550be4e491ab8db5ce7248aa6c555181d45a Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 11 Oct 2023 17:27:20 -0600 Subject: [PATCH 133/157] logging for selectedFilter & SocketIOService --- .../src/components/ServiceFlow/details/TaskHeader.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index 85749be0..c02af129 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -60,8 +60,10 @@ const TaskHeader = React.memo(() => { claimBPMTask(taskId, username, (err, response) => { console.log("claimBPMTaskErr", err); console.log("claimBPMTaskResponse", response); + console.log("claimBPMTaskSelectedFilter", selectedFilter); + console.log("claimBPMTaskSocket", SocketIOService.isConnected()); if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch( @@ -71,7 +73,7 @@ const TaskHeader = React.memo(() => { } else { dispatch(setBPMTaskDetailUpdating(false)); } - } + //} if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) From d343eef9bda1f08057fa4db81e7631cedd602443 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 11 Oct 2023 18:06:05 -0600 Subject: [PATCH 134/157] changes to onChangeClaim & onUnClaimTask --- .../src/components/ServiceFlow/details/TaskHeader.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index c02af129..b7b0c401 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -95,12 +95,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars updateAssigneeBPMTask(taskId, userId, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch(setBPMTaskDetailUpdating(false)); } - } + //} if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) @@ -123,12 +123,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars unClaimBPMTask(taskId, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch(setBPMTaskDetailUpdating(false)); } - } + //} if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) From f95c3e26f01a32dc32c6f7844a043617b0fec4a3 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 12 Oct 2023 14:28:41 -0600 Subject: [PATCH 135/157] revert previous commit --- .../src/components/ServiceFlow/details/TaskHeader.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index b7b0c401..db051743 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -63,7 +63,7 @@ const TaskHeader = React.memo(() => { console.log("claimBPMTaskSelectedFilter", selectedFilter); console.log("claimBPMTaskSocket", SocketIOService.isConnected()); if (!err) { - //if (!SocketIOService.isConnected()) { + if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch( @@ -73,7 +73,7 @@ const TaskHeader = React.memo(() => { } else { dispatch(setBPMTaskDetailUpdating(false)); } - //} + } if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) @@ -95,12 +95,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars updateAssigneeBPMTask(taskId, userId, (err, response) => { if (!err) { - //if (!SocketIOService.isConnected()) { + if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch(setBPMTaskDetailUpdating(false)); } - //} + } if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) @@ -123,12 +123,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars unClaimBPMTask(taskId, (err, response) => { if (!err) { - //if (!SocketIOService.isConnected()) { + if (!SocketIOService.isConnected()) { if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); dispatch(setBPMTaskDetailUpdating(false)); } - //} + } if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) From da38f2c83289ee6a165fa594b81a3672198e3092 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Thu, 12 Oct 2023 14:46:29 -0600 Subject: [PATCH 136/157] remove TaskHeader.js --- .../ServiceFlow/details/TaskHeader.js | 366 ------------------ 1 file changed, 366 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js deleted file mode 100644 index db051743..00000000 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ /dev/null @@ -1,366 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { Row, Col } from "react-bootstrap"; -import { - getISODateTime, - getFormattedDateAndTime, - getProcessDataObjectFromList, -} from "../../../apiManager/services/formatterService"; -import { useDispatch, useSelector } from "react-redux"; -import DatePicker from "react-datepicker"; -import moment from "moment"; -import "react-datepicker/dist/react-datepicker.css"; -import "./../ServiceFlow.scss"; -import AddGroupModal from "./AddGroupModal"; -import { - claimBPMTask, - // fetchFilterList, - fetchServiceTaskList, - getBPMTaskDetail, - unClaimBPMTask, - updateAssigneeBPMTask, - updateBPMTask, -} from "../../../apiManager/services/bpmTaskServices"; -import { setBPMTaskDetailUpdating } from "../../../actions/bpmTaskActions"; -//import UserSelection from "./UserSelection"; -import UserSelectionDebounce from "./UserSelectionDebounce"; -import SocketIOService from "../../../services/SocketIOService"; -import { useTranslation } from "react-i18next"; - -const TaskHeader = React.memo(() => { - const task = useSelector((state) => state.bpmTasks.taskDetail); - const taskId = useSelector((state) => state.bpmTasks.taskId); - const processList = useSelector((state) => state.bpmTasks.processList); - const username = useSelector( - (state) => state.user?.userDetail?.preferred_username || "" - ); - const taskGroups = useSelector((state) => state.bpmTasks.taskGroups); - const selectedFilter = useSelector((state) => state.bpmTasks.selectedFilter); - const reqData = useSelector((state) => state.bpmTasks.listReqParams); - const firstResult = useSelector((state) => state.bpmTasks.firstResult); - const [followUpDate, setFollowUpDate] = useState(null); - const [dueDate, setDueDate] = useState(null); - const [showModal, setModal] = useState(false); - const [isEditAssignee, setIsEditAssignee] = useState(false); - const dispatch = useDispatch(); - const { t } = useTranslation(); - useEffect(() => { - const followUp = task?.followUp ? new Date(task?.followUp) : null; - setFollowUpDate(followUp); - }, [task?.followUp]); - - useEffect(() => { - const due = task?.due ? new Date(task?.due) : null; - setDueDate(due); - }, [task?.due]); - - const onClaim = () => { - dispatch(setBPMTaskDetailUpdating(true)); - dispatch( - // eslint-disable-next-line no-unused-vars - claimBPMTask(taskId, username, (err, response) => { - console.log("claimBPMTaskErr", err); - console.log("claimBPMTaskResponse", response); - console.log("claimBPMTaskSelectedFilter", selectedFilter); - console.log("claimBPMTaskSocket", SocketIOService.isConnected()); - if (!err) { - if (!SocketIOService.isConnected()) { - if (selectedFilter) { - dispatch(getBPMTaskDetail(taskId)); - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - dispatch(setBPMTaskDetailUpdating(false)); - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - } - if(selectedFilter){ - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - dispatch(setBPMTaskDetailUpdating(false)); - } - - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - }) - ); - }; - const onChangeClaim = (userId) => { - setIsEditAssignee(false); - if (userId && userId !== task.assignee) { - dispatch(setBPMTaskDetailUpdating(true)); - dispatch( - // eslint-disable-next-line no-unused-vars - updateAssigneeBPMTask(taskId, userId, (err, response) => { - if (!err) { - if (!SocketIOService.isConnected()) { - if (selectedFilter) { - dispatch(getBPMTaskDetail(taskId)); - dispatch(setBPMTaskDetailUpdating(false)); - } - } - if(selectedFilter){ - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - dispatch(setBPMTaskDetailUpdating(false)); - - } - - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - }) - ); - } - }; - - const onUnClaimTask = () => { - dispatch(setBPMTaskDetailUpdating(true)); - dispatch( - // eslint-disable-next-line no-unused-vars - unClaimBPMTask(taskId, (err, response) => { - if (!err) { - if (!SocketIOService.isConnected()) { - if (selectedFilter) { - dispatch(getBPMTaskDetail(taskId)); - dispatch(setBPMTaskDetailUpdating(false)); - } - } - if(selectedFilter){ - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - dispatch(setBPMTaskDetailUpdating(false)); - } - - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - }) - ); - }; - - const onFollowUpDateUpdate = (followUpDate) => { - setFollowUpDate(followUpDate); - dispatch(setBPMTaskDetailUpdating(true)); - const updatedTask = { - ...task, - ...{ followUp: followUpDate ? getISODateTime(followUpDate) : null }, - }; - dispatch( - // eslint-disable-next-line no-unused-vars - updateBPMTask(taskId, updatedTask, (err, response) => { - if (!err) { - if (!SocketIOService.isConnected()) { - dispatch(getBPMTaskDetail(taskId)); - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - } - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - }) - ); - }; - - const onDueDateUpdate = (dueDate) => { - setDueDate(dueDate); - dispatch(setBPMTaskDetailUpdating(true)); - const updatedTask = { - ...task, - ...{ due: dueDate ? getISODateTime(dueDate) : null }, - }; - dispatch( - // eslint-disable-next-line no-unused-vars - updateBPMTask(taskId, updatedTask, (err, response) => { - if (!err) { - if (!SocketIOService.isConnected()) { - dispatch(getBPMTaskDetail(taskId)); - dispatch( - fetchServiceTaskList(selectedFilter.id, firstResult, reqData) - ); - } - } else { - dispatch(setBPMTaskDetailUpdating(false)); - } - }) - ); - }; - - // eslint-disable-next-line no-unused-vars - const FollowUpDateInput = React.forwardRef(({ value, onClick }, ref) => { - return ( -
- {" "} - {followUpDate ? ( - {moment(followUpDate).fromNow()} - ) : ( - t("Set follow-up Date") - )} -
- ); - }); - - // eslint-disable-next-line no-unused-vars - const DueDateInput = React.forwardRef(({ value, onClick }, ref) => { - return ( -
- {" "} - {dueDate ? ( - {moment(dueDate).fromNow()} - ) : ( - t("Set Due date") - )} -
- ); - }); - - const getGroups = (groups) => { - return groups?.map((group) => group.groupId).join(", "); - }; - - return ( - <> - setModal(false)} - groups={taskGroups} - /> - {task?.name} - - - {" "} - { - getProcessDataObjectFromList(processList, task?.processDefinitionId) - ?.name - } - - - - - {t("Application ID")}# {task?.applicationId} - - - - - } - /> - - - } - /> - - setModal(true)} - data-title={t("groups")} - > - - {taskGroups.length === 0 ? ( - {t("Add groups")} - ) : ( - {getGroups(taskGroups)} - )} - - - {isEditAssignee ? ( - task?.assignee ? ( - - setIsEditAssignee(false)} - currentUser={task.assignee} - onChangeClaim={onChangeClaim} - /> - - ) : ( - - {" "} - {t("Claim")} - - ) - ) : ( - <> - - {task?.assignee ? ( - - setIsEditAssignee(true)} - data-title={t("Click to Change Assignee")} - > - {task.assignee} - - - - ) : ( - - {t("Claim")} - - )} - - )} - - - - ); -}); - -export default TaskHeader; From c7e26dcabfe11f51c559f75403cfc6f7b9f6ae07 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 13 Oct 2023 12:38:03 -0600 Subject: [PATCH 137/157] TaskHeader.js added and changed --- .../ServiceFlow/details/TaskHeader.js | 353 ++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js new file mode 100644 index 00000000..225ab412 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -0,0 +1,353 @@ +import React, { useEffect, useState } from "react"; +import { Row, Col } from "react-bootstrap"; +import { + getISODateTime, + getFormattedDateAndTime, + getProcessDataObjectFromList, +} from "../../../apiManager/services/formatterService"; +import { useDispatch, useSelector } from "react-redux"; +import DatePicker from "react-datepicker"; +import moment from "moment"; +import "react-datepicker/dist/react-datepicker.css"; +import "./../ServiceFlow.scss"; +import AddGroupModal from "./AddGroupModal"; +import { + claimBPMTask, + // fetchFilterList, + fetchServiceTaskList, + getBPMTaskDetail, + unClaimBPMTask, + updateAssigneeBPMTask, + updateBPMTask, +} from "../../../apiManager/services/bpmTaskServices"; +import { setBPMTaskDetailUpdating } from "../../../actions/bpmTaskActions"; +//import UserSelection from "./UserSelection"; +import UserSelectionDebounce from "./UserSelectionDebounce"; +import SocketIOService from "../../../services/SocketIOService"; +import { useTranslation } from "react-i18next"; + +const TaskHeader = React.memo(() => { + const task = useSelector((state) => state.bpmTasks.taskDetail); + const taskId = useSelector((state) => state.bpmTasks.taskId); + const processList = useSelector((state) => state.bpmTasks.processList); + const username = useSelector( + (state) => state.user?.userDetail?.preferred_username || "" + ); + const taskGroups = useSelector((state) => state.bpmTasks.taskGroups); + const selectedFilter = useSelector((state) => state.bpmTasks.selectedFilter); + const reqData = useSelector((state) => state.bpmTasks.listReqParams); + const firstResult = useSelector((state) => state.bpmTasks.firstResult); + const [followUpDate, setFollowUpDate] = useState(null); + const [dueDate, setDueDate] = useState(null); + const [showModal, setModal] = useState(false); + const [isEditAssignee, setIsEditAssignee] = useState(false); + const dispatch = useDispatch(); + const { t } = useTranslation(); + useEffect(() => { + const followUp = task?.followUp ? new Date(task?.followUp) : null; + setFollowUpDate(followUp); + }, [task?.followUp]); + + useEffect(() => { + const due = task?.due ? new Date(task?.due) : null; + setDueDate(due); + }, [task?.due]); + + const onClaim = () => { + dispatch(setBPMTaskDetailUpdating(true)); + + // eslint-disable-next-line no-unused-vars + claimBPMTask(taskId, username, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + dispatch(getBPMTaskDetail(taskId)); + }else { + dispatch(setBPMTaskDetailUpdating(false)); + } + + if(selectedFilter) { + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }); + }; + + const onChangeClaim = (userId) => { + setIsEditAssignee(false); + if (userId && userId !== task.assignee) { + dispatch(setBPMTaskDetailUpdating(true)); + //dispatch( + // eslint-disable-next-line no-unused-vars + updateAssigneeBPMTask(taskId, userId, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + //if (selectedFilter) { + dispatch(getBPMTaskDetail(taskId)); + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + + if(selectedFilter) { + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }); + } + }; + + const onUnClaimTask = () => { + dispatch(setBPMTaskDetailUpdating(true)); + //dispatch( + // eslint-disable-next-line no-unused-vars + unClaimBPMTask(taskId, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + //if (selectedFilter) { + dispatch(getBPMTaskDetail(taskId)); + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + + if(selectedFilter){ + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }); + }; + + const onFollowUpDateUpdate = (followUpDate) => { + setFollowUpDate(followUpDate); + dispatch(setBPMTaskDetailUpdating(true)); + const updatedTask = { + ...task, + ...{ followUp: followUpDate ? getISODateTime(followUpDate) : null }, + }; + dispatch( + // eslint-disable-next-line no-unused-vars + updateBPMTask(taskId, updatedTask, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + dispatch(getBPMTaskDetail(taskId)); + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + + const onDueDateUpdate = (dueDate) => { + setDueDate(dueDate); + dispatch(setBPMTaskDetailUpdating(true)); + const updatedTask = { + ...task, + ...{ due: dueDate ? getISODateTime(dueDate) : null }, + }; + dispatch( + // eslint-disable-next-line no-unused-vars + updateBPMTask(taskId, updatedTask, (err, response) => { + if (!err) { + if (!SocketIOService.isConnected()) { + dispatch(getBPMTaskDetail(taskId)); + dispatch( + fetchServiceTaskList(selectedFilter.id, firstResult, reqData) + ); + } + } else { + dispatch(setBPMTaskDetailUpdating(false)); + } + }) + ); + }; + + // eslint-disable-next-line no-unused-vars + const FollowUpDateInput = React.forwardRef(({ value, onClick }, ref) => { + return ( +
+ {" "} + {followUpDate ? ( + {moment(followUpDate).fromNow()} + ) : ( + t("Set follow-up Date") + )} +
+ ); + }); + + // eslint-disable-next-line no-unused-vars + const DueDateInput = React.forwardRef(({ value, onClick }, ref) => { + return ( +
+ {" "} + {dueDate ? ( + {moment(dueDate).fromNow()} + ) : ( + t("Set Due date") + )} +
+ ); + }); + + const getGroups = (groups) => { + return groups?.map((group) => group.groupId).join(", "); + }; + + return ( + <> + setModal(false)} + groups={taskGroups} + /> + {task?.name} + + + {" "} + { + getProcessDataObjectFromList(processList, task?.processDefinitionId) + ?.name + } + + + + + {t("Application ID")}# {task?.applicationId} + + + + + } + /> + + + } + /> + + setModal(true)} + data-title={t("groups")} + > + + {taskGroups.length === 0 ? ( + {t("Add groups")} + ) : ( + {getGroups(taskGroups)} + )} + + + {isEditAssignee ? ( + task?.assignee ? ( + + setIsEditAssignee(false)} + currentUser={task.assignee} + onChangeClaim={onChangeClaim} + /> + + ) : ( + + {" "} + {t("Claim")} + + ) + ) : ( + <> + + {task?.assignee ? ( + + setIsEditAssignee(true)} + data-title={t("Click to Change Assignee")} + > + {task.assignee} + + + + ) : ( + + {t("Claim")} + + )} + + )} + + + + ); +}); + +export default TaskHeader; From 73a6e928f258e822b60e6f6e0d99c683497da4ce Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 13 Oct 2023 13:52:03 -0600 Subject: [PATCH 138/157] TaskHeader.js updated --- .../src/components/ServiceFlow/details/TaskHeader.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index 225ab412..82d93253 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -55,7 +55,7 @@ const TaskHeader = React.memo(() => { const onClaim = () => { dispatch(setBPMTaskDetailUpdating(true)); - + dispatch( // eslint-disable-next-line no-unused-vars claimBPMTask(taskId, username, (err, response) => { if (!err) { @@ -74,14 +74,14 @@ const TaskHeader = React.memo(() => { } else { dispatch(setBPMTaskDetailUpdating(false)); } - }); + })); }; const onChangeClaim = (userId) => { setIsEditAssignee(false); if (userId && userId !== task.assignee) { dispatch(setBPMTaskDetailUpdating(true)); - //dispatch( + dispatch( // eslint-disable-next-line no-unused-vars updateAssigneeBPMTask(taskId, userId, (err, response) => { if (!err) { @@ -101,13 +101,13 @@ const TaskHeader = React.memo(() => { } else { dispatch(setBPMTaskDetailUpdating(false)); } - }); + })); } }; const onUnClaimTask = () => { dispatch(setBPMTaskDetailUpdating(true)); - //dispatch( + dispatch( // eslint-disable-next-line no-unused-vars unClaimBPMTask(taskId, (err, response) => { if (!err) { @@ -127,7 +127,7 @@ const TaskHeader = React.memo(() => { } else { dispatch(setBPMTaskDetailUpdating(false)); } - }); + })); }; const onFollowUpDateUpdate = (followUpDate) => { From d025bbb678817816290412dfb98baebf6eed0489 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 18 Oct 2023 13:30:50 -0600 Subject: [PATCH 139/157] disable SocketIOService in TaskHeader.js --- .../components/ServiceFlow/details/TaskHeader.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index 82d93253..fba51d3f 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -59,7 +59,7 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars claimBPMTask(taskId, username, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { dispatch(getBPMTaskDetail(taskId)); }else { dispatch(setBPMTaskDetailUpdating(false)); @@ -69,8 +69,7 @@ const TaskHeader = React.memo(() => { dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) ); - } - + //} } else { dispatch(setBPMTaskDetailUpdating(false)); } @@ -85,7 +84,7 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars updateAssigneeBPMTask(taskId, userId, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { //if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); } else { @@ -96,7 +95,7 @@ const TaskHeader = React.memo(() => { dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) ); - } + //} } else { dispatch(setBPMTaskDetailUpdating(false)); @@ -111,18 +110,18 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars unClaimBPMTask(taskId, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { //if (selectedFilter) { dispatch(getBPMTaskDetail(taskId)); } else { dispatch(setBPMTaskDetailUpdating(false)); - } + } if(selectedFilter){ dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) ); - } + //} } else { dispatch(setBPMTaskDetailUpdating(false)); From 51238fe2d6086ac9238e1bf3cc754c31af7a8cb7 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 18 Oct 2023 13:51:14 -0600 Subject: [PATCH 140/157] TaskHeader.js updated --- .../src/components/ServiceFlow/details/TaskHeader.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index fba51d3f..943d18dd 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -140,12 +140,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars updateBPMTask(taskId, updatedTask, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { dispatch(getBPMTaskDetail(taskId)); dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) ); - } + //} } else { dispatch(setBPMTaskDetailUpdating(false)); } @@ -164,12 +164,12 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars updateBPMTask(taskId, updatedTask, (err, response) => { if (!err) { - if (!SocketIOService.isConnected()) { + //if (!SocketIOService.isConnected()) { dispatch(getBPMTaskDetail(taskId)); dispatch( fetchServiceTaskList(selectedFilter.id, firstResult, reqData) ); - } + //} } else { dispatch(setBPMTaskDetailUpdating(false)); } From 410e59206e3492021e500ca3758212d1d3962fdd Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 18 Oct 2023 14:21:12 -0600 Subject: [PATCH 141/157] add notes --- .../src/components/ServiceFlow/details/TaskHeader.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js index 943d18dd..8b19fe51 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js +++ b/apps/forms-flow-ai/forms-flow-web/src/components/ServiceFlow/details/TaskHeader.js @@ -59,6 +59,8 @@ const TaskHeader = React.memo(() => { // eslint-disable-next-line no-unused-vars claimBPMTask(taskId, username, (err, response) => { if (!err) { + /* '!SocketIOService.isConnected' commented out in all blocks below as when socket is connected, details are not sent as expected. + To be uncommented and used later when product team has released the fix for this issue */ //if (!SocketIOService.isConnected()) { dispatch(getBPMTaskDetail(taskId)); }else { From 26b6a8c4b6bf05f1bd1de2e1ee50515e22d845d1 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 23 Oct 2023 14:15:47 -0600 Subject: [PATCH 142/157] dropdown-toggle updated in styles.scss --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 2 +- apps/forms-flow-ai/forms-flow-web/src/styles.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index 635881a4..c5051e56 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -264,7 +264,7 @@ } .dropdown-toggle{ margin-right: 1rem; -//color: white; +color: white; } .form-icons-active:active { // fill: #4d61fc !important; diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index 373b4077..8191377c 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -214,7 +214,7 @@ i.fa.fa-question-circle.text-muted { box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); } .dropdown-toggle { - //color: white !important; + color: white !important; a { text-decoration: none; } From c7060db1281727be3f41a1056ba643ec27a32aca Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 22 Nov 2023 14:15:12 -0700 Subject: [PATCH 143/157] changes made to dropdown.toggle --- .../forms-flow-web/src/containers/styles.scss | 8 +++++++- apps/forms-flow-ai/forms-flow-web/src/styles.scss | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index c5051e56..ddc166f9 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -264,7 +264,13 @@ } .dropdown-toggle{ margin-right: 1rem; -color: white; + // color: white; +} + + // add white color for username in dropdown.toggle +.d-lg-inline-block { + display: inline-block!important; + color: #fff!important; } .form-icons-active:active { // fill: #4d61fc !important; diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index 8191377c..fe475f72 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -214,11 +214,17 @@ i.fa.fa-question-circle.text-muted { box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); } .dropdown-toggle { - color: white !important; + // color: white !important; a { text-decoration: none; } } + + // add white color for username in dropdown.toggle + .d-lg-inline-block { + display: inline-block!important; + color: #fff!important; + } .userIcon { padding: 0 0 0 0; font-size: 2rem; From 17a1ba0e19fe7feb182927578e1816f7c1327db5 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Wed, 22 Nov 2023 14:33:36 -0700 Subject: [PATCH 144/157] remove !important from dropdown color --- apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss | 2 +- apps/forms-flow-ai/forms-flow-web/src/styles.scss | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss index ddc166f9..cdb9729c 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/containers/styles.scss @@ -270,7 +270,7 @@ margin-right: 1rem; // add white color for username in dropdown.toggle .d-lg-inline-block { display: inline-block!important; - color: #fff!important; + color: #fff; } .form-icons-active:active { // fill: #4d61fc !important; diff --git a/apps/forms-flow-ai/forms-flow-web/src/styles.scss b/apps/forms-flow-ai/forms-flow-web/src/styles.scss index fe475f72..45754d73 100644 --- a/apps/forms-flow-ai/forms-flow-web/src/styles.scss +++ b/apps/forms-flow-ai/forms-flow-web/src/styles.scss @@ -219,11 +219,11 @@ i.fa.fa-question-circle.text-muted { text-decoration: none; } } - + // add white color for username in dropdown.toggle .d-lg-inline-block { display: inline-block!important; - color: #fff!important; + color: #fff; } .userIcon { padding: 0 0 0 0; From 2e19c22761d9dae48bf300df4426732e6ded3832 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 5 Jan 2024 07:44:43 -0700 Subject: [PATCH 145/157] remove entries "entered_by", "los_entity_key" --- .../analytics/SimpleDBDataPipeline.java | 197 ++++++++++-------- 1 file changed, 111 insertions(+), 86 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java index dd0b9ee6..c371f137 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java @@ -1,6 +1,5 @@ package org.camunda.bpm.extension.hooks.services.analytics; - import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +22,7 @@ /** * Service class for publishing data to downstream analytics system. * - * @author sumathi.thirumani@aot-technologies.com + * @author sumathi.thirumani@aot-technologies.com */ @Service("dbdatapipeline") public class SimpleDBDataPipeline extends AbstractDataPipeline { @@ -31,7 +30,7 @@ public class SimpleDBDataPipeline extends AbstractDataPipeline { private final Logger LOGGER = Logger.getLogger(SimpleDBDataPipeline.class.getName()); @Autowired - private NamedParameterJdbcTemplate analyticsJdbcTemplate; + private NamedParameterJdbcTemplate analyticsJdbcTemplate; /** * Transformation method. @@ -41,21 +40,23 @@ public class SimpleDBDataPipeline extends AbstractDataPipeline { */ @Override public Map prepare(Map variables) { - LOGGER.info("Inside transformation for pid :"+ getIdentityKey(variables) +" : map: "+variables); - Map dataMap = new HashMap<>(); - for(Map.Entry entry : variables.entrySet()) { - if(entry.getValue() != null) { - if(StringUtils.endsWith(entry.getKey(),"_date") || StringUtils.endsWith(entry.getKey(),"_date_time")) { + LOGGER.info("Inside transformation for pid :" + getIdentityKey(variables) + " : map: " + variables); + Map dataMap = new HashMap<>(); + for (Map.Entry entry : variables.entrySet()) { + if (entry.getValue() != null) { + if (StringUtils.endsWith(entry.getKey(), "_date") + || StringUtils.endsWith(entry.getKey(), "_date_time")) { if (entry.getKey().equals("action_claim_date_time")) { try { Timestamp timestamp = new Timestamp(Long.parseLong(String.valueOf(entry.getValue()))); DateTime ts = new DateTime(timestamp); dataMap.put(entry.getKey(), new Timestamp((ts.getMillis()))); - } catch(NumberFormatException e) { + } catch (NumberFormatException e) { DateTime ts = new DateTime(String.valueOf(entry.getValue())); dataMap.put(entry.getKey(), new Timestamp((ts.getMillis()))); } - } else if(entry.getValue() != null && !"null".equalsIgnoreCase(String.valueOf(entry.getValue())) && StringUtils.isNotBlank(String.valueOf(entry.getValue()))) { + } else if (entry.getValue() != null && !"null".equalsIgnoreCase(String.valueOf(entry.getValue())) + && StringUtils.isNotBlank(String.valueOf(entry.getValue()))) { DateTime ts = new DateTime(String.valueOf(entry.getValue())); dataMap.put(entry.getKey(), new Timestamp((ts.getMillis()))); } @@ -65,48 +66,52 @@ public Map prepare(Map variables) { } } - LOGGER.info("Post transformation:"+ dataMap); + LOGGER.info("Post transformation:" + dataMap); return dataMap; } /** - * Implementation method for direct database connectivity with downstream system. - * This method handles lob & non-lob objects separately to keep the thread span short. + * Implementation method for direct database connectivity with downstream + * system. + * This method handles lob & non-lob objects separately to keep the thread span + * short. * * @param data * @return */ @Override - public DataPipelineResponse publish(Map data) { + public DataPipelineResponse publish(Map data) { DataPipelineResponse response = new DataPipelineResponse(); - Map nonLobMap = new HashMap<>(); - Map> lobMap = new HashMap<>(); + Map nonLobMap = new HashMap<>(); + Map> lobMap = new HashMap<>(); try { - for(Map.Entry entry : data.entrySet()) { - if(StringUtils.endsWith(entry.getKey(),"_file")) { - String fileNamePrefix = StringUtils.substringBefore(entry.getKey(),"_file"); - if(!lobMap.containsKey(entry.getKey())) { - Map lobData = new HashMap<>(); - lobData.put("name",getDateWithoutSpecialCharacters(String.valueOf(data.get(fileNamePrefix.concat("_name"))))); - lobData.put("file_mimetype",data.get(fileNamePrefix.concat("_mimetype"))); - lobData.put("file_stream",entry.getValue()); - lobData.put("file_size",data.get(fileNamePrefix.concat("_size"))); - lobData.put("stream_id",data.get(fileNamePrefix.concat("_stream_id"))); - lobData.put("files_entity_key",data.get("files_entity_key")); - //nonLobMap.put(StringUtils.concat("_id"), data.get(fileNamePrefix.concat("_stream_id"))); - - lobMap.put(entry.getKey(),lobData); + for (Map.Entry entry : data.entrySet()) { + if (StringUtils.endsWith(entry.getKey(), "_file")) { + String fileNamePrefix = StringUtils.substringBefore(entry.getKey(), "_file"); + if (!lobMap.containsKey(entry.getKey())) { + Map lobData = new HashMap<>(); + lobData.put("name", getDateWithoutSpecialCharacters( + String.valueOf(data.get(fileNamePrefix.concat("_name"))))); + lobData.put("file_mimetype", data.get(fileNamePrefix.concat("_mimetype"))); + lobData.put("file_stream", entry.getValue()); + lobData.put("file_size", data.get(fileNamePrefix.concat("_size"))); + lobData.put("stream_id", data.get(fileNamePrefix.concat("_stream_id"))); + lobData.put("files_entity_key", data.get("files_entity_key")); + // nonLobMap.put(StringUtils.concat("_id"), + // data.get(fileNamePrefix.concat("_stream_id"))); + + lobMap.put(entry.getKey(), lobData); } } else { nonLobMap.put(entry.getKey(), entry.getValue()); } - } - for(Map.Entry entry : data.entrySet()) { + for (Map.Entry entry : data.entrySet()) { if (StringUtils.endsWith(entry.getKey(), "_uploadname")) { - if (entry.getValue() != null && StringUtils.isNotBlank(String.valueOf(entry.getValue())) && !"null".equals(String.valueOf(entry.getValue()))) { + if (entry.getValue() != null && StringUtils.isNotBlank(String.valueOf(entry.getValue())) + && !"null".equals(String.valueOf(entry.getValue()))) { String filename = String.valueOf(entry.getValue()); List fieldValue = new ArrayList<>(); for (String fentry : filename.split(",")) { @@ -114,21 +119,26 @@ public DataPipelineResponse publish(Map data) { String prefix = StringUtils.substringBefore(entry.getKey(), "_file_uploadname"); fieldValue.add(String.valueOf(data.get(name + prefix + "_stream_id"))); } - nonLobMap.put(StringUtils.substringBefore(entry.getKey(), "_file_uploadname") + "_file_id", String.join(",", fieldValue)); + nonLobMap.put(StringUtils.substringBefore(entry.getKey(), "_file_uploadname") + "_file_id", + String.join(",", fieldValue)); } } } + // Remove entries if they exist becaue these fields may not exist in the + // destination tables + removeEntries(nonLobMap, "entered_by", "los_entity_key"); - //Non-lob objects block - String query = getQuery(String.valueOf(nonLobMap.get("entity_key")),nonLobMap,"pid",getIdentityKey(data)); - LOGGER.info("Non-lob query:"+ query); - analyticsJdbcTemplate.update(query,nonLobMap); + // Non-lob objects block + String query = getQuery(String.valueOf(nonLobMap.get("entity_key")), nonLobMap, "pid", + getIdentityKey(data)); + LOGGER.info("Non-lob query:" + query); + analyticsJdbcTemplate.update(query, nonLobMap); // Lob objects handleFileObject(lobMap); response.setStatus(ResponseStatus.SUCCESS); - } catch(Exception ex) { + } catch (Exception ex) { LOGGER.log(Level.SEVERE, "Exception occurred in publishing data for analytics system", ex); response.setStatus(ResponseStatus.FAILURE, ex); } @@ -136,12 +146,23 @@ public DataPipelineResponse publish(Map data) { } private static String getDateWithoutSpecialCharacters(String filename) { - String timestampVal = StringUtils.replace(StringUtils.replace( - StringUtils.replace(StringUtils.replace(StringUtils.substringBefore(new DateTime().toString(), "."), "-", ""), ":", "") - ,".","")," ",""); - return StringUtils.substringBeforeLast(filename, ".")+"_"+timestampVal+"."+StringUtils.substringAfterLast(filename, "."); + String timestampVal = StringUtils.replace(StringUtils.replace( + StringUtils.replace( + StringUtils.replace(StringUtils.substringBefore(new DateTime().toString(), "."), "-", ""), ":", + ""), + ".", ""), " ", ""); + return StringUtils.substringBeforeLast(filename, ".") + "_" + timestampVal + "." + + StringUtils.substringAfterLast(filename, "."); } + private void removeEntries(Map map, String... keysToRemove) { + for (String key : keysToRemove) { + // Remove the entry only if it exists in the map + if (map.containsKey(key)) { + map.remove(key); + } + } + } /** * Implementation method for notification of execution status. @@ -150,12 +171,12 @@ private static String getDateWithoutSpecialCharacters(String filename) { * @return */ @Override - public Map notificationMessage(DataPipelineResponse response) { - Map rspVarMap = new HashMap<>(); - LOGGER.info("Data pipeline status:" +response.getResponseCode()); - rspVarMap.put("code",response.getResponseCode()); - rspVarMap.put("message",response.getResponseMessage()); - rspVarMap.put("exception",response.getException()); + public Map notificationMessage(DataPipelineResponse response) { + Map rspVarMap = new HashMap<>(); + LOGGER.info("Data pipeline status:" + response.getResponseCode()); + rspVarMap.put("code", response.getResponseCode()); + rspVarMap.put("message", response.getResponseMessage()); + rspVarMap.put("exception", response.getException()); return rspVarMap; } @@ -165,11 +186,12 @@ public Map notificationMessage(DataPipelineResponse response) { * @param lobMap * @throws SQLException */ - private void handleFileObject(Map> lobMap) throws SQLException { - for(Map.Entry> entry : lobMap.entrySet()) { - String query = getQuery(String.valueOf(entry.getValue().get("files_entity_key")),entry.getValue(),"stream_id",String.valueOf(entry.getValue().get("stream_id"))); - LOGGER.info("lob query:"+ query); - analyticsJdbcTemplate.update(query,entry.getValue()); + private void handleFileObject(Map> lobMap) throws SQLException { + for (Map.Entry> entry : lobMap.entrySet()) { + String query = getQuery(String.valueOf(entry.getValue().get("files_entity_key")), entry.getValue(), + "stream_id", String.valueOf(entry.getValue().get("stream_id"))); + LOGGER.info("lob query:" + query); + analyticsJdbcTemplate.update(query, entry.getValue()); } } @@ -180,64 +202,67 @@ private void handleFileObject(Map> lobMap) throws SQLE * @param pkColums * @return */ - private String getValidationQuery(String tableName,String... pkColums) { - return IQueryFactory.getValidationQuery(tableName,pkColums); + private String getValidationQuery(String tableName, String... pkColums) { + return IQueryFactory.getValidationQuery(tableName, pkColums); } /** - * Returns the query + * Returns the query + * * @param formKey * @param dataMap * @return * @throws SQLException */ - private String getQuery(String formKey, Map dataMap,String pkname, String pkvalue) throws SQLException { - Map cols = getColumns(formKey, pkname,pkvalue); + private String getQuery(String formKey, Map dataMap, String pkname, String pkvalue) + throws SQLException { + Map cols = getColumns(formKey, pkname, pkvalue); List filteredCols = new ArrayList<>(); - LOGGER.info("Prepare query for columns:"+cols); - for(Map.Entry entry : dataMap.entrySet()) { - if(cols.containsKey(entry.getKey().toLowerCase())) { + LOGGER.info("Prepare query for columns:" + cols); + for (Map.Entry entry : dataMap.entrySet()) { + if (cols.containsKey(entry.getKey().toLowerCase())) { filteredCols.add(entry.getKey()); } } - LOGGER.info("Value of expression"+StringUtils.isEmpty(getIdentityKey(cols))); - return IQueryFactory.prepareQuery(formKey,filteredCols,StringUtils.isEmpty(getIdentityKey(cols))? Boolean.FALSE : Boolean.TRUE,pkname); + LOGGER.info("Value of expression" + StringUtils.isEmpty(getIdentityKey(cols))); + return IQueryFactory.prepareQuery(formKey, filteredCols, + StringUtils.isEmpty(getIdentityKey(cols)) ? Boolean.FALSE : Boolean.TRUE, pkname); } - /** * This method returns the column metadata for preparing dynamic queries. + * * @param formKey * @param pkName * @param pkValue * @return * @throws SQLException */ - private Map getColumns(String formKey,String pkName, String pkValue) throws SQLException { + private Map getColumns(String formKey, String pkName, String pkValue) throws SQLException { SqlParameterSource namedParameters = new MapSqlParameterSource(pkName, pkValue); - Map resp = analyticsJdbcTemplate.query(getValidationQuery(formKey,pkName), namedParameters,new ResultSetExtractor>(){ - @Override - public Map extractData(ResultSet rs) throws SQLException, DataAccessException { - Map dataMap=new HashMap<>(); - ResultSetMetaData resultSetMetaData = rs.getMetaData(); - for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { - dataMap.put(rs.getMetaData().getColumnName(i).toLowerCase(), null); - } - while(rs.next()) { - for (int j = 1; j <= resultSetMetaData.getColumnCount(); j++) { - if(StringUtils.endsWith(rs.getMetaData().getColumnName(j),"_file")) { - //Not-loading the lob objects on retrieve to keep the metadata lightweight. - dataMap.put(rs.getMetaData().getColumnName(j), null); - } else { - dataMap.put(rs.getMetaData().getColumnName(j), JdbcUtils.getResultSetValue(rs, j)); + Map resp = analyticsJdbcTemplate.query(getValidationQuery(formKey, pkName), namedParameters, + new ResultSetExtractor>() { + @Override + public Map extractData(ResultSet rs) throws SQLException, DataAccessException { + Map dataMap = new HashMap<>(); + ResultSetMetaData resultSetMetaData = rs.getMetaData(); + for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { + dataMap.put(rs.getMetaData().getColumnName(i).toLowerCase(), null); + } + while (rs.next()) { + for (int j = 1; j <= resultSetMetaData.getColumnCount(); j++) { + if (StringUtils.endsWith(rs.getMetaData().getColumnName(j), "_file")) { + // Not-loading the lob objects on retrieve to keep the metadata lightweight. + dataMap.put(rs.getMetaData().getColumnName(j), null); + } else { + dataMap.put(rs.getMetaData().getColumnName(j), JdbcUtils.getResultSetValue(rs, j)); + } + } } + return dataMap; } - } - return dataMap; - } - }); + }); return resp; } - } From 323d180d61e7f72808ac2d9510dbcb77c07a834b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Fri, 5 Jan 2024 10:25:37 -0700 Subject: [PATCH 146/157] revert code --- .../services/analytics/SimpleDBDataPipeline.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java index c371f137..dba967f0 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/services/analytics/SimpleDBDataPipeline.java @@ -126,10 +126,6 @@ public DataPipelineResponse publish(Map data) { } } - // Remove entries if they exist becaue these fields may not exist in the - // destination tables - removeEntries(nonLobMap, "entered_by", "los_entity_key"); - // Non-lob objects block String query = getQuery(String.valueOf(nonLobMap.get("entity_key")), nonLobMap, "pid", getIdentityKey(data)); @@ -155,15 +151,6 @@ private static String getDateWithoutSpecialCharacters(String filename) { + StringUtils.substringAfterLast(filename, "."); } - private void removeEntries(Map map, String... keysToRemove) { - for (String key : keysToRemove) { - // Remove the entry only if it exists in the map - if (map.containsKey(key)) { - map.remove(key); - } - } - } - /** * Implementation method for notification of execution status. * From a4c095573053e638818695f816752d67ea5fccc0 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 25 Mar 2024 19:34:55 -0600 Subject: [PATCH 147/157] added ProcessInstanceRestResource files --- .../rest/ProcessInstanceRestResource.java | 44 +++++++++++++++++++ .../impl/ProcessInstanceRestResourceImpl.java | 43 ++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java new file mode 100644 index 00000000..345aeeaf --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java @@ -0,0 +1,44 @@ +package org.camunda.bpm.extension.hooks.rest; + +import java.util.Map; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.springframework.hateoas.EntityModel; + +@Produces(MediaType.APPLICATION_JSON) +public interface ProcessInstanceRestResource extends RestResource { + + String PATH = "/process-instance"; + + public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; + + @GET + @Path("/{id}/activity-instances") + @Produces(MediaType.APPLICATION_JSON) + EntityModel getActivityInstanceTree( + @PathParam("id") String id); + + @GET + @Path("/{id}/variables") + @Produces(MediaType.APPLICATION_JSON) + Map getVariables( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, + @PathParam("id") String id); + + @GET + @Path("/{id}/variable/{variableName}") + @Produces(MediaType.APPLICATION_JSON) + VariableValueDto getVariable( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, + @DefaultValue("true") boolean deserializeValue, + @PathParam("id") String id); + +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java new file mode 100644 index 00000000..3503bd2f --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java @@ -0,0 +1,43 @@ +package org.camunda.bpm.extension.hooks.rest.impl; + +import org.camunda.bpm.engine.rest.ProcessInstanceRestService; +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.camunda.bpm.extension.hooks.rest.ProcessInstanceRestResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.hateoas.EntityModel; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +import java.util.Map; + +public class ProcessInstanceRestResourceImpl implements ProcessInstanceRestResource { + + private static final Logger LOG = LoggerFactory.getLogger(ProcessInstanceRestResourceImpl.class); + + private final ProcessInstanceRestService restService; + + public ProcessInstanceRestResourceImpl(ProcessInstanceRestService processInstanceRestService) { + this.restService = processInstanceRestService; + } + + @Override + public EntityModel getActivityInstanceTree(String id) { + + org.camunda.bpm.engine.rest.dto.runtime.ActivityInstanceDto responseEntity = restService.getProcessInstance(id) + .getActivityInstanceTree(); + return EntityModel.of(responseEntity, + linkTo(methodOn(ProcessInstanceRestResourceImpl.class).getActivityInstanceTree(id)).withSelfRel()); + } + + @Override + public Map getVariables(boolean deserializeValues, String id) { + return restService.getProcessInstance(id).getVariablesResource().getVariables(deserializeValues); + } + + @Override + public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { + return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName); + } +} From ea7210922f621609c6632e26ab71f0b3b7c51a4b Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 25 Mar 2024 19:55:13 -0600 Subject: [PATCH 148/157] updated getVariable method --- .../hooks/rest/impl/ProcessInstanceRestResourceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java index 3503bd2f..649fe5a3 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java @@ -38,6 +38,6 @@ public Map getVariables(boolean deserializeValues, Str @Override public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName); + return restService.getProcessInstance(id).getVariablesResource().getVariable(deserializeValue); } } From f1bc33fa7a0eac52debb6b4f75667ff7b4cc8a38 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Mon, 25 Mar 2024 20:32:29 -0600 Subject: [PATCH 149/157] updated ProcessInstanceRestResourceImpl.java --- .../hooks/rest/impl/ProcessInstanceRestResourceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java index 649fe5a3..2c4cfd47 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java @@ -38,6 +38,6 @@ public Map getVariables(boolean deserializeValues, Str @Override public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariable(deserializeValue); + return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName, deserializeValue); } } From f939c881ceeb4ac486930f48825c1ed461dd7b99 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 26 Mar 2024 11:32:41 -0600 Subject: [PATCH 150/157] added TaskRestResource files --- .../rest/ProcessInstanceRestResource.java | 44 ------- .../impl/ProcessInstanceRestResourceImpl.java | 43 ------- .../hooks/rest/impl/TaskRestResource.java | 112 ++++++++++++++++++ .../hooks/rest/impl/TaskRestResourceImpl.java | 105 ++++++++++++++++ 4 files changed, 217 insertions(+), 87 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java deleted file mode 100644 index 345aeeaf..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.camunda.bpm.extension.hooks.rest; - -import java.util.Map; - -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; - -import org.camunda.bpm.engine.rest.dto.VariableValueDto; -import org.springframework.hateoas.EntityModel; - -@Produces(MediaType.APPLICATION_JSON) -public interface ProcessInstanceRestResource extends RestResource { - - String PATH = "/process-instance"; - - public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; - - @GET - @Path("/{id}/activity-instances") - @Produces(MediaType.APPLICATION_JSON) - EntityModel getActivityInstanceTree( - @PathParam("id") String id); - - @GET - @Path("/{id}/variables") - @Produces(MediaType.APPLICATION_JSON) - Map getVariables( - @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, - @PathParam("id") String id); - - @GET - @Path("/{id}/variable/{variableName}") - @Produces(MediaType.APPLICATION_JSON) - VariableValueDto getVariable( - @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, - @DefaultValue("true") boolean deserializeValue, - @PathParam("id") String id); - -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java deleted file mode 100644 index 2c4cfd47..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.camunda.bpm.extension.hooks.rest.impl; - -import org.camunda.bpm.engine.rest.ProcessInstanceRestService; -import org.camunda.bpm.engine.rest.dto.VariableValueDto; -import org.camunda.bpm.extension.hooks.rest.ProcessInstanceRestResource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.hateoas.EntityModel; - -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; - -import java.util.Map; - -public class ProcessInstanceRestResourceImpl implements ProcessInstanceRestResource { - - private static final Logger LOG = LoggerFactory.getLogger(ProcessInstanceRestResourceImpl.class); - - private final ProcessInstanceRestService restService; - - public ProcessInstanceRestResourceImpl(ProcessInstanceRestService processInstanceRestService) { - this.restService = processInstanceRestService; - } - - @Override - public EntityModel getActivityInstanceTree(String id) { - - org.camunda.bpm.engine.rest.dto.runtime.ActivityInstanceDto responseEntity = restService.getProcessInstance(id) - .getActivityInstanceTree(); - return EntityModel.of(responseEntity, - linkTo(methodOn(ProcessInstanceRestResourceImpl.class).getActivityInstanceTree(id)).withSelfRel()); - } - - @Override - public Map getVariables(boolean deserializeValues, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariables(deserializeValues); - } - - @Override - public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName, deserializeValue); - } -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java new file mode 100644 index 00000000..d72f9990 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java @@ -0,0 +1,112 @@ +package org.camunda.bpm.extension.hooks.rest; + +import org.camunda.bpm.engine.rest.dto.CountResultDto; +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.camunda.bpm.engine.rest.dto.task.CompleteTaskDto; +import org.camunda.bpm.engine.rest.dto.task.IdentityLinkDto; +import org.camunda.bpm.engine.rest.dto.task.TaskDto; +import org.camunda.bpm.engine.rest.dto.task.TaskQueryDto; +import org.camunda.bpm.engine.rest.hal.Hal; +import org.camunda.bpm.extension.hooks.rest.dto.UserIdDto; +import org.springframework.hateoas.EntityModel; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Path; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import java.util.List; +import java.util.Map; + +@Produces(MediaType.APPLICATION_JSON) +public interface TaskRestResource extends RestResource { + + public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; + public final static String DESERIALIZE_VALUES_QUERY_PARAM = DESERIALIZE_VALUE_QUERY_PARAM + "s"; + + String PATH = "/task"; + + @GET + @Produces({ MediaType.APPLICATION_JSON, Hal.APPLICATION_HAL_JSON }) + Object getTasks(@Context Request request, @Context UriInfo uriInfo, + @QueryParam("firstResult") Integer firstResult, @QueryParam("maxResults") Integer maxResults); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + List queryTasks(TaskQueryDto query, + @QueryParam("firstResult") Integer firstResult, @QueryParam("maxResults") Integer maxResults); + + @GET + @Path("/count") + @Produces(MediaType.APPLICATION_JSON) + EntityModel getTasksCount(@Context UriInfo uriInfo); + + @GET + @Path("/{id}") + @Produces({ MediaType.APPLICATION_JSON, Hal.APPLICATION_HAL_JSON }) + Object getTask(@Context Request request, @PathParam("id") String id); + + @PUT + @Path("/{id}") + @Consumes(MediaType.APPLICATION_JSON) + void updateTask(TaskDto task, @PathParam("id") String id); + + @POST + @Path("/{id}/claim") + @Consumes(MediaType.APPLICATION_JSON) + void claim(UserIdDto userIdDto, @PathParam("id") String id); + + @POST + @Path("/{id}/unclaim") + void unClaim(@PathParam("id") String id); + + @POST + @Path("/{id}/assignee") + @Consumes(MediaType.APPLICATION_JSON) + void setAssignee(UserIdDto dto, @PathParam("id") String id); + + @GET + @Path("/{id}/variables") + @Produces(MediaType.APPLICATION_JSON) + Map getVariables( + @QueryParam(DESERIALIZE_VALUES_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, + @PathParam("id") String id); + + @GET + @Path("/{id}/variable/{variableName}") + @Produces(MediaType.APPLICATION_JSON) + VariableValueDto getVariable( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, + @DefaultValue("true") boolean deserializeValue, @PathParam("id") String id); + + @GET + @Path("/{id}/identity-links") + @Produces(MediaType.APPLICATION_JSON) + List getIdentityLinks(@QueryParam("type") String type, @PathParam("id") String id); + + @POST + @Path("/{id}/identity-links") + @Consumes(MediaType.APPLICATION_JSON) + void addIdentityLink(IdentityLinkDto identityLink, @PathParam("id") String id); + + @POST + @Path("/{id}/identity-links/delete") + @Consumes(MediaType.APPLICATION_JSON) + void deleteIdentityLink(IdentityLinkDto identityLink, @PathParam("id") String id); + + @POST + @Path("/{id}/submit-form") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + Response submit(CompleteTaskDto dto, @PathParam("id") String id); +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java new file mode 100644 index 00000000..27f11c3c --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java @@ -0,0 +1,105 @@ +package org.camunda.bpm.extension.hooks.rest.impl; + +import org.camunda.bpm.engine.rest.TaskRestService; +import org.camunda.bpm.engine.rest.dto.CountResultDto; +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.camunda.bpm.engine.rest.dto.task.CompleteTaskDto; +import org.camunda.bpm.engine.rest.dto.task.IdentityLinkDto; +import org.camunda.bpm.engine.rest.dto.task.TaskDto; +import org.camunda.bpm.engine.rest.dto.task.TaskQueryDto; +import org.camunda.bpm.extension.hooks.rest.TaskRestResource; +import org.camunda.bpm.extension.hooks.rest.dto.UserIdDto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.hateoas.EntityModel; + +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.util.List; +import java.util.Map; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +public class TaskRestResourceImpl implements TaskRestResource { + + private static final Logger LOG = LoggerFactory.getLogger(TaskRestResourceImpl.class); + + private final TaskRestService restService; + + public TaskRestResourceImpl(TaskRestService taskRestService) { + restService = taskRestService; + } + + @Override + public Object getTasks(Request request, UriInfo uriInfo, Integer firstResult, Integer maxResults) { + return restService.getTasks(request, uriInfo, firstResult, maxResults); + } + + @Override + public List queryTasks(TaskQueryDto query, Integer firstResult, Integer maxResults) { + return restService.queryTasks(query, firstResult, maxResults); + } + + @Override + public EntityModel getTasksCount(UriInfo uriInfo) { + CountResultDto dto = restService.getTasksCount(uriInfo); + return EntityModel.of(dto, linkTo(methodOn(TaskRestResourceImpl.class).getTasksCount(uriInfo)).withSelfRel()); + } + + @Override + public Object getTask(Request request, String id) { + return restService.getTask(id).getTask(request); + } + + @Override + public void updateTask(TaskDto task, String id) { + restService.getTask(id).updateTask(task); + } + + @Override + public void claim(UserIdDto userIdDto, String id) { + restService.getTask(id).claim(userIdDto); + } + + @Override + public void unClaim(String id) { + restService.getTask(id).unclaim(); + } + + @Override + public void setAssignee(UserIdDto userIdDto, String id) { + restService.getTask(id).setAssignee(userIdDto); + } + + @Override + public Map getVariables(boolean deserializeValues, String id) { + return restService.getTask(id).getVariables().getVariables(deserializeValues); + } + + @Override + public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { + return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName, deserializeValue); + } + + @Override + public List getIdentityLinks(String type, String id) { + return restService.getTask(id).getIdentityLinks(type); + } + + @Override + public void addIdentityLink(IdentityLinkDto identityLink, String id) { + restService.getTask(id).addIdentityLink(identityLink); + } + + @Override + public void deleteIdentityLink(IdentityLinkDto identityLink, String id) { + restService.getTask(id).deleteIdentityLink(identityLink); + } + + @Override + public Response submit(CompleteTaskDto completeTaskDto, String id) { + return restService.getTask(id).submit(completeTaskDto); + } +} From cbf93d2b4714d59a1fd543276021fbfa6e608ccc Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 26 Mar 2024 12:58:50 -0600 Subject: [PATCH 151/157] revert to commit ea721092 --- .../rest/ProcessInstanceRestResource.java | 44 +++++++++++++++++++ .../impl/ProcessInstanceRestResourceImpl.java | 43 ++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java create mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java new file mode 100644 index 00000000..345aeeaf --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java @@ -0,0 +1,44 @@ +package org.camunda.bpm.extension.hooks.rest; + +import java.util.Map; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.springframework.hateoas.EntityModel; + +@Produces(MediaType.APPLICATION_JSON) +public interface ProcessInstanceRestResource extends RestResource { + + String PATH = "/process-instance"; + + public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; + + @GET + @Path("/{id}/activity-instances") + @Produces(MediaType.APPLICATION_JSON) + EntityModel getActivityInstanceTree( + @PathParam("id") String id); + + @GET + @Path("/{id}/variables") + @Produces(MediaType.APPLICATION_JSON) + Map getVariables( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, + @PathParam("id") String id); + + @GET + @Path("/{id}/variable/{variableName}") + @Produces(MediaType.APPLICATION_JSON) + VariableValueDto getVariable( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, + @DefaultValue("true") boolean deserializeValue, + @PathParam("id") String id); + +} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java new file mode 100644 index 00000000..649fe5a3 --- /dev/null +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java @@ -0,0 +1,43 @@ +package org.camunda.bpm.extension.hooks.rest.impl; + +import org.camunda.bpm.engine.rest.ProcessInstanceRestService; +import org.camunda.bpm.engine.rest.dto.VariableValueDto; +import org.camunda.bpm.extension.hooks.rest.ProcessInstanceRestResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.hateoas.EntityModel; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + +import java.util.Map; + +public class ProcessInstanceRestResourceImpl implements ProcessInstanceRestResource { + + private static final Logger LOG = LoggerFactory.getLogger(ProcessInstanceRestResourceImpl.class); + + private final ProcessInstanceRestService restService; + + public ProcessInstanceRestResourceImpl(ProcessInstanceRestService processInstanceRestService) { + this.restService = processInstanceRestService; + } + + @Override + public EntityModel getActivityInstanceTree(String id) { + + org.camunda.bpm.engine.rest.dto.runtime.ActivityInstanceDto responseEntity = restService.getProcessInstance(id) + .getActivityInstanceTree(); + return EntityModel.of(responseEntity, + linkTo(methodOn(ProcessInstanceRestResourceImpl.class).getActivityInstanceTree(id)).withSelfRel()); + } + + @Override + public Map getVariables(boolean deserializeValues, String id) { + return restService.getProcessInstance(id).getVariablesResource().getVariables(deserializeValues); + } + + @Override + public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { + return restService.getProcessInstance(id).getVariablesResource().getVariable(deserializeValue); + } +} From 2d6aaad82a99851f61865f55d11898fc1d92ef23 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 26 Mar 2024 13:01:40 -0600 Subject: [PATCH 152/157] remove TaskRestResource files --- .../hooks/rest/impl/TaskRestResource.java | 112 ------------------ .../hooks/rest/impl/TaskRestResourceImpl.java | 105 ---------------- 2 files changed, 217 deletions(-) delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java delete mode 100644 apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java deleted file mode 100644 index d72f9990..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResource.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.camunda.bpm.extension.hooks.rest; - -import org.camunda.bpm.engine.rest.dto.CountResultDto; -import org.camunda.bpm.engine.rest.dto.VariableValueDto; -import org.camunda.bpm.engine.rest.dto.task.CompleteTaskDto; -import org.camunda.bpm.engine.rest.dto.task.IdentityLinkDto; -import org.camunda.bpm.engine.rest.dto.task.TaskDto; -import org.camunda.bpm.engine.rest.dto.task.TaskQueryDto; -import org.camunda.bpm.engine.rest.hal.Hal; -import org.camunda.bpm.extension.hooks.rest.dto.UserIdDto; -import org.springframework.hateoas.EntityModel; - -import javax.ws.rs.Consumes; -import javax.ws.rs.Path; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.core.Request; -import javax.ws.rs.core.Response; -import java.util.List; -import java.util.Map; - -@Produces(MediaType.APPLICATION_JSON) -public interface TaskRestResource extends RestResource { - - public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; - public final static String DESERIALIZE_VALUES_QUERY_PARAM = DESERIALIZE_VALUE_QUERY_PARAM + "s"; - - String PATH = "/task"; - - @GET - @Produces({ MediaType.APPLICATION_JSON, Hal.APPLICATION_HAL_JSON }) - Object getTasks(@Context Request request, @Context UriInfo uriInfo, - @QueryParam("firstResult") Integer firstResult, @QueryParam("maxResults") Integer maxResults); - - @POST - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - List queryTasks(TaskQueryDto query, - @QueryParam("firstResult") Integer firstResult, @QueryParam("maxResults") Integer maxResults); - - @GET - @Path("/count") - @Produces(MediaType.APPLICATION_JSON) - EntityModel getTasksCount(@Context UriInfo uriInfo); - - @GET - @Path("/{id}") - @Produces({ MediaType.APPLICATION_JSON, Hal.APPLICATION_HAL_JSON }) - Object getTask(@Context Request request, @PathParam("id") String id); - - @PUT - @Path("/{id}") - @Consumes(MediaType.APPLICATION_JSON) - void updateTask(TaskDto task, @PathParam("id") String id); - - @POST - @Path("/{id}/claim") - @Consumes(MediaType.APPLICATION_JSON) - void claim(UserIdDto userIdDto, @PathParam("id") String id); - - @POST - @Path("/{id}/unclaim") - void unClaim(@PathParam("id") String id); - - @POST - @Path("/{id}/assignee") - @Consumes(MediaType.APPLICATION_JSON) - void setAssignee(UserIdDto dto, @PathParam("id") String id); - - @GET - @Path("/{id}/variables") - @Produces(MediaType.APPLICATION_JSON) - Map getVariables( - @QueryParam(DESERIALIZE_VALUES_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, - @PathParam("id") String id); - - @GET - @Path("/{id}/variable/{variableName}") - @Produces(MediaType.APPLICATION_JSON) - VariableValueDto getVariable( - @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, - @DefaultValue("true") boolean deserializeValue, @PathParam("id") String id); - - @GET - @Path("/{id}/identity-links") - @Produces(MediaType.APPLICATION_JSON) - List getIdentityLinks(@QueryParam("type") String type, @PathParam("id") String id); - - @POST - @Path("/{id}/identity-links") - @Consumes(MediaType.APPLICATION_JSON) - void addIdentityLink(IdentityLinkDto identityLink, @PathParam("id") String id); - - @POST - @Path("/{id}/identity-links/delete") - @Consumes(MediaType.APPLICATION_JSON) - void deleteIdentityLink(IdentityLinkDto identityLink, @PathParam("id") String id); - - @POST - @Path("/{id}/submit-form") - @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) - Response submit(CompleteTaskDto dto, @PathParam("id") String id); -} diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java deleted file mode 100644 index 27f11c3c..00000000 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/TaskRestResourceImpl.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.camunda.bpm.extension.hooks.rest.impl; - -import org.camunda.bpm.engine.rest.TaskRestService; -import org.camunda.bpm.engine.rest.dto.CountResultDto; -import org.camunda.bpm.engine.rest.dto.VariableValueDto; -import org.camunda.bpm.engine.rest.dto.task.CompleteTaskDto; -import org.camunda.bpm.engine.rest.dto.task.IdentityLinkDto; -import org.camunda.bpm.engine.rest.dto.task.TaskDto; -import org.camunda.bpm.engine.rest.dto.task.TaskQueryDto; -import org.camunda.bpm.extension.hooks.rest.TaskRestResource; -import org.camunda.bpm.extension.hooks.rest.dto.UserIdDto; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.hateoas.EntityModel; - -import javax.ws.rs.core.Request; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import java.util.List; -import java.util.Map; - -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; -import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; - -public class TaskRestResourceImpl implements TaskRestResource { - - private static final Logger LOG = LoggerFactory.getLogger(TaskRestResourceImpl.class); - - private final TaskRestService restService; - - public TaskRestResourceImpl(TaskRestService taskRestService) { - restService = taskRestService; - } - - @Override - public Object getTasks(Request request, UriInfo uriInfo, Integer firstResult, Integer maxResults) { - return restService.getTasks(request, uriInfo, firstResult, maxResults); - } - - @Override - public List queryTasks(TaskQueryDto query, Integer firstResult, Integer maxResults) { - return restService.queryTasks(query, firstResult, maxResults); - } - - @Override - public EntityModel getTasksCount(UriInfo uriInfo) { - CountResultDto dto = restService.getTasksCount(uriInfo); - return EntityModel.of(dto, linkTo(methodOn(TaskRestResourceImpl.class).getTasksCount(uriInfo)).withSelfRel()); - } - - @Override - public Object getTask(Request request, String id) { - return restService.getTask(id).getTask(request); - } - - @Override - public void updateTask(TaskDto task, String id) { - restService.getTask(id).updateTask(task); - } - - @Override - public void claim(UserIdDto userIdDto, String id) { - restService.getTask(id).claim(userIdDto); - } - - @Override - public void unClaim(String id) { - restService.getTask(id).unclaim(); - } - - @Override - public void setAssignee(UserIdDto userIdDto, String id) { - restService.getTask(id).setAssignee(userIdDto); - } - - @Override - public Map getVariables(boolean deserializeValues, String id) { - return restService.getTask(id).getVariables().getVariables(deserializeValues); - } - - @Override - public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName, deserializeValue); - } - - @Override - public List getIdentityLinks(String type, String id) { - return restService.getTask(id).getIdentityLinks(type); - } - - @Override - public void addIdentityLink(IdentityLinkDto identityLink, String id) { - restService.getTask(id).addIdentityLink(identityLink); - } - - @Override - public void deleteIdentityLink(IdentityLinkDto identityLink, String id) { - restService.getTask(id).deleteIdentityLink(identityLink); - } - - @Override - public Response submit(CompleteTaskDto completeTaskDto, String id) { - return restService.getTask(id).submit(completeTaskDto); - } -} From ac740e8755f2b68088e9fec8b5bb78f75d596a65 Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 26 Mar 2024 13:18:32 -0600 Subject: [PATCH 153/157] updates in ProcessInstanceRestResource files --- .../rest/ProcessInstanceRestResource.java | 48 +++++++++---------- .../impl/ProcessInstanceRestResourceImpl.java | 2 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java index 345aeeaf..2b732eb2 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java @@ -16,29 +16,29 @@ @Produces(MediaType.APPLICATION_JSON) public interface ProcessInstanceRestResource extends RestResource { - String PATH = "/process-instance"; - - public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; - - @GET - @Path("/{id}/activity-instances") - @Produces(MediaType.APPLICATION_JSON) - EntityModel getActivityInstanceTree( - @PathParam("id") String id); - - @GET - @Path("/{id}/variables") - @Produces(MediaType.APPLICATION_JSON) - Map getVariables( - @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, - @PathParam("id") String id); - - @GET - @Path("/{id}/variable/{variableName}") - @Produces(MediaType.APPLICATION_JSON) - VariableValueDto getVariable( - @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @PathParam("variableName") String variableName, - @DefaultValue("true") boolean deserializeValue, - @PathParam("id") String id); + String PATH = "/process-instance"; + + public final static String DESERIALIZE_VALUE_QUERY_PARAM = "deserializeValue"; + + @GET + @Path("/{id}/activity-instances") + @Produces(MediaType.APPLICATION_JSON) + EntityModel getActivityInstanceTree( + @PathParam("id") String id); + + @GET + @Path("/{id}/variables") + @Produces(MediaType.APPLICATION_JSON) + Map getVariables( + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValues, + @PathParam("id") String id); + + @GET + @Path("/{id}/variable/{variableName}") + @Produces(MediaType.APPLICATION_JSON) + VariableValueDto getVariable( + @PathParam("variableName") String variableName, + @QueryParam(DESERIALIZE_VALUE_QUERY_PARAM) @DefaultValue("true") boolean deserializeValue, + @PathParam("id") String id); } diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java index 649fe5a3..2c4cfd47 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/impl/ProcessInstanceRestResourceImpl.java @@ -38,6 +38,6 @@ public Map getVariables(boolean deserializeValues, Str @Override public VariableValueDto getVariable(String variableName, boolean deserializeValue, String id) { - return restService.getProcessInstance(id).getVariablesResource().getVariable(deserializeValue); + return restService.getProcessInstance(id).getVariablesResource().getVariable(variableName, deserializeValue); } } From ffae360df3f50ad3e89a548e48855bb9c0bfabaa Mon Sep 17 00:00:00 2001 From: Ijeoma Sophia Date: Tue, 26 Mar 2024 15:21:04 -0600 Subject: [PATCH 154/157] update ProcessInstanceRestResource.java --- .../bpm/extension/hooks/rest/ProcessInstanceRestResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java index 2b732eb2..2252066d 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/rest/ProcessInstanceRestResource.java @@ -34,7 +34,7 @@ Map getVariables( @PathParam("id") String id); @GET - @Path("/{id}/variable/{variableName}") + @Path("/{id}/variables/{variableName}") @Produces(MediaType.APPLICATION_JSON) VariableValueDto getVariable( @PathParam("variableName") String variableName, From 1c45e298c5ce095f35e5b9be7af88e8457f2a8e8 Mon Sep 17 00:00:00 2001 From: Ijeoma Oforeh Date: Mon, 3 Jun 2024 14:30:01 -0600 Subject: [PATCH 155/157] updated FormBuilderPipelineController.java --- .../hooks/controllers/FormBuilderPipelineController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java index 4d7171f2..95ec6f20 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java @@ -56,7 +56,7 @@ public class FormBuilderPipelineController { /** * Creates a camunda process instance for the orbeon form data given. - * + * * @param request The request object containing the CCII form data. */ @PostMapping(value = "/orbeon/data", consumes = MediaType.APPLICATION_XML_VALUE) @@ -203,13 +203,14 @@ private Map prepareRequestVariableMap(String formXML) throws IOE variables.put("entered_by", new VariableData("orbeon")); VariableData serviceMethodData = (VariableData) variables.get("service_method"); variables.put("engagement_source", new VariableData(serviceMethodData.getValue().toString())); + variables.put("service_channel", new VariableData("Service BC Location")); VariableData serviceChannelData = (VariableData) variables.get("service_channel"); if (serviceChannelData.getValue().toString().equals("Service BC Location")) { variables.put("service_location_type", new VariableData("service_centre")); } else if (serviceChannelData.getValue().equals("Mobile Outreach Location")) { variables.put("service_location_type", new VariableData("mobile_outreach")); } - variables.put("service_channel", new VariableData("Service BC Location")); + // variables.put("service_channel", new VariableData("Service BC Location")); // Check if Orbeon is submitted with a value for "mobile-location" if (variables.containsKey("mobile_location")) { // Set location parameter to "Mobile Outreach" From fa8318bd793f7e117636b745aae333add9a5300a Mon Sep 17 00:00:00 2001 From: Ijeoma Oforeh Date: Fri, 14 Jun 2024 13:11:17 -0600 Subject: [PATCH 156/157] updated FormBuilderPipelineController.java --- .../hooks/controllers/FormBuilderPipelineController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java index 95ec6f20..72645ed7 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java @@ -59,7 +59,9 @@ public class FormBuilderPipelineController { * * @param request The request object containing the CCII form data. */ - @PostMapping(value = "/orbeon/data", consumes = MediaType.APPLICATION_XML_VALUE) + // @PostMapping(value = "/orbeon/data", consumes = + // MediaType.APPLICATION_XML_VALUE) + @PostMapping(value = "/orbeon/data", consumes = { "application/xml", "xml" }) public void createProcess(HttpServletRequest request) { LOGGER.info("Inside Data transformation controller" + request.getParameterMap()); String formXML = null; From e8a9efe316e391c40267d067b0ee87158a2cb373 Mon Sep 17 00:00:00 2001 From: Ijeoma Oforeh Date: Wed, 19 Jun 2024 15:56:08 -0600 Subject: [PATCH 157/157] Revert "updated FormBuilderPipelineController.java" This reverts commit fa8318bd793f7e117636b745aae333add9a5300a. --- .../hooks/controllers/FormBuilderPipelineController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java index 72645ed7..95ec6f20 100644 --- a/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java +++ b/apps/forms-flow-ai/forms-flow-bpm/src/main/java/org/camunda/bpm/extension/hooks/controllers/FormBuilderPipelineController.java @@ -59,9 +59,7 @@ public class FormBuilderPipelineController { * * @param request The request object containing the CCII form data. */ - // @PostMapping(value = "/orbeon/data", consumes = - // MediaType.APPLICATION_XML_VALUE) - @PostMapping(value = "/orbeon/data", consumes = { "application/xml", "xml" }) + @PostMapping(value = "/orbeon/data", consumes = MediaType.APPLICATION_XML_VALUE) public void createProcess(HttpServletRequest request) { LOGGER.info("Inside Data transformation controller" + request.getParameterMap()); String formXML = null;