Use ControlUtil.

This commit is contained in:
takezoe
2013-09-21 22:13:15 +09:00
parent 18ca3cbd80
commit e89b2020a3
14 changed files with 272 additions and 278 deletions

View File

@@ -1,6 +1,7 @@
package app package app
import util._ import util._
import ControlUtil._
import service._ import service._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
@@ -26,8 +27,7 @@ trait SearchControllerBase extends ControllerBase { self: RepositoryService
} }
get("/:owner/:repository/search")(referrersOnly { repository => get("/:owner/:repository/search")(referrersOnly { repository =>
val query = params("q").trim defining(params("q").trim, params.getOrElse("type", "code")){ case (query, target) =>
val target = params.getOrElse("type", "code")
val page = try { val page = try {
val i = params.getOrElse("page", "1").toInt val i = params.getOrElse("page", "1").toInt
if(i <= 0) 1 else i if(i <= 0) 1 else i
@@ -46,6 +46,7 @@ trait SearchControllerBase extends ControllerBase { self: RepositoryService
countIssues(repository.owner, repository.name, query), countIssues(repository.owner, repository.name, query),
query, page, repository) query, page, repository)
} }
}
}) })
} }

View File

@@ -3,6 +3,7 @@ package app
import service._ import service._
import util.AdminAuthenticator import util.AdminAuthenticator
import util.StringUtil._ import util.StringUtil._
import util.ControlUtil._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
class UserManagementController extends UserManagementControllerBase class UserManagementController extends UserManagementControllerBase
@@ -107,16 +108,15 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
}) })
get("/admin/users/:groupName/_editgroup")(adminOnly { get("/admin/users/:groupName/_editgroup")(adminOnly {
val groupName = params("groupName") defining(params("groupName")){ groupName =>
admin.users.html.group(getAccountByUserName(groupName), getGroupMembers(groupName)) admin.users.html.group(getAccountByUserName(groupName), getGroupMembers(groupName))
}
}) })
post("/admin/users/:groupName/_editgroup", editGroupForm)(adminOnly { form => post("/admin/users/:groupName/_editgroup", editGroupForm)(adminOnly { form =>
val groupName = params("groupName") defining(params("groupName"), form.memberNames.map(_.split(",").toList).getOrElse(Nil)){ case (groupName, memberNames) =>
getAccountByUserName(groupName).map { account => getAccountByUserName(groupName).map { account =>
updateGroup(groupName, form.url) updateGroup(groupName, form.url)
val memberNames = form.memberNames.map(_.split(",").toList).getOrElse(Nil)
updateGroupMembers(form.groupName, memberNames) updateGroupMembers(form.groupName, memberNames)
getRepositoryNamesOfUser(form.groupName).foreach { repositoryName => getRepositoryNamesOfUser(form.groupName).foreach { repositoryName =>
@@ -130,6 +130,7 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
redirect("/admin/users") redirect("/admin/users")
} getOrElse NotFound } getOrElse NotFound
}
}) })
post("/admin/users/_usercheck")(adminOnly { post("/admin/users/_usercheck")(adminOnly {

View File

@@ -2,14 +2,14 @@ package service
import scala.slick.driver.H2Driver.simple._ import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession import Database.threadLocalSession
import model._ import model._
import util.ControlUtil._
trait PullRequestService { self: IssuesService => trait PullRequestService { self: IssuesService =>
import PullRequestService._ import PullRequestService._
def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = { def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] =
val issue = getIssue(owner, repository, issueId.toString) defining(getIssue(owner, repository, issueId.toString)){ issue =>
if(issue.isDefined){ if(issue.isDefined){
Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption match { Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption match {
case Some(pullreq) => Some((issue.get, pullreq)) case Some(pullreq) => Some((issue.get, pullreq))

View File

@@ -10,7 +10,8 @@ import scala.collection.mutable.ListBuffer
import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.lib.FileMode
import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.Git
trait RepositorySearchService { self: IssuesService => trait
RepositorySearchService { self: IssuesService =>
import RepositorySearchService._ import RepositorySearchService._
def countIssues(owner: String, repository: String, query: String): Int = def countIssues(owner: String, repository: String, query: String): Int =

View File

@@ -1,12 +1,13 @@
package service package service
import util.Directory._ import util.Directory._
import util.ControlUtil._
import SystemSettingsService._ import SystemSettingsService._
trait SystemSettingsService { trait SystemSettingsService {
def saveSystemSettings(settings: SystemSettings): Unit = { def saveSystemSettings(settings: SystemSettings): Unit = {
val props = new java.util.Properties() defining(new java.util.Properties()){ props =>
props.setProperty(AllowAccountRegistration, settings.allowAccountRegistration.toString) props.setProperty(AllowAccountRegistration, settings.allowAccountRegistration.toString)
props.setProperty(Gravatar, settings.gravatar.toString) props.setProperty(Gravatar, settings.gravatar.toString)
props.setProperty(Notification, settings.notification.toString) props.setProperty(Notification, settings.notification.toString)
@@ -33,10 +34,11 @@ trait SystemSettingsService {
} }
props.store(new java.io.FileOutputStream(GitBucketConf), null) props.store(new java.io.FileOutputStream(GitBucketConf), null)
} }
}
def loadSystemSettings(): SystemSettings = { def loadSystemSettings(): SystemSettings = {
val props = new java.util.Properties() defining(new java.util.Properties()){ props =>
if(GitBucketConf.exists){ if(GitBucketConf.exists){
props.load(new java.io.FileInputStream(GitBucketConf)) props.load(new java.io.FileInputStream(GitBucketConf))
} }
@@ -69,6 +71,7 @@ trait SystemSettingsService {
} }
) )
} }
}
} }
@@ -119,20 +122,20 @@ object SystemSettingsService {
private val LdapUserNameAttribute = "ldap.username_attribute" private val LdapUserNameAttribute = "ldap.username_attribute"
private val LdapMailAddressAttribute = "ldap.mail_attribute" private val LdapMailAddressAttribute = "ldap.mail_attribute"
private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = { private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A =
val value = props.getProperty(key) defining(props.getProperty(key)){ value =>
if(value == null || value.isEmpty) default if(value == null || value.isEmpty) default
else convertType(value).asInstanceOf[A] else convertType(value).asInstanceOf[A]
} }
private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] = { private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] =
val value = props.getProperty(key) defining(props.getProperty(key)){ value =>
if(value == null || value.isEmpty) default if(value == null || value.isEmpty) default
else Some(convertType(value)).asInstanceOf[Option[A]] else Some(convertType(value)).asInstanceOf[Option[A]]
} }
private def convertType[A: ClassTag](value: String) = { private def convertType[A: ClassTag](value: String) =
val c = implicitly[ClassTag[A]].runtimeClass defining(implicitly[ClassTag[A]].runtimeClass){ c =>
if(c == classOf[Boolean]) value.toBoolean if(c == classOf[Boolean]) value.toBoolean
else if(c == classOf[Int]) value.toInt else if(c == classOf[Int]) value.toInt
else value else value

View File

@@ -34,9 +34,9 @@ object WikiService {
trait WikiService { trait WikiService {
import 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"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
val dir = Directory.getWikiRepositoryDir(owner, repository) defining(Directory.getWikiRepositoryDir(owner, repository)){ dir =>
if(!dir.exists){ if(!dir.exists){
try { try {
JGitUtil.initRepository(dir) JGitUtil.initRepository(dir)
@@ -54,20 +54,20 @@ trait WikiService {
*/ */
def getWikiPage(owner: String, repository: String, pageName: String): Option[WikiPageInfo] = { def getWikiPage(owner: String, repository: String, pageName: String): Option[WikiPageInfo] = {
using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git => 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 => 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) 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. * 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 => using(Git.open(Directory.getWikiRepositoryDir(owner, repository))){ git =>
if(!JGitUtil.isEmpty(git)){ optionIf(!JGitUtil.isEmpty(git)){
val index = path.lastIndexOf('/') val index = path.lastIndexOf('/')
val parentPath = if(index < 0) "." else path.substring(0, index) val parentPath = if(index < 0) "." else path.substring(0, index)
val fileName = if(index < 0) path else path.substring(index + 1) val fileName = if(index < 0) path else path.substring(index + 1)
@@ -75,7 +75,6 @@ trait WikiService {
JGitUtil.getFileList(git, "master", parentPath).find(_.name == fileName).map { file => JGitUtil.getFileList(git, "master", parentPath).find(_.name == fileName).map { file =>
git.getRepository.open(file.id).getBytes git.getRepository.open(file.id).getBytes
} }
} else None
} }
} }
@@ -98,36 +97,31 @@ trait WikiService {
content: String, committer: model.Account, message: String): Option[String] = { content: String, committer: model.Account, message: String): Option[String] = {
LockUtil.lock(s"${owner}/${repository}/wiki"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
defining(Directory.getWikiWorkDir(owner, repository)){ workDir =>
// clone working copy // clone working copy
val workDir = Directory.getWikiWorkDir(owner, repository)
cloneOrPullWorkingCopy(workDir, owner, repository) cloneOrPullWorkingCopy(workDir, owner, repository)
// write as file // write as file
using(Git.open(workDir)){ git => using(Git.open(workDir)){ git =>
val file = new File(workDir, newPageName + ".md") defining(new File(workDir, newPageName + ".md")){ file =>
val added = if(!file.exists || FileUtils.readFileToString(file, "UTF-8") != content){ val added = executeIf(!file.exists || FileUtils.readFileToString(file, "UTF-8") != content){
FileUtils.writeStringToFile(file, content, "UTF-8") FileUtils.writeStringToFile(file, content, "UTF-8")
git.add.addFilepattern(file.getName).call git.add.addFilepattern(file.getName).call
true
} else {
false
} }
// delete file // delete file
val deleted = if(currentPageName != "" && currentPageName != newPageName){ val deleted = executeIf(currentPageName != "" && currentPageName != newPageName){
git.rm.addFilepattern(currentPageName + ".md").call git.rm.addFilepattern(currentPageName + ".md").call
true
} else {
false
} }
// commit and push // commit and push
if(added || deleted){ optionIf(added || deleted){
val commit = git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(message).call defining(git.commit.setCommitter(committer.userName, committer.mailAddress).setMessage(message).call){ commit =>
git.push.call git.push.call
Some(commit.getName) Some(commit.getName)
} else { }
None }
}
} }
} }
} }
@@ -139,8 +133,8 @@ trait WikiService {
def deleteWikiPage(owner: String, repository: String, pageName: String, def deleteWikiPage(owner: String, repository: String, pageName: String,
committer: String, mailAddress: String, message: String): Unit = { committer: String, mailAddress: String, message: String): Unit = {
LockUtil.lock(s"${owner}/${repository}/wiki"){ LockUtil.lock(s"${owner}/${repository}/wiki"){
defining(Directory.getWikiWorkDir(owner, repository)){ workDir =>
// clone working copy // clone working copy
val workDir = Directory.getWikiWorkDir(owner, repository)
cloneOrPullWorkingCopy(workDir, owner, repository) cloneOrPullWorkingCopy(workDir, owner, repository)
// delete file // delete file
@@ -155,20 +149,19 @@ trait WikiService {
} }
} }
} }
}
private def cloneOrPullWorkingCopy(workDir: File, owner: String, repository: String): Unit = { private def cloneOrPullWorkingCopy(workDir: File, owner: String, repository: String): Unit = {
if(!workDir.exists){ if(!workDir.exists){
val git =
Git.cloneRepository Git.cloneRepository
.setURI(Directory.getWikiRepositoryDir(owner, repository).toURI.toString) .setURI(Directory.getWikiRepositoryDir(owner, repository).toURI.toString)
.setDirectory(workDir) .setDirectory(workDir)
.call .call
git.getRepository.close // close .git resources. .getRepository
} else { .close
using(Git.open(workDir)){ git => } else using(Git.open(workDir)){ git =>
git.pull.call git.pull.call
} }
} }
}
} }

View File

@@ -6,7 +6,9 @@ import org.apache.commons.io.FileUtils
import javax.servlet.ServletContextEvent import javax.servlet.ServletContextEvent
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import util.Directory import util.Directory._
import util.ControlUtil._
import org.eclipse.jgit.api.Git
object AutoUpdate { object AutoUpdate {
@@ -26,15 +28,14 @@ object AutoUpdate {
*/ */
def update(conn: Connection): Unit = { def update(conn: Connection): Unit = {
val sqlPath = s"update/${majorVersion}_${minorVersion}.sql" val sqlPath = s"update/${majorVersion}_${minorVersion}.sql"
val in = Thread.currentThread.getContextClassLoader.getResourceAsStream(sqlPath)
using(Thread.currentThread.getContextClassLoader.getResourceAsStream(sqlPath)){ in =>
if(in != null){ if(in != null){
val sql = IOUtils.toString(in, "UTF-8") val sql = IOUtils.toString(in, "UTF-8")
val stmt = conn.createStatement() using(conn.createStatement()){ stmt =>
try {
logger.debug(sqlPath + "=" + sql) logger.debug(sqlPath + "=" + sql)
stmt.executeUpdate(sql) stmt.executeUpdate(sql)
} finally { }
stmt.close()
} }
} }
} }
@@ -56,16 +57,17 @@ object AutoUpdate {
override def update(conn: Connection): Unit = { override def update(conn: Connection): Unit = {
super.update(conn) super.update(conn)
// Fix wiki repository configuration // Fix wiki repository configuration
val rs = conn.createStatement.executeQuery("SELECT USER_NAME, REPOSITORY_NAME FROM REPOSITORY") using(conn.createStatement.executeQuery("SELECT USER_NAME, REPOSITORY_NAME FROM REPOSITORY")){ rs =>
while(rs.next){ while(rs.next){
val wikidir = Directory.getWikiRepositoryDir(rs.getString("USER_NAME"), rs.getString("REPOSITORY_NAME")) using(Git.open(getWikiRepositoryDir(rs.getString("USER_NAME"), rs.getString("REPOSITORY_NAME")))){ git =>
val repository = org.eclipse.jgit.api.Git.open(wikidir).getRepository defining(git.getRepository.getConfig){ config =>
val config = repository.getConfig
if(!config.getBoolean("http", "receivepack", false)){ if(!config.getBoolean("http", "receivepack", false)){
config.setBoolean("http", null, "receivepack", true) config.setBoolean("http", null, "receivepack", true)
config.save config.save
} }
repository.close }
}
}
} }
} }
}, },
@@ -82,7 +84,7 @@ object AutoUpdate {
/** /**
* The version file (GITBUCKET_HOME/version). * 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. * Returns the current version from the version file.
@@ -113,14 +115,14 @@ class AutoUpdateListener extends org.h2.server.web.DbStarter {
private val logger = LoggerFactory.getLogger(classOf[AutoUpdateListener]) private val logger = LoggerFactory.getLogger(classOf[AutoUpdateListener])
override def contextInitialized(event: ServletContextEvent): Unit = { 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) super.contextInitialized(event)
logger.debug("H2 started") logger.debug("H2 started")
logger.debug("Start schema update") logger.debug("Start schema update")
val conn = getConnection() defining(getConnection()){ conn =>
try { try {
val currentVersion = getCurrentVersion() defining(getCurrentVersion()){ currentVersion =>
if(currentVersion == headVersion){ if(currentVersion == headVersion){
logger.debug("No update") logger.debug("No update")
} else { } else {
@@ -129,6 +131,7 @@ class AutoUpdateListener extends org.h2.server.web.DbStarter {
conn.commit() conn.commit()
logger.debug("Updated from " + currentVersion.versionString + " to " + headVersion.versionString) logger.debug("Updated from " + currentVersion.versionString + " to " + headVersion.versionString)
} }
}
} catch { } catch {
case ex: Throwable => { case ex: Throwable => {
logger.error("Failed to schema update", ex) logger.error("Failed to schema update", ex)
@@ -136,6 +139,7 @@ class AutoUpdateListener extends org.h2.server.web.DbStarter {
conn.rollback() conn.rollback()
} }
} }
}
logger.debug("End schema update") logger.debug("End schema update")
} }

View File

@@ -33,5 +33,18 @@ object ControlUtil {
git.getRepository.close 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
}
} }

View File

@@ -69,29 +69,17 @@ object JGitUtil {
rev.getFullMessage, rev.getFullMessage,
rev.getParents().map(_.name).toList) rev.getParents().map(_.name).toList)
val summary = { val summary = defining(fullMessage.trim.indexOf("\n")){ i =>
val i = fullMessage.trim.indexOf("\n") defining(if(i >= 0) fullMessage.trim.substring(0, i).trim else fullMessage){ firstLine =>
val firstLine = if(i >= 0){ if(firstLine.length > shortMessage.length) shortMessage else firstLine
fullMessage.trim.substring(0, i).trim
} else {
fullMessage
}
if(firstLine.length > shortMessage.length){
shortMessage
} else {
firstLine
} }
} }
val description = { val description = defining(fullMessage.trim.indexOf("\n")){ i =>
val i = fullMessage.trim.indexOf("\n") optionIf(i >= 0){
if(i >= 0){
Some(fullMessage.trim.substring(i).trim) Some(fullMessage.trim.substring(i).trim)
} else {
None
} }
} }
} }
case class DiffInfo(changeType: ChangeType, oldPath: String, newPath: String, oldContent: Option[String], newContent: Option[String]) case class DiffInfo(changeType: ChangeType, oldPath: String, newPath: String, oldContent: Option[String], newContent: Option[String])
@@ -462,26 +450,21 @@ object JGitUtil {
} }
} }
def initRepository(dir: java.io.File): Unit = { def initRepository(dir: java.io.File): Unit =
using(new RepositoryBuilder().setGitDir(dir).setBare.build){ repository => using(new RepositoryBuilder().setGitDir(dir).setBare.build){ repository =>
repository.create repository.create
setReceivePack(repository) setReceivePack(repository)
} }
}
def cloneRepository(from: java.io.File, to: java.io.File): Unit = { def cloneRepository(from: java.io.File, to: java.io.File): Unit =
val git = Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call using(Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call){ git =>
try {
setReceivePack(git.getRepository) setReceivePack(git.getRepository)
} finally {
git.getRepository.close
}
} }
def isEmpty(git: Git): Boolean = git.getRepository.resolve(Constants.HEAD) == null def isEmpty(git: Git): Boolean = git.getRepository.resolve(Constants.HEAD) == null
private def setReceivePack(repository: org.eclipse.jgit.lib.Repository): Unit = { private def setReceivePack(repository: org.eclipse.jgit.lib.Repository): Unit =
val config = repository.getConfig defining(repository.getConfig){ config =>
config.setBoolean("http", null, "receivepack", true) config.setBoolean("http", null, "receivepack", true)
config.save config.save
} }

View File

@@ -1,10 +1,9 @@
package util package util
import service.SystemSettingsService.Ldap import util.ControlUtil._
import service.SystemSettingsService import service.SystemSettingsService
import com.novell.ldap._ import com.novell.ldap._
import service.SystemSettingsService.Ldap import service.SystemSettingsService.Ldap
import scala.Some
import scala.annotation.tailrec import scala.annotation.tailrec
/** /**
@@ -96,12 +95,10 @@ object LDAPUtil {
} }
} }
private def findMailAddress(conn: LDAPConnection, userDN: String, mailAttribute: String): Option[String] = { private def findMailAddress(conn: LDAPConnection, userDN: String, mailAttribute: String): Option[String] =
val results = conn.search(userDN, LDAPConnection.SCOPE_BASE, null, Array[String](mailAttribute), false) defining(conn.search(userDN, LDAPConnection.SCOPE_BASE, null, Array[String](mailAttribute), false)){ results =>
if (results.hasMore) { optionIf (results.hasMore) {
Option(results.next.getAttribute(mailAttribute)).map(_.getStringValue) Option(results.next.getAttribute(mailAttribute)).map(_.getStringValue)
} else {
None
} }
} }
} }

View File

@@ -2,6 +2,7 @@ package util
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.locks.{ReentrantLock, Lock} import java.util.concurrent.locks.{ReentrantLock, Lock}
import util.ControlUtil._
object LockUtil { object LockUtil {
@@ -23,8 +24,7 @@ object LockUtil {
/** /**
* Synchronizes a given function which modifies the working copy of the wiki repository. * Synchronizes a given function which modifies the working copy of the wiki repository.
*/ */
def lock[T](key: String)(f: => T): T = { def lock[T](key: String)(f: => T): T = defining(getLockObject(key)){ lock =>
val lock = getLockObject(key)
try { try {
lock.lock() lock.lock()
f f

View File

@@ -2,11 +2,12 @@ package util
import java.net.{URLDecoder, URLEncoder} import java.net.{URLDecoder, URLEncoder}
import org.mozilla.universalchardet.UniversalDetector import org.mozilla.universalchardet.UniversalDetector
import util.ControlUtil._
object StringUtil { object StringUtil {
def sha1(value: String): String = { def sha1(value: String): String =
val md = java.security.MessageDigest.getInstance("SHA-1") defining(java.security.MessageDigest.getInstance("SHA-1")){ md =>
md.update(value.getBytes) md.update(value.getBytes)
md.digest.map(b => "%02x".format(b)).mkString md.digest.map(b => "%02x".format(b)).mkString
} }
@@ -28,8 +29,8 @@ object StringUtil {
def convertFromByteArray(content: Array[Byte]): String = new String(content, detectEncoding(content)) def convertFromByteArray(content: Array[Byte]): String = new String(content, detectEncoding(content))
def detectEncoding(content: Array[Byte]): String = { def detectEncoding(content: Array[Byte]): String =
val detector = new UniversalDetector(null) defining(new UniversalDetector(null)){ detector =>
detector.handleData(content, 0, content.length) detector.handleData(content, 0, content.length)
detector.dataEnd() detector.dataEnd()
detector.getDetectedCharset match { detector.getDetectedCharset match {

View File

@@ -25,10 +25,7 @@ trait Validations {
*/ */
def date(constraints: Constraint*): SingleValueType[java.util.Date] = def date(constraints: Constraint*): SingleValueType[java.util.Date] =
new SingleValueType[java.util.Date]((pattern("\\d{4}-\\d{2}-\\d{2}") +: constraints): _*){ new SingleValueType[java.util.Date]((pattern("\\d{4}-\\d{2}-\\d{2}") +: constraints): _*){
def convert(value: String): java.util.Date = { def convert(value: String): java.util.Date = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(value)
val formatter = new java.text.SimpleDateFormat("yyyy-MM-dd")
formatter.parse(value)
}
} }
} }