Some refactoring / Scalafication

master
Abhinav Sarkar 2013-05-21 23:31:40 +05:30
parent b5b7ec12b2
commit 72ac950374
5 changed files with 64 additions and 63 deletions

View File

@ -26,20 +26,24 @@ trait HttpRequestHandler extends ChannelInboundMessageHandlerAdapter[HttpRequest
response response
} }
protected def sendSuccess(ctx : ChannelHandlerContext, request : HttpRequest, body : String) : HttpResponse = { private def sendReponse(ctx: ChannelHandlerContext, request: HttpRequest,
val response = new DefaultHttpResponse(HTTP_1_1, OK) response: HttpResponse, body: String): HttpResponse = {
response.setContent(Unpooled.copiedBuffer(body.getBytes)) response.setContent(Unpooled.copiedBuffer(body.getBytes))
response.setHeader(CONTENT_TYPE, "application/json") response.setHeader(CONTENT_TYPE, "application/json")
writeResponse(ctx, request, response) writeResponse(ctx, request, response)
response response
} }
protected def sendError(ctx : ChannelHandlerContext, request : HttpRequest, body : String) : HttpResponse = { protected def sendSuccess(ctx : ChannelHandlerContext, request : HttpRequest, body : String) = {
val response = new DefaultHttpResponse(HTTP_1_1, INTERNAL_SERVER_ERROR) sendReponse(ctx, request, new DefaultHttpResponse(HTTP_1_1, OK), body)
response.setContent(Unpooled.copiedBuffer(body.getBytes)) }
response.setHeader(CONTENT_TYPE, "text/plain")
writeResponse(ctx, request, response) protected def sendServerError(ctx : ChannelHandlerContext, request : HttpRequest, body : String) = {
response sendReponse(ctx, request, new DefaultHttpResponse(HTTP_1_1, INTERNAL_SERVER_ERROR), body)
}
protected def sendClientError(ctx : ChannelHandlerContext, request : HttpRequest, body : String) = {
sendReponse(ctx, request, new DefaultHttpResponse(HTTP_1_1, BAD_REQUEST), body)
} }
protected def writeResponse( protected def writeResponse(

View File

@ -70,7 +70,7 @@ object Server extends App with Logging {
} }
} }
def stopServer(server : ServerBootstrap) { private def stopServer(server : ServerBootstrap) {
logger.info("Stopping server") logger.info("Stopping server")
server.shutdown server.shutdown
logger.info("Stopped server") logger.info("Stopped server")
@ -79,7 +79,7 @@ object Server extends App with Logging {
} }
@Sharable @Sharable
object UnifiedHandler extends ChannelInboundByteHandlerAdapter { private object UnifiedHandler extends ChannelInboundByteHandlerAdapter {
val httpRequestRouter = new HttpRequestRouter { val httpRequestRouter = new HttpRequestRouter {
val Echo = "^/echo$".r val Echo = "^/echo$".r
@ -132,7 +132,7 @@ object UnifiedHandler extends ChannelInboundByteHandlerAdapter {
} }
class TcpIndexHandler extends ChannelInboundMessageHandlerAdapter[String] { private class TcpIndexHandler extends ChannelInboundMessageHandlerAdapter[String] {
var server: String = null var server: String = null
var channel : String = null var channel : String = null
var botName : String = null var botName : String = null
@ -148,14 +148,14 @@ class TcpIndexHandler extends ChannelInboundMessageHandlerAdapter[String] {
botName = values(2) botName = values(2)
inited = true inited = true
} else { } else {
Indexer.index(new IndexRequest(server, channel, botName, Indexer.index(IndexRequest(server, channel, botName,
List(ChatLine(values(0), values(1).toLong, values(2))))) List(ChatLine(values(0), values(1).toLong, values(2)))))
} }
} }
} }
@Sharable @Sharable
object EchoHandler extends HttpRequestHandler { private object EchoHandler extends HttpRequestHandler {
override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) { override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) {
val content = request.getContent().toString(Charset.forName("UTF-8")) val content = request.getContent().toString(Charset.forName("UTF-8"))
logRequest(ctx, request, sendSuccess(ctx, request, content)) logRequest(ctx, request, sendSuccess(ctx, request, content))
@ -163,7 +163,7 @@ object EchoHandler extends HttpRequestHandler {
} }
@Sharable @Sharable
class IndexHandler extends HttpRequestHandler { private class IndexHandler extends HttpRequestHandler {
implicit val formats = DefaultFormats implicit val formats = DefaultFormats
override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) { override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) {
future { future {
@ -176,7 +176,7 @@ class IndexHandler extends HttpRequestHandler {
} }
@Sharable @Sharable
object SearchHandler extends HttpRequestHandler { private object SearchHandler extends HttpRequestHandler {
implicit val formats = DefaultFormats implicit val formats = DefaultFormats
override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) { override def messageReceived(ctx: ChannelHandlerContext, request: HttpRequest) {
val f = future { val f = future {
@ -186,15 +186,12 @@ object SearchHandler extends HttpRequestHandler {
Serialization.read[SearchRequest](content) Serialization.read[SearchRequest](content)
} else if (HttpMethod.GET.equals(method)) { } else if (HttpMethod.GET.equals(method)) {
val params = new QueryStringDecoder(request.getUri).getParameters.toMap val params = new QueryStringDecoder(request.getUri).getParameters.toMap
val server = params("server")(0) val List(server, channel, botName, query) =
val channel = params("channel")(0) List("server", "channel", "botName", "query").map(params(_).get(0))
val botName = params("botName")(0) val List(page, pageSize, details) =
val query = params("query")(0) List("page", "pageSize", "details").map(params.get(_).map({ case l => l.get(0) }))
val page = params.get("page").collect({ case l => l.get(0) })
val pageSize = params.get("pageSize").collect({ case l => l.get(0) })
val details = params.get("details").collect({ case l => l.get(0) })
var sr = new SearchRequest(server, channel, botName, query) var sr = SearchRequest(server, channel, botName, query)
if (page.isDefined) if (page.isDefined)
sr = sr.copy(page = page.get.toInt) sr = sr.copy(page = page.get.toInt)
if (pageSize.isDefined) if (pageSize.isDefined)
@ -210,16 +207,23 @@ object SearchHandler extends HttpRequestHandler {
} }
f onSuccess { f onSuccess {
case (searchRequest, searchResult) => case (searchRequest, searchResult) =>
logRequest(ctx, request, logRequest(ctx, request, sendSuccess(ctx, request,
sendSuccess(ctx, request, Serialization.write(
if (searchRequest.details) if (searchRequest.details) searchResult else searchResult.toSimpleSearchResult)))
Serialization.write(searchResult) }
else f onFailure {
Serialization.write(searchResult.toSimpleSearchResult))) case e => {
logger.error("Error", e)
val body = Serialization.write(SearchError(e.getMessage))
e match {
case e : NoSuchElementException => {
logRequest(ctx, request, sendClientError(ctx, request, body))
}
case _ => {
logRequest(ctx, request, sendServerError(ctx, request, body))
}
}
}
} }
f onFailure { case e : Exception => {
logger.error("Error", e)
logRequest(ctx, request, sendError(ctx, request, e.getMessage))
}}
} }
} }

View File

@ -41,9 +41,7 @@ object Indexer extends Logging {
object IndexRecord { object IndexRecord {
def fromIndexRequest(indexRequest : IndexRequest) = { def fromIndexRequest(indexRequest : IndexRequest) = {
val IndexRequest(server, channel, botName, chatLines) = indexRequest val IndexRequest(server, channel, botName, chatLines) = indexRequest
for { chatLines.map(IndexRecord(server, channel, botName, _))
chatLine <- chatLines
} yield new IndexRecord(server, channel, botName, chatLine)
} }
} }
@ -64,14 +62,12 @@ object Indexer extends Logging {
private val indexers = mutable.Map[String, IndexWriter]() private val indexers = mutable.Map[String, IndexWriter]()
private def close { private def close {
for (indexer <- indexers.values) indexers.values.foreach(_.close)
indexer.close
logger.info("Closed Indexer") logger.info("Closed Indexer")
} }
private def flush { private def flush {
for (indexer <- indexers.values) indexers.values.foreach(_.commit)
indexer.commit
logger.info("Flushed Indexer") logger.info("Flushed Indexer")
} }
@ -145,7 +141,7 @@ object Indexer extends Logging {
def start { def start {
logger.info("Starting indexer") logger.info("Starting indexer")
indexingFuture = schedule(0, IndexingDurationSecs.max(ContextDurationSecs), TimeUnit.SECONDS) { indexingFuture = schedule(0, IndexingDurationSecs, TimeUnit.SECONDS) {
if (!indexQueue.isEmpty) { if (!indexQueue.isEmpty) {
val indexRecs = new ArrayList[IndexRecord] val indexRecs = new ArrayList[IndexRecord]
indexQueue drainTo indexRecs indexQueue drainTo indexRecs
@ -172,6 +168,7 @@ object Indexer extends Logging {
} }
} }
} }
flushFuture = schedule(0, FlushDurationSecs, TimeUnit.SECONDS) { flushFuture = schedule(0, FlushDurationSecs, TimeUnit.SECONDS) {
doInLock(flush) doInLock(flush)
} }

View File

@ -28,8 +28,7 @@ object Searcher extends Logging {
private val searcherMgrs = mutable.Map[String, SearcherManager]() private val searcherMgrs = mutable.Map[String, SearcherManager]()
def close { def close {
for (searcherMgr <- searcherMgrs.values) searcherMgrs.values.foreach(_.close)
searcherMgr.close
logger.info("Closed Searcher") logger.info("Closed Searcher")
} }
@ -41,7 +40,6 @@ object Searcher extends Logging {
val dir = FSDirectory.open(indexDir) val dir = FSDirectory.open(indexDir)
searcherMgrs += (dirPath -> new SearcherManager(dir, new SearcherFactory)) searcherMgrs += (dirPath -> new SearcherManager(dir, new SearcherFactory))
} }
} }
@ -71,23 +69,18 @@ object Searcher extends Logging {
filterQuery.add(clause) filterQuery.add(clause)
filters += new QueryWrapperFilter(filterQuery) filters += new QueryWrapperFilter(filterQuery)
} }
case "before" => { case "before" => try {
try { val ts = sdf.parse(termQuery.getTerm.text).getTime
val ts = sdf.parse(termQuery.getTerm.text).getTime filters += NumericRangeFilter.newLongRange(ChatLine.TS, 0, ts, true, true)
filters += NumericRangeFilter.newLongRange( } catch {
ChatLine.TS, 0, ts, true, true) case e : ParseException => {}
} catch {
case e : ParseException => {}
}
} }
case "after" => { case "after" => try {
try { val ts = sdf.parse(termQuery.getTerm.text).getTime
val ts = sdf.parse(termQuery.getTerm.text).getTime filters += NumericRangeFilter.newLongRange(
filters += NumericRangeFilter.newLongRange( ChatLine.TS, ts, java.lang.Long.MAX_VALUE, true, true)
ChatLine.TS, ts, java.lang.Long.MAX_VALUE, true, true) } catch {
} catch { case e : ParseException => {}
case e : ParseException => {}
}
} }
case _ => newQuery.add(clause) case _ => newQuery.add(clause)
} }
@ -108,7 +101,8 @@ object Searcher extends Logging {
logger.debug("Searching : [{} {} {}] {}", logger.debug("Searching : [{} {} {}] {}",
searchRequest.server, searchRequest.channel, searchRequest.botName, searchRequest.query) searchRequest.server, searchRequest.channel, searchRequest.botName, searchRequest.query)
val indexDir = Indexer.getIndexDir(searchRequest.server, searchRequest.channel, searchRequest.botName) val indexDir =
Indexer.getIndexDir(searchRequest.server, searchRequest.channel, searchRequest.botName)
val analyzer = Indexer.mkAnalyzer val analyzer = Indexer.mkAnalyzer
try { try {
val queryParser = mkQueryParser(analyzer) val queryParser = mkQueryParser(analyzer)
@ -147,10 +141,10 @@ object Searcher extends Logging {
val LineRe = "(\\d+) (.*?): (.*)".r val LineRe = "(\\d+) (.*?): (.*)".r
val List(ctxBefore, ctxAfter) = List(contextBefore, contextAfter).map { val List(ctxBefore, ctxAfter) = List(contextBefore, contextAfter).map {
_.split('\n').filterNot(_.isEmpty).map { _.split('\n').filterNot(_.isEmpty).map {
case LineRe(timestamp, user, message) => new ChatLine(user, timestamp.toLong, message) case LineRe(timestamp, user, message) => ChatLine(user, timestamp.toLong, message)
}} }}
val chatLine = new ChatLine(user, timestamp.toLong, message, ctxBefore.toList, ctxAfter.toList) val chatLine = ChatLine(user, timestamp.toLong, message, ctxBefore.toList, ctxAfter.toList)
(chatLine, score) (chatLine, score)
} }
(topDocs.totalHits, docs.toList) (topDocs.totalHits, docs.toList)

View File

@ -43,3 +43,5 @@ object SearchResult {
case class SimpleSearchResult( case class SimpleSearchResult(
server : String, channel : String, botName : String, query: String, server : String, channel : String, botName : String, query: String,
page : Int, pageSize : Int, totalResults : Int, lines : List[List[List[String]]]) page : Int, pageSize : Int, totalResults : Int, lines : List[List[List[String]]])
case class SearchError(error : String)