diff --git a/src/main/scala/app/SearchController.scala b/src/main/scala/app/SearchController.scala index 7a89006..99ea743 100644 --- a/src/main/scala/app/SearchController.scala +++ b/src/main/scala/app/SearchController.scala @@ -1,6 +1,7 @@ package app import util._ +import ControlUtil._ import service._ import jp.sf.amateras.scalatra.forms._ @@ -26,25 +27,25 @@ } get("/:owner/:repository/search")(referrersOnly { repository => - val query = params("q").trim - val target = params.getOrElse("type", "code") - val page = try { - val i = params.getOrElse("page", "1").toInt - if(i <= 0) 1 else i - } catch { - case e: NumberFormatException => 1 - } + defining(params("q").trim, params.getOrElse("type", "code")){ case (query, target) => + val page = try { + val i = params.getOrElse("page", "1").toInt + if(i <= 0) 1 else i + } catch { + case e: NumberFormatException => 1 + } - target.toLowerCase match { - case "issue" => search.html.issues( - searchIssues(repository.owner, repository.name, query), - countFiles(repository.owner, repository.name, query), - query, page, repository) + target.toLowerCase match { + case "issue" => search.html.issues( + searchIssues(repository.owner, repository.name, query), + countFiles(repository.owner, repository.name, query), + query, page, repository) - case _ => search.html.code( - searchFiles(repository.owner, repository.name, query), - countIssues(repository.owner, repository.name, query), - query, page, repository) + case _ => search.html.code( + searchFiles(repository.owner, repository.name, query), + countIssues(repository.owner, repository.name, query), + query, page, repository) + } } }) diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index 08f14d8..1e1f0f5 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -3,6 +3,7 @@ import service._ import util.AdminAuthenticator import util.StringUtil._ +import util.ControlUtil._ import jp.sf.amateras.scalatra.forms._ class UserManagementController extends UserManagementControllerBase @@ -107,29 +108,29 @@ }) get("/admin/users/:groupName/_editgroup")(adminOnly { - val groupName = params("groupName") - admin.users.html.group(getAccountByUserName(groupName), getGroupMembers(groupName)) + defining(params("groupName")){ groupName => + admin.users.html.group(getAccountByUserName(groupName), getGroupMembers(groupName)) + } }) post("/admin/users/:groupName/_editgroup", editGroupForm)(adminOnly { form => - val groupName = params("groupName") - getAccountByUserName(groupName).map { account => - updateGroup(groupName, form.url) + defining(params("groupName"), form.memberNames.map(_.split(",").toList).getOrElse(Nil)){ case (groupName, memberNames) => + getAccountByUserName(groupName).map { account => + updateGroup(groupName, form.url) + updateGroupMembers(form.groupName, memberNames) - val memberNames = form.memberNames.map(_.split(",").toList).getOrElse(Nil) - updateGroupMembers(form.groupName, memberNames) - - getRepositoryNamesOfUser(form.groupName).foreach { repositoryName => - removeCollaborators(form.groupName, repositoryName) - memberNames.foreach { userName => - addCollaborator(form.groupName, repositoryName, userName) + getRepositoryNamesOfUser(form.groupName).foreach { repositoryName => + removeCollaborators(form.groupName, repositoryName) + memberNames.foreach { userName => + addCollaborator(form.groupName, repositoryName, userName) + } } - } - updateImage(form.groupName, form.fileId, form.clearImage) - redirect("/admin/users") + updateImage(form.groupName, form.fileId, form.clearImage) + redirect("/admin/users") - } getOrElse NotFound + } getOrElse NotFound + } }) post("/admin/users/_usercheck")(adminOnly { diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index a44f9af..bf88879 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -132,8 +132,8 @@ get("/:owner/:repository/wiki/_blob/*")(referrersOnly { repository => getFileContent(repository.owner, repository.name, multiParams("splat").head).map { content => - contentType = "application/octet-stream" - content + contentType = "application/octet-stream" + content } getOrElse NotFound }) diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index 4a0abf7..950c4d3 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -2,21 +2,21 @@ import scala.slick.driver.H2Driver.simple._ import Database.threadLocalSession - import model._ +import util.ControlUtil._ trait PullRequestService { self: IssuesService => import PullRequestService._ - def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = { - val issue = getIssue(owner, repository, issueId.toString) - if(issue.isDefined){ - Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption match { - case Some(pullreq) => Some((issue.get, pullreq)) - case None => None - } - } else None - } + def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = + defining(getIssue(owner, repository, issueId.toString)){ issue => + if(issue.isDefined){ + Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption match { + case Some(pullreq) => Some((issue.get, pullreq)) + case None => None + } + } else None + } def getPullRequestCountGroupByUser(closed: Boolean, owner: String, repository: Option[String]): List[PullRequestCount] = Query(PullRequests) diff --git a/src/main/scala/service/RepositorySearchService.scala b/src/main/scala/service/RepositorySearchService.scala index 1baed45..ac4f177 100644 --- a/src/main/scala/service/RepositorySearchService.scala +++ b/src/main/scala/service/RepositorySearchService.scala @@ -10,7 +10,8 @@ import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.api.Git -trait RepositorySearchService { self: IssuesService => +trait +RepositorySearchService { self: IssuesService => import RepositorySearchService._ def countIssues(owner: String, repository: String, query: String): Int = diff --git a/src/main/scala/service/SystemSettingsService.scala b/src/main/scala/service/SystemSettingsService.scala index 6d9d2ad..39e1e5f 100644 --- a/src/main/scala/service/SystemSettingsService.scala +++ b/src/main/scala/service/SystemSettingsService.scala @@ -1,73 +1,76 @@ package service import util.Directory._ +import util.ControlUtil._ import SystemSettingsService._ trait SystemSettingsService { def saveSystemSettings(settings: SystemSettings): Unit = { - val props = new java.util.Properties() - props.setProperty(AllowAccountRegistration, settings.allowAccountRegistration.toString) - props.setProperty(Gravatar, settings.gravatar.toString) - props.setProperty(Notification, settings.notification.toString) - if(settings.notification) { - settings.smtp.foreach { smtp => - props.setProperty(SmtpHost, smtp.host) - smtp.port.foreach(x => props.setProperty(SmtpPort, x.toString)) - smtp.user.foreach(props.setProperty(SmtpUser, _)) - smtp.password.foreach(props.setProperty(SmtpPassword, _)) - smtp.ssl.foreach(x => props.setProperty(SmtpSsl, x.toString)) + defining(new java.util.Properties()){ props => + props.setProperty(AllowAccountRegistration, settings.allowAccountRegistration.toString) + props.setProperty(Gravatar, settings.gravatar.toString) + props.setProperty(Notification, settings.notification.toString) + if(settings.notification) { + settings.smtp.foreach { smtp => + props.setProperty(SmtpHost, smtp.host) + smtp.port.foreach(x => props.setProperty(SmtpPort, x.toString)) + smtp.user.foreach(props.setProperty(SmtpUser, _)) + smtp.password.foreach(props.setProperty(SmtpPassword, _)) + smtp.ssl.foreach(x => props.setProperty(SmtpSsl, x.toString)) + } } - } - props.setProperty(LdapAuthentication, settings.ldapAuthentication.toString) - if(settings.ldapAuthentication){ - settings.ldap.map { ldap => - props.setProperty(LdapHost, ldap.host) - ldap.port.foreach(x => props.setProperty(LdapPort, x.toString)) - ldap.bindDN.foreach(x => props.setProperty(LdapBindDN, x)) - ldap.bindPassword.foreach(x => props.setProperty(LdapBindPassword, x)) - props.setProperty(LdapBaseDN, ldap.baseDN) - props.setProperty(LdapUserNameAttribute, ldap.userNameAttribute) - props.setProperty(LdapMailAddressAttribute, ldap.mailAttribute) + props.setProperty(LdapAuthentication, settings.ldapAuthentication.toString) + if(settings.ldapAuthentication){ + settings.ldap.map { ldap => + props.setProperty(LdapHost, ldap.host) + ldap.port.foreach(x => props.setProperty(LdapPort, x.toString)) + ldap.bindDN.foreach(x => props.setProperty(LdapBindDN, x)) + ldap.bindPassword.foreach(x => props.setProperty(LdapBindPassword, x)) + props.setProperty(LdapBaseDN, ldap.baseDN) + props.setProperty(LdapUserNameAttribute, ldap.userNameAttribute) + props.setProperty(LdapMailAddressAttribute, ldap.mailAttribute) + } } + props.store(new java.io.FileOutputStream(GitBucketConf), null) } - props.store(new java.io.FileOutputStream(GitBucketConf), null) } def loadSystemSettings(): SystemSettings = { - val props = new java.util.Properties() - if(GitBucketConf.exists){ - props.load(new java.io.FileInputStream(GitBucketConf)) - } - SystemSettings( - getValue(props, AllowAccountRegistration, false), - getValue(props, Gravatar, true), - getValue(props, Notification, false), - if(getValue(props, Notification, false)){ - Some(Smtp( - getValue(props, SmtpHost, ""), - getOptionValue(props, SmtpPort, Some(DefaultSmtpPort)), - getOptionValue(props, SmtpUser, None), - getOptionValue(props, SmtpPassword, None), - getOptionValue[Boolean](props, SmtpSsl, None))) - } else { - None - }, - getValue(props, LdapAuthentication, false), - if(getValue(props, LdapAuthentication, false)){ - Some(Ldap( - getValue(props, LdapHost, ""), - getOptionValue(props, LdapPort, Some(DefaultLdapPort)), - getOptionValue(props, LdapBindDN, None), - getOptionValue(props, LdapBindPassword, None), - getValue(props, LdapBaseDN, ""), - getValue(props, LdapUserNameAttribute, ""), - getValue(props, LdapMailAddressAttribute, ""))) - } else { - None + defining(new java.util.Properties()){ props => + if(GitBucketConf.exists){ + props.load(new java.io.FileInputStream(GitBucketConf)) } - ) + SystemSettings( + getValue(props, AllowAccountRegistration, false), + getValue(props, Gravatar, true), + getValue(props, Notification, false), + if(getValue(props, Notification, false)){ + Some(Smtp( + getValue(props, SmtpHost, ""), + getOptionValue(props, SmtpPort, Some(DefaultSmtpPort)), + getOptionValue(props, SmtpUser, None), + getOptionValue(props, SmtpPassword, None), + getOptionValue[Boolean](props, SmtpSsl, None))) + } else { + None + }, + getValue(props, LdapAuthentication, false), + if(getValue(props, LdapAuthentication, false)){ + Some(Ldap( + getValue(props, LdapHost, ""), + getOptionValue(props, LdapPort, Some(DefaultLdapPort)), + getOptionValue(props, LdapBindDN, None), + getOptionValue(props, LdapBindPassword, None), + getValue(props, LdapBaseDN, ""), + getValue(props, LdapUserNameAttribute, ""), + getValue(props, LdapMailAddressAttribute, ""))) + } else { + None + } + ) + } } } @@ -119,23 +122,23 @@ private val LdapUserNameAttribute = "ldap.username_attribute" private val LdapMailAddressAttribute = "ldap.mail_attribute" - private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = { - val value = props.getProperty(key) - if(value == null || value.isEmpty) default - else convertType(value).asInstanceOf[A] - } + private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = + defining(props.getProperty(key)){ value => + if(value == null || value.isEmpty) default + else convertType(value).asInstanceOf[A] + } - private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] = { - val value = props.getProperty(key) - if(value == null || value.isEmpty) default - else Some(convertType(value)).asInstanceOf[Option[A]] - } + private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] = + defining(props.getProperty(key)){ value => + if(value == null || value.isEmpty) default + else Some(convertType(value)).asInstanceOf[Option[A]] + } - private def convertType[A: ClassTag](value: String) = { - val c = implicitly[ClassTag[A]].runtimeClass - if(c == classOf[Boolean]) value.toBoolean - else if(c == classOf[Int]) value.toInt - else value - } + private def convertType[A: ClassTag](value: String) = + defining(implicitly[ClassTag[A]].runtimeClass){ c => + if(c == classOf[Boolean]) value.toBoolean + else if(c == classOf[Int]) value.toInt + else value + } } diff --git a/src/main/scala/service/WikiService.scala b/src/main/scala/service/WikiService.scala index 2a1a945..774cfc7 100644 --- a/src/main/scala/service/WikiService.scala +++ b/src/main/scala/service/WikiService.scala @@ -34,40 +34,40 @@ trait WikiService { import WikiService._ - def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = { + def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = LockUtil.lock(s"${owner}/${repository}/wiki"){ - val dir = Directory.getWikiRepositoryDir(owner, repository) - if(!dir.exists){ - try { - JGitUtil.initRepository(dir) - saveWikiPage(owner, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", loginAccount, "Initial Commit") - } finally { - // once delete cloned repository because initial cloned repository does not have 'branch.master.merge' - FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner, repository)) + defining(Directory.getWikiRepositoryDir(owner, repository)){ dir => + if(!dir.exists){ + try { + JGitUtil.initRepository(dir) + saveWikiPage(owner, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", loginAccount, "Initial Commit") + } finally { + // once delete cloned repository because initial cloned repository does not have 'branch.master.merge' + FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner, repository)) + } } } } - } - + /** * Returns the wiki page. */ def getWikiPage(owner: String, repository: String, pageName: String): Option[WikiPageInfo] = { using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git => - if(!JGitUtil.isEmpty(git)){ + optionIf(!JGitUtil.isEmpty(git)){ JGitUtil.getFileList(git, "master", ".").find(_.name == pageName + ".md").map { file => WikiPageInfo(file.name, new String(git.getRepository.open(file.id).getBytes, "UTF-8"), file.committer, file.time) } - } else None + } } } /** * Returns the content of the specified file. */ - def getFileContent(owner: String, repository: String, path: String): Option[Array[Byte]] = { + def getFileContent(owner: String, repository: String, path: String): Option[Array[Byte]] = using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git => - if(!JGitUtil.isEmpty(git)){ + optionIf(!JGitUtil.isEmpty(git)){ val index = path.lastIndexOf('/') val parentPath = if(index < 0) "." else path.substring(0, index) val fileName = if(index < 0) path else path.substring(index + 1) @@ -75,9 +75,8 @@ JGitUtil.getFileList(git, "master", parentPath).find(_.name == fileName).map { file => git.getRepository.open(file.id).getBytes } - } else None + } } - } /** * Returns the list of wiki page names. @@ -98,36 +97,31 @@ content: String, committer: model.Account, message: String): Option[String] = { LockUtil.lock(s"${owner}/${repository}/wiki"){ - // clone working copy - val workDir = Directory.getWikiWorkDir(owner, repository) - cloneOrPullWorkingCopy(workDir, owner, repository) + defining(Directory.getWikiWorkDir(owner, repository)){ workDir => + // clone working copy + cloneOrPullWorkingCopy(workDir, owner, repository) - // write as file - using(Git.open(workDir)){ git => - val file = new File(workDir, newPageName + ".md") - val added = if(!file.exists || FileUtils.readFileToString(file, "UTF-8") != content){ - FileUtils.writeStringToFile(file, content, "UTF-8") - git.add.addFilepattern(file.getName).call - true - } else { - false - } + // write as file + using(Git.open(workDir)){ git => + defining(new File(workDir, newPageName + ".md")){ file => + val added = executeIf(!file.exists || FileUtils.readFileToString(file, "UTF-8") != content){ + FileUtils.writeStringToFile(file, content, "UTF-8") + git.add.addFilepattern(file.getName).call + } - // delete file - val deleted = if(currentPageName != "" && currentPageName != newPageName){ - git.rm.addFilepattern(currentPageName + ".md").call - true - } else { - false - } + // delete file + val deleted = executeIf(currentPageName != "" && currentPageName != newPageName){ + git.rm.addFilepattern(currentPageName + ".md").call + } - // commit and push - if(added || deleted){ - val commit = git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(message).call - git.push.call - Some(commit.getName) - } else { - None + // commit and push + optionIf(added || deleted){ + defining(git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(message).call){ commit => + git.push.call + Some(commit.getName) + } + } + } } } } @@ -139,35 +133,34 @@ def deleteWikiPage(owner: String, repository: String, pageName: String, committer: String, mailAddress: String, message: String): Unit = { LockUtil.lock(s"${owner}/${repository}/wiki"){ - // clone working copy - val workDir = Directory.getWikiWorkDir(owner, repository) - cloneOrPullWorkingCopy(workDir, owner, repository) + defining(Directory.getWikiWorkDir(owner, repository)){ workDir => + // clone working copy + cloneOrPullWorkingCopy(workDir, owner, repository) - // delete file - new File(workDir, pageName + ".md").delete - - using(Git.open(workDir)){ git => - git.rm.addFilepattern(pageName + ".md").call - - // commit and push - git.commit.setAuthor(committer, mailAddress).setMessage(message).call - git.push.call + // delete file + new File(workDir, pageName + ".md").delete + + using(Git.open(workDir)){ git => + git.rm.addFilepattern(pageName + ".md").call + + // commit and push + git.commit.setAuthor(committer, mailAddress).setMessage(message).call + git.push.call + } } } } private def cloneOrPullWorkingCopy(workDir: File, owner: String, repository: String): Unit = { if(!workDir.exists){ - val git = - Git.cloneRepository - .setURI(Directory.getWikiRepositoryDir(owner, repository).toURI.toString) - .setDirectory(workDir) - .call - git.getRepository.close // close .git resources. - } else { - using(Git.open(workDir)){ git => - git.pull.call - } + Git.cloneRepository + .setURI(Directory.getWikiRepositoryDir(owner, repository).toURI.toString) + .setDirectory(workDir) + .call + .getRepository + .close + } else using(Git.open(workDir)){ git => + git.pull.call } } diff --git a/src/main/scala/servlet/AutoUpdateListener.scala b/src/main/scala/servlet/AutoUpdateListener.scala index dd6dd6e..46cc220 100644 --- a/src/main/scala/servlet/AutoUpdateListener.scala +++ b/src/main/scala/servlet/AutoUpdateListener.scala @@ -6,7 +6,9 @@ import javax.servlet.ServletContextEvent import org.apache.commons.io.IOUtils import org.slf4j.LoggerFactory -import util.Directory +import util.Directory._ +import util.ControlUtil._ +import org.eclipse.jgit.api.Git object AutoUpdate { @@ -26,15 +28,14 @@ */ def update(conn: Connection): Unit = { val sqlPath = s"update/${majorVersion}_${minorVersion}.sql" - val in = Thread.currentThread.getContextClassLoader.getResourceAsStream(sqlPath) - if(in != null){ - val sql = IOUtils.toString(in, "UTF-8") - val stmt = conn.createStatement() - try { - logger.debug(sqlPath + "=" + sql) - stmt.executeUpdate(sql) - } finally { - stmt.close() + + using(Thread.currentThread.getContextClassLoader.getResourceAsStream(sqlPath)){ in => + if(in != null){ + val sql = IOUtils.toString(in, "UTF-8") + using(conn.createStatement()){ stmt => + logger.debug(sqlPath + "=" + sql) + stmt.executeUpdate(sql) + } } } } @@ -56,16 +57,17 @@ override def update(conn: Connection): Unit = { super.update(conn) // Fix wiki repository configuration - val rs = conn.createStatement.executeQuery("SELECT USER_NAME, REPOSITORY_NAME FROM REPOSITORY") - while(rs.next){ - val wikidir = Directory.getWikiRepositoryDir(rs.getString("USER_NAME"), rs.getString("REPOSITORY_NAME")) - val repository = org.eclipse.jgit.api.Git.open(wikidir).getRepository - val config = repository.getConfig - if(!config.getBoolean("http", "receivepack", false)){ - config.setBoolean("http", null, "receivepack", true) - config.save + using(conn.createStatement.executeQuery("SELECT USER_NAME, REPOSITORY_NAME FROM REPOSITORY")){ rs => + while(rs.next){ + using(Git.open(getWikiRepositoryDir(rs.getString("USER_NAME"), rs.getString("REPOSITORY_NAME")))){ git => + defining(git.getRepository.getConfig){ config => + if(!config.getBoolean("http", "receivepack", false)){ + config.setBoolean("http", null, "receivepack", true) + config.save + } + } + } } - repository.close } } }, @@ -82,7 +84,7 @@ /** * The version file (GITBUCKET_HOME/version). */ - val versionFile = new File(Directory.GitBucketHome, "version") + val versionFile = new File(GitBucketHome, "version") /** * Returns the current version from the version file. @@ -113,27 +115,29 @@ private val logger = LoggerFactory.getLogger(classOf[AutoUpdateListener]) override def contextInitialized(event: ServletContextEvent): Unit = { - event.getServletContext.setInitParameter("db.url", s"jdbc:h2:${Directory.DatabaseHome}") + event.getServletContext.setInitParameter("db.url", s"jdbc:h2:${DatabaseHome}") super.contextInitialized(event) logger.debug("H2 started") logger.debug("Start schema update") - val conn = getConnection() - try { - val currentVersion = getCurrentVersion() - if(currentVersion == headVersion){ - logger.debug("No update") - } else { - versions.takeWhile(_ != currentVersion).reverse.foreach(_.update(conn)) - FileUtils.writeStringToFile(versionFile, headVersion.versionString, "UTF-8") - conn.commit() - logger.debug("Updated from " + currentVersion.versionString + " to " + headVersion.versionString) - } - } catch { - case ex: Throwable => { - logger.error("Failed to schema update", ex) - ex.printStackTrace() - conn.rollback() + defining(getConnection()){ conn => + try { + defining(getCurrentVersion()){ currentVersion => + if(currentVersion == headVersion){ + logger.debug("No update") + } else { + versions.takeWhile(_ != currentVersion).reverse.foreach(_.update(conn)) + FileUtils.writeStringToFile(versionFile, headVersion.versionString, "UTF-8") + conn.commit() + logger.debug("Updated from " + currentVersion.versionString + " to " + headVersion.versionString) + } + } + } catch { + case ex: Throwable => { + logger.error("Failed to schema update", ex) + ex.printStackTrace() + conn.rollback() + } } } logger.debug("End schema update") diff --git a/src/main/scala/util/ControlUtil.scala b/src/main/scala/util/ControlUtil.scala index 2c4fc71..cae271a 100644 --- a/src/main/scala/util/ControlUtil.scala +++ b/src/main/scala/util/ControlUtil.scala @@ -33,5 +33,18 @@ git.getRepository.close } + def executeIf(condition: => Boolean)(action: => Unit): Boolean = + if(condition){ + action + true + } else { + false + } + def optionIf[T](condition: => Boolean)(action: => Option[T]): Option[T] = + if(condition){ + action + } else { + None + } } diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index 3878736..47615b5 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -69,29 +69,17 @@ rev.getFullMessage, rev.getParents().map(_.name).toList) - val summary = { - val i = fullMessage.trim.indexOf("\n") - val firstLine = if(i >= 0){ - fullMessage.trim.substring(0, i).trim - } else { - fullMessage - } - if(firstLine.length > shortMessage.length){ - shortMessage - } else { - firstLine + val summary = defining(fullMessage.trim.indexOf("\n")){ i => + defining(if(i >= 0) fullMessage.trim.substring(0, i).trim else fullMessage){ firstLine => + if(firstLine.length > shortMessage.length) shortMessage else firstLine } } - val description = { - val i = fullMessage.trim.indexOf("\n") - if(i >= 0){ + val description = defining(fullMessage.trim.indexOf("\n")){ i => + optionIf(i >= 0){ Some(fullMessage.trim.substring(i).trim) - } else { - None } } - } case class DiffInfo(changeType: ChangeType, oldPath: String, newPath: String, oldContent: Option[String], newContent: Option[String]) @@ -124,7 +112,7 @@ val revWalk = new RevWalk(git.getRepository) val revCommit = revWalk.parseAny(objectId) match { case r: RevTag => revWalk.parseCommit(r.getObject) - case _ => revWalk.parseCommit(objectId) + case _ => revWalk.parseCommit(objectId) } revWalk.dispose revCommit @@ -462,29 +450,24 @@ } } - def initRepository(dir: java.io.File): Unit = { + def initRepository(dir: java.io.File): Unit = using(new RepositoryBuilder().setGitDir(dir).setBare.build){ repository => repository.create setReceivePack(repository) } - } - def cloneRepository(from: java.io.File, to: java.io.File): Unit = { - val git = Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call - try { + def cloneRepository(from: java.io.File, to: java.io.File): Unit = + using(Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call){ git => setReceivePack(git.getRepository) - } finally { - git.getRepository.close } - } def isEmpty(git: Git): Boolean = git.getRepository.resolve(Constants.HEAD) == null - private def setReceivePack(repository: org.eclipse.jgit.lib.Repository): Unit = { - val config = repository.getConfig - config.setBoolean("http", null, "receivepack", true) - config.save - } + private def setReceivePack(repository: org.eclipse.jgit.lib.Repository): Unit = + defining(repository.getConfig){ config => + config.setBoolean("http", null, "receivepack", true) + config.save + } def getDefaultBranch(git: Git, repository: RepositoryService.RepositoryInfo, revstr: String = ""): Option[(ObjectId, String)] = { diff --git a/src/main/scala/util/LDAPUtil.scala b/src/main/scala/util/LDAPUtil.scala index 96dd248..9b2adac 100644 --- a/src/main/scala/util/LDAPUtil.scala +++ b/src/main/scala/util/LDAPUtil.scala @@ -1,10 +1,9 @@ package util -import service.SystemSettingsService.Ldap +import util.ControlUtil._ import service.SystemSettingsService import com.novell.ldap._ import service.SystemSettingsService.Ldap -import scala.Some import scala.annotation.tailrec /** @@ -96,12 +95,10 @@ } } - private def findMailAddress(conn: LDAPConnection, userDN: String, mailAttribute: String): Option[String] = { - val results = conn.search(userDN, LDAPConnection.SCOPE_BASE, null, Array[String](mailAttribute), false) - if (results.hasMore) { - Option(results.next.getAttribute(mailAttribute)).map(_.getStringValue) - } else { - None + private def findMailAddress(conn: LDAPConnection, userDN: String, mailAttribute: String): Option[String] = + defining(conn.search(userDN, LDAPConnection.SCOPE_BASE, null, Array[String](mailAttribute), false)){ results => + optionIf (results.hasMore) { + Option(results.next.getAttribute(mailAttribute)).map(_.getStringValue) + } } - } } diff --git a/src/main/scala/util/LockUtil.scala b/src/main/scala/util/LockUtil.scala index 3b6c796..267b28b 100644 --- a/src/main/scala/util/LockUtil.scala +++ b/src/main/scala/util/LockUtil.scala @@ -2,6 +2,7 @@ import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.locks.{ReentrantLock, Lock} +import util.ControlUtil._ object LockUtil { @@ -23,8 +24,7 @@ /** * Synchronizes a given function which modifies the working copy of the wiki repository. */ - def lock[T](key: String)(f: => T): T = { - val lock = getLockObject(key) + def lock[T](key: String)(f: => T): T = defining(getLockObject(key)){ lock => try { lock.lock() f diff --git a/src/main/scala/util/StringUtil.scala b/src/main/scala/util/StringUtil.scala index 3484b83..61c5c18 100644 --- a/src/main/scala/util/StringUtil.scala +++ b/src/main/scala/util/StringUtil.scala @@ -2,14 +2,15 @@ import java.net.{URLDecoder, URLEncoder} import org.mozilla.universalchardet.UniversalDetector +import util.ControlUtil._ object StringUtil { - def sha1(value: String): String = { - val md = java.security.MessageDigest.getInstance("SHA-1") - md.update(value.getBytes) - md.digest.map(b => "%02x".format(b)).mkString - } + def sha1(value: String): String = + defining(java.security.MessageDigest.getInstance("SHA-1")){ md => + md.update(value.getBytes) + md.digest.map(b => "%02x".format(b)).mkString + } def md5(value: String): String = { val md = java.security.MessageDigest.getInstance("MD5") @@ -28,13 +29,13 @@ def convertFromByteArray(content: Array[Byte]): String = new String(content, detectEncoding(content)) - def detectEncoding(content: Array[Byte]): String = { - val detector = new UniversalDetector(null) - detector.handleData(content, 0, content.length) - detector.dataEnd() - detector.getDetectedCharset match { - case null => "UTF-8" - case e => e + def detectEncoding(content: Array[Byte]): String = + defining(new UniversalDetector(null)){ detector => + detector.handleData(content, 0, content.length) + detector.dataEnd() + detector.getDetectedCharset match { + case null => "UTF-8" + case e => e + } } - } } diff --git a/src/main/scala/util/Validations.scala b/src/main/scala/util/Validations.scala index cb92c0d..3b71280 100644 --- a/src/main/scala/util/Validations.scala +++ b/src/main/scala/util/Validations.scala @@ -25,10 +25,7 @@ */ def date(constraints: Constraint*): SingleValueType[java.util.Date] = new SingleValueType[java.util.Date]((pattern("\\d{4}-\\d{2}-\\d{2}") +: constraints): _*){ - def convert(value: String): java.util.Date = { - val formatter = new java.text.SimpleDateFormat("yyyy-MM-dd") - formatter.parse(value) - } + def convert(value: String): java.util.Date = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(value) } }