public WikiBootstrapper(ServerConfig config, bool enableDiagnostics = false, string diagnosticsPassword = "") : base() { this.config = config; this.enableDiagnostics = enableDiagnostics; this.diagnosticsPassword = diagnosticsPassword; }
public ServerStartup(ServerConfig config, bool enableDiagnostics = false, string diagnosticsPassword = "") { serverConfig = config; sites = new Dictionary<string, WikiSite>(); // TODO: Investigate event ordering if these two schedulers are in fact the same (slow handling seems to cause notifications out of order) notificationScheduler = new EventLoopScheduler(threadStart => new Thread(threadStart) { Name = "NotificationScheduler" }); modelSyncScheduler = new EventLoopScheduler(threadStart => new Thread(threadStart) { Name = "ModelSyncScheduler" }); foreach (var wikiConfig in config.AllConfig) { // get the relevant repositories MasterRepository masterRepository; IPageCache pageCache; if (serverConfig.TryGetMasterRepository(wikiConfig.SiteName, out masterRepository) && serverConfig.TryGetPageCache(wikiConfig.SiteName, out pageCache)) { var sourceWatcher = new SourceWatcher(wikiConfig.RootSourcePath, wikiConfig.Convertor.FileSearchString); // create site var site = new WikiSite(wikiConfig, masterRepository, sourceWatcher, pageCache); // subscribe to all the sites events for notification purposes EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "PageAdded", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "PageUpdated", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "PageDeleted", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "PageMoved", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "DirectoryAdded", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "DirectoryUpdated", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "DirectoryDeleted", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); EventHelper.SubscribeToWikiEvent<WikiSiteEventArgs>(site, "DirectoryMoved", notificationScheduler, (args) => HandleEvent(site.Name, args.WikiUrl)); // store sites[wikiConfig.SiteName] = site; } } WikiBootstrapper bootstrapper = new WikiBootstrapper(config, enableDiagnostics, diagnosticsPassword); nancyHost = new NancyHost(new Uri("http://localhost:8070/"), bootstrapper); signalrHost = new Server("http://localhost:8071/"); }
static void StartUp(string[] args) { Thread.CurrentThread.Name = "Main"; string coreDirectory = "D:\\ickletest"; File.WriteAllText(Path.Combine(coreDirectory, "index.md"), "Hello World"); Directory.CreateDirectory(Path.Combine(coreDirectory, "subdir")); // reference the bootstrapper (and turn on diagnostics) ServerConfig serverConfig = new ServerConfig( new List<Tuple<WikiConfig, IPageCache>>() { new Tuple<WikiConfig, IPageCache>( new WikiConfig() { SiteName = "Tester", RootSourcePath = PathHelper.GetFullPath(coreDirectory), RootWikiPath = PathHelper.GetFullPath(coreDirectory, "wiki"), Convertor = new Convertor(new MarkdownSharpDialogue()) }, new PageCache() ) }); // add filters foreach (var config in serverConfig.AllConfig) { config.Convertor.PostConvertors.Add(new MarkdownLinkPostFilter()); } // basic startup pattern taken from: // https://github.com/loudej/owin-samples/blob/master/src/ConsoleNancySignalR/Program.cs // TODO: All this Gate/Owin stuff seems to be up in the air so this code needs reviewing // at some point startup = new ServerStartup(serverConfig, true, "password"); // this program's Startup.cs class startup.Start(); Thread.Sleep(100); // add another page File.WriteAllText(Path.Combine(coreDirectory, "firstFile.md"), "Hello Again"); // and another File.WriteAllText(Path.Combine(coreDirectory, "subdir", "index.md"), "Hello World Sub Directory"); // then delete one File.Delete(Path.Combine(coreDirectory, "index.md")); }
public WikiModule(ServerConfig serverConfig) : base("/wiki") { config = serverConfig; fileReader = new FileReader(FileReaderPolicy.LimitedBlock, 500); // add top level "site" route Get["/{site}"] = parameters => { WikiConfig wikiConfig = null; MasterRepository masterRepository = null; if (config.TryGetConfig(parameters["site"], out wikiConfig) && config.TryGetMasterRepository(parameters["site"], out masterRepository)) { // TODO: Async-ify this var pageResults = masterRepository.GetAvailableAssets().Result; SiteModel model = new SiteModel() { IsPartialView = Request.Query.isPartial, WikiUrl = "/", SiteMap = pageResults }; Context.ViewBag.SiteName = wikiConfig.SiteName; return(View["Site.cshtml", model]); } else { return(HttpStatusCode.NotFound); } }; // add "directory" route, subpath should not contain a "." or a "/" Get[@"/{site}/(?<directory>[^\.]*)"] = parameters => { WikiConfig wikiConfig; if (config.TryGetConfig(parameters["site"], out wikiConfig) && Directory.Exists(Path.Combine(wikiConfig.RootWikiPath, parameters["directory"]))) { DirectoryModel model = new DirectoryModel() { IsPartialView = Request.Query.isPartial, WikiUrl = parameters["directory"], }; Context.ViewBag.SiteName = wikiConfig.SiteName; return(View["Directory.cshtml", model]); } else { return(HttpStatusCode.NotFound); } }; // add "page" route, subpath should always have a file extension (and therefore at least one ".") Get[@"/{site}/(?<page>.*\..*)"] = parameters => { WikiConfig wikiConfig = null; MasterRepository masterRepository = null; if (config.TryGetConfig(parameters["site"], out wikiConfig) && config.TryGetMasterRepository(parameters["site"], out masterRepository)) { // Async-ify var results = masterRepository.GetPageByWikiUrl(parameters["page"]).Result; if (results.Item1) { var results2 = TryGetPageContents(parameters["site"], results.Item2); if (results2.Item1) { PageModel model = new PageModel() { IsPartialView = Request.Query.isPartial, WikiUrl = parameters["page"], Contents = results2.Item2 }; Context.ViewBag.SiteName = wikiConfig.SiteName; return(View["Page.cshtml", model]); } else { // TODO: If the file doesn't exist we could potentially remove it from the cache return(HttpStatusCode.NotFound); } } else { // TODO: If the file doesn't exist we could potentially remove it from the cache return(HttpStatusCode.NotFound); } } else { return(HttpStatusCode.NotFound); } }; }
public WikiModule(ServerConfig serverConfig) : base("/wiki") { config = serverConfig; fileReader = new FileReader(FileReaderPolicy.LimitedBlock, 500); // add top level "site" route Get["/{site}"] = parameters => { WikiConfig wikiConfig = null; MasterRepository masterRepository = null; if (config.TryGetConfig(parameters["site"], out wikiConfig) && config.TryGetMasterRepository(parameters["site"], out masterRepository)) { // TODO: Async-ify this var pageResults = masterRepository.GetAvailableAssets().Result; SiteModel model = new SiteModel() { IsPartialView = Request.Query.isPartial, WikiUrl = "/", SiteMap = pageResults }; Context.ViewBag.SiteName = wikiConfig.SiteName; return View["Site.cshtml", model]; } else { return HttpStatusCode.NotFound; } }; // add "directory" route, subpath should not contain a "." or a "/" Get[@"/{site}/(?<directory>[^\.]*)"] = parameters => { WikiConfig wikiConfig; if (config.TryGetConfig(parameters["site"], out wikiConfig) && Directory.Exists(Path.Combine(wikiConfig.RootWikiPath, parameters["directory"]))) { DirectoryModel model = new DirectoryModel() { IsPartialView = Request.Query.isPartial, WikiUrl = parameters["directory"], }; Context.ViewBag.SiteName = wikiConfig.SiteName; return View["Directory.cshtml", model]; } else { return HttpStatusCode.NotFound; } }; // add "page" route, subpath should always have a file extension (and therefore at least one ".") Get[@"/{site}/(?<page>.*\..*)"] = parameters => { WikiConfig wikiConfig = null; MasterRepository masterRepository = null; if (config.TryGetConfig(parameters["site"], out wikiConfig) && config.TryGetMasterRepository(parameters["site"], out masterRepository)) { // Async-ify var results = masterRepository.GetPageByWikiUrl(parameters["page"]).Result; if (results.Item1) { var results2 = TryGetPageContents(parameters["site"], results.Item2); if (results2.Item1) { PageModel model = new PageModel() { IsPartialView = Request.Query.isPartial, WikiUrl = parameters["page"], Contents = results2.Item2 }; Context.ViewBag.SiteName = wikiConfig.SiteName; return View["Page.cshtml", model]; } else { // TODO: If the file doesn't exist we could potentially remove it from the cache return HttpStatusCode.NotFound; } } else { // TODO: If the file doesn't exist we could potentially remove it from the cache return HttpStatusCode.NotFound; } } else { return HttpStatusCode.NotFound; } }; }