using System; using ln.logging; using ln.http; using System.Net; using ln.skyscanner.http; using System.IO; using ln.skyscanner.crawl; using ln.types.threads; using System.Threading; using sharp.logging; using Newtonsoft.Json; using Newtonsoft.Json.Converters; namespace ln.skyscanner { [JsonConverter(typeof(StringEnumConverter))] public enum ComponentState { STOPPED, INITIALIZED, STARTED, FAILED, STOPPING } public class SkyScanner { public String[] Arguments { get; } public String BasePath { get; private set; } public Pool ConveniencePool { get; } public HTTPServer HTTPServer { get; private set; } public Crawler Crawler { get; private set; } public MemoryLogger MemoryLogger { get; private set; } public SkyScanner(String[] args) { MemoryLogger = new MemoryLogger(1024); Logger.Default.Backends.Add(MemoryLogger); Logging.Log(LogLevel.INFO, "SkyScanner: Constructor"); BasePath = Path.GetFullPath("."); Logging.Log(LogLevel.INFO, "SkyScanner: BasePath={0}", BasePath); ConveniencePool = new Pool(); Arguments = args; } public void Start() { Logging.Log(LogLevel.INFO, "SkyScanner: Start()"); StartHttpServer(); StartCrawler(); lock (this) { Monitor.Wait(this); } } public void Stop() { Logging.Log(LogLevel.INFO, "SkyScanner: Stop()"); StopCrawler(); new Thread(() => ConveniencePool.Close()).Start(); StopHttpServer(); lock (this) { Monitor.Pulse(this); } } /** HTTP Server **/ public ComponentState HttpStatus { get { if (HTTPServer != null) { if (HTTPServer.IsRunning) return ComponentState.STARTED; return ComponentState.INITIALIZED; } return ComponentState.STOPPED; } } public void StartHttpServer() { HTTPServer = new HTTPServer(); HTTPServer.AddEndpoint(new System.Net.IPEndPoint(IPAddress.Any,8080)); HTTPServer.DefaultApplication = new SkyScannerHttpApplication(this); HTTPServer.Start(); } public void StopHttpServer() { if (HTTPServer != null) { if (HTTPServer.IsRunning) { HTTPServer.Stop(); } } } /** Crawler **/ public ComponentState CrawlerStatus { get { if (Crawler != null) { return Crawler.CrawlerState; } return ComponentState.STOPPED; } } public void StartCrawler() { if (Crawler == null) { Crawler = new Crawler(this); } else { Crawler.Start(); } } public void StopCrawler() { if (Crawler != null) { Crawler.Stop(); } } } }