diff --git a/keter-backend/pom.xml b/keter-backend/pom.xml
new file mode 100644
index 0000000..cd9830c
--- /dev/null
+++ b/keter-backend/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+ com.keter-backend
+ keter-backend
+ 0.0.1-SNAPSHOT
+ jar
+
+ keter-backend
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-web-services
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.9.6
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/Application.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/Application.java
new file mode 100644
index 0000000..bb42c39
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/Application.java
@@ -0,0 +1,60 @@
+package ru.avplatonov.keter.backend;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+import ru.avplatonov.keter.backend.db.GraphsDB;
+import ru.avplatonov.keter.backend.db.NodesDB;
+
+import java.util.Arrays;
+
+@SpringBootApplication
+public class Application {
+
+ public static ApplicationContext context;
+ public static GraphsDB graphsDB;
+ public static NodesDB nodesDB;
+
+ public static void main(String[] args) {
+ context = new AnnotationConfigApplicationContext(GraphsDB.class, NodesDB.class);
+ graphsDB = context.getBean(GraphsDB.class);
+ nodesDB = context.getBean(NodesDB.class);
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Configuration
+ static class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+ @Override
+ public void configure(WebSecurity web) throws Exception {
+ web.ignoring().antMatchers("/**");
+ }
+ }
+
+ @Bean
+ public InternalResourceViewResolver jspViewResolver() {
+ InternalResourceViewResolver resolver= new InternalResourceViewResolver();
+ resolver.setPrefix("/");
+ return resolver;
+ }
+
+ @Bean
+ public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
+ return args -> {
+
+ System.out.println("Let's inspect the beans provided by Spring Boot:");
+
+ String[] beanNames = ctx.getBeanDefinitionNames();
+ Arrays.sort(beanNames);
+ for (String beanName : beanNames) {
+ System.out.println(beanName);
+ }
+ };
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/Index.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/Index.java
new file mode 100644
index 0000000..6acfbfe
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/Index.java
@@ -0,0 +1,15 @@
+package ru.avplatonov.keter.backend.controllers;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@EnableAutoConfiguration
+public class Index {
+
+ @RequestMapping("/")
+ public String index() {
+ return "Welcome to Keter";
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateGraph.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateGraph.java
new file mode 100644
index 0000000..23495f0
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateGraph.java
@@ -0,0 +1,50 @@
+package ru.avplatonov.keter.backend.controllers.management.create;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import ru.avplatonov.keter.backend.initialize.GraphTemplate;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.io.IOException;
+import java.util.*;
+
+import static ru.avplatonov.keter.backend.Application.graphsDB;
+import static ru.avplatonov.keter.backend.Application.nodesDB;
+
+@RestController
+@EnableAutoConfiguration
+public class CreateGraph {
+
+ @RequestMapping(value = "/create/graphs",
+ headers = {"Content-type=application/json"})
+ public String service(
+ @RequestBody GraphTemplate graphTemplate
+ ) throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ //listOfNodes.add(graphTemplate);
+ if(createGraph(graphTemplate).isEmpty())
+ return "Uuid of node is not found.";
+ return "listOfGraphs.size=" + graphsDB.getListOfGraphs().size() + "\n" + mapper.writeValueAsString(createGraph(graphTemplate));
+ }
+
+ private Set createGraph(GraphTemplate uuidNodesToGraphTemplate) {
+ Set listOfGraphsLocal = new HashSet<>();
+ for (UUID graphUuid : uuidNodesToGraphTemplate.getListOfUuidNodes()) {
+ boolean containsNode = false;
+ for (NodeTemplate nodeTemplateUuid : nodesDB.getListOfNodeTemplates()) {
+ if(graphUuid.equals(nodeTemplateUuid.getUuid())){
+ containsNode = true;
+ listOfGraphsLocal.add(nodeTemplateUuid);
+ }
+ }
+ if(!containsNode)
+ return new HashSet<>();
+ }
+ graphsDB.addListOfNodes(listOfGraphsLocal);
+ return listOfGraphsLocal;
+ }
+}
\ No newline at end of file
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateNode.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateNode.java
new file mode 100644
index 0000000..17b3c69
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/create/CreateNode.java
@@ -0,0 +1,27 @@
+package ru.avplatonov.keter.backend.controllers.management.create;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.io.IOException;
+
+import static ru.avplatonov.keter.backend.Application.nodesDB;
+
+@RestController
+@EnableAutoConfiguration
+public class CreateNode {
+
+ @RequestMapping(value = "/create/nodes",
+ headers = {"Content-type=application/json"})
+ public String service(
+ @RequestBody NodeTemplate nodeTemplate
+ ) throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ nodesDB.addListOfNodes(nodeTemplate);
+ return "listOfNode.size=" + nodesDB.getListOfNodeTemplates().size() + "\n" + mapper.writeValueAsString(nodeTemplate) ;
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/graphs/GraphListController.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/graphs/GraphListController.java
new file mode 100644
index 0000000..6fc01f1
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/graphs/GraphListController.java
@@ -0,0 +1,36 @@
+package ru.avplatonov.keter.backend.controllers.management.graphs;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.lang.NonNull;
+import org.springframework.web.bind.annotation.*;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static ru.avplatonov.keter.backend.Application.nodesDB;
+
+@RestController
+@EnableAutoConfiguration
+public class GraphListController {
+
+ @RequestMapping(value = "/graphs/{graphSearch}")
+ public String listOfGraphs(
+ @PathVariable("graphSearch") @NonNull String value
+ ) throws JsonProcessingException {
+ return value + "\n" + searchGraph(value);
+ }
+
+ private List searchGraph(String value) throws JsonProcessingException {
+ List listOfGraphs = new ArrayList<>();
+ ObjectMapper mapper = new ObjectMapper();
+ for (NodeTemplate nodeTemplate : nodesDB.getListOfNodeTemplates()) {
+ if (nodeTemplate.getDescription().contains(value) || nodeTemplate.getTags().contains(value) || nodeTemplate.getName().contains(value)){
+ listOfGraphs.add(mapper.writeValueAsString(nodeTemplate));
+ }
+ }
+ return listOfGraphs;
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/nodes/NodeListController.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/nodes/NodeListController.java
new file mode 100644
index 0000000..66406be
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/nodes/NodeListController.java
@@ -0,0 +1,42 @@
+package ru.avplatonov.keter.backend.controllers.management.nodes;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.lang.NonNull;
+import org.springframework.web.bind.annotation.*;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import static ru.avplatonov.keter.backend.Application.nodesDB;
+
+@RestController
+@EnableAutoConfiguration
+public class NodeListController {
+
+ @RequestMapping(value = "/nodes/all")
+ public Set service() throws JsonProcessingException {
+ return nodesDB.getListOfNodeTemplates();
+ }
+
+ @RequestMapping(value = "/nodes/{nodeSearch}")
+ public String service(
+ @PathVariable("nodeSearch") @NonNull String value
+ ) throws JsonProcessingException {
+ return value + "\n" + searchNode(value); //.toLowerCase() ?
+ }
+
+ private List searchNode(String value) throws JsonProcessingException {
+ List listOfNodes = new ArrayList<>();
+ ObjectMapper mapper = new ObjectMapper();
+ for (NodeTemplate nodeTemplate : nodesDB.getListOfNodeTemplates()) {
+ if (nodeTemplate.getDescription().contains(value) || nodeTemplate.getTags().contains(value) || nodeTemplate.getName().contains(value)){
+ listOfNodes.add(mapper.writeValueAsString(nodeTemplate));
+ }
+ }
+ return listOfNodes;
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/services/ServiceListController.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/services/ServiceListController.java
new file mode 100644
index 0000000..51e2474
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/controllers/management/services/ServiceListController.java
@@ -0,0 +1,15 @@
+package ru.avplatonov.keter.backend.controllers.management.services;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@EnableAutoConfiguration
+public class ServiceListController {
+
+ @GetMapping("/services")
+ public String service() {
+ return null;
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/GraphsDB.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/GraphsDB.java
new file mode 100644
index 0000000..d2debd7
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/GraphsDB.java
@@ -0,0 +1,27 @@
+package ru.avplatonov.keter.backend.db;
+
+import org.springframework.stereotype.Component;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Component
+public class GraphsDB {
+
+ private List> listOfGraphs = new ArrayList<>();
+
+ public List> getListOfGraphs() {
+ return listOfGraphs;
+ }
+
+ public void setListOfGraphs(List> listOfGraphs) {
+ this.listOfGraphs = listOfGraphs;
+ }
+
+ public void addListOfNodes(Set listOfGraphs){
+ this.listOfGraphs.add(listOfGraphs);
+ }
+
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/NodesDB.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/NodesDB.java
new file mode 100644
index 0000000..94a95c2
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/db/NodesDB.java
@@ -0,0 +1,26 @@
+package ru.avplatonov.keter.backend.db;
+
+import org.springframework.stereotype.Component;
+import ru.avplatonov.keter.backend.initialize.NodeTemplate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Component
+public class NodesDB {
+
+ private Set listOfNodeTemplates = new HashSet<>();
+
+ public Set getListOfNodeTemplates() {
+ return listOfNodeTemplates;
+ }
+
+ public void addListOfNodes(NodeTemplate listOfNodes){
+ this.listOfNodeTemplates.add(listOfNodes);
+ }
+
+ public void setListOfNodeTemplates(Set listOfNodeTemplates) {
+ this.listOfNodeTemplates = listOfNodeTemplates;
+ }
+
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/GraphTemplate.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/GraphTemplate.java
new file mode 100644
index 0000000..2b06faf
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/GraphTemplate.java
@@ -0,0 +1,35 @@
+package ru.avplatonov.keter.backend.initialize;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+public class GraphTemplate {
+
+ private UUID uuidGraph = UUID.randomUUID();
+ private List listOfUuidNodes = new ArrayList<>();
+
+ public UUID getUuid() {
+ return uuidGraph;
+ }
+
+ public List getListOfUuidNodes() {
+ return listOfUuidNodes;
+ }
+
+ public List listOfUuidNodes() {
+ return listOfUuidNodes;
+ }
+
+ public void setListOfNodes(List listOfNodes) {
+ this.listOfUuidNodes = listOfNodes;
+ }
+
+ public GraphTemplate(){
+
+ }
+
+ public GraphTemplate(List listOfNodes) {
+ this.listOfUuidNodes = listOfNodes;
+ }
+}
diff --git a/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/NodeTemplate.java b/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/NodeTemplate.java
new file mode 100644
index 0000000..e58e1ff
--- /dev/null
+++ b/keter-backend/src/main/java/ru/avplatonov/keter/backend/initialize/NodeTemplate.java
@@ -0,0 +1,92 @@
+package ru.avplatonov.keter.backend.initialize;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class NodeTemplate {
+
+ private UUID uuidNode = UUID.randomUUID();
+ private String name = "KETER";
+ private String description = "KETER";
+ private List tags = null;
+ private String script = "KETER";
+ private Map parameters = null;
+ private List> hardware = null;
+ private List files = null;
+
+ public UUID getUuid() {
+ return uuidNode;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public List getTags() {
+ return tags;
+ }
+
+ public void setTags(List tags) {
+ this.tags = tags;
+ }
+
+ public String getScript() {
+ return script;
+ }
+
+ public void setScript(String script) {
+ this.script = script;
+ }
+
+ public Map getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(Map parameters) {
+ this.parameters = parameters;
+ }
+
+ public List> getHardware() {
+ return hardware;
+ }
+
+ public void setHardware(List> hardware) {
+ this.hardware = hardware;
+ }
+
+ public void setFiles(List files) {
+ this.files = files;
+ }
+
+ public List getFiles() {
+ return files;
+ }
+
+
+ public NodeTemplate(){
+
+ }
+
+ public NodeTemplate(String name, String description, List tags, String script, Map parameters, List> hardware, List files) {
+ this.name = name;
+ this.description = description;
+ this.tags = tags;
+ this.script = script;
+ this.parameters = parameters;
+ this.hardware = hardware;
+ this.files = files;
+ }
+}
diff --git a/keter-backend/src/main/resources/application.properties b/keter-backend/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/keter-backend/target/classes/application.properties b/keter-backend/target/classes/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/keter-core/src/main/scala/ru/avplatonov/keter/core/task/Task.scala b/keter-core/src/main/scala/ru/avplatonov/keter/core/task/Task.scala
index fcaee10..2dccff8 100644
--- a/keter-core/src/main/scala/ru/avplatonov/keter/core/task/Task.scala
+++ b/keter-core/src/main/scala/ru/avplatonov/keter/core/task/Task.scala
@@ -22,8 +22,8 @@ import java.util.UUID
/**
* Represents dependencies between tasks.
*
- * @param tasks tasks list with their local ids in graph.
- * @param edges dependencies in graph.
+ * @param tasks tasks list with their local ids in graphTemplate.
+ * @param edges dependencies in graphTemplate.
*/
case class Graph(tasks: Map[Long, Task], edges: Map[Long, Long])
diff --git a/keter-core/src/main/scala/ru/avplatonov/keter/core/task/TaskQueue.scala b/keter-core/src/main/scala/ru/avplatonov/keter/core/task/TaskQueue.scala
index 5e411c5..432b013 100644
--- a/keter-core/src/main/scala/ru/avplatonov/keter/core/task/TaskQueue.scala
+++ b/keter-core/src/main/scala/ru/avplatonov/keter/core/task/TaskQueue.scala
@@ -43,7 +43,7 @@ trait TaskQueue {
* Takes a description of task dependencies and task descriptions, creates all tasks in queue,
* asssign unique id for them and sets dependencies on this unique ids.
*
- * @param taskGraph task graph.
+ * @param taskGraph task graphTemplate.
* @return true if operation was successful.
*/
def createTasks(taskGraph: Graph): Boolean
diff --git a/keter-core/src/main/scala/ru/avplatonov/keter/core/worker/Worker.scala b/keter-core/src/main/scala/ru/avplatonov/keter/core/worker/Worker.scala
index 532ec9e..68f99bd 100644
--- a/keter-core/src/main/scala/ru/avplatonov/keter/core/worker/Worker.scala
+++ b/keter-core/src/main/scala/ru/avplatonov/keter/core/worker/Worker.scala
@@ -59,7 +59,7 @@ trait Worker {
* and runs task.
*
* @param task task.
- * @return work object, contains unique workId on current node,
+ * @return work object, contains unique workId on current nodeTemplate,
*/
def run(task: Task): Work
diff --git a/pom.xml b/pom.xml
index 54c74df..621bb02 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
+ keter-backend
keter-common
keter-core