From 4228ea932b5e290bc2725279352c0ccb8a8cfb58 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 13 Dec 2016 01:23:06 +0300 Subject: [PATCH] =?UTF-8?q?WebInterface:=20=D0=B7=D0=B0=D0=B4=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D1=80=D0=B5=D0=B9=D0=BC=D0=B2=D0=BE=D1=80=D0=BA=D0=B0=20Angula?= =?UTF-8?q?rJS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webinterface/pom.xml | 9 +++- .../java/asys/webinterface/AjaxHandler.java | 51 +++++++++++++++++++ .../java/asys/webinterface/IndexHandler.java | 48 +++++++---------- .../java/asys/webinterface/StaticHandler.java | 41 +++++++++++++++ .../java/asys/webinterface/WebServer.java | 2 + webinterface/src/main/resources/index.html | 15 ++++++ webinterface/src/main/resources/static/app.js | 2 + .../resources/static/bundle-list.component.js | 19 +++++++ 8 files changed, 157 insertions(+), 30 deletions(-) create mode 100644 webinterface/src/main/java/asys/webinterface/AjaxHandler.java create mode 100644 webinterface/src/main/java/asys/webinterface/StaticHandler.java create mode 100644 webinterface/src/main/resources/index.html create mode 100644 webinterface/src/main/resources/static/app.js create mode 100644 webinterface/src/main/resources/static/bundle-list.component.js diff --git a/webinterface/pom.xml b/webinterface/pom.xml index 6bdeaca..b7e6ddd 100644 --- a/webinterface/pom.xml +++ b/webinterface/pom.xml @@ -19,7 +19,7 @@ asys webinterface - 0.3-SNAPSHOT + 0.4-SNAPSHOT bundle @@ -33,6 +33,13 @@ api 0.1-SNAPSHOT + + com.google.code.gson + gson + 2.7 + + + diff --git a/webinterface/src/main/java/asys/webinterface/AjaxHandler.java b/webinterface/src/main/java/asys/webinterface/AjaxHandler.java new file mode 100644 index 0000000..f6342e0 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/AjaxHandler.java @@ -0,0 +1,51 @@ +/* + * DmitriyMX + * 2016-12-13 + */ +package asys.webinterface; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; + +public class AjaxHandler implements HttpHandler { + private static final Charset defaultCharset = Charset.forName("UTF-8"); + private BundleContext context; + + public AjaxHandler(BundleContext context) { + this.context = context; + } + + @Override + public void handle(HttpExchange httpExchange) throws IOException { + String outJson = "{}"; + + String jsonPath = httpExchange.getRequestURI().getPath(); + if (jsonPath.equals("/ajax/bundles.json")) { + JsonArray jsonArray = new JsonArray(); + + for (Bundle bundle : context.getBundle(0).getBundleContext().getBundles()) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("name", bundle.getHeaders().get("Bundle-Name")); + jsonObject.addProperty("symname", bundle.getSymbolicName()); + jsonArray.add(jsonObject); + } + + outJson = jsonArray.toString(); + } + + httpExchange.getResponseHeaders().add("Context-Type", "application/json;charset=utf-8"); + httpExchange.sendResponseHeaders(200, 0); + OutputStream responseBody = httpExchange.getResponseBody(); + responseBody.write(outJson.getBytes(defaultCharset)); + responseBody.close(); + } +} diff --git a/webinterface/src/main/java/asys/webinterface/IndexHandler.java b/webinterface/src/main/java/asys/webinterface/IndexHandler.java index e06bb63..029951f 100644 --- a/webinterface/src/main/java/asys/webinterface/IndexHandler.java +++ b/webinterface/src/main/java/asys/webinterface/IndexHandler.java @@ -6,13 +6,9 @@ package asys.webinterface; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URI; +import java.io.*; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; @@ -20,38 +16,32 @@ import java.util.Map; public class IndexHandler implements HttpHandler { private static final Charset defaultCharset = Charset.forName("UTF-8"); private BundleContext context; + private String htmlTemplate; public IndexHandler(BundleContext context) { this.context = context; + + try { + InputStream inputStream = getClass().getResourceAsStream("/index.html"); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line).append("\n"); + } + htmlTemplate = sb.toString(); + } catch (Exception e) { + throw new RuntimeException("Error load htmlTemplate", e); + } } @Override public void handle(HttpExchange httpExchange) throws IOException { - URI requestURI = httpExchange.getRequestURI(); - if (requestURI.getQuery() != null && !requestURI.getQuery().isEmpty()) { - Map map = queryToMap(requestURI.getQuery()); - int bndid = Integer.valueOf(map.get("bnd")); - try { - context.getBundle(bndid).stop(); - } catch (BundleException e) { - e.printStackTrace(); - } - } - - StringBuilder htmlText = new StringBuilder(""); - htmlText.append("

").append("ASys Web interface").append("

") - .append("
    "); - for (Bundle bundle : context.getBundle(0).getBundleContext().getBundles()) { - htmlText.append("
  • ").append(bundle.getHeaders().get("Bundle-Name")) - .append(" [Stop]") - .append("
  • "); - } - htmlText.append("
"); - - httpExchange.sendResponseHeaders(200, htmlText.length()); - httpExchange.setAttribute("Context-Type", "text/html;charset=utf-8"); + httpExchange.getResponseHeaders().add("Context-Type","text/html;charset=utf-8"); + httpExchange.sendResponseHeaders(200, htmlTemplate.length()); OutputStream responseBody = httpExchange.getResponseBody(); - responseBody.write(htmlText.toString().getBytes(defaultCharset)); + responseBody.write(htmlTemplate.getBytes(defaultCharset)); responseBody.close(); } diff --git a/webinterface/src/main/java/asys/webinterface/StaticHandler.java b/webinterface/src/main/java/asys/webinterface/StaticHandler.java new file mode 100644 index 0000000..092f5a4 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/StaticHandler.java @@ -0,0 +1,41 @@ +/* + * DmitriyMX + * 2016-12-12 + */ +package asys.webinterface; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class StaticHandler implements HttpHandler { + @Override + public void handle(HttpExchange httpExchange) throws IOException { + String fileId = httpExchange.getRequestURI().getPath(); + fileId = fileId.replace("../", "").replace("//", "/"); + System.err.println(fileId); + InputStream inputStream = getClass().getResourceAsStream(fileId); + if (inputStream == null) { + String response = "Error 404 File not found."; + httpExchange.sendResponseHeaders(404, response.length()); + OutputStream outputStream = httpExchange.getResponseBody(); + outputStream.write(response.getBytes()); + outputStream.flush(); + outputStream.close(); + } else { + httpExchange.sendResponseHeaders(200, 0); + OutputStream outputStream = httpExchange.getResponseBody(); + final byte[] buffer = new byte[0x10000]; + int len; + while((len = inputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, len); + } + outputStream.flush(); + outputStream.close(); + inputStream.close(); + } + } +} diff --git a/webinterface/src/main/java/asys/webinterface/WebServer.java b/webinterface/src/main/java/asys/webinterface/WebServer.java index c02b0c9..5f77bdb 100644 --- a/webinterface/src/main/java/asys/webinterface/WebServer.java +++ b/webinterface/src/main/java/asys/webinterface/WebServer.java @@ -21,6 +21,8 @@ public class WebServer { public void start(int port) throws IOException { server = HttpServer.create(new InetSocketAddress(port), 0); server.createContext("/", new IndexHandler(context)); + server.createContext("/static", new StaticHandler()); + server.createContext("/ajax", new AjaxHandler(context)); server.start(); } diff --git a/webinterface/src/main/resources/index.html b/webinterface/src/main/resources/index.html new file mode 100644 index 0000000..3911d4a --- /dev/null +++ b/webinterface/src/main/resources/index.html @@ -0,0 +1,15 @@ + + + + + ASys: Web interface + + + + + +

ASys: Web interface

+
+ + + \ No newline at end of file diff --git a/webinterface/src/main/resources/static/app.js b/webinterface/src/main/resources/static/app.js new file mode 100644 index 0000000..7fb82d3 --- /dev/null +++ b/webinterface/src/main/resources/static/app.js @@ -0,0 +1,2 @@ +'use strict'; +angular.module('asysApp', []); \ No newline at end of file diff --git a/webinterface/src/main/resources/static/bundle-list.component.js b/webinterface/src/main/resources/static/bundle-list.component.js new file mode 100644 index 0000000..1cb6487 --- /dev/null +++ b/webinterface/src/main/resources/static/bundle-list.component.js @@ -0,0 +1,19 @@ +'use strict'; + +angular. + module('asysApp'). + component('bundleList', { + template: + '
    ' + + '
  • ' + + '{{bundle.name}}' + + '

    {{bundle.symname}}

    ' + + '
  • ' + + '
', + controller: function PhoneListController($http) { + var self = this; + $http.get('/ajax/bundles.json').then(function(response) { + self.bundles = response.data; + }); + } + }); \ No newline at end of file