#region License Information /* HeuristicLab * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Reflection; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.Dispatcher; namespace HeuristicLab.Services.WebApp.Controllers { public class WebAppHttpControllerSelector : DefaultHttpControllerSelector { private readonly HttpConfiguration configuration; private readonly IDictionary controllers; private readonly PluginManager pluginManager = PluginManager.Instance; public WebAppHttpControllerSelector(HttpConfiguration configuration) : base(configuration) { this.configuration = configuration; controllers = new ConcurrentDictionary(); LoadAppControllers(); } private void LoadAppControllers() { var assembly = Assembly.GetExecutingAssembly(); var assemblyTypes = assembly.GetTypes(); var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList(); foreach (var apiController in apiControllers) { var apiControllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower(); controllers.Add(apiControllerName, new HttpControllerDescriptor(configuration, apiControllerName, apiController)); } } public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { if (request == null) { throw new ArgumentNullException("request"); } var parts = request.RequestUri.AbsolutePath.Split('/'); int startIndex = parts.TakeWhile(part => part.ToLower() != "api").Count(); if (parts.Length < startIndex + 2) { throw new ArgumentException("invalid request path"); } string pluginName = parts[startIndex + 1].ToLower(); string controllerName = parts[startIndex + 2].ToLower(); // load controller if (pluginName == "app") { // from main app HttpControllerDescriptor controller; controllers.TryGetValue(controllerName, out controller); return controller; } // from plugin var plugin = pluginManager.GetPlugin(pluginName); if (plugin == null) { throw new ArgumentException(string.Format("invalid plugin '{0}'", pluginName)); } return plugin.GetController(controllerName); } } }