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