Archived
0

Расширение API от веб интерфейса

This commit is contained in:
2017-03-12 20:54:56 +03:00
parent dbcf9c9894
commit e96ffbc568
12 changed files with 159 additions and 72 deletions

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.1-SNAPSHOT' version = '0.2-SNAPSHOT'
apply plugin: 'osgi' apply plugin: 'osgi'

View File

@@ -4,7 +4,7 @@
*/ */
package asys.mcsmanager; package asys.mcsmanager;
import asys.webinterface.api.MainMenu; import asys.webinterface.api.Webinterface;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceEvent;
@@ -15,15 +15,15 @@ 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<?, MainMenu> serviceTracker; private ServiceTracker<?, Webinterface> serviceTracker;
@Override @Override
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
logger.debug("Register service listener"); logger.debug("Register service listener");
context.addServiceListener(this); context.addServiceListener(this);
logger.debug("Get service: {}", MainMenu.class); logger.debug("Get service: {}", Webinterface.class);
serviceTracker = new ServiceTracker<>(context, MainMenu.class, null); serviceTracker = new ServiceTracker<>(context, Webinterface.class, null);
} }
@Override @Override
@@ -37,12 +37,13 @@ public class Activator implements BundleActivator, ServiceListener {
if (event.getType() == ServiceEvent.REGISTERED) { if (event.getType() == ServiceEvent.REGISTERED) {
String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass"); String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass");
for (String classStr : objectClass) { for (String classStr : objectClass) {
if (classStr.equals("asys.webinterface.api.MainMenu")) { if (classStr.equals(Webinterface.class.getCanonicalName())) {
try { try {
serviceTracker.open(); serviceTracker.open();
MainMenu mainMenu = serviceTracker.waitForService(5000); Webinterface webinterface = serviceTracker.waitForService(5000);
if (mainMenu != null) { if (webinterface != null) {
mainMenu.addItem("Серверы", "/modules/mcsmanager"); webinterface.addMainMenuItem("mcsmanager",
"Серверы", "/modules/mcsmanager");
return; return;
} else { } else {
logger.debug("service not found =("); logger.debug("service not found =(");

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.12-SNAPSHOT' version = '0.13-SNAPSHOT'
buildscript { buildscript {
repositories { repositories {

View File

@@ -4,7 +4,7 @@
*/ */
package asys.webinterface; package asys.webinterface;
import asys.webinterface.api.MainMenu; import asys.webinterface.api.Webinterface;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration; import org.osgi.framework.ServiceRegistration;
@@ -18,13 +18,14 @@ public class Activator implements BundleActivator {
@Override @Override
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
MainMenuImpl mainMenu = new MainMenuImpl(); WebinterfaceImpl webinterface = new WebinterfaceImpl();
mainMenu.addItem("Модули", "#"); webinterface.addMainMenuItem("modules", "Модули", "#");
webinterface.addJavascript("modules", "/static/module.js");
logger.trace("Register service: {}", MainMenu.class); logger.trace("Register service: {}", Webinterface.class);
serviceMainMenu = context.registerService(MainMenu.class, mainMenu, null); serviceMainMenu = context.registerService(Webinterface.class, webinterface, null);
webServer = new WebServer(context, mainMenu); webServer = new WebServer(context, webinterface);
webServer.start(8778); webServer.start(8778);
} }

View File

@@ -18,10 +18,10 @@ public class AppJsHandler implements HttpHandler {
private String doneAppJs; private String doneAppJs;
private int size; private int size;
public AppJsHandler(MainMenuImpl mainMenu) { public AppJsHandler(WebinterfaceImpl webinterface) {
try { try {
String appJs = IOUtils.toString(getClass().getResourceAsStream("/app.js"), "UTF-8"); String appJs = IOUtils.toString(getClass().getResourceAsStream("/app.js"), "UTF-8");
doneAppJs = appJs.replace("<{mainMenuItems}>", mainMenu.toReacJS()); doneAppJs = appJs.replace("<{mainMenuItems}>", webinterface.mainMenuItemsToReactJS());
size = doneAppJs.getBytes(IndexHandler.defaultCharset).length; size = doneAppJs.getBytes(IndexHandler.defaultCharset).length;
} catch (IOException e) { } catch (IOException e) {
logger.error("app.js", e); logger.error("app.js", e);

View File

@@ -15,11 +15,12 @@ public class IndexHandler implements HttpHandler {
static final Charset defaultCharset = Charset.forName("UTF-8"); static final Charset defaultCharset = Charset.forName("UTF-8");
private String htmlTemplate; private String htmlTemplate;
public IndexHandler() { 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}>", "<script src=\"/static/module.js\"></script>"); .replace("<{moduleScript}>", webinterface.javascriptToTags())
.replace("<{moduleStylesheet}>", webinterface.stylesheetToTags());
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Error load htmlTemplate", e); throw new RuntimeException("Error load htmlTemplate", e);
} }

View File

@@ -1,38 +0,0 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 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<String, String> 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<String, String> 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 +
'}';
}
}

View File

@@ -13,17 +13,17 @@ import java.net.InetSocketAddress;
public class WebServer { public class WebServer {
private HttpServer server; private HttpServer server;
private BundleContext context; private BundleContext context;
private MainMenuImpl mainMenu; private WebinterfaceImpl webinterface;
public WebServer(BundleContext context, MainMenuImpl mainMenu) { public WebServer(BundleContext context, WebinterfaceImpl webinterface) {
this.context = context; this.context = context;
this.mainMenu = mainMenu; this.webinterface = webinterface;
} }
public void start(int port) throws IOException { public void start(int port) throws IOException {
server = HttpServer.create(new InetSocketAddress(port), 0); server = HttpServer.create(new InetSocketAddress(port), 0);
server.createContext("/", new IndexHandler()); server.createContext("/", new IndexHandler(webinterface));
server.createContext("/app.js", new AppJsHandler(mainMenu)); server.createContext("/app.js", new AppJsHandler(webinterface));
server.createContext("/static", new StaticHandler()); server.createContext("/static", new StaticHandler());
server.createContext("/ajax", new AjaxHandler(context)); server.createContext("/ajax", new AjaxHandler(context));
server.start(); server.start();

View File

@@ -0,0 +1,114 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-03-12
*/
package asys.webinterface;
import asys.webinterface.api.Webinterface;
import java.util.*;
public class WebinterfaceImpl implements Webinterface {
// moduleName, links
private Map<String, List<String>> javascripts = new HashMap<>();
private Map<String, List<String>> stylesheets = new HashMap<>();
private Map<String, List<MainMenuItem>> menuItems = new HashMap<>();
public class MainMenuItem {
public String title, link;
public MainMenuItem(String title, String link) {
this.title = title;
this.link = link;
}
}
@Override
public void addJavascript(String moduleName, String link) {
List<String> 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<String> 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<MainMenuItem> 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 String mainMenuItemsToReactJS() {
StringJoiner sj = new StringJoiner(",");
for(List<MainMenuItem> listItems : menuItems.values()) {
for (MainMenuItem item : listItems) {
sj.add(String.format(
"ce(MainMenuItem, {title: '%s', href: '%s'})",
item.title.replace("'","\\'"), item.link.replace("'","\\'")
));
}
}
return sj.toString();
}
public String javascriptToTags() {
StringJoiner sj = new StringJoiner("\n");
for (List<String> items : javascripts.values()) {
for (String link : items) {
sj.add(String.format("<script src=\"%s\"></script>", link));
}
}
return sj.toString();
}
public String stylesheetToTags() {
StringJoiner sj = new StringJoiner("\n");
for (List<String> items : javascripts.values()) {
for (String link : items) {
sj.add(String.format("<link rel=\"stylesheet\" href=\"%s\">", link));
}
}
return sj.toString();
}
}

View File

@@ -1,9 +0,0 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-03-11
*/
package asys.webinterface.api;
public interface MainMenu {
void addItem(String title, String href);
}

View File

@@ -0,0 +1,16 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-03-12
*/
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);
}

View File

@@ -9,6 +9,7 @@
background: url('/static/background.png') fixed; background: url('/static/background.png') fixed;
} }
</style> </style>
<{moduleStylesheet}>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.min.js"></script>