Archived
0

Работающий прототип расширения веб интерфейса

This commit is contained in:
2017-03-15 17:18:57 +03:00
parent 908bd6a7dd
commit c876908509
9 changed files with 127 additions and 15 deletions

View File

@@ -16,9 +16,13 @@ import org.slf4j.LoggerFactory;
public class Activator implements BundleActivator, ServiceListener { public class Activator implements BundleActivator, ServiceListener {
private final Logger logger = LoggerFactory.getLogger(Activator.class); private final Logger logger = LoggerFactory.getLogger(Activator.class);
private ServiceTracker<?, Webinterface> serviceTracker; private ServiceTracker<?, Webinterface> serviceTracker;
private MCSM_WebModule module;
private Webinterface webinterface;
@Override @Override
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
module = new MCSM_WebModule();
logger.debug("Register service listener"); logger.debug("Register service listener");
context.addServiceListener(this); context.addServiceListener(this);
@@ -28,6 +32,9 @@ public class Activator implements BundleActivator, ServiceListener {
@Override @Override
public void stop(BundleContext context) throws Exception { public void stop(BundleContext context) throws Exception {
if (webinterface != null) {
webinterface.removeModule(module.getName());
}
serviceTracker.close(); serviceTracker.close();
context.removeServiceListener(this); context.removeServiceListener(this);
} }
@@ -40,11 +47,9 @@ public class Activator implements BundleActivator, ServiceListener {
if (classStr.equals(Webinterface.class.getCanonicalName())) { if (classStr.equals(Webinterface.class.getCanonicalName())) {
try { try {
serviceTracker.open(); serviceTracker.open();
Webinterface webinterface = serviceTracker.waitForService(5000); webinterface = serviceTracker.waitForService(5000);
if (webinterface != null) { if (webinterface != null) {
webinterface.addMainMenuItem("mcsmanager", webinterface.addModule(module);
"Серверы", "/modules/mcsmanager");
return;
} else { } else {
logger.debug("service not found =("); logger.debug("service not found =(");
} }

View File

@@ -0,0 +1,44 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 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<String> getStylesheetsLinks() {
return Collections.emptyList();
}
@Override
public List<String> getJavaScriptLinks() {
return Collections.singletonList("/module/"+MODULE_NAME+"/module.js");
}
@Override
public Map<String, String> getMainMenuItems() {
return new HashMap<String, String>(){{
this.put("Серверы", "/module/"+MODULE_NAME);
}};
}
@Override
public void handle(HttpReqResp httpReqResp) {
}
}

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.14-SNAPSHOT' version = '0.15-SNAPSHOT'
buildscript { buildscript {
repositories { repositories {

View File

@@ -52,7 +52,7 @@ public class Activator implements BundleActivator {
@Override @Override
public Map<String, String> getMainMenuItems() { public Map<String, String> getMainMenuItems() {
return new HashMap<String, String>(){{ return new HashMap<String, String>(){{
this.put("Модули", "#"); this.put("Модули", "/modules");
}}; }};
} }

View File

@@ -0,0 +1,31 @@
/*
* DmitriyMX <mail@dmitriymx.ru>
* 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;
}
}
}

View File

@@ -4,23 +4,28 @@
*/ */
package asys.webinterface; package asys.webinterface;
import asys.webinterface.api.HttpReqResp;
import asys.webinterface.api.WebModule;
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpHandler;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*; import java.io.*;
import java.nio.charset.Charset; import java.nio.charset.Charset;
public class IndexHandler implements HttpHandler { public class IndexHandler implements HttpHandler {
private final Logger logger = LoggerFactory.getLogger(IndexHandler.class);
static final Charset defaultCharset = Charset.forName("UTF-8"); static final Charset defaultCharset = Charset.forName("UTF-8");
private String htmlTemplate; private String htmlTemplate;
private WebinterfaceImpl webinterface;
public IndexHandler(WebinterfaceImpl webinterface) { public IndexHandler(WebinterfaceImpl webinterface) {
try { try {
InputStream inputStream = getClass().getResourceAsStream("/index.html"); InputStream inputStream = getClass().getResourceAsStream("/index.html");
htmlTemplate = IOUtils.toString(inputStream, "UTF-8") htmlTemplate = IOUtils.toString(inputStream, "UTF-8");
.replace("<{moduleScript}>", webinterface.javascriptToTags("modules")) this.webinterface = webinterface;
.replace("<{moduleStylesheet}>", webinterface.stylesheetToTags("modules"));
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Error load htmlTemplate", e); throw new RuntimeException("Error load htmlTemplate", e);
} }
@@ -28,10 +33,32 @@ public class IndexHandler implements HttpHandler {
@Override @Override
public void handle(HttpExchange httpExchange) throws IOException { 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.getResponseHeaders().add("Context-Type","text/html;charset=utf-8");
httpExchange.sendResponseHeaders(200, htmlTemplate.length()); httpExchange.sendResponseHeaders(200, htmlTemplateBytes.length);
OutputStream responseBody = httpExchange.getResponseBody(); OutputStream responseBody = httpExchange.getResponseBody();
responseBody.write(htmlTemplate.getBytes(defaultCharset)); responseBody.write(htmlTemplateBytes);
responseBody.close(); responseBody.close();
} }
} }

View File

@@ -22,6 +22,11 @@ public class WebinterfaceImpl implements Webinterface {
webModules.remove(moduleName); webModules.remove(moduleName);
} }
@Override
public WebModule getModule(String moduleName) {
return webModules.get(moduleName);
}
public String mainMenuItemsToReactJS() { public String mainMenuItemsToReactJS() {
StringJoiner sj = new StringJoiner(","); StringJoiner sj = new StringJoiner(",");
@@ -37,10 +42,9 @@ public class WebinterfaceImpl implements Webinterface {
return sj.toString(); return sj.toString();
} }
public String javascriptToTags(String moduleName) { public String javascriptToTags(WebModule webModule) {
StringJoiner sj = new StringJoiner("\n"); StringJoiner sj = new StringJoiner("\n");
WebModule webModule = webModules.get(moduleName);
for (String link : webModule.getJavaScriptLinks()) { for (String link : webModule.getJavaScriptLinks()) {
sj.add(String.format("<script src=\"%s\"></script>", link)); sj.add(String.format("<script src=\"%s\"></script>", link));
} }
@@ -48,10 +52,9 @@ public class WebinterfaceImpl implements Webinterface {
return sj.toString(); return sj.toString();
} }
public String stylesheetToTags(String moduleName) { public String stylesheetToTags(WebModule webModule) {
StringJoiner sj = new StringJoiner("\n"); StringJoiner sj = new StringJoiner("\n");
WebModule webModule = webModules.get(moduleName);
for (String link : webModule.getJavaScriptLinks()) { for (String link : webModule.getJavaScriptLinks()) {
sj.add(String.format("<link rel=\"stylesheet\" href=\"%s\">", link)); sj.add(String.format("<link rel=\"stylesheet\" href=\"%s\">", link));
} }

View File

@@ -5,4 +5,5 @@
package asys.webinterface.api; package asys.webinterface.api;
public interface HttpReqResp { public interface HttpReqResp {
String[] getRequestURIParts();
} }

View File

@@ -7,4 +7,5 @@ package asys.webinterface.api;
public interface Webinterface { public interface Webinterface {
void addModule(WebModule webModule); void addModule(WebModule webModule);
void removeModule(String moduleName); void removeModule(String moduleName);
WebModule getModule(String moduleName);
} }