diff options
Diffstat (limited to 'src')
10 files changed, 269 insertions, 25 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java new file mode 100644 index 0000000..62f77ee --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java @@ -0,0 +1,54 @@ +package pl.edu.mimuw.cloudatlas.client; + +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.stereotype.Controller; + +/* +should enable reading attribute values stored by the agent +installing and +uninstalling queries, and +setting fallback contacts. + +Apart from providing forms for queries and fallback contacts, +and presenting the information fetched from the agent in a textual form (with automatic refreshment), +plotting the attributes with numeric values as real-time graphs. +*/ + +@Controller +public class ClientController { + + @GetMapping("/") + public String homePage(Model model) { + model.addAttribute("homeMessage", "Welcome to CloudaAtlas client interface"); + return "home"; + } + + @GetMapping("/query") + public String queryPage(Model model) { + model.addAttribute("queryObject", new Query()); + return "queryForm"; + } + + @PostMapping("/query") + public String submitQuery(@ModelAttribute Query queryObject, Model model) { + model.addAttribute("homeMessage", "Query submitted successfully"); + return "home"; + } + + @GetMapping("/contacts") + public String contactPage(Model model) { + return "contactsForm"; + } + + @PostMapping("/contacts") + public String contactPage(@ModelAttribute String contactsObject, Model model) { + model.addAttribute("homeMessage", "Contact list submitted successfully"); + return "home"; + } + + @GetMapping("/attribs") + public String attribPage(Model model) { + return "attribChart"; + } +} diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java deleted file mode 100644 index 3b0ec63..0000000 --- a/src/main/java/pl/edu/mimuw/cloudatlas/client/Controller.java +++ /dev/null @@ -1,25 +0,0 @@ -package pl.edu.mimuw.cloudatlas.client; - -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/* -should enable reading attribute values stored by the agent -installing and -uninstalling queries, and -setting fallback contacts. - -Apart from providing forms for queries and fallback contacts, -and presenting the information fetched from the agent in a textual form (with automatic refreshment), -plotting the attributes with numeric values as real-time graphs. -*/ - -@RestController -public class Controller { - - @GetMapping("/") - public String homePage(Model model) { - return "home"; - } -} diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java new file mode 100644 index 0000000..ff9b7f4 --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/Query.java @@ -0,0 +1,22 @@ +package pl.edu.mimuw.cloudatlas.client; + +class Query { + private String name; + private String value; + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return this.value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..9cbc2e8 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.application.name=CloudAtlas Client + +spring.thymeleaf.cache=false +spring.thymeleaf.enabled=true +spring.thymeleaf.prefix=classpath:/pl/edu/mimuw/cloudatlas/client/templates/ +spring.thymeleaf.suffix=.html diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html new file mode 100644 index 0000000..7e0b37f --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/attribChart.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> + +<head> + <meta charset="UTF-8"> + <title>Attributes chart</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> + <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> + <script type="text/javascript"> + google.charts.load('current', {'packages':['corechart']}); + google.charts.setOnLoadCallback(drawChart); + + function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Year', 'Sales', 'Expenses'], + ['2013', 1000, 400], + ['2014', 1170, 460], + ['2015', 660, 1120], + ['2016', 1030, 540] + ]); + + var options = { + title: 'Company Performance', + hAxis: {title: 'Year', titleTextStyle: {color: '#333'}}, + vAxis: {minValue: 0} + }; + + var chart = new google.visualization.AreaChart(document.getElementById('chart_div')); + chart.draw(data, options); + } + </script> +</head> + +<body> + +<div th:replace="fragments/navbar :: navbar"></div> +<div id="chart_div" style="width: 100%; height: 500px;"></div> + +<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +</body> + +</html> + diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html new file mode 100644 index 0000000..027f831 --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/contactsForm.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> + +<head> + <meta charset="UTF-8"> + <title>Query form</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> +</head> + +<body> + +<div th:replace="fragments/navbar :: navbar"></div> +<div id="queryForm"> + <form action="#" th:action="@{/contacts}" th:object="${contactsObject}" method="post"> + <div class="form-group"> + <label for="Textarea1">Enter contacts as a Json list</label> + <textarea class="form-control" id="Textarea1" rows="3"></textarea> + </div> + <button type="submit" class="btn btn-primary">Submit</button> + </form> +</div> + +<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +</body> + +</html> diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html new file mode 100644 index 0000000..b449bda --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/error.html @@ -0,0 +1,10 @@ +<html lang="en"> +<head><title>Error</title></head> +<body> +<h1>Error</h1> +<b>[<span th:text="${status}">status</span>] + <span th:text="${error}">error</span> +</b> +<p th:text="${message}">message</p> +</body> +</html> diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html new file mode 100644 index 0000000..c651f74 --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/fragments/navbar.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> + +<html xmlns:th="http://www.thymeleaf.org"> + +<head> + <title>CloudAtlas Client</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> +</head> + +<body> + +<div th:fragment="navbar"> + <nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="/">CloudAtlas</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNav"> + <ul class="navbar-nav"> + <li class="nav-item active"> + <a class="nav-link" href="/">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/query">Queries</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/contacts">Contacts</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/attribs">Attribute values</a> + </li> + </ul> + </div> + </nav> +</div> + +<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +</body> + +</html> diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html new file mode 100644 index 0000000..47b19af --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/home.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> + +<html lang="en" xmlns:th="http://www.thymeleaf.org"> + +<head> + <meta charset="UTF-8"> + <title>CloudAtlas Client - home</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> +</head> + +<body> + +<div th:replace="fragments/navbar :: navbar"></div> +<div class="jumbotron"> + <h1 class="display-4" th:text="${homeMessage}"></h1> +</div> + +<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +</body> + +</html> diff --git a/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html new file mode 100644 index 0000000..ac00645 --- /dev/null +++ b/src/main/resources/pl/edu/mimuw/cloudatlas/client/templates/queryForm.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> + +<head> + <meta charset="UTF-8"> + <title>Query form</title> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> +</head> + +<body> + +<div th:replace="fragments/navbar :: navbar"></div> +<div id="queryForm"> + <form action="#" th:action="@{/query}" th:object="${queryObject}" method="post"> + <div class="form-group"> + <label for="QueryName1">Enter query name</label> + <input type="text" class="form-control" id="QueryName1" rows="3" th:field="*{name}"/> + </div> + <div class="form-group"> + <label for="Textarea1">Enter query</label> + <textarea class="form-control" id="Textarea1" rows="3" th:field="*{value}"></textarea> + </div> + <button type="submit" class="btn btn-primary">Submit</button> + </form> + + <div id="response"><p th:text="${responseText}"/></div> +</div> + +<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +</body> + +</html> |