Работающий прототип расширения веб интерфейса
This commit is contained in:
@@ -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 =(");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
group = 'asys'
|
group = 'asys'
|
||||||
version = '0.14-SNAPSHOT'
|
version = '0.15-SNAPSHOT'
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
|
|||||||
@@ -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");
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,4 +5,5 @@
|
|||||||
package asys.webinterface.api;
|
package asys.webinterface.api;
|
||||||
|
|
||||||
public interface HttpReqResp {
|
public interface HttpReqResp {
|
||||||
|
String[] getRequestURIParts();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user