diff --git a/src/main/scala/plugin/JavaScriptPlugin.scala b/src/main/scala/plugin/JavaScriptPlugin.scala index 1a8d0e5..fe7701d 100644 --- a/src/main/scala/plugin/JavaScriptPlugin.scala +++ b/src/main/scala/plugin/JavaScriptPlugin.scala @@ -3,20 +3,20 @@ import org.mozilla.javascript.{Context => JsContext} import org.mozilla.javascript.{Function => JsFunction} import scala.collection.mutable.ListBuffer -import plugin.PluginSystem.{Action, GlobalMenu, RepositoryMenu} +import plugin.PluginSystem._ class JavaScriptPlugin(val id: String, val version: String, val author: String, val url: String, val description: String) extends Plugin { private val repositoryMenuList = ListBuffer[RepositoryMenu]() private val globalMenuList = ListBuffer[GlobalMenu]() - private val repositoryActionList = ListBuffer[Action]() + private val repositoryActionList = ListBuffer[RepositoryAction]() private val globalActionList = ListBuffer[Action]() - def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList - def globalMenus : List[GlobalMenu] = globalMenuList.toList - def repositoryActions : List[Action] = repositoryActionList.toList - def globalActions : List[Action] = globalActionList.toList + def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList + def globalMenus : List[GlobalMenu] = globalMenuList.toList + def repositoryActions : List[RepositoryAction] = repositoryActionList.toList + def globalActions : List[Action] = globalActionList.toList def addRepositoryMenu(label: String, name: String, url: String, icon: String, condition: JsFunction): Unit = { repositoryMenuList += RepositoryMenu(label, name, url, icon, (context) => { @@ -52,10 +52,10 @@ } def addRepositoryAction(path: String, function: JsFunction): Unit = { - repositoryActionList += Action(path, (request, response) => { + repositoryActionList += RepositoryAction(path, (request, response, repository) => { val context = JsContext.enter() try { - function.call(context, function, function, Array(request, response)) + function.call(context, function, function, Array(request, response, repository)) } finally { JsContext.exit() } diff --git a/src/main/scala/plugin/Plugin.scala b/src/main/scala/plugin/Plugin.scala index 59961fe..677083f 100644 --- a/src/main/scala/plugin/Plugin.scala +++ b/src/main/scala/plugin/Plugin.scala @@ -1,6 +1,6 @@ package plugin -import plugin.PluginSystem.{Action, GlobalMenu, RepositoryMenu} +import plugin.PluginSystem._ trait Plugin { val id: String @@ -11,6 +11,6 @@ def repositoryMenus : List[RepositoryMenu] def globalMenus : List[GlobalMenu] - def repositoryActions : List[Action] + def repositoryActions : List[RepositoryAction] def globalActions : List[Action] } diff --git a/src/main/scala/plugin/PluginSystem.scala b/src/main/scala/plugin/PluginSystem.scala index e40f860..6c96ac9 100644 --- a/src/main/scala/plugin/PluginSystem.scala +++ b/src/main/scala/plugin/PluginSystem.scala @@ -9,6 +9,7 @@ import org.apache.commons.io.FileUtils import util.JGitUtil import org.eclipse.jgit.api.Git +import service.RepositoryService.RepositoryInfo /** * Provides extension points to plug-ins. @@ -76,16 +77,17 @@ } } - def repositoryMenus : List[RepositoryMenu] = pluginsMap.values.flatMap(_.repositoryMenus).toList - def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList - def repositoryActions : List[Action] = pluginsMap.values.flatMap(_.repositoryActions).toList - def globalActions : List[Action] = pluginsMap.values.flatMap(_.globalActions).toList + def repositoryMenus : List[RepositoryMenu] = pluginsMap.values.flatMap(_.repositoryMenus).toList + def globalMenus : List[GlobalMenu] = pluginsMap.values.flatMap(_.globalMenus).toList + def repositoryActions : List[RepositoryAction] = pluginsMap.values.flatMap(_.repositoryActions).toList + def globalActions : List[Action] = pluginsMap.values.flatMap(_.globalActions).toList // Case classes to hold plug-ins information internally in GitBucket case class PluginRepository(id: String, url: String) case class GlobalMenu(label: String, url: String, icon: String, condition: Context => Boolean) case class RepositoryMenu(label: String, name: String, url: String, icon: String, condition: Context => Boolean) case class Action(path: String, function: (HttpServletRequest, HttpServletResponse) => Any) + case class RepositoryAction(path: String, function: (HttpServletRequest, HttpServletResponse, RepositoryInfo) => Any) /** * Checks whether the plugin is updatable. diff --git a/src/main/scala/plugin/ScalaPlugin.scala b/src/main/scala/plugin/ScalaPlugin.scala index c0bb728..e9ccc3b 100644 --- a/src/main/scala/plugin/ScalaPlugin.scala +++ b/src/main/scala/plugin/ScalaPlugin.scala @@ -2,8 +2,9 @@ import app.Context import scala.collection.mutable.ListBuffer -import plugin.PluginSystem.{Action, GlobalMenu, RepositoryMenu} +import plugin.PluginSystem._ import javax.servlet.http.{HttpServletResponse, HttpServletRequest} +import service.RepositoryService.RepositoryInfo // TODO This is a sample implementation for Scala based plug-ins. class ScalaPlugin(val id: String, val version: String, @@ -11,13 +12,13 @@ private val repositoryMenuList = ListBuffer[RepositoryMenu]() private val globalMenuList = ListBuffer[GlobalMenu]() - private val repositoryActionList = ListBuffer[Action]() + private val repositoryActionList = ListBuffer[RepositoryAction]() private val globalActionList = ListBuffer[Action]() - def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList - def globalMenus : List[GlobalMenu] = globalMenuList.toList - def repositoryActions : List[Action] = repositoryActionList.toList - def globalActions : List[Action] = globalActionList.toList + def repositoryMenus : List[RepositoryMenu] = repositoryMenuList.toList + def globalMenus : List[GlobalMenu] = globalMenuList.toList + def repositoryActions : List[RepositoryAction] = repositoryActionList.toList + def globalActions : List[Action] = globalActionList.toList def addRepositoryMenu(label: String, name: String, url: String, icon: String)(condition: (Context) => Boolean): Unit = { repositoryMenuList += RepositoryMenu(label, name, url, icon, condition) @@ -31,8 +32,8 @@ globalActionList += Action(path, function) } - def addRepositoryAction(path: String)(function: (HttpServletRequest, HttpServletResponse) => Any): Unit = { - repositoryActionList += Action(path, function) + def addRepositoryAction(path: String)(function: (HttpServletRequest, HttpServletResponse, RepositoryInfo) => Any): Unit = { + repositoryActionList += RepositoryAction(path, function) } } diff --git a/src/main/scala/servlet/PluginActionInvokeFilter.scala b/src/main/scala/servlet/PluginActionInvokeFilter.scala index 6dbbe78..20e1db5 100644 --- a/src/main/scala/servlet/PluginActionInvokeFilter.scala +++ b/src/main/scala/servlet/PluginActionInvokeFilter.scala @@ -55,14 +55,15 @@ val owner = elements(1) val name = elements(2) val remain = elements.drop(3).mkString("/", "/", "") - getRepository(owner, name, "").flatMap { repository => // TODO fill baseUrl + val systemSettings = loadSystemSettings() + getRepository(owner, name, systemSettings.baseUrl(request)).flatMap { repository => plugin.PluginSystem.repositoryActions.find(_.path == remain).map { action => - val result = action.function(request, response) + val result = action.function(request, response, repository) result match { case x: String => { response.setContentType("text/html; charset=UTF-8") val loginAccount = request.getSession.getAttribute(Keys.Session.LoginAccount).asInstanceOf[Account] - implicit val context = app.Context(loadSystemSettings(), Option(loginAccount), request) + implicit val context = app.Context(systemSettings, Option(loginAccount), request) val html = _root_.html.main("GitBucket", None)(_root_.html.menu("", repository)(Html(x))) // TODO specify active side menu IOUtils.write(html.toString.getBytes("UTF-8"), response.getOutputStream) }