diff --git a/SkyScanner.cs b/SkyScanner.cs
index 775e353..ba84cd6 100644
--- a/SkyScanner.cs
+++ b/SkyScanner.cs
@@ -4,6 +4,7 @@ using ln.http;
using System.Net;
using ln.skyscanner.http;
using System.IO;
+using ln.skyscanner.crawl;
namespace ln.skyscanner
{
public enum ComponentState { STOPPED, INITIALIZED, STARTED, FAILED }
@@ -15,6 +16,7 @@ namespace ln.skyscanner
public HTTPServer HTTPServer { get; private set; }
+ public Crawler Crawler { get; private set; }
public SkyScanner(String[] args)
{
@@ -85,6 +87,23 @@ namespace ln.skyscanner
}
+ /** Crawler **/
+
+ public ComponentState CrawlerStatus
+ {
+ get
+ {
+ if (Crawler != null)
+ {
+ if (Crawler.ThreadStates.Length > 0)
+ {
+ return ComponentState.STARTED;
+ }
+ return ComponentState.INITIALIZED;
+ }
+ return ComponentState.STOPPED;
+ }
+ }
}
diff --git a/http/SkyScannerHttpApi.cs b/http/SkyScannerHttpApi.cs
index 5788f7b..2113317 100644
--- a/http/SkyScannerHttpApi.cs
+++ b/http/SkyScannerHttpApi.cs
@@ -14,7 +14,7 @@ namespace ln.skyscanner.http
{
SkyScanner = skyScannerHttpApplication.SkyScanner;
- TemplateResource statistics = new TemplateResource(this, System.IO.Path.Combine(SkyScanner.BasePath,"templates","statistics.html"), SkyScanner);
+ SkyScannerHttpManagement management = new SkyScannerHttpManagement(this,SkyScanner);
}
diff --git a/http/SkyScannerHttpManagement.cs b/http/SkyScannerHttpManagement.cs
new file mode 100644
index 0000000..3b50eee
--- /dev/null
+++ b/http/SkyScannerHttpManagement.cs
@@ -0,0 +1,80 @@
+// /**
+// * File: SkyScannerHttpManagement.cs
+// * Author: haraldwolff
+// *
+// * This file and it's content is copyrighted by the Author and / or copyright holder.
+// * Any use wihtout proper permission is illegal and may lead to legal actions.
+// *
+// *
+// **/
+using System;
+using ln.http.resources;
+using ln.logging;
+using System.Threading;
+namespace ln.skyscanner.http
+{
+ public class SkyScannerHttpManagement : JsonCallResource
+ {
+ public SkyScanner SkyScanner { get; }
+
+ public SkyScannerHttpManagement(Resource container,SkyScanner skyScanner)
+ : base(container, "management")
+ {
+ SkyScanner = skyScanner;
+ }
+ public SkyScannerHttpManagement(Resource container, string name, SkyScanner skyScanner)
+ : base(container, name)
+ {
+ SkyScanner = skyScanner;
+ }
+
+ [Callable]
+ public SkyScannerStatistics GetStatistics()
+ {
+ SkyScannerStatistics statistics = new SkyScannerStatistics(SkyScanner);
+ return statistics;
+ }
+
+ [Callable]
+ public void StartCrawler()
+ {
+ Logging.Log(LogLevel.INFO, "Management: StartCrawler() called");
+ }
+
+ [Callable]
+ public void Shutdown()
+ {
+ Thread thread = new Thread(()=>SkyScanner.Stop());
+ thread.Start();
+ }
+
+
+
+
+ public class SkyScannerStatistics
+ {
+ public SkyScannerState States;
+
+ public SkyScannerStatistics(SkyScanner skyScanner)
+ {
+ States.HttpServer = skyScanner.HttpStatus;
+ States.Crawler = skyScanner.CrawlerStatus;
+
+ States.Checks = ComponentState.STOPPED;
+ States.Dispatcher = ComponentState.STOPPED;
+
+
+ States.Manager = ComponentState.STARTED;
+ }
+
+ }
+ public struct SkyScannerState
+ {
+ public ComponentState HttpServer;
+ public ComponentState Crawler;
+ public ComponentState Manager;
+ public ComponentState Checks;
+ public ComponentState Dispatcher;
+ }
+ }
+}
diff --git a/ln.skyscanner.csproj b/ln.skyscanner.csproj
index bbba2dd..2c241e1 100644
--- a/ln.skyscanner.csproj
+++ b/ln.skyscanner.csproj
@@ -50,6 +50,7 @@
+
@@ -62,10 +63,10 @@
PreserveNewest
-
+
PreserveNewest
-
+
PreserveNewest
diff --git a/templates/static/frame.html b/templates/static/frame.html
index c288f11..0cdc62d 100644
--- a/templates/static/frame.html
+++ b/templates/static/frame.html
@@ -6,8 +6,9 @@
+
-
+
+
diff --git a/templates/static/index.html b/templates/static/index.html
index 0ef800d..308ce76 100644
--- a/templates/static/index.html
+++ b/templates/static/index.html
@@ -1,3 +1,5 @@
<%frame "frame.html"%>
-SkyScanner
+
+
+
diff --git a/templates/static/interface.js b/templates/static/interface.js
index c2242d2..218cdb1 100644
--- a/templates/static/interface.js
+++ b/templates/static/interface.js
@@ -2,18 +2,109 @@
function API(baseurl){
-}
+ this.baseurl = baseurl;
+
+ this.get = function(page, handler = null){
+ var x = new XMLHttpRequest();
+ var async = (handler != null);
+
+ if (async)
+ {
+ x.onload = function(){
+ var responseText = x.responseText;
+ handler( responseText );
+ }
+ }
+ x.open("GET", this.baseurl + page, async);
+ x.send();
+
+ if (!async)
+ return x.responseText
+ }
+ this.post = function(page, handler = null){
+ var x = new XMLHttpRequest();
+ if (handler != null)
+ {
+ x.onload = function(){
+ var responseText = x.responseText;
+ handler( responseText );
+ }
+ }
+ x.open("POST", this.baseurl + page);
+ x.send();
+ }
+
+ this.getJson = function(page, handler){
+ var j = function(t){
+ handler(JSON.parse(t));
+ };
+ return this.get( page, j );
+ }
+
+ this.call = function(endpoint,method,parameters = []){
+ var x = new XMLHttpRequest();
+ x.open("POST", this.baseurl + endpoint, false);
+ x.setRequestHeader("content-type","application/json");
+
+ var methodCall = {
+ "MethodName": method,
+ "Parameters": parameters
+ }
+
+ x.send(JSON.stringify(methodCall));
+
+ var result = JSON.parse(x.responseText);
+ if (result.Exception != null)
+ throw result.Exception;
-
-
-api = API("<%=request.self()%>");
-
-
-function loadStatistics()
-{
+ return result.Result;
+ }
}
+function $(id)
+{
+ return document.getElementById(id);
+}
+function CE(eName)
+{
+ return document.createElement(eName);
+}
+
+
+var api = null;
+
+function loadStatistics()
+{
+ try
+ {
+ var stats = api.call("api/management","GetStatistics");
+
+ $("indHttpServer").attributes["state"].value = stats.States.HttpServer;
+ $("indManager").attributes["state"].value = stats.States.Manager;
+ $("indCrawler").attributes["state"].value = stats.States.Crawler;
+ $("indChecks").attributes["state"].value = stats.States.Checks;
+ $("indDispatcher").attributes["state"].value = stats.States.Dispatcher;
+
+ } catch (e)
+ {
+ $("indHttpServer").attributes["state"].value = 3;
+ $("indManager").attributes["state"].value = 0;
+ $("indCrawler").attributes["state"].value = 0;
+ $("indChecks").attributes["state"].value = 0;
+ $("indDispatcher").attributes["state"].value = 0;
+ }
+}
+
+
+function initApi(baseurl)
+{
+ api = new API(baseurl);
+ setInterval( loadStatistics, 1000 );
+
+ log("API initialized");
+}
+
diff --git a/templates/static/style.css b/templates/static/style.css
index 826efd0..29b5b5c 100644
--- a/templates/static/style.css
+++ b/templates/static/style.css
@@ -4,6 +4,18 @@
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
+
+ display: block;
+ position: absolute;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+}
+
+a {
+ text-decoration: none;
+ color: inherit;
}
#header {
@@ -43,7 +55,7 @@
}
.indicator > div {
border-radius: 50%;
- background-color: red;
+ background-color: #404040;
display: inline-block;
width: 11px;
height: 11px;
@@ -52,6 +64,71 @@
margin-right: 4px;
}
- .indicator[state=STARTED] > div {
- background-color: #00D000;
- }
+.indicator[state="1"] > div {
+ background-color: #C0C000;
+}
+.indicator[state="2"] > div {
+ background-color: #00D000;
+}
+.indicator[state="3"] > div {
+ background-color: #D00000;
+}
+
+#footer {
+ position: absolute;
+ display: block;
+
+ bottom: 0px;
+ height: 32px;
+ left: 0px;
+ right: 0px;
+
+
+ background-color: #c7def5;
+ padding: 6px;
+ padding-left: 24px;
+}
+
+#nav {
+ display: block;
+ left: 0px;
+ right: 0px;
+
+ text-align: center;
+ padding: 6px;
+}
+
+#nav > div {
+}
+
+#nav > div > div {
+ display: inline-block;
+
+ width: 160px;
+
+
+ border: 1px solid black;
+ padding: 4px;
+
+ margin-left: 32px;
+ margin-right: 32px;
+
+
+ border-radius: 3px;
+}
+
+#content {
+ display: block;
+ position: absolute;
+
+ top: 80px;
+ bottom: 32px;
+ left: 0px;
+ right: 0px;
+
+ background-color: #F0F0D0;
+}
+
+#workspace {
+}
+
diff --git a/templates/static/workspace.js b/templates/static/workspace.js
new file mode 100644
index 0000000..b01f5a1
--- /dev/null
+++ b/templates/static/workspace.js
@@ -0,0 +1,26 @@
+
+function Workspace()
+{
+ this.desktop = $("workspace");
+
+ this.loadPanel = function(title,page){
+ var content = api.get(page);
+ this.createPanel(title,content);
+ }
+
+ this.createPanel = function(title,content){
+ var divFrame = CE("div");
+ var divTitle = CE("div");
+ var divPanel = CE("DIV");
+
+ divFrame.appendChild(divTitle);
+ divFrame.appendChild(divPanel);
+
+ divTitle.innerText = title;
+ divPanel.innerText = content;
+
+ this.desktop.appendChild(divFrame);
+ }
+}
+
+var workspace = null;
diff --git a/templates/statistics.html b/templates/statistics.html
deleted file mode 100644
index 248f790..0000000
--- a/templates/statistics.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<%=response.SetHeader("Content-Type","application/json")%>
-{
- "ComponentState": {
- "HttpServer": "<%=this.HttpStatus%>"
- }
-}