Add the plugin reload button to the plugin list page

This commit is contained in:
Naoki Takezoe
2017-03-11 12:13:59 +09:00
parent c760af7810
commit 7e7e45e794
4 changed files with 29 additions and 10 deletions

View File

@@ -181,9 +181,14 @@ trait SystemSettingsControllerBase extends AccountManagementControllerBase {
}) })
get("/admin/plugins")(adminOnly { 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 { get("/admin/users")(adminOnly {
val includeRemoved = params.get("includeRemoved").map(_.toBoolean).getOrElse(false) val includeRemoved = params.get("includeRemoved").map(_.toBoolean).getOrElse(false)

View File

@@ -155,17 +155,26 @@ object PluginRegistry {
private val logger = LoggerFactory.getLogger(classOf[PluginRegistry]) private val logger = LoggerFactory.getLogger(classOf[PluginRegistry])
private val instance = new PluginRegistry() private var instance = new PluginRegistry()
/** /**
* Returns the PluginRegistry singleton instance. * Returns the PluginRegistry singleton instance.
*/ */
def apply(): PluginRegistry = instance 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. * 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 pluginDir = new File(PluginHome)
val manager = new JDBCVersionManager(conn) val manager = new JDBCVersionManager(conn)
@@ -207,7 +216,7 @@ object PluginRegistry {
} }
} }
def shutdown(context: ServletContext, settings: SystemSettings): Unit = { def shutdown(context: ServletContext, settings: SystemSettings): Unit = synchronized {
instance.getPlugins().foreach { pluginInfo => instance.getPlugins().foreach { pluginInfo =>
try { try {
pluginInfo.pluginClass.shutdown(instance, context, settings) pluginInfo.pluginClass.shutdown(instance, context, settings)
@@ -219,7 +228,6 @@ object PluginRegistry {
} }
} }
} }
case class Link(id: String, label: String, path: String, icon: Option[String] = None) case class Link(id: String, label: String, path: String, icon: Option[String] = None)

View File

@@ -7,10 +7,10 @@ import gitbucket.core.plugin.PluginRegistry
class PluginControllerFilter extends Filter { class PluginControllerFilter extends Filter {
private var filterConfig: FilterConfig = null
override def init(filterConfig: FilterConfig): Unit = { override def init(filterConfig: FilterConfig): Unit = {
PluginRegistry().getControllers().foreach { case (controller, _) => this.filterConfig = filterConfig
controller.init(filterConfig)
}
} }
override def destroy(): Unit = { override def destroy(): Unit = {
@@ -26,6 +26,9 @@ class PluginControllerFilter extends Filter {
} }
controller.map { case (controller, _) => controller.map { case (controller, _) =>
if(controller.config == null){
controller.init(filterConfig)
}
controller.doFilter(request, response, chain) controller.doFilter(request, response, chain)
}.getOrElse{ }.getOrElse{
chain.doFilter(request, response) chain.doFilter(request, response)

View File

@@ -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.html.main("Plugins"){
@gitbucket.core.admin.html.menu("plugins") { @gitbucket.core.admin.html.menu("plugins") {
@gitbucket.core.helper.html.information(info)
<h1>Installed plugins</h1> <h1>Installed plugins</h1>
<form action="@context.path/admin/plugins/_reload" method="POST" class="pull-right">
<input type="submit" value="Reload plugins" class="btn btn-success">
</form>
@if(plugins.size > 0) { @if(plugins.size > 0) {
<ul> <ul>
@plugins.map { plugin => @plugins.map { plugin =>