diff --git a/src/main/scala/gitbucket/core/plugin/Plugin.scala b/src/main/scala/gitbucket/core/plugin/Plugin.scala index 8166a7c..f51224b 100644 --- a/src/main/scala/gitbucket/core/plugin/Plugin.scala +++ b/src/main/scala/gitbucket/core/plugin/Plugin.scala @@ -1,7 +1,9 @@ package gitbucket.core.plugin import javax.servlet.ServletContext +import gitbucket.core.controller.ControllerBase import gitbucket.core.service.SystemSettingsService.SystemSettings +import gitbucket.core.util.ControlUtil._ import gitbucket.core.util.Version /** @@ -16,15 +18,50 @@ val versions: Seq[Version] /** + * Override to declare this plug-in provides images. + */ + val images: Seq[(String, Array[Byte])] = Nil + + /** + * Override to declare this plug-in provides controllers. + */ + val controllers: Seq[(String, ControllerBase)] = Nil + + /** + * Override to declare this plug-in provides JavaScript. + */ + val javaScripts: Seq[(String, String)] = Nil + + /** * This method is invoked in initialization of plugin system. * Register plugin functionality to PluginRegistry. */ - def initialize(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Unit + def initialize(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Unit = { + images.foreach { case (id, in) => + registry.addImage(id, in) + } + controllers.foreach { case (path, controller) => + registry.addController(path, controller) + } + javaScripts.foreach { case (path, script) => + registry.addJavaScript(path, script) + } + } /** * This method is invoked in shutdown of plugin system. * If the plugin has any resources, release them in this method. */ - def shutdown(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Unit + def shutdown(registry: PluginRegistry, context: ServletContext, settings: SystemSettings): Unit = {} + + /** + * Helper method to get a resource from classpath. + */ + protected def fromClassPath(path: String): Array[Byte] = + using(getClass.getClassLoader.getResourceAsStream(path)){ in => + val bytes = new Array[Byte](in.available) + in.read(bytes) + bytes + } } diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala index fdd3892..fd2c329 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistory.scala @@ -31,22 +31,32 @@ def getPlugins(): List[PluginInfo] = plugins.toList + def addImage(id: String, bytes: Array[Byte]): Unit = { + val encoded = StringUtils.newStringUtf8(Base64.encodeBase64(bytes, false)) + images += ((id, encoded)) + } + + @deprecated def addImage(id: String, in: InputStream): Unit = { val bytes = using(in){ in => val bytes = new Array[Byte](in.available) in.read(bytes) bytes } - val encoded = StringUtils.newStringUtf8(Base64.encodeBase64(bytes, false)) - images += ((id, encoded)) + addImage(id, bytes) } def getImage(id: String): String = images(id) - def addController(controller: ControllerBase, path: String): Unit = { + def addController(path: String, controller: ControllerBase): Unit = { controllers += ((controller, path)) } + @deprecated + def addController(controller: ControllerBase, path: String): Unit = { + addController(path, controller) + } + def getControllers(): List[(ControllerBase, String)] = controllers.toList def addJavaScript(path: String, script: String): Unit = {