From c876908509765740c05fc86078a68aac856c4107 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 15 Mar 2017 17:18:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B9=20=D0=BF=D1=80=D0=BE=D1=82=D0=BE=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=D0=B5=D0=B1=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/asys/mcsmanager/Activator.java | 13 ++++-- .../java/asys/mcsmanager/MCSM_WebModule.java | 44 +++++++++++++++++++ webinterface/build.gradle | 2 +- .../java/asys/webinterface/Activator.java | 2 +- .../asys/webinterface/HttpReqRespImpl.java | 31 +++++++++++++ .../java/asys/webinterface/IndexHandler.java | 37 +++++++++++++--- .../asys/webinterface/WebinterfaceImpl.java | 11 +++-- .../asys/webinterface/api/HttpReqResp.java | 1 + .../asys/webinterface/api/Webinterface.java | 1 + 9 files changed, 127 insertions(+), 15 deletions(-) create mode 100644 mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java create mode 100644 webinterface/src/main/java/asys/webinterface/HttpReqRespImpl.java diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java b/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java index dd68177..969dd9b 100644 --- a/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java +++ b/mcserver-manager/src/main/java/asys/mcsmanager/Activator.java @@ -16,9 +16,13 @@ import org.slf4j.LoggerFactory; public class Activator implements BundleActivator, ServiceListener { private final Logger logger = LoggerFactory.getLogger(Activator.class); private ServiceTracker serviceTracker; + private MCSM_WebModule module; + private Webinterface webinterface; @Override public void start(BundleContext context) throws Exception { + module = new MCSM_WebModule(); + logger.debug("Register service listener"); context.addServiceListener(this); @@ -28,6 +32,9 @@ public class Activator implements BundleActivator, ServiceListener { @Override public void stop(BundleContext context) throws Exception { + if (webinterface != null) { + webinterface.removeModule(module.getName()); + } serviceTracker.close(); context.removeServiceListener(this); } @@ -40,11 +47,9 @@ public class Activator implements BundleActivator, ServiceListener { if (classStr.equals(Webinterface.class.getCanonicalName())) { try { serviceTracker.open(); - Webinterface webinterface = serviceTracker.waitForService(5000); + webinterface = serviceTracker.waitForService(5000); if (webinterface != null) { - webinterface.addMainMenuItem("mcsmanager", - "Серверы", "/modules/mcsmanager"); - return; + webinterface.addModule(module); } else { logger.debug("service not found =("); } diff --git a/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java b/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java new file mode 100644 index 0000000..639d20a --- /dev/null +++ b/mcserver-manager/src/main/java/asys/mcsmanager/MCSM_WebModule.java @@ -0,0 +1,44 @@ +/* + * DmitriyMX + * 2017-03-15 + */ +package asys.mcsmanager; + +import asys.webinterface.api.HttpReqResp; +import asys.webinterface.api.WebModule; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MCSM_WebModule implements WebModule { + private final String MODULE_NAME = "mcsmanager"; + + @Override + public String getName() { + return MODULE_NAME; + } + + @Override + public List getStylesheetsLinks() { + return Collections.emptyList(); + } + + @Override + public List getJavaScriptLinks() { + return Collections.singletonList("/module/"+MODULE_NAME+"/module.js"); + } + + @Override + public Map getMainMenuItems() { + return new HashMap(){{ + this.put("Серверы", "/module/"+MODULE_NAME); + }}; + } + + @Override + public void handle(HttpReqResp httpReqResp) { + + } +} diff --git a/webinterface/build.gradle b/webinterface/build.gradle index c1b04a1..d29c061 100644 --- a/webinterface/build.gradle +++ b/webinterface/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.14-SNAPSHOT' +version = '0.15-SNAPSHOT' buildscript { repositories { diff --git a/webinterface/src/main/java/asys/webinterface/Activator.java b/webinterface/src/main/java/asys/webinterface/Activator.java index 8b33668..f4c879d 100644 --- a/webinterface/src/main/java/asys/webinterface/Activator.java +++ b/webinterface/src/main/java/asys/webinterface/Activator.java @@ -52,7 +52,7 @@ public class Activator implements BundleActivator { @Override public Map getMainMenuItems() { return new HashMap(){{ - this.put("Модули", "#"); + this.put("Модули", "/modules"); }}; } diff --git a/webinterface/src/main/java/asys/webinterface/HttpReqRespImpl.java b/webinterface/src/main/java/asys/webinterface/HttpReqRespImpl.java new file mode 100644 index 0000000..5c30e46 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/HttpReqRespImpl.java @@ -0,0 +1,31 @@ +/* + * DmitriyMX + * 2017-03-15 + */ +package asys.webinterface; + +import asys.webinterface.api.HttpReqResp; +import com.sun.net.httpserver.HttpExchange; + +public class HttpReqRespImpl implements HttpReqResp { + private HttpExchange httpExchange; + + public HttpReqRespImpl(HttpExchange httpExchange) { + this.httpExchange = httpExchange; + } + + @Override + public String[] getRequestURIParts() { + String uriStr = httpExchange.getRequestURI().toString().replaceAll("/{2,}", "/"); + if (uriStr.startsWith("/")) { + uriStr = uriStr.replaceFirst("/",""); + } + + String[] result = uriStr.split("/"); + if (result.length == 1 && result[0].isEmpty()) { + return new String[0]; + } else { + return result; + } + } +} diff --git a/webinterface/src/main/java/asys/webinterface/IndexHandler.java b/webinterface/src/main/java/asys/webinterface/IndexHandler.java index dc40b0f..e0c347c 100644 --- a/webinterface/src/main/java/asys/webinterface/IndexHandler.java +++ b/webinterface/src/main/java/asys/webinterface/IndexHandler.java @@ -4,23 +4,28 @@ */ package asys.webinterface; +import asys.webinterface.api.HttpReqResp; +import asys.webinterface.api.WebModule; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.*; import java.nio.charset.Charset; public class IndexHandler implements HttpHandler { + private final Logger logger = LoggerFactory.getLogger(IndexHandler.class); static final Charset defaultCharset = Charset.forName("UTF-8"); private String htmlTemplate; + private WebinterfaceImpl webinterface; public IndexHandler(WebinterfaceImpl webinterface) { try { InputStream inputStream = getClass().getResourceAsStream("/index.html"); - htmlTemplate = IOUtils.toString(inputStream, "UTF-8") - .replace("<{moduleScript}>", webinterface.javascriptToTags("modules")) - .replace("<{moduleStylesheet}>", webinterface.stylesheetToTags("modules")); + htmlTemplate = IOUtils.toString(inputStream, "UTF-8"); + this.webinterface = webinterface; } catch (Exception e) { throw new RuntimeException("Error load htmlTemplate", e); } @@ -28,10 +33,32 @@ public class IndexHandler implements HttpHandler { @Override public void handle(HttpExchange httpExchange) throws IOException { + HttpReqResp httpReqResp = new HttpReqRespImpl(httpExchange); + String[] requestURIParts = httpReqResp.getRequestURIParts(); + if (requestURIParts.length > 0 && requestURIParts[0].equals("module")) { + logger.debug("Module request: {}", requestURIParts[1]); + WebModule module = webinterface.getModule(requestURIParts[1]); + if (module != null) { + sendHtmlTemplate(prepareHtmlTemplate(module), httpExchange); + } else { + logger.warn("404 - module \"{}\" not found", requestURIParts[1]); + } + } else if (requestURIParts.length == 0 || requestURIParts[0].equals("modules")) { + logger.debug("use default module"); + sendHtmlTemplate(prepareHtmlTemplate(webinterface.getModule("modules")), httpExchange); + } + } + + private byte[] prepareHtmlTemplate(WebModule module) { + return htmlTemplate.replace("<{moduleScript}>", webinterface.javascriptToTags(module)) + .replace("<{moduleStylesheet}>", webinterface.stylesheetToTags(module)).getBytes(defaultCharset); + } + + private void sendHtmlTemplate(byte[] htmlTemplateBytes, HttpExchange httpExchange) throws IOException { httpExchange.getResponseHeaders().add("Context-Type","text/html;charset=utf-8"); - httpExchange.sendResponseHeaders(200, htmlTemplate.length()); + httpExchange.sendResponseHeaders(200, htmlTemplateBytes.length); OutputStream responseBody = httpExchange.getResponseBody(); - responseBody.write(htmlTemplate.getBytes(defaultCharset)); + responseBody.write(htmlTemplateBytes); responseBody.close(); } } diff --git a/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java b/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java index 5815587..d3fc4a8 100644 --- a/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java +++ b/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java @@ -22,6 +22,11 @@ public class WebinterfaceImpl implements Webinterface { webModules.remove(moduleName); } + @Override + public WebModule getModule(String moduleName) { + return webModules.get(moduleName); + } + public String mainMenuItemsToReactJS() { StringJoiner sj = new StringJoiner(","); @@ -37,10 +42,9 @@ public class WebinterfaceImpl implements Webinterface { return sj.toString(); } - public String javascriptToTags(String moduleName) { + public String javascriptToTags(WebModule webModule) { StringJoiner sj = new StringJoiner("\n"); - WebModule webModule = webModules.get(moduleName); for (String link : webModule.getJavaScriptLinks()) { sj.add(String.format("", link)); } @@ -48,10 +52,9 @@ public class WebinterfaceImpl implements Webinterface { return sj.toString(); } - public String stylesheetToTags(String moduleName) { + public String stylesheetToTags(WebModule webModule) { StringJoiner sj = new StringJoiner("\n"); - WebModule webModule = webModules.get(moduleName); for (String link : webModule.getJavaScriptLinks()) { sj.add(String.format("", link)); } diff --git a/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java b/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java index 2b03604..a88b6ac 100644 --- a/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java +++ b/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java @@ -5,4 +5,5 @@ package asys.webinterface.api; public interface HttpReqResp { + String[] getRequestURIParts(); } diff --git a/webinterface/src/main/java/asys/webinterface/api/Webinterface.java b/webinterface/src/main/java/asys/webinterface/api/Webinterface.java index ee60230..338b602 100644 --- a/webinterface/src/main/java/asys/webinterface/api/Webinterface.java +++ b/webinterface/src/main/java/asys/webinterface/api/Webinterface.java @@ -7,4 +7,5 @@ package asys.webinterface.api; public interface Webinterface { void addModule(WebModule webModule); void removeModule(String moduleName); + WebModule getModule(String moduleName); }