diff --git a/src/main/scala/app/SystemSettingsController.scala b/src/main/scala/app/SystemSettingsController.scala index 82aabbd..2292853 100644 --- a/src/main/scala/app/SystemSettingsController.scala +++ b/src/main/scala/app/SystemSettingsController.scala @@ -11,6 +11,7 @@ import java.io.FileInputStream import plugin.{Plugin, PluginSystem} import org.scalatra.Ok +import util.Implicits._ class SystemSettingsController extends SystemSettingsControllerBase with AccountService with AdminAuthenticator diff --git a/src/main/scala/plugin/PluginSystem.scala b/src/main/scala/plugin/PluginSystem.scala index 2afaa6e..0524d2f 100644 --- a/src/main/scala/plugin/PluginSystem.scala +++ b/src/main/scala/plugin/PluginSystem.scala @@ -10,6 +10,8 @@ import service.RepositoryService.RepositoryInfo import Security._ import service.PluginService +import model.Profile._ +import profile.simple._ /** * Provides extension points to plug-ins. @@ -22,14 +24,15 @@ private val pluginsMap = scala.collection.mutable.Map[String, Plugin]() private val repositoriesList = scala.collection.mutable.ListBuffer[PluginRepository]() - def install(plugin: Plugin): Unit = { + def install(plugin: Plugin)(implicit session: Session): Unit = { pluginsMap.put(plugin.id, plugin) } def plugins: List[Plugin] = pluginsMap.values.toList - def uninstall(id: String): Unit = { + def uninstall(id: String)(implicit session: Session): Unit = { pluginsMap.remove(id) + deletePlugin(id) } def repositories: List[PluginRepository] = repositoriesList.toList @@ -37,7 +40,7 @@ /** * Initializes the plugin system. Load scripts from GITBUCKET_HOME/plugins. */ - def init(): Unit = { + def init()(implicit session: Session): Unit = { if(initialized.compareAndSet(false, true)){ // Load installed plugins val pluginDir = new java.io.File(PluginHome) @@ -52,7 +55,7 @@ } // TODO Method name seems to not so good. - def installPlugin(id: String): Unit = { + def installPlugin(id: String)(implicit session: Session): Unit = { val pluginDir = new java.io.File(PluginHome) val scalaFile = new java.io.File(pluginDir, id + "/plugin.scala") diff --git a/src/main/scala/service/PluginService.scala b/src/main/scala/service/PluginService.scala index 12f97fb..74523b2 100644 --- a/src/main/scala/service/PluginService.scala +++ b/src/main/scala/service/PluginService.scala @@ -14,6 +14,6 @@ def deletePlugin(pluginId: String)(implicit s: Session): Unit = Plugins.filter(_.pluginId === pluginId.bind).delete - def getPlugin(pluginId: String): Option[Plugin] = Plugins.filter(_.pluginId === pluginId.bind).firstOption + def getPlugin(pluginId: String)(implicit s: Session): Option[Plugin] = Plugins.filter(_.pluginId === pluginId.bind).firstOption } diff --git a/src/main/scala/servlet/AutoUpdateListener.scala b/src/main/scala/servlet/AutoUpdateListener.scala index eb52c5b..4619c24 100644 --- a/src/main/scala/servlet/AutoUpdateListener.scala +++ b/src/main/scala/servlet/AutoUpdateListener.scala @@ -180,10 +180,12 @@ System.setProperty("gitbucket.home", datadir) } org.h2.Driver.load() - event.getServletContext.setInitParameter("db.url", s"jdbc:h2:${DatabaseHome};MVCC=true") - logger.debug("Start schema update") + val context = event.getServletContext + context.setInitParameter("db.url", s"jdbc:h2:${DatabaseHome};MVCC=true") + defining(getConnection(event.getServletContext)){ conn => + logger.debug("Start schema update") try { defining(getCurrentVersion()){ currentVersion => if(currentVersion == headVersion){ @@ -193,7 +195,6 @@ } else { versions.takeWhile(_ != currentVersion).reverse.foreach(_.update(conn)) FileUtils.writeStringToFile(versionFile, headVersion.versionString, "UTF-8") - conn.commit() logger.debug(s"Updated from ${currentVersion.versionString} to ${headVersion.versionString}") } } @@ -204,17 +205,27 @@ conn.rollback() } } + logger.debug("End schema update") } - logger.debug("End schema update") - logger.debug("Starting plugin system...") - plugin.PluginSystem.init() + getDatabase(context).withSession { implicit session => + logger.debug("Starting plugin system...") + try { + plugin.PluginSystem.init() - scheduler.start() - PluginUpdateJob.schedule(scheduler) - logger.debug("PluginUpdateJob is started.") + scheduler.start() + PluginUpdateJob.schedule(scheduler) + logger.debug("PluginUpdateJob is started.") - logger.debug("Plugin system is initialized.") + logger.debug("Plugin system is initialized.") + } catch { + case ex: Throwable => { + logger.error("Failed to initialize plugin system", ex) + ex.printStackTrace() + session.rollback() + } + } + } } def contextDestroyed(sce: ServletContextEvent): Unit = { @@ -227,4 +238,10 @@ servletContext.getInitParameter("db.user"), servletContext.getInitParameter("db.password")) + private def getDatabase(servletContext: ServletContext): scala.slick.jdbc.JdbcBackend.Database = + slick.jdbc.JdbcBackend.Database.forURL( + servletContext.getInitParameter("db.url"), + servletContext.getInitParameter("db.user"), + servletContext.getInitParameter("db.password")) + }