diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index ac2fbff..e47d0fc 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -181,9 +181,14 @@ }) get("/admin/plugins")(adminOnly { - html.plugins(PluginRegistry().getPlugins()) + html.plugins(PluginRegistry().getPlugins(), flash.get("info")) }) + post("/admin/plugins/_reload")(adminOnly { + PluginRegistry.reload(request.getServletContext(), loadSystemSettings(), request2Session(request).conn) + flash += "info" -> "All plugins are reloaded." + redirect("/admin/plugins") + }) get("/admin/users")(adminOnly { val includeRemoved = params.get("includeRemoved").map(_.toBoolean).getOrElse(false) diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala index 7ba1026..76c3602 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala @@ -155,7 +155,7 @@ private val logger = LoggerFactory.getLogger(classOf[PluginRegistry]) - private val instance = new PluginRegistry() + private var instance = new PluginRegistry() /** * Returns the PluginRegistry singleton instance. @@ -163,9 +163,18 @@ def apply(): PluginRegistry = instance /** + * Reload all plugins. + */ + def reload(context: ServletContext, settings: SystemSettings, conn: java.sql.Connection): Unit = synchronized { + shutdown(context, settings) + instance = new PluginRegistry() + initialize(context, settings, conn) + } + + /** * Initializes all installed plugins. */ - def initialize(context: ServletContext, settings: SystemSettings, conn: java.sql.Connection): Unit = { + def initialize(context: ServletContext, settings: SystemSettings, conn: java.sql.Connection): Unit = synchronized { val pluginDir = new File(PluginHome) val manager = new JDBCVersionManager(conn) @@ -207,7 +216,7 @@ } } - def shutdown(context: ServletContext, settings: SystemSettings): Unit = { + def shutdown(context: ServletContext, settings: SystemSettings): Unit = synchronized { instance.getPlugins().foreach { pluginInfo => try { pluginInfo.pluginClass.shutdown(instance, context, settings) @@ -219,7 +228,6 @@ } } - } case class Link(id: String, label: String, path: String, icon: Option[String] = None) diff --git a/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala b/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala index 95060f0..442841b 100644 --- a/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/PluginControllerFilter.scala @@ -7,10 +7,10 @@ class PluginControllerFilter extends Filter { + private var filterConfig: FilterConfig = null + override def init(filterConfig: FilterConfig): Unit = { - PluginRegistry().getControllers().foreach { case (controller, _) => - controller.init(filterConfig) - } + this.filterConfig = filterConfig } override def destroy(): Unit = { @@ -26,6 +26,9 @@ } controller.map { case (controller, _) => + if(controller.config == null){ + controller.init(filterConfig) + } controller.doFilter(request, response, chain) }.getOrElse{ chain.doFilter(request, response) diff --git a/src/main/twirl/gitbucket/core/admin/plugins.scala.html b/src/main/twirl/gitbucket/core/admin/plugins.scala.html index 0186e49..446bdfc 100644 --- a/src/main/twirl/gitbucket/core/admin/plugins.scala.html +++ b/src/main/twirl/gitbucket/core/admin/plugins.scala.html @@ -1,8 +1,11 @@ -@(plugins: List[gitbucket.core.plugin.PluginInfo])(implicit context: gitbucket.core.controller.Context) +@(plugins: List[gitbucket.core.plugin.PluginInfo], info: Option[Any])(implicit context: gitbucket.core.controller.Context) @gitbucket.core.html.main("Plugins"){ @gitbucket.core.admin.html.menu("plugins") { + @gitbucket.core.helper.html.information(info)