diff --git a/configmap/dev/veloflow-service-configmap-dev.yaml b/configmap/dev/veloflow-service-configmap-dev.yaml
index bba7f4e486654223d7efb0d3b38a579ca5355930..18b6de97f733727e60a3e9281ba2a4d73552a0ff 100644
--- a/configmap/dev/veloflow-service-configmap-dev.yaml
+++ b/configmap/dev/veloflow-service-configmap-dev.yaml
@@ -4,6 +4,6 @@ metadata:
name: veloflow-service-configmap-dev
data:
APP_ENV: dev
- DB_URL: jdbc:mariadb://192.168.1.206:3306/c10_wrk_flw_v1
+ DB_URL: jdbc:mariadb://192.168.1.206:3306/c10_wrk_flw_v1?tcpKeepAlive=true&connectTimeout=5000&socketTimeout=10000
DB_USER: c10_wrk_flw
SHOW_SQL: "true"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 947d4a48cf5a69a0cb6bc875b095ef5b99c1e556..4645e4c576d37177575b57d53640ed8fa7a02eb5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,7 @@
org.mariadb.jdbc
mariadb-java-client
+ 3.5.7
runtime
diff --git a/src/main/java/xyz/pkay/simpleWf/SimpleWF.java b/src/main/java/xyz/pkay/veloflow/VeloFlow.java
similarity index 91%
rename from src/main/java/xyz/pkay/simpleWf/SimpleWF.java
rename to src/main/java/xyz/pkay/veloflow/VeloFlow.java
index fd2dec4353b42b67fc8cbf01f7304f97a2740e6a..4b7ba40f576229072d7f7bf0fd16d84490918eed 100644
--- a/src/main/java/xyz/pkay/simpleWf/SimpleWF.java
+++ b/src/main/java/xyz/pkay/veloflow/VeloFlow.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf;
+package xyz.pkay.veloflow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -12,10 +12,10 @@ import java.util.Map;
@SpringBootApplication
@RestController
-public class SimpleWF {
+public class VeloFlow {
public static void main(String[] args) {
- SpringApplication.run(SimpleWF.class, args);
+ SpringApplication.run(VeloFlow.class, args);
}
@GetMapping("/")
diff --git a/src/main/java/xyz/pkay/simpleWf/app/api/controller/InstanceController.java b/src/main/java/xyz/pkay/veloflow/app/api/controller/InstanceController.java
similarity index 78%
rename from src/main/java/xyz/pkay/simpleWf/app/api/controller/InstanceController.java
rename to src/main/java/xyz/pkay/veloflow/app/api/controller/InstanceController.java
index e70db8e30a164697bf683b8369289c32c2b9f260..e2cc6d017dc1cdadd986faa72429be80e3441311 100644
--- a/src/main/java/xyz/pkay/simpleWf/app/api/controller/InstanceController.java
+++ b/src/main/java/xyz/pkay/veloflow/app/api/controller/InstanceController.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.app.api.controller;
+package xyz.pkay.veloflow.app.api.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -8,9 +8,9 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import xyz.pkay.simpleWf.core.service.WorkflowInstanceService;
-import xyz.pkay.simpleWf.editor.api.dto.WorkflowInstanceDto;
-import xyz.pkay.simpleWf.editor.mapper.WorkflowMapper;
+import xyz.pkay.veloflow.core.service.WorkflowInstanceService;
+import xyz.pkay.veloflow.editor.api.dto.WorkflowInstanceDto;
+import xyz.pkay.veloflow.editor.mapper.WorkflowMapper;
import java.util.UUID;
@@ -20,10 +20,11 @@ import java.util.UUID;
@Tags({@Tag(name = "Workflow Instance"), @Tag(name = "Executor")})
public class InstanceController {
-
+
private final WorkflowMapper mapper;
+
private final WorkflowInstanceService workflowInstanceService;
-
+
@PostMapping("/start/{workflowId}")
public WorkflowInstanceDto startProcess(@PathVariable UUID workflowId) {
return mapper.toDto(workflowInstanceService.createInstance(workflowId));
diff --git a/src/main/java/xyz/pkay/simpleWf/app/api/controller/TaskController.java b/src/main/java/xyz/pkay/veloflow/app/api/controller/TaskController.java
similarity index 78%
rename from src/main/java/xyz/pkay/simpleWf/app/api/controller/TaskController.java
rename to src/main/java/xyz/pkay/veloflow/app/api/controller/TaskController.java
index a3f236a6450bfdb4af8b57b0d85353b0b6a2d659..402fdd6a0e2b830d7567a79b3b71403f68eac63a 100644
--- a/src/main/java/xyz/pkay/simpleWf/app/api/controller/TaskController.java
+++ b/src/main/java/xyz/pkay/veloflow/app/api/controller/TaskController.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.app.api.controller;
+package xyz.pkay.veloflow.app.api.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.tags.Tags;
@@ -6,10 +6,10 @@ import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import xyz.pkay.simpleWf.core.service.RunnerPools;
-import xyz.pkay.simpleWf.core.service.TaskService;
-import xyz.pkay.simpleWf.editor.api.dto.TaskDto;
-import xyz.pkay.simpleWf.editor.mapper.WorkflowMapper;
+import xyz.pkay.veloflow.core.service.RunnerPools;
+import xyz.pkay.veloflow.core.service.TaskService;
+import xyz.pkay.veloflow.editor.api.dto.TaskDto;
+import xyz.pkay.veloflow.editor.mapper.WorkflowMapper;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/advice/HostnameResponseBodyAdvice.java b/src/main/java/xyz/pkay/veloflow/core/advice/HostnameResponseBodyAdvice.java
similarity index 96%
rename from src/main/java/xyz/pkay/simpleWf/core/advice/HostnameResponseBodyAdvice.java
rename to src/main/java/xyz/pkay/veloflow/core/advice/HostnameResponseBodyAdvice.java
index da3473433fc0d7fcb86393043c2cf6cc4851e678..b175baeab2b7fc9e4dad2133bb7c67d8490f6535 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/advice/HostnameResponseBodyAdvice.java
+++ b/src/main/java/xyz/pkay/veloflow/core/advice/HostnameResponseBodyAdvice.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.advice;
+package xyz.pkay.veloflow.core.advice;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
@@ -7,7 +7,7 @@ import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
-import xyz.pkay.simpleWf.core.context.RequestContext;
+import xyz.pkay.veloflow.core.context.RequestContext;
import java.net.InetAddress;
import java.net.UnknownHostException;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/config/AppConfig.java b/src/main/java/xyz/pkay/veloflow/core/config/AppConfig.java
similarity index 87%
rename from src/main/java/xyz/pkay/simpleWf/core/config/AppConfig.java
rename to src/main/java/xyz/pkay/veloflow/core/config/AppConfig.java
index 5363bb8ad9faef2e4593f5a090f6fbf218c4a7b1..0d09a9c8875e945d2b52c21c1887b1167b61dc57 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/config/AppConfig.java
+++ b/src/main/java/xyz/pkay/veloflow/core/config/AppConfig.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.config;
+package xyz.pkay.veloflow.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -9,14 +9,18 @@ import org.springframework.context.annotation.Configuration;
@Data
public class AppConfig {
String env;
+
ThreadPoolConfig processThreadPool = new ThreadPoolConfig();
+
ThreadPoolConfig taskThreadPool = new ThreadPoolConfig();
-
+
@Data
public static class ThreadPoolConfig {
int corePoolSize = 1;
+
int keepAliveSeconds = 1800;
+
int maxPoolSize = 2;
}
-
+
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/context/RequestContext.java b/src/main/java/xyz/pkay/veloflow/core/context/RequestContext.java
similarity index 89%
rename from src/main/java/xyz/pkay/simpleWf/core/context/RequestContext.java
rename to src/main/java/xyz/pkay/veloflow/core/context/RequestContext.java
index d9bd6492c573ee43877542afceb082a61416a9e1..d702644b6675bba2a14deb780b9b38292fdc0bc7 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/context/RequestContext.java
+++ b/src/main/java/xyz/pkay/veloflow/core/context/RequestContext.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.context;
+package xyz.pkay.veloflow.core.context;
public class RequestContext {
private static final ThreadLocal requestId = new ThreadLocal<>();
diff --git a/src/main/java/xyz/pkay/simpleWf/core/converter/JsonMapConverter.java b/src/main/java/xyz/pkay/veloflow/core/converter/JsonMapConverter.java
similarity index 92%
rename from src/main/java/xyz/pkay/simpleWf/core/converter/JsonMapConverter.java
rename to src/main/java/xyz/pkay/veloflow/core/converter/JsonMapConverter.java
index 48126ac09a49277ddd8bb25b49dae3b26abbd104..1414440af9a089bc13b5b3b19027251cb02f9c95 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/converter/JsonMapConverter.java
+++ b/src/main/java/xyz/pkay/veloflow/core/converter/JsonMapConverter.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.converter;
+package xyz.pkay.veloflow.core.converter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -6,16 +6,16 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.model.WorkflowInstance;
+import xyz.pkay.veloflow.core.data.model.WorkflowInstance;
import java.util.HashMap;
@Converter
@Component
public class JsonMapConverter implements AttributeConverter {
-
+
private static final ObjectMapper objectMapper = new ObjectMapper();
-
+
@Override
public String convertToDatabaseColumn(WorkflowInstance.RuntimeData attribute) {
try {
@@ -29,7 +29,7 @@ public class JsonMapConverter implements AttributeConverter, String> {
+
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ @Override
+ public String convertToDatabaseColumn(List attribute) {
+ try {
+ if (attribute == null) {
+ attribute = new ArrayList<>();
+ }
+ return objectMapper.writeValueAsString(attribute);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public List convertToEntityAttribute(String dbData) {
+ try {
+ return dbData == null || dbData.isEmpty() ? new ArrayList<>() : objectMapper.readValue(dbData, new TypeReference>() {
+ });
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/dto/TaskExecutionResponse.java b/src/main/java/xyz/pkay/veloflow/core/data/dto/TaskExecutionResponse.java
similarity index 80%
rename from src/main/java/xyz/pkay/simpleWf/core/data/dto/TaskExecutionResponse.java
rename to src/main/java/xyz/pkay/veloflow/core/data/dto/TaskExecutionResponse.java
index d2b9e441f03abdfc869adf491277a599d9e6d3e7..0560cdab40cfbdfbfd936a8d0afc7b07c3aeeef8 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/dto/TaskExecutionResponse.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/dto/TaskExecutionResponse.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.dto;
+package xyz.pkay.veloflow.core.data.dto;
import lombok.Data;
@@ -8,5 +8,6 @@ import java.util.Map;
@Data
public class TaskExecutionResponse {
private List actions;
+
private Map outputData;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/EventDefinition.java b/src/main/java/xyz/pkay/veloflow/core/data/model/EventDefinition.java
similarity index 70%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/EventDefinition.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/EventDefinition.java
index 3453f8c7b527fc1c8444c77a69f9af66edbcebfb..da8f47b1f37e10f3701b47f3435fbbf1da85994f 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/EventDefinition.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/EventDefinition.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum EventDefinition {
NONE,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/EventTypes.java b/src/main/java/xyz/pkay/veloflow/core/data/model/EventTypes.java
similarity index 65%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/EventTypes.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/EventTypes.java
index f6233c4041202a460ec39bf8686cf953114ca2d7..37d99b9026074b0c6667acc3a3fd99dc57afca9e 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/EventTypes.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/EventTypes.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum EventTypes {
START_EVENT,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/GatewaySubTypes.java b/src/main/java/xyz/pkay/veloflow/core/data/model/GatewaySubTypes.java
similarity index 74%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/GatewaySubTypes.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/GatewaySubTypes.java
index d95e1a44bc9d5c7fca54190b4e50742337753c9b..c37625904faf4d390546e0d8ae7f1e0e21166d9c 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/GatewaySubTypes.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/GatewaySubTypes.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum GatewaySubTypes {
EXCLUSIVE_GATEWAY,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/InstanceStatus.java b/src/main/java/xyz/pkay/veloflow/core/data/model/InstanceStatus.java
similarity index 61%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/InstanceStatus.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/InstanceStatus.java
index 0a3bda858d00c8a00068b1983fc285e98d30d934..cbccf2a5180ec4ae1accb9c5dddfacad97629915 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/InstanceStatus.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/InstanceStatus.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum InstanceStatus {
RUNNING,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/Step.java b/src/main/java/xyz/pkay/veloflow/core/data/model/Step.java
similarity index 84%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/Step.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/Step.java
index e716363a5e9e96d6ca25c56f9b02702f9094960b..24b49acfdc3183d256e140b154c1009e503f572e 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/Step.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/Step.java
@@ -1,9 +1,9 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
-import xyz.pkay.simpleWf.editor.model.Position;
+import xyz.pkay.veloflow.editor.model.Position;
import java.util.UUID;
@@ -29,9 +29,9 @@ public class Step {
@Column(nullable = false)
private String name;
-
- @Column(name = "step_order", nullable = false)
- private Integer order;
+
+// @Column(name = "step_order", nullable = false)
+// private Integer order;
@Embedded
private Position position;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/StepTypes.java b/src/main/java/xyz/pkay/veloflow/core/data/model/StepTypes.java
similarity index 58%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/StepTypes.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/StepTypes.java
index 146bfe43d6b17ea4110ba70c031017f8020cc737..f0ccf772cfec77ff82d65a937c67870bb78910a2 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/StepTypes.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/StepTypes.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum StepTypes {
TASK,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/Task.java b/src/main/java/xyz/pkay/veloflow/core/data/model/Task.java
similarity index 96%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/Task.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/Task.java
index 56a23338ef3de4af80fabdbc805f3cccb9c2f652..a0abf1353dbcf544d5f910f4c0c5a54ef60ed6b9 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/Task.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/Task.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
import jakarta.persistence.*;
import lombok.Getter;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/TaskStatus.java b/src/main/java/xyz/pkay/veloflow/core/data/model/TaskStatus.java
similarity index 68%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/TaskStatus.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/TaskStatus.java
index 67aeb15042db58a33bdf4503dda04c4e68418ee2..8ae4b806052533d0d1da4602673debaa1d9baf30 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/TaskStatus.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/TaskStatus.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum TaskStatus {
NEW, ASSIGNED, PRE_EXECUTE, POST_EXECUTE, COMPLETED, FAILED
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/TaskSubTypes.java b/src/main/java/xyz/pkay/veloflow/core/data/model/TaskSubTypes.java
similarity index 78%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/TaskSubTypes.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/TaskSubTypes.java
index b839d5fb63552399f2f6e238e425e195b9b29acc..3b06cc9d6c956f678bde05b3f20756d420739971 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/TaskSubTypes.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/TaskSubTypes.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
public enum TaskSubTypes {
USER_TASK,
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/Transition.java b/src/main/java/xyz/pkay/veloflow/core/data/model/Transition.java
similarity index 74%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/Transition.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/Transition.java
index 7fbd74533781012fed5169530864e57c117e8f2c..c7130fadce92ebeb6c8d43d5d3cbc58b15a38497 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/Transition.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/Transition.java
@@ -1,11 +1,14 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
-import xyz.pkay.simpleWf.editor.model.Anchor;
-import xyz.pkay.simpleWf.editor.model.Position;
+import xyz.pkay.veloflow.core.converter.JsonPositionListConverter;
+import xyz.pkay.veloflow.editor.model.Anchor;
+import xyz.pkay.veloflow.editor.model.Position;
+import java.util.ArrayList;
+import java.util.List;
import java.util.UUID;
@Entity
@@ -13,37 +16,46 @@ import java.util.UUID;
@Getter
@Setter
public class Transition {
-
+
@Column(nullable = false)
private String actionName;
+
@Column(nullable = false)
private String actionValue;
+
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "current_step_id", nullable = false)
private Step currentStep;
+
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "side", column = @Column(name = "from_anchor_side")),
@AttributeOverride(name = "sideIndex", column = @Column(name = "from_anchor_index"))
})
private Anchor fromAnchor;
+
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
+
@Column
private String name;
+
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "next_step_id", nullable = false)
private Step nextStep;
+
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "side", column = @Column(name = "to_anchor_side")),
@AttributeOverride(name = "sideIndex", column = @Column(name = "to_anchor_index"))
})
private Anchor toAnchor;
- @ElementCollection
- @CollectionTable(name = "transition_waypoints", joinColumns = @JoinColumn(name = "transition_id"))
- private java.util.List waypoints = new java.util.ArrayList<>();
+
+ @Convert(converter = JsonPositionListConverter.class)
+ @Column(columnDefinition = "TEXT")
+ private List waypoints = new ArrayList<>();
+
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "workflow_id", nullable = false)
private Workflow workflow;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/Workflow.java b/src/main/java/xyz/pkay/veloflow/core/data/model/Workflow.java
similarity index 82%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/Workflow.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/Workflow.java
index b167be2d1c19cf28539275863ea0c067aa1c4d2a..d324600fe26a3f4c514dbcab301fda7cc8c8f959 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/Workflow.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/Workflow.java
@@ -1,46 +1,50 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
@Entity
@Table(name = "workflows")
public class Workflow {
-
+
@Getter
private LocalDateTime createdAt;
+
// Getters and Setters
@Getter
@Setter
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
+
@Getter
@OneToMany(mappedBy = "workflow", cascade = CascadeType.ALL, orphanRemoval = true)
private List instances = new ArrayList<>();
+
@Getter
@Setter
@Column(nullable = false)
private String name;
+
@Setter
@Getter
@Column(nullable = false)
private String status; // e.g., PENDING, RUNNING, COMPLETED
+
@Getter
@Setter
@OneToMany(mappedBy = "workflow", cascade = CascadeType.ALL, orphanRemoval = true)
- private List steps = new ArrayList<>();
+ private Set steps = new HashSet<>();
+
@Getter
@Setter
@OneToMany(mappedBy = "workflow", cascade = CascadeType.ALL, orphanRemoval = true)
- private List transitions = new ArrayList<>();
-
+ private Set transitions = new HashSet<>();
+
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/model/WorkflowInstance.java b/src/main/java/xyz/pkay/veloflow/core/data/model/WorkflowInstance.java
similarity index 93%
rename from src/main/java/xyz/pkay/simpleWf/core/data/model/WorkflowInstance.java
rename to src/main/java/xyz/pkay/veloflow/core/data/model/WorkflowInstance.java
index 59b0e60e27598d8d8b91d3b37d055d8c736e7088..9b8573485045dcc519e27afc9bc5045b011a05b6 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/model/WorkflowInstance.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/model/WorkflowInstance.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.data.model;
+package xyz.pkay.veloflow.core.data.model;
import jakarta.persistence.*;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
-import xyz.pkay.simpleWf.core.converter.JsonMapConverter;
+import xyz.pkay.veloflow.core.converter.JsonMapConverter;
import java.time.LocalDateTime;
import java.util.ArrayList;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/repository/StepRepository.java b/src/main/java/xyz/pkay/veloflow/core/data/repository/StepRepository.java
similarity index 69%
rename from src/main/java/xyz/pkay/simpleWf/core/data/repository/StepRepository.java
rename to src/main/java/xyz/pkay/veloflow/core/data/repository/StepRepository.java
index f59016413d27dca5f397fcb0b27d12036dbdf6bc..5456d32f309434ccd0ddf1a15e0edce73e05f21f 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/repository/StepRepository.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/repository/StepRepository.java
@@ -1,8 +1,8 @@
-package xyz.pkay.simpleWf.core.data.repository;
+package xyz.pkay.veloflow.core.data.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
-import xyz.pkay.simpleWf.core.data.model.Step;
+import xyz.pkay.veloflow.core.data.model.Step;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/repository/TaskRepository.java b/src/main/java/xyz/pkay/veloflow/core/data/repository/TaskRepository.java
similarity index 80%
rename from src/main/java/xyz/pkay/simpleWf/core/data/repository/TaskRepository.java
rename to src/main/java/xyz/pkay/veloflow/core/data/repository/TaskRepository.java
index 5039ceb4158e91e8b06f269a6933e4e19dd215fc..d8736e793f92efea0412643497191c33924b1860 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/repository/TaskRepository.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/repository/TaskRepository.java
@@ -1,9 +1,9 @@
-package xyz.pkay.simpleWf.core.data.repository;
+package xyz.pkay.veloflow.core.data.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
-import xyz.pkay.simpleWf.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.model.Task;
import java.util.List;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowInstanceRepository.java b/src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowInstanceRepository.java
similarity index 67%
rename from src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowInstanceRepository.java
rename to src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowInstanceRepository.java
index 92bac174a817322545d4d5b41df4ca6b317eb223..63d87d48f7f612c91caf0099e1ec42068dcdbd92 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowInstanceRepository.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowInstanceRepository.java
@@ -1,8 +1,8 @@
-package xyz.pkay.simpleWf.core.data.repository;
+package xyz.pkay.veloflow.core.data.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
-import xyz.pkay.simpleWf.core.data.model.WorkflowInstance;
+import xyz.pkay.veloflow.core.data.model.WorkflowInstance;
@Repository
public interface WorkflowInstanceRepository extends JpaRepository {
diff --git a/src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowRepository.java b/src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowRepository.java
similarity index 52%
rename from src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowRepository.java
rename to src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowRepository.java
index 8707a28a37d2f8e3f8721db3aad665fa431e7308..1a72072cbd97da38905909da30dff74b204004cc 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/data/repository/WorkflowRepository.java
+++ b/src/main/java/xyz/pkay/veloflow/core/data/repository/WorkflowRepository.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.data.repository;
+package xyz.pkay.veloflow.core.data.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
-import xyz.pkay.simpleWf.core.data.model.Workflow;
+import xyz.pkay.veloflow.core.data.model.Workflow;
import java.util.Optional;
import java.util.UUID;
@@ -12,6 +12,9 @@ import java.util.UUID;
@Repository
public interface WorkflowRepository extends JpaRepository {
- @Query("SELECT w FROM Workflow w LEFT JOIN FETCH w.steps WHERE w.id = :id")
- Optional findByIdWithSteps(@Param("id") UUID id);
+ @Query("SELECT w FROM Workflow w " +
+ "LEFT JOIN FETCH w.steps " +
+ "LEFT JOIN FETCH w.transitions " +
+ "WHERE w.id = :id")
+ Optional findByIdWithFullDetails(@Param("id") UUID id);
}
\ No newline at end of file
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/BaseTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/BaseTaskExecutor.java
similarity index 61%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/BaseTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/BaseTaskExecutor.java
index 5a7ab45f10dad06ae6f37447ccf28198f48d51ab..ebcae4ee053da54d070717a1963ad08e81f3c3f4 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/BaseTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/BaseTaskExecutor.java
@@ -1,9 +1,9 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
-import xyz.pkay.simpleWf.core.data.dto.TaskExecutionResponse;
-import xyz.pkay.simpleWf.core.data.model.Task;
-import xyz.pkay.simpleWf.core.data.model.TaskStatus;
+import xyz.pkay.veloflow.core.data.dto.TaskExecutionResponse;
+import xyz.pkay.veloflow.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.model.TaskStatus;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/DecisionTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/DecisionTaskExecutor.java
similarity index 61%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/DecisionTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/DecisionTaskExecutor.java
index 0cda86539280fd9baceff064120034809da16910..472d6ff2073713d42922c6c4c57d8cc23aa498db 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/DecisionTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/DecisionTaskExecutor.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
public interface DecisionTaskExecutor extends BaseTaskExecutor {
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultDecisionTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultDecisionTaskExecutor.java
similarity index 72%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/DefaultDecisionTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/DefaultDecisionTaskExecutor.java
index 786d22a4a670a62f40f52ca3dc426b5f1aae60eb..147405797b76ea16cba7d656cb8379c8a9d3ba3e 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultDecisionTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultDecisionTaskExecutor.java
@@ -1,8 +1,8 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.dto.TaskExecutionResponse;
-import xyz.pkay.simpleWf.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.dto.TaskExecutionResponse;
+import xyz.pkay.veloflow.core.data.model.Task;
import java.util.UUID;
@@ -12,19 +12,19 @@ public class DefaultDecisionTaskExecutor implements DecisionTaskExecutor {
public TaskExecutionResponse execute(Task task) {
return null;
}
-
+
@Override
public Task init(Long pid, UUID stepId) {
return null;
}
-
+
@Override
public void interrupt() {
-
+
}
-
+
@Override
public void preExecute(Long taskId) {
-
+
}
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultScriptTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultScriptTaskExecutor.java
similarity index 72%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/DefaultScriptTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/DefaultScriptTaskExecutor.java
index 6d5521c564a521a77bfa69c4361e2fbda705972c..5bc30f9332300e2106b0a032b5abab0f48efecc2 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultScriptTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultScriptTaskExecutor.java
@@ -1,8 +1,8 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.dto.TaskExecutionResponse;
-import xyz.pkay.simpleWf.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.dto.TaskExecutionResponse;
+import xyz.pkay.veloflow.core.data.model.Task;
import java.util.UUID;
@@ -12,19 +12,19 @@ public class DefaultScriptTaskExecutor implements ScriptTaskExecutor {
public TaskExecutionResponse execute(Task task) {
return null;
}
-
+
@Override
public Task init(Long pid, UUID stepId) {
return null;
}
-
+
@Override
public void interrupt() {
-
+
}
-
+
@Override
public void preExecute(Long taskId) {
-
+
}
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultSystemTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultSystemTaskExecutor.java
similarity index 72%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/DefaultSystemTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/DefaultSystemTaskExecutor.java
index cb7fd94fa3549d77f09d9a873f84198762a536a7..df96f698013e5136cd24741ea0ebcd311b5633a3 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultSystemTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultSystemTaskExecutor.java
@@ -1,8 +1,8 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.dto.TaskExecutionResponse;
-import xyz.pkay.simpleWf.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.dto.TaskExecutionResponse;
+import xyz.pkay.veloflow.core.data.model.Task;
import java.util.UUID;
@@ -12,19 +12,19 @@ public class DefaultSystemTaskExecutor implements SystemTaskExecutor {
public TaskExecutionResponse execute(Task task) {
return null;
}
-
+
@Override
public Task init(Long pid, UUID stepId) {
return null;
}
-
+
@Override
public void interrupt() {
-
+
}
-
+
@Override
public void preExecute(Long taskId) {
-
+
}
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultUserTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultUserTaskExecutor.java
similarity index 73%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/DefaultUserTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/DefaultUserTaskExecutor.java
index d7602ac094ca95a303980f71cc8939e996aac6c3..9ece40c52ac495ec521229a506659c7bd8578e93 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/DefaultUserTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/DefaultUserTaskExecutor.java
@@ -1,14 +1,14 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.dto.TaskExecutionResponse;
-import xyz.pkay.simpleWf.core.data.model.Task;
-import xyz.pkay.simpleWf.core.data.model.WorkflowInstance;
-import xyz.pkay.simpleWf.core.data.repository.WorkflowInstanceRepository;
-import xyz.pkay.simpleWf.core.service.CommonTaskServices;
-import xyz.pkay.simpleWf.core.service.StepService;
-import xyz.pkay.simpleWf.core.service.TaskService;
+import xyz.pkay.veloflow.core.data.dto.TaskExecutionResponse;
+import xyz.pkay.veloflow.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.model.WorkflowInstance;
+import xyz.pkay.veloflow.core.data.repository.WorkflowInstanceRepository;
+import xyz.pkay.veloflow.core.service.CommonTaskServices;
+import xyz.pkay.veloflow.core.service.StepService;
+import xyz.pkay.veloflow.core.service.TaskService;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/ExecutorRegistry.java b/src/main/java/xyz/pkay/veloflow/core/executors/ExecutorRegistry.java
similarity index 94%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/ExecutorRegistry.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/ExecutorRegistry.java
index 7b3a51b82eda2316194fdbbe7267e35ba616a8e8..0888632d09f10738bfa23233aae457725af05af4 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/ExecutorRegistry.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/ExecutorRegistry.java
@@ -1,9 +1,9 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.model.Step;
-import xyz.pkay.simpleWf.core.data.model.StepTypes;
+import xyz.pkay.veloflow.core.data.model.Step;
+import xyz.pkay.veloflow.core.data.model.StepTypes;
import java.beans.Introspector;
import java.util.Map;
@@ -11,19 +11,19 @@ import java.util.Map;
@Component
@Slf4j
public class ExecutorRegistry {
-
+
private final Map executorsByBeanName;
-
+
public ExecutorRegistry(Map executorsByBeanName) {
// Make it unmodifiable to guarantee no accidental mutation in the hot path
this.executorsByBeanName = Map.copyOf(executorsByBeanName);
log.info("ExecutorRegistry initialized with {} executors", this.executorsByBeanName.size());
}
-
+
private static String beanName(Class> clazz) {
return Introspector.decapitalize(clazz.getSimpleName());
}
-
+
private BaseTaskExecutor required(String beanName, Step step) {
BaseTaskExecutor ex = executorsByBeanName.get(beanName);
if (ex == null) {
@@ -33,16 +33,16 @@ public class ExecutorRegistry {
}
return ex;
}
-
+
public BaseTaskExecutor resolve(Step step) {
if (step == null) throw new IllegalArgumentException("step must not be null");
-
+
String name = step.getExecutorClassName();
if (name != null && !name.isBlank()) {
BaseTaskExecutor exact = executorsByBeanName.get(name);
if (exact != null) return exact;
}
-
+
// fallback (no caching of misses)
if (step.getType() == StepTypes.TASK && step.getTaskSubType() != null) {
switch (step.getTaskSubType()) {
@@ -74,7 +74,7 @@ public class ExecutorRegistry {
// Events might not have executors or might have default ones
throw new IllegalArgumentException("Events do not have default executors yet");
}
-
+
throw new IllegalArgumentException("Unsupported step type or missing sub-type: " + step.getType());
}
}
\ No newline at end of file
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/ScriptTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/ScriptTaskExecutor.java
similarity index 61%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/ScriptTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/ScriptTaskExecutor.java
index 70cc9179dea5c5d48d252dda47a6f8e5a42b34f5..bba4402000ad86c70ced011d43ed659ceac6cf76 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/ScriptTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/ScriptTaskExecutor.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
public interface ScriptTaskExecutor extends BaseTaskExecutor {
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/SystemTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/SystemTaskExecutor.java
similarity index 61%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/SystemTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/SystemTaskExecutor.java
index a62540a9a0da9d961cd5d31b3d2b9d65f5487707..0da2da557119a572ce91a3e0d0be0615e9e7dc27 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/SystemTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/SystemTaskExecutor.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
public interface SystemTaskExecutor extends BaseTaskExecutor {
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/executors/UserTaskExecutor.java b/src/main/java/xyz/pkay/veloflow/core/executors/UserTaskExecutor.java
similarity index 60%
rename from src/main/java/xyz/pkay/simpleWf/core/executors/UserTaskExecutor.java
rename to src/main/java/xyz/pkay/veloflow/core/executors/UserTaskExecutor.java
index eebfba6f20d54fc3cd84454325e002fcc45291a2..7fb826b37a7cfeb7f834fff3f42ca8e56389e0f1 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/executors/UserTaskExecutor.java
+++ b/src/main/java/xyz/pkay/veloflow/core/executors/UserTaskExecutor.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.executors;
+package xyz.pkay.veloflow.core.executors;
public interface UserTaskExecutor extends BaseTaskExecutor {
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/filter/RequestIdFilter.java b/src/main/java/xyz/pkay/veloflow/core/filter/RequestIdFilter.java
similarity index 93%
rename from src/main/java/xyz/pkay/simpleWf/core/filter/RequestIdFilter.java
rename to src/main/java/xyz/pkay/veloflow/core/filter/RequestIdFilter.java
index 6caa18135382aa864e63684a550d82dad446b178..259250afc455db7be97482a44c87d86ae13a4ea4 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/filter/RequestIdFilter.java
+++ b/src/main/java/xyz/pkay/veloflow/core/filter/RequestIdFilter.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.core.filter;
+package xyz.pkay.veloflow.core.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
@@ -6,7 +6,7 @@ import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.context.RequestContext;
+import xyz.pkay.veloflow.core.context.RequestContext;
import java.io.IOException;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/filter/RequestLoggingFilter.java b/src/main/java/xyz/pkay/veloflow/core/filter/RequestLoggingFilter.java
similarity index 93%
rename from src/main/java/xyz/pkay/simpleWf/core/filter/RequestLoggingFilter.java
rename to src/main/java/xyz/pkay/veloflow/core/filter/RequestLoggingFilter.java
index 8769013946b260c030f9890b26cd8e76d9b454a7..27991ca9d013734dc9a1761e63c0d35784907632 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/filter/RequestLoggingFilter.java
+++ b/src/main/java/xyz/pkay/veloflow/core/filter/RequestLoggingFilter.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.filter;
+package xyz.pkay.veloflow.core.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.context.RequestContext;
+import xyz.pkay.veloflow.core.context.RequestContext;
import java.io.IOException;
import java.net.InetAddress;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/CommonTaskServices.java b/src/main/java/xyz/pkay/veloflow/core/service/CommonTaskServices.java
similarity index 77%
rename from src/main/java/xyz/pkay/simpleWf/core/service/CommonTaskServices.java
rename to src/main/java/xyz/pkay/veloflow/core/service/CommonTaskServices.java
index cbc70f8176b13c1e3f94fc0fd971524d51289fd7..baec1a798aec7521df75e888bb1cf1e21afb3168 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/CommonTaskServices.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/CommonTaskServices.java
@@ -1,12 +1,12 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.model.Step;
-import xyz.pkay.simpleWf.core.data.model.Task;
-import xyz.pkay.simpleWf.core.data.model.TaskStatus;
-import xyz.pkay.simpleWf.core.data.model.WorkflowInstance;
+import xyz.pkay.veloflow.core.data.model.Step;
+import xyz.pkay.veloflow.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.model.TaskStatus;
+import xyz.pkay.veloflow.core.data.model.WorkflowInstance;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/RunnerPools.java b/src/main/java/xyz/pkay/veloflow/core/service/RunnerPools.java
similarity index 96%
rename from src/main/java/xyz/pkay/simpleWf/core/service/RunnerPools.java
rename to src/main/java/xyz/pkay/veloflow/core/service/RunnerPools.java
index eb58426a305478ba3fa9449080c5c2cc80be88ad..e83873742f2cc2d585c1998c18e80223799cca0a 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/RunnerPools.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/RunnerPools.java
@@ -1,11 +1,11 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import jakarta.annotation.PreDestroy;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.config.AppConfig;
-import xyz.pkay.simpleWf.core.data.model.Task;
-import xyz.pkay.simpleWf.core.executors.BaseTaskExecutor;
-import xyz.pkay.simpleWf.core.executors.ExecutorRegistry;
+import xyz.pkay.veloflow.core.config.AppConfig;
+import xyz.pkay.veloflow.core.data.model.Task;
+import xyz.pkay.veloflow.core.executors.BaseTaskExecutor;
+import xyz.pkay.veloflow.core.executors.ExecutorRegistry;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/StepService.java b/src/main/java/xyz/pkay/veloflow/core/service/StepService.java
similarity index 69%
rename from src/main/java/xyz/pkay/simpleWf/core/service/StepService.java
rename to src/main/java/xyz/pkay/veloflow/core/service/StepService.java
index a8c6e4f052d3c12a27f1a94794e9de972ce4939a..523afb30d027b51584deadb2a03a2cddfc940832 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/StepService.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/StepService.java
@@ -1,19 +1,19 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.data.model.Step;
-import xyz.pkay.simpleWf.core.data.repository.StepRepository;
+import xyz.pkay.veloflow.core.data.model.Step;
+import xyz.pkay.veloflow.core.data.repository.StepRepository;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class StepService {
-
+
private final StepRepository stepRepository;
-
+
@Transactional
public void deleteStep(UUID id) {
if (!stepRepository.existsById(id)) {
@@ -21,9 +21,9 @@ public class StepService {
}
stepRepository.deleteById(id);
}
-
+
public Step getStepById(UUID id) {
return stepRepository.findById(id)
- .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
+ .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
}
}
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/TaskService.java b/src/main/java/xyz/pkay/veloflow/core/service/TaskService.java
similarity index 85%
rename from src/main/java/xyz/pkay/simpleWf/core/service/TaskService.java
rename to src/main/java/xyz/pkay/veloflow/core/service/TaskService.java
index 7637ca2836c141b577f00627ffbf568ae21ae306..6705feb4cd8de9b197e17c06edc9d71b1cf6f72b 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/TaskService.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/TaskService.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.data.model.Task;
-import xyz.pkay.simpleWf.core.data.repository.TaskRepository;
+import xyz.pkay.veloflow.core.data.model.Task;
+import xyz.pkay.veloflow.core.data.repository.TaskRepository;
import java.util.List;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/WorkflowInstanceService.java b/src/main/java/xyz/pkay/veloflow/core/service/WorkflowInstanceService.java
similarity index 93%
rename from src/main/java/xyz/pkay/simpleWf/core/service/WorkflowInstanceService.java
rename to src/main/java/xyz/pkay/veloflow/core/service/WorkflowInstanceService.java
index 1139b121318aadcc724f81547b3648b6991b4bc7..0c3f5866df8c5d9c2063b672bde502a079aae82b 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/WorkflowInstanceService.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/WorkflowInstanceService.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.data.model.*;
-import xyz.pkay.simpleWf.core.data.repository.WorkflowInstanceRepository;
+import xyz.pkay.veloflow.core.data.model.*;
+import xyz.pkay.veloflow.core.data.repository.WorkflowInstanceRepository;
import java.time.LocalDateTime;
import java.util.UUID;
diff --git a/src/main/java/xyz/pkay/simpleWf/core/service/WorkflowService.java b/src/main/java/xyz/pkay/veloflow/core/service/WorkflowService.java
similarity index 76%
rename from src/main/java/xyz/pkay/simpleWf/core/service/WorkflowService.java
rename to src/main/java/xyz/pkay/veloflow/core/service/WorkflowService.java
index 9640d88734a779d105a235b63b77f8bac2268e61..3953805f78bf94b308391c658f2d71b2347620a8 100644
--- a/src/main/java/xyz/pkay/simpleWf/core/service/WorkflowService.java
+++ b/src/main/java/xyz/pkay/veloflow/core/service/WorkflowService.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.core.service;
+package xyz.pkay.veloflow.core.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.data.model.Workflow;
-import xyz.pkay.simpleWf.core.data.repository.WorkflowRepository;
+import xyz.pkay.veloflow.core.data.model.Workflow;
+import xyz.pkay.veloflow.core.data.repository.WorkflowRepository;
import java.util.List;
import java.util.UUID;
@@ -30,17 +30,19 @@ public class WorkflowService {
repository.deleteById(id);
}
+ @Transactional(readOnly = true)
public List getAllWorkflows() {
return repository.findAll();
}
+ @Transactional(readOnly = true)
public Workflow getWorkflowById(UUID id) {
return repository.findById(id).orElseThrow(() -> new RuntimeException("Workflow not found with id: " + id));
}
public Workflow getWorkflowWithStepsById(UUID id) {
- return repository.findByIdWithSteps(id).orElseThrow(() -> new RuntimeException("Workflow not found with id: " + id));
+ return repository.findByIdWithFullDetails(id).orElseThrow(() -> new RuntimeException("Workflow not found with id: " + id));
}
@Transactional
@@ -51,11 +53,13 @@ public class WorkflowService {
existingWorkflow.setStatus(workflow.getStatus());
if (workflow.getSteps() != null) {
existingWorkflow.getSteps().clear();
- existingWorkflow.getSteps().addAll(workflow.getSteps().stream().peek(s -> s.setWorkflow(existingWorkflow)).toList());
+ existingWorkflow.getSteps().addAll(workflow.getSteps());
+ existingWorkflow.getSteps().forEach(s -> s.setWorkflow(existingWorkflow));
}
if (workflow.getTransitions() != null) {
existingWorkflow.getTransitions().clear();
- existingWorkflow.getTransitions().addAll(workflow.getTransitions().stream().peek(t -> t.setWorkflow(existingWorkflow)).toList());
+ existingWorkflow.getTransitions().addAll(workflow.getTransitions());
+ existingWorkflow.getTransitions().forEach(t -> t.setWorkflow(existingWorkflow));
}
return repository.save(existingWorkflow);
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/controller/StepEditorController.java b/src/main/java/xyz/pkay/veloflow/editor/api/controller/StepEditorController.java
similarity index 88%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/controller/StepEditorController.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/controller/StepEditorController.java
index fae1efdc34bf35a1bd910761d93e992fdbf45eba..b109c31d6e46941ef1e66d06d16d5119d33674a9 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/controller/StepEditorController.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/controller/StepEditorController.java
@@ -1,12 +1,12 @@
-package xyz.pkay.simpleWf.editor.api.controller;
+package xyz.pkay.veloflow.editor.api.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.tags.Tags;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import xyz.pkay.simpleWf.editor.api.dto.StepDto;
-import xyz.pkay.simpleWf.editor.service.StepEditorService;
+import xyz.pkay.veloflow.editor.api.dto.StepDto;
+import xyz.pkay.veloflow.editor.service.StepEditorService;
import java.util.List;
import java.util.UUID;
@@ -17,30 +17,30 @@ import java.util.UUID;
@Tags({@Tag(name = "Steps"), @Tag(name = "Editor")})
public class StepEditorController {
-
+
private final StepEditorService stepEditorService;
-
+
@PostMapping("/Workflows/{workflowId}")
public ResponseEntity create(@PathVariable UUID workflowId, @RequestBody StepDto stepDto) {
return ResponseEntity.ok(stepEditorService.createStep(workflowId, stepDto));
}
-
+
@DeleteMapping("/{id}")
public ResponseEntity delete(@PathVariable UUID id) {
stepEditorService.deleteStep(id);
return ResponseEntity.noContent().build();
}
-
+
@GetMapping("/{id}")
public ResponseEntity getById(@PathVariable UUID id) {
return ResponseEntity.ok(stepEditorService.getStepById(id));
}
-
+
@GetMapping("/Workflows/{workflowId}")
public List listByWorkflow(@PathVariable UUID workflowId) {
return stepEditorService.getStepsByWorkflowId(workflowId);
}
-
+
@PutMapping("/{id}")
public ResponseEntity update(@PathVariable UUID id, @RequestBody StepDto stepDto) {
return ResponseEntity.ok(stepEditorService.updateStep(id, stepDto));
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/controller/WorkflowEditorController.java b/src/main/java/xyz/pkay/veloflow/editor/api/controller/WorkflowEditorController.java
similarity index 53%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/controller/WorkflowEditorController.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/controller/WorkflowEditorController.java
index 653725e48174734cf4243ceff2dd8bc06276861e..2bbd215f00fc516154c68a941b96125eb78bb473 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/controller/WorkflowEditorController.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/controller/WorkflowEditorController.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.api.controller;
+package xyz.pkay.veloflow.editor.api.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -6,8 +6,8 @@ import io.swagger.v3.oas.annotations.tags.Tags;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
-import xyz.pkay.simpleWf.editor.api.dto.WorkflowDto;
-import xyz.pkay.simpleWf.editor.service.WorkflowEditorService;
+import xyz.pkay.veloflow.editor.api.dto.WorkflowDto;
+import xyz.pkay.veloflow.editor.service.WorkflowEditorService;
import java.util.List;
import java.util.UUID;
@@ -17,43 +17,55 @@ import java.util.UUID;
@RequiredArgsConstructor
@Tags({@Tag(name = "Workflows"), @Tag(name = "Editor")})
public class WorkflowEditorController {
-
+
private final WorkflowEditorService workflowEditorService;
-
+
@PostMapping
public ResponseEntity create(@RequestBody WorkflowDto workflowDto) {
return ResponseEntity.ok(workflowEditorService.createWorkflow(workflowDto));
}
-
-
+
+
@DeleteMapping("/{id}")
public ResponseEntity delete(@PathVariable UUID id) {
workflowEditorService.deleteWorkflow(id);
return ResponseEntity.noContent().build();
}
-
-
+
+ @GetMapping("/{id}/export/bpmn")
+ public ResponseEntity exportToBpmn(@PathVariable UUID id) throws Exception {
+ String bpmnXml = workflowEditorService.exportWorkflowToBpmn(id);
+ return ResponseEntity.ok()
+ .header("Content-Type", "application/xml")
+ .body(bpmnXml);
+ }
+
@GetMapping("/{id}")
public ResponseEntity getById(@PathVariable UUID id) throws InterruptedException {
return ResponseEntity.ok(workflowEditorService.getWorkflowById(id));
}
-
-
+
+ @PostMapping("/import/bpmn")
+ public ResponseEntity importFromBpmn(@RequestBody String bpmnXml) throws Exception {
+ return ResponseEntity.ok(workflowEditorService.importWorkflowFromBpmn(bpmnXml));
+ }
+
+
@GetMapping
public List list() {
return workflowEditorService.getAllWorkflows();
}
-
+
@PutMapping("/{id}")
public ResponseEntity update(@PathVariable UUID id, @RequestBody WorkflowDto workflowDto) {
WorkflowDto updatedDto = WorkflowDto.builder()
- .createdAt(workflowDto.getCreatedAt())
- .id(id)
- .name(workflowDto.getName())
- .status(workflowDto.getStatus())
- .steps(workflowDto.getSteps())
- .transitions(workflowDto.getTransitions())
- .build();
+ .createdAt(workflowDto.getCreatedAt())
+ .id(id)
+ .name(workflowDto.getName())
+ .status(workflowDto.getStatus())
+ .steps(workflowDto.getSteps())
+ .transitions(workflowDto.getTransitions())
+ .build();
return ResponseEntity.ok(workflowEditorService.updateWorkflow(id, updatedDto));
}
}
\ No newline at end of file
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/AnchorDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/AnchorDto.java
similarity index 71%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/AnchorDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/AnchorDto.java
index a551792faf5bdea92a013e5d7290e30e86a7364f..7a030d3434726ea0ef87a14da07d3f63c2c344bd 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/AnchorDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/AnchorDto.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import xyz.pkay.simpleWf.editor.model.enums.Side;
+import xyz.pkay.veloflow.editor.model.enums.Side;
@Builder
@Data
@@ -12,5 +12,6 @@ import xyz.pkay.simpleWf.editor.model.enums.Side;
@AllArgsConstructor
public class AnchorDto {
private Side side;
+
private Integer sideIndex;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/PositionDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/PositionDto.java
similarity index 68%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/PositionDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/PositionDto.java
index 4bf6e5368e984c418a2b6ee021c7fbcf2fa43604..d202dee912dd0aa43c1a6ec60fa40dac9cf16be0 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/PositionDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/PositionDto.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -10,6 +10,11 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
public class PositionDto {
+ private Integer height;
+
+ private Integer width;
+
private Integer x;
+
private Integer y;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/StepDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/StepDto.java
similarity index 76%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/StepDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/StepDto.java
index 633367e4192d03f3871e11db068297dcd3a2731e..f9311fd0c8808f3aa94382d2cb1e4d06457ad5e7 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/StepDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/StepDto.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import xyz.pkay.simpleWf.core.data.model.*;
+import xyz.pkay.veloflow.core.data.model.*;
import java.util.UUID;
@@ -14,13 +14,22 @@ import java.util.UUID;
@AllArgsConstructor
public class StepDto {
private EventDefinition eventDefinition;
+
private EventTypes eventType;
+
private String executorClassName;
+
private GatewaySubTypes gatewaySubType;
+
private UUID id;
+
private String name;
- private Integer order;
+
+// private Integer order;
+
private PositionDto position;
+
private TaskSubTypes taskSubType;
+
private StepTypes type;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/TaskDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/TaskDto.java
similarity index 92%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/TaskDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/TaskDto.java
index c1edc985a4a03ced46d0eb36228d5de61bd14d7b..c067c7b0b7ee2be91083698381ad905f82f31cd4 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/TaskDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/TaskDto.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/TransitionDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/TransitionDto.java
similarity index 86%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/TransitionDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/TransitionDto.java
index 8c52c94f324a504716a94425912184ae77fdc1a3..e1d6ce780ae304de4a9691fd758abb538038c89d 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/TransitionDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/TransitionDto.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -13,12 +13,20 @@ import java.util.UUID;
@AllArgsConstructor
public class TransitionDto {
private String actionName;
+
private String actionValue;
+
private UUID currentStepId;
+
private AnchorDto fromAnchor;
+
private UUID id;
+
private String name;
+
private UUID nextStepId;
+
private AnchorDto toAnchor;
+
private java.util.List waypoints;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowDto.java
similarity index 87%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowDto.java
index 47f441229dd581664b2425bfc2f91125b6ef1dad..141607c8ff561f33551e8df2d9c54cf1eebaf06e 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowDto.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -15,9 +15,14 @@ import java.util.UUID;
@AllArgsConstructor
public class WorkflowDto {
private LocalDateTime createdAt;
+
private UUID id;
+
private String name;
+
private String status;
+
private List steps;
+
private List transitions;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowInstanceDto.java b/src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowInstanceDto.java
similarity index 84%
rename from src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowInstanceDto.java
rename to src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowInstanceDto.java
index de1d9dce51127dcf6f6af730fdc11da47ccd3281..f3e60fa1774ae6e2fb60660c24ed9ef02181633a 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/api/dto/WorkflowInstanceDto.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/api/dto/WorkflowInstanceDto.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.editor.api.dto;
+package xyz.pkay.veloflow.editor.api.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import xyz.pkay.simpleWf.core.data.model.InstanceStatus;
+import xyz.pkay.veloflow.core.data.model.InstanceStatus;
import java.time.LocalDateTime;
import java.util.List;
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/mapper/WorkflowMapper.java b/src/main/java/xyz/pkay/veloflow/editor/mapper/WorkflowMapper.java
similarity index 89%
rename from src/main/java/xyz/pkay/simpleWf/editor/mapper/WorkflowMapper.java
rename to src/main/java/xyz/pkay/veloflow/editor/mapper/WorkflowMapper.java
index a7f8fbc9d7c761fb0d70d838de2d24428688eabd..67ff0ff101be14da089674be431fba386ff33c91 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/mapper/WorkflowMapper.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/mapper/WorkflowMapper.java
@@ -1,10 +1,10 @@
-package xyz.pkay.simpleWf.editor.mapper;
+package xyz.pkay.veloflow.editor.mapper;
import org.springframework.stereotype.Component;
-import xyz.pkay.simpleWf.core.data.model.*;
-import xyz.pkay.simpleWf.editor.api.dto.*;
-import xyz.pkay.simpleWf.editor.model.Anchor;
-import xyz.pkay.simpleWf.editor.model.Position;
+import xyz.pkay.veloflow.core.data.model.*;
+import xyz.pkay.veloflow.editor.api.dto.*;
+import xyz.pkay.veloflow.editor.model.Anchor;
+import xyz.pkay.veloflow.editor.model.Position;
import java.util.stream.Collectors;
@@ -54,7 +54,7 @@ public class WorkflowMapper {
.id(entity.getId())
.name(entity.getName())
.type(entity.getType())
- .order(entity.getOrder())
+// .order(entity.getOrder())
.position(toDto(entity.getPosition()))
.eventType(entity.getEventType())
.taskSubType(entity.getTaskSubType())
@@ -145,15 +145,26 @@ public class WorkflowMapper {
Step step = this.toEntity(s);
step.setWorkflow(entity);
return step;
- }).collect(Collectors.toList()));
+ }).collect(Collectors.toSet()));
}
if (dto.getTransitions() != null) {
entity.setTransitions(dto.getTransitions().stream().map(t -> {
Transition transition = this.toEntity(t, entity);
transition.setWorkflow(entity);
return transition;
- }).collect(Collectors.toList()));
+ }).collect(Collectors.toSet()));
}
+
+ // If it's a new workflow, clear temporary IDs to avoid "detached entity" error in Hibernate
+ if (entity.getId() == null) {
+ if (entity.getSteps() != null) {
+ entity.getSteps().forEach(s -> s.setId(null));
+ }
+ if (entity.getTransitions() != null) {
+ entity.getTransitions().forEach(t -> t.setId(null));
+ }
+ }
+
return entity;
}
@@ -163,7 +174,7 @@ public class WorkflowMapper {
entity.setId(dto.getId());
entity.setName(dto.getName());
entity.setType(dto.getType());
- entity.setOrder(dto.getOrder());
+// entity.setOrder(dto.getOrder());
entity.setPosition(toEntity(dto.getPosition()));
entity.setEventType(dto.getEventType());
entity.setTaskSubType(dto.getTaskSubType());
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/model/Anchor.java b/src/main/java/xyz/pkay/veloflow/editor/model/Anchor.java
similarity index 83%
rename from src/main/java/xyz/pkay/simpleWf/editor/model/Anchor.java
rename to src/main/java/xyz/pkay/veloflow/editor/model/Anchor.java
index 024de3ece044fcfc96d453f37f16073aba962ebd..a2d9df6528d2a2a8ad45725575188471ee289053 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/model/Anchor.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/model/Anchor.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.model;
+package xyz.pkay.veloflow.editor.model;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
@@ -8,7 +8,7 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
-import xyz.pkay.simpleWf.editor.model.enums.Side;
+import xyz.pkay.veloflow.editor.model.enums.Side;
@Embeddable
@Getter
@@ -16,10 +16,10 @@ import xyz.pkay.simpleWf.editor.model.enums.Side;
@NoArgsConstructor
@AllArgsConstructor
public class Anchor {
-
+
@Enumerated(EnumType.STRING)
@Column(length = 10)
private Side side; // top, left, right, bottom
-
+
private Integer sideIndex;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/model/Position.java b/src/main/java/xyz/pkay/veloflow/editor/model/Position.java
similarity index 85%
rename from src/main/java/xyz/pkay/simpleWf/editor/model/Position.java
rename to src/main/java/xyz/pkay/veloflow/editor/model/Position.java
index b8a682ca18b82e6fcc4bee6b0442de1ecce16e5a..6edc9e3faad60635a2308b4d009ac16b54e54999 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/model/Position.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/model/Position.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.editor.model;
+package xyz.pkay.veloflow.editor.model;
import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
@@ -12,8 +12,8 @@ import lombok.Setter;
@NoArgsConstructor
@AllArgsConstructor
public class Position {
-
+
private Integer x;
-
+
private Integer y;
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/model/enums/Side.java b/src/main/java/xyz/pkay/veloflow/editor/model/enums/Side.java
similarity index 85%
rename from src/main/java/xyz/pkay/simpleWf/editor/model/enums/Side.java
rename to src/main/java/xyz/pkay/veloflow/editor/model/enums/Side.java
index 24c0d016da762cd37d0c9669404e65a12c472343..78e6c9185811c32b44e9290a859ae96518749296 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/model/enums/Side.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/model/enums/Side.java
@@ -1,11 +1,11 @@
-package xyz.pkay.simpleWf.editor.model.enums;
+package xyz.pkay.veloflow.editor.model.enums;
public enum Side {
TOP,
LEFT,
RIGHT,
BOTTOM;
-
+
public static Side fromString(String side) {
if (side == null) return null;
try {
diff --git a/src/main/java/xyz/pkay/veloflow/editor/service/BpmnService.java b/src/main/java/xyz/pkay/veloflow/editor/service/BpmnService.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba7010dc19d44b370b3d5175309712adc300f904
--- /dev/null
+++ b/src/main/java/xyz/pkay/veloflow/editor/service/BpmnService.java
@@ -0,0 +1,342 @@
+package xyz.pkay.veloflow.editor.service;
+
+import org.springframework.stereotype.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import xyz.pkay.veloflow.core.data.model.EventTypes;
+import xyz.pkay.veloflow.core.data.model.GatewaySubTypes;
+import xyz.pkay.veloflow.core.data.model.StepTypes;
+import xyz.pkay.veloflow.core.data.model.TaskSubTypes;
+import xyz.pkay.veloflow.editor.api.dto.*;
+import xyz.pkay.veloflow.editor.model.enums.Side;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class BpmnService {
+
+ private static final String BPMNDI_NS = "http://www.omg.org/spec/BPMN/20100524/DI";
+
+ private static final String BPMN_NS = "http://www.omg.org/spec/BPMN/20100524/MODEL";
+
+ private static final String DC_NS = "http://www.omg.org/spec/DD/20100524/DC";
+
+ private static final String DI_NS = "http://www.omg.org/spec/DD/20100524/DI";
+
+ public String exportToBpmn(WorkflowDto workflow) throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document doc = db.newDocument();
+
+ Element definitions = doc.createElementNS(BPMN_NS, "bpmn:definitions");
+ definitions.setAttribute("xmlns:bpmn", BPMN_NS);
+ definitions.setAttribute("xmlns:bpmndi", BPMNDI_NS);
+ definitions.setAttribute("xmlns:dc", DC_NS);
+ definitions.setAttribute("xmlns:di", DI_NS);
+ definitions.setAttribute("targetNamespace", "http://bpmn.io/schema/bpmn");
+ doc.appendChild(definitions);
+
+ Element process = doc.createElementNS(BPMN_NS, "bpmn:process");
+ process.setAttribute("id", "Process_" + (workflow.getId() != null ? workflow.getId() : UUID.randomUUID()));
+ process.setAttribute("isExecutable", "false");
+ process.setAttribute("name", workflow.getName());
+ definitions.appendChild(process);
+
+ Element diagram = doc.createElementNS(BPMNDI_NS, "bpmndi:BPMNDiagram");
+ diagram.setAttribute("id", "BPMNDiagram_1");
+ definitions.appendChild(diagram);
+
+ Element plane = doc.createElementNS(BPMNDI_NS, "bpmndi:BPMNPlane");
+ plane.setAttribute("id", "BPMNPlane_1");
+ plane.setAttribute("bpmnElement", process.getAttribute("id"));
+ diagram.appendChild(plane);
+
+ Map stepIdToBpmnId = new HashMap<>();
+
+ for (StepDto step : workflow.getSteps()) {
+ String bpmnId = getBpmnId(step);
+ stepIdToBpmnId.put(step.getId(), bpmnId);
+ Element stepEl = doc.createElementNS(BPMN_NS, "bpmn:" + getBpmnElementName(step));
+ stepEl.setAttribute("id", bpmnId);
+ stepEl.setAttribute("name", step.getName());
+ process.appendChild(stepEl);
+
+ // Add DI Shape
+ Element shape = doc.createElementNS(BPMNDI_NS, "bpmndi:BPMNShape");
+ shape.setAttribute("id", bpmnId + "_di");
+ shape.setAttribute("bpmnElement", bpmnId);
+ plane.appendChild(shape);
+
+ Element bounds = doc.createElementNS(DC_NS, "dc:Bounds");
+ int x = step.getPosition() != null ? step.getPosition().getX() : 0;
+ int y = step.getPosition() != null ? step.getPosition().getY() : 0;
+ bounds.setAttribute("x", String.valueOf(x));
+ bounds.setAttribute("y", String.valueOf(y));
+ bounds.setAttribute("width", "100");
+ bounds.setAttribute("height", "80");
+ shape.appendChild(bounds);
+ }
+
+ for (TransitionDto transition : workflow.getTransitions()) {
+ String transId = "Flow_" + (transition.getId() != null ? transition.getId() : UUID.randomUUID());
+ Element flow = doc.createElementNS(BPMN_NS, "bpmn:sequenceFlow");
+ flow.setAttribute("id", transId);
+ flow.setAttribute("name", transition.getName());
+ flow.setAttribute("sourceRef", stepIdToBpmnId.get(transition.getCurrentStepId()));
+ flow.setAttribute("targetRef", stepIdToBpmnId.get(transition.getNextStepId()));
+ process.appendChild(flow);
+
+ // Add DI Edge
+ Element edge = doc.createElementNS(BPMNDI_NS, "bpmndi:BPMNEdge");
+ edge.setAttribute("id", transId + "_di");
+ edge.setAttribute("bpmnElement", transId);
+ plane.appendChild(edge);
+
+ if (transition.getWaypoints() != null) {
+ for (PositionDto wp : transition.getWaypoints()) {
+ Element waypoint = doc.createElementNS(DI_NS, "di:waypoint");
+ waypoint.setAttribute("x", String.valueOf(wp.getX()));
+ waypoint.setAttribute("y", String.valueOf(wp.getY()));
+ edge.appendChild(waypoint);
+ }
+ }
+ }
+
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer transformer = tf.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+ StringWriter writer = new StringWriter();
+ transformer.transform(new DOMSource(doc), new StreamResult(writer));
+ return writer.getBuffer().toString();
+ }
+
+ private String getBpmnElementName(StepDto step) {
+ if (step.getType() == StepTypes.EVENT) {
+ if (step.getEventType() == EventTypes.START_EVENT) return "startEvent";
+ if (step.getEventType() == EventTypes.END_EVENT) return "endEvent";
+ return "intermediateEvent";
+ }
+ if (step.getType() == StepTypes.GATEWAY) {
+ if (step.getGatewaySubType() == GatewaySubTypes.EXCLUSIVE_GATEWAY) return "exclusiveGateway";
+ if (step.getGatewaySubType() == GatewaySubTypes.PARALLEL_GATEWAY) return "parallelGateway";
+ if (step.getGatewaySubType() == GatewaySubTypes.INCLUSIVE_GATEWAY) return "inclusiveGateway";
+ if (step.getGatewaySubType() == GatewaySubTypes.EVENT_BASED_GATEWAY) return "eventBasedGateway";
+ return "exclusiveGateway";
+ }
+ if (step.getTaskSubType() != null) {
+ switch (step.getTaskSubType()) {
+ case USER_TASK:
+ return "userTask";
+ case SERVICE_TASK:
+ return "serviceTask";
+ case SCRIPT_TASK:
+ return "scriptTask";
+ case MANUAL_TASK:
+ return "manualTask";
+ case SEND_TASK:
+ return "sendTask";
+ case RECEIVE_TASK:
+ return "receiveTask";
+ case BUSINESS_RULE_TASK:
+ return "businessRuleTask";
+ }
+ }
+ return "task";
+ }
+
+ private String getBpmnId(StepDto step) {
+ return "Step_" + step.getId();
+ }
+
+ public WorkflowDto importFromBpmn(String xml) throws Exception {
+ if (xml != null) {
+ xml = xml.trim();
+ if (xml.startsWith("\uFEFF")) {
+ xml = xml.substring(1).trim();
+ }
+ if (xml.startsWith("\"") && xml.endsWith("\"")) {
+ xml = xml.substring(1, xml.length() - 1);
+ xml = xml.replace("\\\"", "\"").replace("\\n", "\n").replace("\\r", "\r").replace("\\t", "\t");
+ }
+ }
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document doc = db.parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
+
+ Element definitions = doc.getDocumentElement();
+ Element process = (Element) definitions.getElementsByTagNameNS(BPMN_NS, "process").item(0);
+ String name = process.getAttribute("name");
+
+ WorkflowDto workflow = WorkflowDto.builder().name(name).steps(new ArrayList<>()).transitions(new ArrayList<>()).status("DRAFT").build();
+
+ Map bpmnIdToStep = new HashMap<>();
+
+ String[] elementTypes = {"startEvent", "endEvent", "intermediateEvent", "task", "userTask", "serviceTask", "scriptTask", "manualTask", "sendTask", "receiveTask", "businessRuleTask", "exclusiveGateway", "parallelGateway", "inclusiveGateway", "eventBasedGateway"};
+
+ for (String type : elementTypes) {
+ NodeList nodes = process.getElementsByTagNameNS(BPMN_NS, type);
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Element el = (Element) nodes.item(i);
+ StepDto step = parseStep(el, type, doc);
+ step.setId(UUID.randomUUID());
+ workflow.getSteps().add(step);
+ bpmnIdToStep.put(el.getAttribute("id"), step);
+ }
+ }
+
+ NodeList flows = process.getElementsByTagNameNS(BPMN_NS, "sequenceFlow");
+ for (int i = 0; i < flows.getLength(); i++) {
+ Element el = (Element) flows.item(i);
+ TransitionDto transition = parseTransition(el, bpmnIdToStep, doc);
+ if (transition != null) {
+ transition.setId(UUID.randomUUID());
+ workflow.getTransitions().add(transition);
+ }
+ }
+
+ return workflow;
+ }
+
+ private StepDto parseStep(Element el, String bpmnType, Document doc) {
+ String bpmnId = el.getAttribute("id");
+
+ StepDto step = StepDto.builder().name(el.getAttribute("name")).build();
+
+ if (bpmnType.contains("Event")) {
+ step.setType(StepTypes.EVENT);
+ if (bpmnType.equals("startEvent")) step.setEventType(EventTypes.START_EVENT);
+ else if (bpmnType.equals("endEvent")) step.setEventType(EventTypes.END_EVENT);
+ else step.setEventType(EventTypes.INTERMEDIATE_EVENT);
+ } else if (bpmnType.contains("Gateway")) {
+ step.setType(StepTypes.GATEWAY);
+ if (bpmnType.equals("exclusiveGateway")) step.setGatewaySubType(GatewaySubTypes.EXCLUSIVE_GATEWAY);
+ else if (bpmnType.equals("parallelGateway")) step.setGatewaySubType(GatewaySubTypes.PARALLEL_GATEWAY);
+ else if (bpmnType.equals("inclusiveGateway")) step.setGatewaySubType(GatewaySubTypes.INCLUSIVE_GATEWAY);
+ else if (bpmnType.equals("eventBasedGateway")) step.setGatewaySubType(GatewaySubTypes.EVENT_BASED_GATEWAY);
+ } else {
+ step.setType(StepTypes.TASK);
+ if (bpmnType.equals("userTask")) step.setTaskSubType(TaskSubTypes.USER_TASK);
+ else if (bpmnType.equals("serviceTask")) step.setTaskSubType(TaskSubTypes.SERVICE_TASK);
+ else if (bpmnType.equals("scriptTask")) step.setTaskSubType(TaskSubTypes.SCRIPT_TASK);
+ else if (bpmnType.equals("manualTask")) step.setTaskSubType(TaskSubTypes.MANUAL_TASK);
+ else if (bpmnType.equals("sendTask")) step.setTaskSubType(TaskSubTypes.SEND_TASK);
+ else if (bpmnType.equals("receiveTask")) step.setTaskSubType(TaskSubTypes.RECEIVE_TASK);
+ else if (bpmnType.equals("businessRuleTask")) step.setTaskSubType(TaskSubTypes.BUSINESS_RULE_TASK);
+ }
+
+ // Parse DI for position
+ NodeList shapes = doc.getElementsByTagNameNS(BPMNDI_NS, "BPMNShape");
+ for (int i = 0; i < shapes.getLength(); i++) {
+ Element shape = (Element) shapes.item(i);
+ if (shape.getAttribute("bpmnElement").equals(bpmnId)) {
+ Element bounds = (Element) shape.getElementsByTagNameNS(DC_NS, "Bounds").item(0);
+ if (bounds != null) {
+ step.setPosition(PositionDto.builder().x((int) Double.parseDouble(bounds.getAttribute("x"))).y((int) Double.parseDouble(bounds.getAttribute("y"))).width((int) Double.parseDouble(bounds.getAttribute("width"))).height((int) Double.parseDouble(bounds.getAttribute("height"))).build());
+ }
+ break;
+ }
+ }
+
+ return step;
+ }
+
+ private TransitionDto parseTransition(Element el, Map bpmnIdToStep, Document doc) {
+ String bpmnId = el.getAttribute("id");
+ String sourceRef = el.getAttribute("sourceRef");
+ String targetRef = el.getAttribute("targetRef");
+ if (!bpmnIdToStep.containsKey(sourceRef) || !bpmnIdToStep.containsKey(targetRef)) {
+ return null;
+ }
+
+ StepDto sourceStep = bpmnIdToStep.get(sourceRef);
+ StepDto targetStep = bpmnIdToStep.get(targetRef);
+
+ TransitionDto transition = TransitionDto.builder().name(el.getAttribute("name")).currentStepId(sourceStep.getId()).nextStepId(targetStep.getId()).actionName("DEFAULT").actionValue("DEFAULT").waypoints(new ArrayList<>()).build();
+
+ // Parse DI for waypoints
+ NodeList edges = doc.getElementsByTagNameNS(BPMNDI_NS, "BPMNEdge");
+ for (int i = 0; i < edges.getLength(); i++) {
+ Element edge = (Element) edges.item(i);
+ if (edge.getAttribute("bpmnElement").equals(bpmnId)) {
+ NodeList waypoints = edge.getElementsByTagNameNS(DI_NS, "waypoint");
+
+ if (waypoints.getLength() > 0) {
+ Element sp = (Element) waypoints.item(0);
+
+ int startX = Integer.parseInt(sp.getAttribute("x"));
+ int startY = Integer.parseInt(sp.getAttribute("y"));
+
+
+ Side side;
+
+ if (startX == sourceStep.getPosition().getX()) {
+ side = Side.LEFT;
+ } else if (startX == sourceStep.getPosition().getX() + sourceStep.getPosition().getWidth()) {
+ side = Side.RIGHT;
+ } else if (startY == sourceStep.getPosition().getY()) {
+ side = Side.TOP;
+ } else if (startY == sourceStep.getPosition().getY() + sourceStep.getPosition().getHeight()) {
+ side = Side.BOTTOM;
+ } else {
+ side = Side.RIGHT;
+ }
+
+ transition.setFromAnchor(AnchorDto.builder().side(side).sideIndex(1).build());
+
+ }
+
+ if (waypoints.getLength() > 1) {
+ Element ep = (Element) waypoints.item(waypoints.getLength() - 1);
+ int startX = Integer.parseInt(ep.getAttribute("x"));
+ int startY = Integer.parseInt(ep.getAttribute("y"));
+
+
+ Side side;
+
+ if (startX == targetStep.getPosition().getX()) {
+ side = Side.LEFT;
+ } else if (startX == targetStep.getPosition().getX() + targetStep.getPosition().getWidth()) {
+ side = Side.RIGHT;
+ } else if (startY == targetStep.getPosition().getY()) {
+ side = Side.TOP;
+ } else if (startY == targetStep.getPosition().getY() + targetStep.getPosition().getHeight()) {
+ side = Side.BOTTOM;
+ } else {
+ side = Side.LEFT;
+ }
+
+
+ transition.setToAnchor(AnchorDto.builder().side(side).sideIndex(1).build());
+
+ }
+ if (waypoints.getLength() > 2) {
+ for (int j = 1; j < waypoints.getLength() - 1; j++) {
+ Element wp = (Element) waypoints.item(j);
+ transition.getWaypoints().add(PositionDto.builder().x((int) Double.parseDouble(wp.getAttribute("x"))).y((int) Double.parseDouble(wp.getAttribute("y"))).build());
+ }
+ break;
+ }
+ }
+ }
+
+ return transition;
+ }
+}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/service/StepEditorService.java b/src/main/java/xyz/pkay/veloflow/editor/service/StepEditorService.java
similarity index 63%
rename from src/main/java/xyz/pkay/simpleWf/editor/service/StepEditorService.java
rename to src/main/java/xyz/pkay/veloflow/editor/service/StepEditorService.java
index f77dab3024251a22d303ec4ed02424b14dd20847..1040d7c44a1b0b29c5e2a710d89e166b4299ca9b 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/service/StepEditorService.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/service/StepEditorService.java
@@ -1,14 +1,14 @@
-package xyz.pkay.simpleWf.editor.service;
+package xyz.pkay.veloflow.editor.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.data.model.Step;
-import xyz.pkay.simpleWf.core.data.model.Workflow;
-import xyz.pkay.simpleWf.core.data.repository.StepRepository;
-import xyz.pkay.simpleWf.core.data.repository.WorkflowRepository;
-import xyz.pkay.simpleWf.editor.api.dto.StepDto;
-import xyz.pkay.simpleWf.editor.mapper.WorkflowMapper;
+import xyz.pkay.veloflow.core.data.model.Step;
+import xyz.pkay.veloflow.core.data.model.Workflow;
+import xyz.pkay.veloflow.core.data.repository.StepRepository;
+import xyz.pkay.veloflow.core.data.repository.WorkflowRepository;
+import xyz.pkay.veloflow.editor.api.dto.StepDto;
+import xyz.pkay.veloflow.editor.mapper.WorkflowMapper;
import java.util.List;
import java.util.UUID;
@@ -17,21 +17,23 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class StepEditorService {
-
+
private final WorkflowMapper mapper;
+
private final StepRepository stepRepository;
+
private final WorkflowRepository workflowRepository;
-
+
@Transactional
public StepDto createStep(UUID workflowId, StepDto stepDto) {
Workflow workflow = workflowRepository.findById(workflowId)
- .orElseThrow(() -> new RuntimeException("Workflow not found with id: " + workflowId));
-
+ .orElseThrow(() -> new RuntimeException("Workflow not found with id: " + workflowId));
+
Step step = mapper.toEntity(stepDto);
step.setWorkflow(workflow);
return mapper.toDto(stepRepository.save(step));
}
-
+
@Transactional
public void deleteStep(UUID id) {
if (!stepRepository.existsById(id)) {
@@ -39,36 +41,36 @@ public class StepEditorService {
}
stepRepository.deleteById(id);
}
-
+
public StepDto getStepById(UUID id) {
return stepRepository.findById(id)
- .map(mapper::toDto)
- .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
+ .map(mapper::toDto)
+ .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
}
-
+
public List getStepsByWorkflowId(UUID workflowId) {
Workflow workflow = workflowRepository.findById(workflowId)
- .orElseThrow(() -> new RuntimeException("Workflow not found with id: " + workflowId));
+ .orElseThrow(() -> new RuntimeException("Workflow not found with id: " + workflowId));
return workflow.getSteps().stream()
- .map(mapper::toDto)
- .collect(Collectors.toList());
+ .map(mapper::toDto)
+ .collect(Collectors.toList());
}
-
+
@Transactional
public StepDto updateStep(UUID id, StepDto stepDto) {
Step existingStep = stepRepository.findById(id)
- .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
-
+ .orElseThrow(() -> new RuntimeException("Step not found with id: " + id));
+
existingStep.setName(stepDto.getName());
existingStep.setType(stepDto.getType());
- existingStep.setOrder(stepDto.getOrder());
+// existingStep.setOrder(stepDto.getOrder());
existingStep.setPosition(mapper.toEntity(stepDto.getPosition()));
existingStep.setEventType(stepDto.getEventType());
existingStep.setTaskSubType(stepDto.getTaskSubType());
existingStep.setGatewaySubType(stepDto.getGatewaySubType());
existingStep.setExecutorClassName(stepDto.getExecutorClassName());
existingStep.setEventDefinition(stepDto.getEventDefinition());
-
+
return mapper.toDto(stepRepository.save(existingStep));
}
}
diff --git a/src/main/java/xyz/pkay/simpleWf/editor/service/WorkflowEditorService.java b/src/main/java/xyz/pkay/veloflow/editor/service/WorkflowEditorService.java
similarity index 55%
rename from src/main/java/xyz/pkay/simpleWf/editor/service/WorkflowEditorService.java
rename to src/main/java/xyz/pkay/veloflow/editor/service/WorkflowEditorService.java
index 2dc87f95a35c346191f4e67b8177d1a4a02d97b0..0af4b04de57429417d27692edc8fba61791a7ac3 100644
--- a/src/main/java/xyz/pkay/simpleWf/editor/service/WorkflowEditorService.java
+++ b/src/main/java/xyz/pkay/veloflow/editor/service/WorkflowEditorService.java
@@ -1,11 +1,11 @@
-package xyz.pkay.simpleWf.editor.service;
+package xyz.pkay.veloflow.editor.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import xyz.pkay.simpleWf.core.service.WorkflowService;
-import xyz.pkay.simpleWf.editor.api.dto.WorkflowDto;
-import xyz.pkay.simpleWf.editor.mapper.WorkflowMapper;
+import xyz.pkay.veloflow.core.service.WorkflowService;
+import xyz.pkay.veloflow.editor.api.dto.WorkflowDto;
+import xyz.pkay.veloflow.editor.mapper.WorkflowMapper;
import java.util.List;
import java.util.UUID;
@@ -14,31 +14,45 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class WorkflowEditorService {
-
+
+ private final BpmnService bpmnService;
+
private final WorkflowMapper mapper;
+
private final WorkflowService workflowService;
-
-
+
@Transactional
public WorkflowDto createWorkflow(WorkflowDto workflowDto) {
return mapper.toDto(workflowService.createWorkflow(mapper.toEntity(workflowDto)));
}
-
-
+
@Transactional
public void deleteWorkflow(UUID id) {
workflowService.deleteWorkflow(id);
}
-
+
+ @Transactional(readOnly = true)
+ public String exportWorkflowToBpmn(UUID id) throws Exception {
+ WorkflowDto workflowDto = getWorkflowById(id);
+ return bpmnService.exportToBpmn(workflowDto);
+ }
+
+ @Transactional(readOnly = true)
public List getAllWorkflows() {
return workflowService.getAllWorkflows().stream().map(mapper::toDto).collect(Collectors.toList());
}
-
-
+
+ @Transactional(readOnly = true)
public WorkflowDto getWorkflowById(UUID id) {
- return mapper.toDto(workflowService.getWorkflowById(id));
+ return mapper.toDto(workflowService.getWorkflowWithStepsById(id));
}
-
+
+ @Transactional
+ public WorkflowDto importWorkflowFromBpmn(String bpmnXml) throws Exception {
+ WorkflowDto workflowDto = bpmnService.importFromBpmn(bpmnXml);
+ return createWorkflow(workflowDto);
+ }
+
@Transactional
public WorkflowDto updateWorkflow(UUID id, WorkflowDto workflowDto) {
return mapper.toDto(workflowService.updateWorkflow(id, mapper.toEntity(workflowDto)));
diff --git a/src/main/java/xyz/pkay/simpleWf/exception/GlobalExceptionHandler.java b/src/main/java/xyz/pkay/veloflow/exception/GlobalExceptionHandler.java
similarity index 95%
rename from src/main/java/xyz/pkay/simpleWf/exception/GlobalExceptionHandler.java
rename to src/main/java/xyz/pkay/veloflow/exception/GlobalExceptionHandler.java
index f5752a3daacdebd40b75bbbe6c8d867e3cf1fa32..98643be43a0db392bf6b32c2739925b676d3c199 100644
--- a/src/main/java/xyz/pkay/simpleWf/exception/GlobalExceptionHandler.java
+++ b/src/main/java/xyz/pkay/veloflow/exception/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.exception;
+package xyz.pkay.veloflow.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -11,17 +11,9 @@ import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
-
+
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
-
- @ExceptionHandler(RuntimeException.class)
- public ResponseEntity> handleRuntimeException(RuntimeException ex) {
- log.error("Runtime exception occurred: ", ex);
- return ResponseEntity
- .status(HttpStatus.INTERNAL_SERVER_ERROR)
- .body(Map.of("error", ex.getMessage()));
- }
-
+
@ExceptionHandler(org.springframework.http.converter.HttpMessageNotReadableException.class)
public ResponseEntity> handleHttpMessageNotReadableException(org.springframework.http.converter.HttpMessageNotReadableException ex) {
log.error("JSON parsing error: ", ex);
@@ -29,4 +21,12 @@ public class GlobalExceptionHandler {
.status(HttpStatus.BAD_REQUEST)
.body(Map.of("error", ex.getMessage()));
}
+
+ @ExceptionHandler(RuntimeException.class)
+ public ResponseEntity> handleRuntimeException(RuntimeException ex) {
+ log.error("Runtime exception occurred: ", ex);
+ return ResponseEntity
+ .status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(Map.of("error", ex.getMessage()));
+ }
}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index f9a0a6444e8c7d56ef8f2d8f92cad86822ad63b9..31338fbe29cbc8618749145789e0038bf412b25c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -9,18 +9,20 @@ spring:
username: ${DB_USER}
password: ${DB_PASSWORD}
hikari:
- max-lifetime: 150000
- keepalive-time: 30000
- minimum-idle: 2
- maximum-pool-size: 4
- validation-timeout: 500
- connection-test-query: SELECT 1
+ max-lifetime: 60000
+ keepalive-time: 25000
+ minimum-idle: 4
+ maximum-pool-size: 8
+ validation-timeout: 2000
+ leak-detection-threshold: 5000
jpa:
generate-ddl: on
hibernate:
ddl-auto: update
show-sql: ${SHOW_SQL}
+ properties:
+ hibernate.default_batch_fetch_size: 50
logging:
level:
web: info
diff --git a/src/test/java/xyz/pkay/simpleWf/api/controller/StepCreationTest.java b/src/test/java/xyz/pkay/veloflow/api/controller/StepCreationTest.java
similarity index 70%
rename from src/test/java/xyz/pkay/simpleWf/api/controller/StepCreationTest.java
rename to src/test/java/xyz/pkay/veloflow/api/controller/StepCreationTest.java
index 88a1f65356a5dd932ee41b9d27552b295c98bdfc..8e088ccb9b9e1b186094cd286016c406ce3c81e9 100644
--- a/src/test/java/xyz/pkay/simpleWf/api/controller/StepCreationTest.java
+++ b/src/test/java/xyz/pkay/veloflow/api/controller/StepCreationTest.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.api.controller;
+package xyz.pkay.veloflow.api.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,21 +16,21 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class StepCreationTest {
-
+
@Autowired
private MockMvc mockMvc;
-
+
@Test
public void testCreateStepWithEventDefinition() throws Exception {
String workflowPayload = "{\"name\":\"Test Workflow\"}";
String workflowResponse = mockMvc.perform(post("/Workflows")
- .contentType(MediaType.APPLICATION_JSON)
- .content(workflowPayload))
- .andExpect(status().isOk())
- .andReturn().getResponse().getContentAsString();
-
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(workflowPayload))
+ .andExpect(status().isOk())
+ .andReturn().getResponse().getContentAsString();
+
String workflowId = workflowResponse.split("\"id\":\"")[1].split("\"")[0];
-
+
String stepPayload = "{" +
"\"name\":\"Start Event\"," +
"\"type\":\"EVENT\"," +
@@ -39,11 +39,11 @@ public class StepCreationTest {
"\"position\":{\"x\":100,\"y\":100}," +
"\"eventDefinition\":\"MESSAGE\"" +
"}";
-
+
mockMvc.perform(post("/Steps/Workflows/" + workflowId)
- .contentType(MediaType.APPLICATION_JSON)
- .content(stepPayload))
- .andExpect(status().isOk())
- .andExpect(jsonPath("$.eventDefinition").value("MESSAGE"));
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(stepPayload))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.eventDefinition").value("MESSAGE"));
}
}
diff --git a/src/test/java/xyz/pkay/simpleWf/api/controller/WorkflowControllerTest.java b/src/test/java/xyz/pkay/veloflow/api/controller/WorkflowControllerTest.java
similarity index 82%
rename from src/test/java/xyz/pkay/simpleWf/api/controller/WorkflowControllerTest.java
rename to src/test/java/xyz/pkay/veloflow/api/controller/WorkflowControllerTest.java
index 865030eb1807dac9949de86a386a9e08041cd773..ea05c3ea07e0fef33e161a396e4641f06997900b 100644
--- a/src/test/java/xyz/pkay/simpleWf/api/controller/WorkflowControllerTest.java
+++ b/src/test/java/xyz/pkay/veloflow/api/controller/WorkflowControllerTest.java
@@ -1,4 +1,4 @@
-package xyz.pkay.simpleWf.api.controller;
+package xyz.pkay.veloflow.api.controller;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,18 +13,18 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@SpringBootTest
@AutoConfigureMockMvc
public class WorkflowControllerTest {
-
+
@Autowired
private MockMvc mockMvc;
-
+
@Test
public void testUpdateWorkflowWithInvalidPayload() throws Exception {
String workflowId = "fdc5752a-fe74-4377-8eab-638fc6e073d7";
String payload = "{\"steps\":[{\"name\":\"Step 1\",\"type\":\"default\",\"order\":0,\"position\":{\"x\":100,\"y\":100}},{\"name\":\"Step 2\",\"type\":\"default\",\"order\":1,\"position\":{\"x\":375,\"y\":278}}],\"transitions\":[{\"currentStepId\":\"Step 1\",\"actionName\":\"New Action\",\"actionValue\":\"Value\",\"fromAnchor\":{\"side\":\"RIGHT\",\"sideIndex\":2},\"nextStepId\":\"Step 2\",\"toAnchor\":{\"side\":\"TOP\",\"sideIndex\":1}}]}";
-
+
mockMvc.perform(put("/Workflows/" + workflowId)
- .contentType(MediaType.APPLICATION_JSON)
- .content(payload))
- .andExpect(status().isBadRequest()); // Expecting bad request due to deserialization error
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(payload))
+ .andExpect(status().isBadRequest()); // Expecting bad request due to deserialization error
}
}
diff --git a/src/test/java/xyz/pkay/veloflow/editor/service/BpmnServiceTest.java b/src/test/java/xyz/pkay/veloflow/editor/service/BpmnServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9997d4931b208b8585def27acfb72dd352a0861
--- /dev/null
+++ b/src/test/java/xyz/pkay/veloflow/editor/service/BpmnServiceTest.java
@@ -0,0 +1,107 @@
+package xyz.pkay.veloflow.editor.service;
+
+import org.junit.jupiter.api.Test;
+import xyz.pkay.veloflow.core.data.model.EventTypes;
+import xyz.pkay.veloflow.core.data.model.StepTypes;
+import xyz.pkay.veloflow.editor.api.dto.PositionDto;
+import xyz.pkay.veloflow.editor.api.dto.StepDto;
+import xyz.pkay.veloflow.editor.api.dto.TransitionDto;
+import xyz.pkay.veloflow.editor.api.dto.WorkflowDto;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class BpmnServiceTest {
+
+ private final BpmnService bpmnService = new BpmnService();
+
+ @Test
+ public void testExportAndImport() throws Exception {
+ UUID workflowId = UUID.randomUUID();
+ UUID step1Id = UUID.randomUUID();
+ UUID step2Id = UUID.randomUUID();
+
+ StepDto step1 = StepDto.builder()
+ .id(step1Id)
+ .name("Start Event")
+ .type(StepTypes.EVENT)
+ .eventType(EventTypes.START_EVENT)
+ .position(PositionDto.builder().x(100).y(100).build())
+ .build();
+
+ StepDto step2 = StepDto.builder()
+ .id(step2Id)
+ .name("End Event")
+ .type(StepTypes.EVENT)
+ .eventType(EventTypes.END_EVENT)
+ .position(PositionDto.builder().x(300).y(100).build())
+ .build();
+
+ TransitionDto transition = TransitionDto.builder()
+ .id(UUID.randomUUID())
+ .name("Flow 1")
+ .currentStepId(step1Id)
+ .nextStepId(step2Id)
+ .waypoints(List.of(PositionDto.builder().x(150).y(100).build(), PositionDto.builder().x(250).y(100).build()))
+ .build();
+
+ WorkflowDto workflow = WorkflowDto.builder()
+ .id(workflowId)
+ .name("Test Workflow")
+ .steps(List.of(step1, step2))
+ .transitions(List.of(transition))
+ .build();
+
+ String bpmnXml = bpmnService.exportToBpmn(workflow);
+ assertNotNull(bpmnXml);
+ assertTrue(bpmnXml.contains("bpmn:startEvent"));
+ assertTrue(bpmnXml.contains("bpmn:endEvent"));
+ assertTrue(bpmnXml.contains("bpmn:sequenceFlow"));
+ assertTrue(bpmnXml.contains("Test Workflow"));
+
+ WorkflowDto importedWorkflow = bpmnService.importFromBpmn(bpmnXml);
+ assertEquals("Test Workflow", importedWorkflow.getName());
+ assertEquals(2, importedWorkflow.getSteps().size());
+ assertEquals(1, importedWorkflow.getTransitions().size());
+
+ StepDto importedStep1 = importedWorkflow.getSteps().stream().filter(s -> s.getEventType() == EventTypes.START_EVENT).findFirst().orElseThrow();
+ assertEquals("Start Event", importedStep1.getName());
+ assertEquals(100, importedStep1.getPosition().getX());
+
+ StepDto importedStep2 = importedWorkflow.getSteps().stream().filter(s -> s.getEventType() == EventTypes.END_EVENT).findFirst().orElseThrow();
+ assertEquals("End Event", importedStep2.getName());
+ assertEquals(300, importedStep2.getPosition().getX());
+
+ TransitionDto importedTransition = importedWorkflow.getTransitions().get(0);
+ assertEquals("Flow 1", importedTransition.getName());
+ assertEquals(importedStep1.getId(), importedTransition.getCurrentStepId());
+ assertEquals(importedStep2.getId(), importedTransition.getNextStepId());
+ assertEquals(2, importedTransition.getWaypoints().size());
+ }
+
+ @Test
+ public void testImportWithBOM() throws Exception {
+ String bpmnXml = "\n" +
+ "\n" +
+ " \n" +
+ "";
+ String xmlWithBOM = "\uFEFF" + bpmnXml;
+
+ WorkflowDto importedWorkflow = bpmnService.importFromBpmn(xmlWithBOM);
+ assertEquals("Test Workflow BOM", importedWorkflow.getName());
+ }
+
+ @Test
+ public void testImportWithQuotedXml() throws Exception {
+ String bpmnXml = "\n" +
+ "\n" +
+ " \n" +
+ "";
+ String quotedXml = "\"" + bpmnXml.replace("\"", "\\\"").replace("\n", "\\n") + "\"";
+
+ WorkflowDto importedWorkflow = bpmnService.importFromBpmn(quotedXml);
+ assertEquals("Test Workflow", importedWorkflow.getName());
+ }
+}