diff --git a/webinterface/build.gradle b/webinterface/build.gradle index 3767fe2..0acd41d 100644 --- a/webinterface/build.gradle +++ b/webinterface/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.10-SNAPSHOT' +version = '0.11-SNAPSHOT' buildscript { repositories { @@ -26,7 +26,8 @@ bundle { instructions << [ 'Bundle-Name': 'ASys Web interface', 'Bundle-Activator': 'asys.webinterface.Activator', - 'Import-Package': '*' + 'Import-Package': '*', + 'Export-Package': 'asys.webinterface.api' ] exclude group: 'com.google.code.gson' exclude group: 'commons-io' diff --git a/webinterface/src/main/java/asys/webinterface/Activator.java b/webinterface/src/main/java/asys/webinterface/Activator.java index 41a914a..90abc3f 100644 --- a/webinterface/src/main/java/asys/webinterface/Activator.java +++ b/webinterface/src/main/java/asys/webinterface/Activator.java @@ -4,20 +4,33 @@ */ package asys.webinterface; +import asys.webinterface.api.MainMenu; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Activator implements BundleActivator { + private final Logger logger = LoggerFactory.getLogger(Activator.class); + private ServiceRegistration serviceMainMenu; private WebServer webServer; @Override public void start(BundleContext context) throws Exception { - webServer = new WebServer(context); + MainMenuImpl mainMenu = new MainMenuImpl(); + mainMenu.addItem("Модули", "#"); + + logger.trace("Register service: {}", MainMenu.class); + serviceMainMenu = context.registerService(MainMenu.class, mainMenu, null); + + webServer = new WebServer(context, mainMenu); webServer.start(8778); } @Override public void stop(BundleContext context) throws Exception { webServer.stop(); + serviceMainMenu.unregister(); } } diff --git a/webinterface/src/main/java/asys/webinterface/AppJsHandler.java b/webinterface/src/main/java/asys/webinterface/AppJsHandler.java new file mode 100644 index 0000000..4e08d3a --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/AppJsHandler.java @@ -0,0 +1,39 @@ +/* + * DmitriyMX + * 2017-03-12 + */ +package asys.webinterface; + +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.IOException; +import java.io.OutputStream; + +public class AppJsHandler implements HttpHandler { + private final Logger logger = LoggerFactory.getLogger(AppJsHandler.class); + private String doneAppJs; + private int size; + + public AppJsHandler(MainMenuImpl mainMenu) { + try { + String appJs = IOUtils.toString(getClass().getResourceAsStream("/app.js"), "UTF-8"); + doneAppJs = appJs.replace("<{mainMenuItems}>", mainMenu.toReacJS()); + size = doneAppJs.getBytes(IndexHandler.defaultCharset).length; + } catch (IOException e) { + logger.error("app.js", e); + } + } + + @Override + public void handle(HttpExchange httpExchange) throws IOException { + httpExchange.getResponseHeaders().add("Context-Type","text/javascript;charset=utf-8"); + httpExchange.sendResponseHeaders(200, size); + OutputStream responseBody = httpExchange.getResponseBody(); + responseBody.write(doneAppJs.getBytes(IndexHandler.defaultCharset)); + responseBody.close(); + } +} diff --git a/webinterface/src/main/java/asys/webinterface/IndexHandler.java b/webinterface/src/main/java/asys/webinterface/IndexHandler.java index a003c5c..649a6ec 100644 --- a/webinterface/src/main/java/asys/webinterface/IndexHandler.java +++ b/webinterface/src/main/java/asys/webinterface/IndexHandler.java @@ -7,19 +7,15 @@ package asys.webinterface; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import org.apache.commons.io.IOUtils; -import org.osgi.framework.BundleContext; import java.io.*; import java.nio.charset.Charset; public class IndexHandler implements HttpHandler { - private static final Charset defaultCharset = Charset.forName("UTF-8"); - private BundleContext context; + static final Charset defaultCharset = Charset.forName("UTF-8"); private String htmlTemplate; - public IndexHandler(BundleContext context) { - this.context = context; - + public IndexHandler() { try { InputStream inputStream = getClass().getResourceAsStream("/index.html"); htmlTemplate = IOUtils.toString(inputStream, "UTF-8"); diff --git a/webinterface/src/main/java/asys/webinterface/MainMenuImpl.java b/webinterface/src/main/java/asys/webinterface/MainMenuImpl.java new file mode 100644 index 0000000..b491f64 --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/MainMenuImpl.java @@ -0,0 +1,38 @@ +/* + * DmitriyMX + * 2017-03-11 + */ +package asys.webinterface; + +import asys.webinterface.api.MainMenu; + +import java.util.HashMap; +import java.util.Map; +import java.util.StringJoiner; + +public class MainMenuImpl implements MainMenu { + private Map items = new HashMap<>(); + + @Override + public void addItem(String title, String href) { + items.put(title, href); + } + + public String toReacJS() { + StringJoiner sj = new StringJoiner(","); + for(Map.Entry entry : items.entrySet()) { + sj.add(String.format( + "ce(MainMenuItem, {title: '%s', href: '%s'})", + entry.getKey().replace("'","\\'"), entry.getValue().replace("'","\\'") + )); + } + return sj.toString(); + } + + @Override + public String toString() { + return "MainMenuImpl{" + + "items=" + items + + '}'; + } +} diff --git a/webinterface/src/main/java/asys/webinterface/WebServer.java b/webinterface/src/main/java/asys/webinterface/WebServer.java index 5f77bdb..632196c 100644 --- a/webinterface/src/main/java/asys/webinterface/WebServer.java +++ b/webinterface/src/main/java/asys/webinterface/WebServer.java @@ -13,14 +13,17 @@ import java.net.InetSocketAddress; public class WebServer { private HttpServer server; private BundleContext context; + private MainMenuImpl mainMenu; - public WebServer(BundleContext context) { + public WebServer(BundleContext context, MainMenuImpl mainMenu) { this.context = context; + this.mainMenu = mainMenu; } public void start(int port) throws IOException { server = HttpServer.create(new InetSocketAddress(port), 0); - server.createContext("/", new IndexHandler(context)); + server.createContext("/", new IndexHandler()); + server.createContext("/app.js", new AppJsHandler(mainMenu)); server.createContext("/static", new StaticHandler()); server.createContext("/ajax", new AjaxHandler(context)); server.start(); diff --git a/webinterface/src/main/java/asys/webinterface/api/MainMenu.java b/webinterface/src/main/java/asys/webinterface/api/MainMenu.java new file mode 100644 index 0000000..2437efe --- /dev/null +++ b/webinterface/src/main/java/asys/webinterface/api/MainMenu.java @@ -0,0 +1,9 @@ +/* + * DmitriyMX + * 2017-03-11 + */ +package asys.webinterface.api; + +public interface MainMenu { + void addItem(String title, String href); +} diff --git a/webinterface/src/main/resources/static/app.js b/webinterface/src/main/resources/app.js similarity index 96% rename from webinterface/src/main/resources/static/app.js rename to webinterface/src/main/resources/app.js index 4447e84..0e93bc3 100644 --- a/webinterface/src/main/resources/static/app.js +++ b/webinterface/src/main/resources/app.js @@ -34,7 +34,7 @@ var App = React.createClass({ } else { return (ce('div', null, - ce(Navbar), + ce(Navbar, {items: [<{mainMenuItems}>]}), ce('div', {className: 'container', style: {marginTop: '60px'}}, ce(Panel, {title: 'Модули'}, ce(BundleTable, null, this.tableRows) diff --git a/webinterface/src/main/resources/index.html b/webinterface/src/main/resources/index.html index 838b494..a15b91e 100644 --- a/webinterface/src/main/resources/index.html +++ b/webinterface/src/main/resources/index.html @@ -15,7 +15,7 @@ - +