From 908bd6a7dddb26d6f8ffa259a940324dd24d2cd6 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 15 Mar 2017 14:34:16 +0300 Subject: [PATCH 1/2] =?UTF-8?q?WebModule:=20=D0=BF=D1=80=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=BB=D0=B6=D0=B0=D0=B5=D0=BC=20=D0=BF=D1=8B=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=D1=81=D1=8F=20=D0=BD=D0=B0=D0=B9=D1=82=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B8=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=B5=20=D1=80=D0=B5?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D1=81=D1=88=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=B5=D0=B1=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=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 --- webinterface/build.gradle | 2 +- .../java/asys/webinterface/Activator.java | 37 +++++++- .../java/asys/webinterface/IndexHandler.java | 4 +- .../asys/webinterface/WebinterfaceImpl.java | 89 ++++--------------- .../asys/webinterface/api/HttpReqResp.java | 8 ++ .../java/asys/webinterface/api/WebModule.java | 16 ++++ .../asys/webinterface/api/Webinterface.java | 10 +-- 7 files changed, 82 insertions(+), 84 deletions(-) create mode 100644 webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java create mode 100644 webinterface/src/main/java/asys/webinterface/api/WebModule.java diff --git a/webinterface/build.gradle b/webinterface/build.gradle index 8996e1e..c1b04a1 100644 --- a/webinterface/build.gradle +++ b/webinterface/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.13-SNAPSHOT' +version = '0.14-SNAPSHOT' buildscript { repositories { diff --git a/webinterface/src/main/java/asys/webinterface/Activator.java b/webinterface/src/main/java/asys/webinterface/Activator.java index a6b0d8f..8b33668 100644 --- a/webinterface/src/main/java/asys/webinterface/Activator.java +++ b/webinterface/src/main/java/asys/webinterface/Activator.java @@ -4,6 +4,8 @@ */ package asys.webinterface; +import asys.webinterface.api.HttpReqResp; +import asys.webinterface.api.WebModule; import asys.webinterface.api.Webinterface; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; @@ -11,6 +13,8 @@ import org.osgi.framework.ServiceRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.*; + public class Activator implements BundleActivator { private final Logger logger = LoggerFactory.getLogger(Activator.class); private ServiceRegistration serviceMainMenu; @@ -19,8 +23,7 @@ public class Activator implements BundleActivator { @Override public void start(BundleContext context) throws Exception { WebinterfaceImpl webinterface = new WebinterfaceImpl(); - webinterface.addMainMenuItem("modules", "Модули", "#"); - webinterface.addJavascript("modules", "/static/module.js"); + webinterface.addModule(createSelfModule()); logger.trace("Register service: {}", Webinterface.class); serviceMainMenu = context.registerService(Webinterface.class, webinterface, null); @@ -29,6 +32,36 @@ public class Activator implements BundleActivator { webServer.start(8778); } + private WebModule createSelfModule() { + return new WebModule() { + @Override + public String getName() { + return "modules"; + } + + @Override + public List getStylesheetsLinks() { + return Collections.emptyList(); + } + + @Override + public List getJavaScriptLinks() { + return Collections.singletonList("/static/module.js"); + } + + @Override + public Map getMainMenuItems() { + return new HashMap(){{ + this.put("Модули", "#"); + }}; + } + + @Override + public void handle(HttpReqResp httpReqResp) { + } + }; + } + @Override public void stop(BundleContext context) throws Exception { webServer.stop(); diff --git a/webinterface/src/main/java/asys/webinterface/IndexHandler.java b/webinterface/src/main/java/asys/webinterface/IndexHandler.java index a663c0c..dc40b0f 100644 --- a/webinterface/src/main/java/asys/webinterface/IndexHandler.java +++ b/webinterface/src/main/java/asys/webinterface/IndexHandler.java @@ -19,8 +19,8 @@ public class IndexHandler implements HttpHandler { try { InputStream inputStream = getClass().getResourceAsStream("/index.html"); htmlTemplate = IOUtils.toString(inputStream, "UTF-8") - .replace("<{moduleScript}>", webinterface.javascriptToTags()) - .replace("<{moduleStylesheet}>", webinterface.stylesheetToTags()); + .replace("<{moduleScript}>", webinterface.javascriptToTags("modules")) + .replace("<{moduleStylesheet}>", webinterface.stylesheetToTags("modules")); } catch (Exception e) { throw new RuntimeException("Error load htmlTemplate", e); } diff --git a/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java b/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java index ca678f7..5815587 100644 --- a/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java +++ b/webinterface/src/main/java/asys/webinterface/WebinterfaceImpl.java @@ -4,83 +4,32 @@ */ package asys.webinterface; +import asys.webinterface.api.WebModule; import asys.webinterface.api.Webinterface; import java.util.*; public class WebinterfaceImpl implements Webinterface { - // moduleName, links - private Map> javascripts = new HashMap<>(); - private Map> stylesheets = new HashMap<>(); - private Map> menuItems = new HashMap<>(); + private Map webModules = new HashMap<>(); - public class MainMenuItem { - public String title, link; - public MainMenuItem(String title, String link) { - this.title = title; - this.link = link; - } + @Override + public void addModule(WebModule webModule) { + webModules.put(webModule.getName(), webModule); } @Override - public void addJavascript(String moduleName, String link) { - List list; - if (javascripts.containsKey(moduleName)) { - list = javascripts.get(moduleName); - } else { - list = new ArrayList<>(); - javascripts.put(moduleName, list); - } - list.add(link); - } - - @Override - public void removeJavascript(String moduleName) { - javascripts.remove(moduleName); - } - - @Override - public void addStylesheet(String moduleName, String link) { - List list; - if (stylesheets.containsKey(moduleName)) { - list = stylesheets.get(moduleName); - } else { - list = new ArrayList<>(); - stylesheets.put(moduleName, list); - } - list.add(link); - } - - @Override - public void removeStylesheet(String moduleName) { - stylesheets.remove(moduleName); - } - - @Override - public void addMainMenuItem(String moduleName, String title, String link) { - List list; - if (menuItems.containsKey(moduleName)) { - list = menuItems.get(moduleName); - } else { - list = new ArrayList<>(); - menuItems.put(moduleName, list); - } - list.add(new MainMenuItem(title, link)); - } - - @Override - public void removeMainMenuItems(String moduleName) { - menuItems.remove(moduleName); + public void removeModule(String moduleName) { + webModules.remove(moduleName); } public String mainMenuItemsToReactJS() { StringJoiner sj = new StringJoiner(","); - for(List listItems : menuItems.values()) { - for (MainMenuItem item : listItems) { + for (WebModule webModule : webModules.values()) { + for(Map.Entry entry : webModule.getMainMenuItems().entrySet()) { sj.add(String.format( "ce(MainMenuItem, {title: '%s', href: '%s'})", - item.title.replace("'","\\'"), item.link.replace("'","\\'") + entry.getKey().replace("'","\\'"), entry.getValue().replace("'","\\'") )); } } @@ -88,25 +37,23 @@ public class WebinterfaceImpl implements Webinterface { return sj.toString(); } - public String javascriptToTags() { + public String javascriptToTags(String moduleName) { StringJoiner sj = new StringJoiner("\n"); - for (List items : javascripts.values()) { - for (String link : items) { - sj.add(String.format("", link)); - } + WebModule webModule = webModules.get(moduleName); + for (String link : webModule.getJavaScriptLinks()) { + sj.add(String.format("", link)); } return sj.toString(); } - public String stylesheetToTags() { + public String stylesheetToTags(String moduleName) { StringJoiner sj = new StringJoiner("\n"); - for (List items : javascripts.values()) { - for (String link : items) { - sj.add(String.format("", link)); - } + WebModule webModule = webModules.get(moduleName); + for (String link : webModule.getJavaScriptLinks()) { + sj.add(String.format("", link)); } return sj.toString(); diff --git a/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java b/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java new file mode 100644 index 0000000..2b03604 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/api/HttpReqResp.java @@ -0,0 +1,8 @@ +/* + * DmitriyMX + * 2017-03-15 + */ +package asys.webinterface.api; + +public interface HttpReqResp { +} diff --git a/webinterface/src/main/java/asys/webinterface/api/WebModule.java b/webinterface/src/main/java/asys/webinterface/api/WebModule.java new file mode 100644 index 0000000..9c8c315 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/api/WebModule.java @@ -0,0 +1,16 @@ +/* + * DmitriyMX + * 2017-03-15 + */ +package asys.webinterface.api; + +import java.util.List; +import java.util.Map; + +public interface WebModule { + String getName(); + List getStylesheetsLinks(); + List getJavaScriptLinks(); + Map getMainMenuItems(); + void handle(HttpReqResp httpReqResp); +} diff --git a/webinterface/src/main/java/asys/webinterface/api/Webinterface.java b/webinterface/src/main/java/asys/webinterface/api/Webinterface.java index 5582158..ee60230 100644 --- a/webinterface/src/main/java/asys/webinterface/api/Webinterface.java +++ b/webinterface/src/main/java/asys/webinterface/api/Webinterface.java @@ -5,12 +5,6 @@ package asys.webinterface.api; public interface Webinterface { - void addJavascript(String moduleName, String link); - void removeJavascript(String moduleName); - - void addStylesheet(String moduleName, String link); - void removeStylesheet(String moduleName); - - void addMainMenuItem(String moduleName, String title, String link); - void removeMainMenuItems(String moduleName); + void addModule(WebModule webModule); + void removeModule(String moduleName); } From c876908509765740c05fc86078a68aac856c4107 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 15 Mar 2017 17:18:57 +0300 Subject: [PATCH 2/2] =?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); }