diff --git a/test-groovy-dsl-workflow-action/pom.xml b/test-groovy-dsl-workflow-action/pom.xml index 786e2d74..d3fec6c3 100755 --- a/test-groovy-dsl-workflow-action/pom.xml +++ b/test-groovy-dsl-workflow-action/pom.xml @@ -11,17 +11,27 @@ 1.8 + + + + org.springframework.boot + spring-boot-dependencies + 2.6.4 + pom + import + + + + org.codehaus.groovy groovy - 3.0.10 org.projectlombok lombok - 1.18.8 provided @@ -31,15 +41,18 @@ 2.11.0 + + org.springframework.boot + spring-boot-starter + + org.slf4j slf4j-api - 1.8.0-beta4 ch.qos.logback logback-classic - 1.3.0-alpha4 runtime @@ -47,10 +60,13 @@ junit junit - 4.12 test - + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParam2s.java b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParam2s.java new file mode 100755 index 00000000..9d6369b7 --- /dev/null +++ b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParam2s.java @@ -0,0 +1,20 @@ +package fr.an.tests.testdslworkflowaction.springboot; + + +import java.util.List; +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Getter; +import lombok.Setter; + +@ConfigurationProperties(prefix = "app") +@Getter @Setter +public class AppParam2s { + + private String prop1; + + private List> workflows; + +} diff --git a/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParams.java b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParams.java new file mode 100755 index 00000000..d463904f --- /dev/null +++ b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/AppParams.java @@ -0,0 +1,33 @@ +package fr.an.tests.testdslworkflowaction.springboot; + + +import java.util.List; +import java.util.Map; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import lombok.Getter; + +@Component +@ConfigurationProperties(prefix = "app") +@Getter +public class AppParams { + + private String prop1; + + private List> workflows; + + public AppParams() { + } + + public void setProp1(String prop1) { + this.prop1 = prop1; + } + + public void setWorkflows(List> workflows) { + this.workflows = workflows; + } + + +} diff --git a/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/SpringbootWorkflowConfigurationTest.java b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/SpringbootWorkflowConfigurationTest.java new file mode 100755 index 00000000..2dea38b5 --- /dev/null +++ b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/SpringbootWorkflowConfigurationTest.java @@ -0,0 +1,139 @@ +package fr.an.tests.testdslworkflowaction.springboot; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import fr.an.tests.testdslworkflowaction.ast.AbstractWorkflowAction; +import fr.an.tests.testdslworkflowaction.ast.WorkflowActionFactory; +import lombok.val; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes=TestAppConfiguration.class) +public class SpringbootWorkflowConfigurationTest { + + @Autowired + private AppParams appParams; + + @Autowired + private AppParam2s appParam2s; + + @Test + public void testYamlConfig() { + val factory = new WorkflowActionFactory(); + String prop1 = appParams.getProp1(); + Assert.assertEquals("value1", prop1); + List> wfs = appParams.getWorkflows(); + List actions = objToActions(wfs, factory); + checkWorkflowAction(actions.get(0)); + } + + @Test + public void testYamlConfig2() { + val factory = new WorkflowActionFactory(); + String prop1 = appParam2s.getProp1(); + Assert.assertEquals("value1", prop1); + List> wfs = appParam2s.getWorkflows(); + List actions = objToActions(wfs, factory); + checkWorkflowAction(actions.get(0)); + } + + protected List objToActions(List> srcs, WorkflowActionFactory factory) { + val res = new ArrayList(); + for(val src : srcs) { + res.add(objToAction(src, factory)); + } + return res; + } + + @SuppressWarnings("unchecked") + protected List toList(Object src) { + val res = new ArrayList(); + if (!(src instanceof Map)) { + throw new RuntimeException("expecting Map, with keys \"0\", \"1\".. "); + } + val srcItems = (Map) src; + for(int i = 0; ; i++) { + String key = Integer.toString(i); + val srcItem = (Map) srcItems.get(key); + if (srcItem == null) { + break; + } + res.add((T) srcItem); + } + return res; + } + + @SuppressWarnings("unchecked") + protected AbstractWorkflowAction objToAction(Map src, WorkflowActionFactory factory) { + AbstractWorkflowAction res; + String type = (String) src.get("type"); + String name = (String) src.get("name"); + if (name == null) { + name = ""; + } + switch(type) { + case "parallel": { + val branchItems = new LinkedHashMap(); + List> srcBranchItems = toList(src.get("branchItems")); + for(val srcBranchItem: srcBranchItems) { + val branchName = (String) srcBranchItem.get("branchName"); + val srcItem = (Map) srcBranchItem.get("item"); + val item = objToAction(srcItem, factory); + branchItems.put(branchName, item); + } + res = factory.parallel(name, branchItems); + } break; + case "sequence": { + List> srcItems = toList(src.get("items")); + val items = objToActions(srcItems, factory); + res = factory.sequence(name, items); + } break; + case "simple1": { + String param = (String) src.get("param"); + res = factory.simple1(name, param); + } break; + case "simple2": { + int intParam = toInt(src.get("intParam"), 0); + res = factory.simple2(name, intParam); + } break; + default: + res = null; + } + return res; + } + + private int toInt(Object src, int defaultValue) { + int intParam = 0; + if (src == null) { + intParam = 0; + } else if (src instanceof Number) { + intParam = ((Number) src).intValue(); + } else if (src instanceof String) { + intParam = Integer.parseInt((String) src); + } else { + intParam = 0; + // unrecognized type + } + return intParam; + } + + private void checkWorkflowAction(AbstractWorkflowAction wf) { + val buffer = new ByteArrayOutputStream(); + try(val out = new PrintStream(buffer)) { + wf.printIndent(out, 0); + } + String dumpText = buffer.toString(); + System.out.println("Wf:\n" + dumpText); + } +} diff --git a/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/TestAppConfiguration.java b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/TestAppConfiguration.java new file mode 100755 index 00000000..476cfdef --- /dev/null +++ b/test-groovy-dsl-workflow-action/src/test/java/fr/an/tests/testdslworkflowaction/springboot/TestAppConfiguration.java @@ -0,0 +1,17 @@ +package fr.an.tests.testdslworkflowaction.springboot; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +@EnableAutoConfiguration +@EnableConfigurationProperties(AppParams.class) +// @ComponentScan("fr.an.tests.testdslworkflowaction.springboot") +public class TestAppConfiguration { + + @Bean + public AppParam2s appParam2s() { + return new AppParam2s(); + } + +} diff --git a/test-groovy-dsl-workflow-action/src/test/resources/application.yml b/test-groovy-dsl-workflow-action/src/test/resources/application.yml new file mode 100755 index 00000000..b15aa85c --- /dev/null +++ b/test-groovy-dsl-workflow-action/src/test/resources/application.yml @@ -0,0 +1,34 @@ + +app: + prop1: value1 + workflows: + - type: parallel + name: p1 + branchItems: + - branchName: branch0 + item: + type: sequence + items: + - type: simple1 + name: p1_branch0_item0 + param: "param1" + - type: simple2 + name: p1_branch0_item1 + intParam: 1 + - branchName: branch1 + item: + type: sequence + items: + - type: simple1 + name: p1_branch1_item0 + param: "param2" + - type: simple2 + name: p1_branch1_item1 + intParam: 2 + - branchName: branch2 + item: + type: simple2 + name: p1_branch2 + intParam: 3 + + \ No newline at end of file