From 3b9d6070b6fdfef4d874a273cb63bc0c60089c52 Mon Sep 17 00:00:00 2001 From: Dmitry Voronin Date: Mon, 23 Sep 2024 16:00:29 +0300 Subject: [PATCH] Add javadoc before it's too late. --- src/main/scala/Main.scala | 1 + src/main/scala/model/crawler/Crawler.scala | 11 ++++++++++- src/main/scala/model/crawler/TitleCrawler.scala | 5 ++++- src/main/scala/model/handler/Handler.scala | 11 +++++++++++ .../scala/model/handler/TitleCrawlerHandler.scala | 9 ++++++--- src/main/scala/model/lib/StreamUtil.scala | 8 ++++++++ src/main/scala/model/server/Server.scala | 7 +++++++ src/main/scala/model/server/TitleCrawlerServer.scala | 2 +- 8 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/main/scala/Main.scala b/src/main/scala/Main.scala index 028a8c3..1b92ee5 100644 --- a/src/main/scala/Main.scala +++ b/src/main/scala/Main.scala @@ -3,6 +3,7 @@ package com.voronind.doublegis.test import model.server.TitleCrawlerServer @main def main(): Unit = { + // Start the server. val server = new TitleCrawlerServer() server.listen(8000) } diff --git a/src/main/scala/model/crawler/Crawler.scala b/src/main/scala/model/crawler/Crawler.scala index 9d8824a..4cb0b93 100644 --- a/src/main/scala/model/crawler/Crawler.scala +++ b/src/main/scala/model/crawler/Crawler.scala @@ -1,6 +1,15 @@ package com.voronind.doublegis.test package model.crawler +/** + * Web crawler base interface. + * Crawler is used to scrape the required data from a specified url. + */ trait Crawler { - + /** + * Fetch data from url. + * @param url Target to extract from. + * @return Result data. + */ + def crawl(url: String): String } diff --git a/src/main/scala/model/crawler/TitleCrawler.scala b/src/main/scala/model/crawler/TitleCrawler.scala index 89685f8..3722374 100644 --- a/src/main/scala/model/crawler/TitleCrawler.scala +++ b/src/main/scala/model/crawler/TitleCrawler.scala @@ -1,6 +1,9 @@ package com.voronind.doublegis.test package model.crawler +/** + * A crawler that extracts Http Head Title. + */ class TitleCrawler extends Crawler { - + } diff --git a/src/main/scala/model/handler/Handler.scala b/src/main/scala/model/handler/Handler.scala index 744a671..2d3fcd1 100644 --- a/src/main/scala/model/handler/Handler.scala +++ b/src/main/scala/model/handler/Handler.scala @@ -3,6 +3,17 @@ package model.handler import com.sun.net.httpserver.HttpExchange +/** + * Basic trait for a Http handler that handles http connections to a specific context. + */ trait Handler { + /** + * Process incoming connection. + * @param exchange Object used to talk with http server. + */ def handle(exchange: HttpExchange): Unit +} + +trait HandlerCompanion { + val CONTEXT: String } \ No newline at end of file diff --git a/src/main/scala/model/handler/TitleCrawlerHandler.scala b/src/main/scala/model/handler/TitleCrawlerHandler.scala index 82ed35e..24194b4 100644 --- a/src/main/scala/model/handler/TitleCrawlerHandler.scala +++ b/src/main/scala/model/handler/TitleCrawlerHandler.scala @@ -5,6 +5,9 @@ import model.lib.StreamUtil import com.sun.net.httpserver.{HttpExchange, HttpHandler} import java.io.InputStream +/** + * Handle Http Title crawling. + */ class TitleCrawlerHandler extends HttpHandler, Handler { override def handle(exchange: HttpExchange): Unit = { log(exchange.getRequestBody) @@ -12,7 +15,7 @@ class TitleCrawlerHandler extends HttpHandler, Handler { } private def log(body: InputStream): Unit = { - println(f"${TitleCrawlerHandler.context}%s : Got payload.") + println(f"${TitleCrawlerHandler.CONTEXT}%s : Got payload.") StreamUtil.copyStream(body, System.out) println() } @@ -26,6 +29,6 @@ class TitleCrawlerHandler extends HttpHandler, Handler { } } -object TitleCrawlerHandler { - val context = "/crawl_title" +object TitleCrawlerHandler extends HandlerCompanion { + override val CONTEXT = "/crawl_title" } diff --git a/src/main/scala/model/lib/StreamUtil.scala b/src/main/scala/model/lib/StreamUtil.scala index c68fc45..60295a0 100644 --- a/src/main/scala/model/lib/StreamUtil.scala +++ b/src/main/scala/model/lib/StreamUtil.scala @@ -4,7 +4,15 @@ package model.lib import java.io.{InputStream, OutputStream} import scala.language.postfixOps +/** + * Utils for Java IO streams. + */ object StreamUtil { + /** + * Copy one stream into another. + * @param in Source stream. + * @param out Destination stream. + */ def copyStream(in: InputStream, out: OutputStream): Unit = { Iterator .continually(in.read) diff --git a/src/main/scala/model/server/Server.scala b/src/main/scala/model/server/Server.scala index 7394ca6..9e11f70 100644 --- a/src/main/scala/model/server/Server.scala +++ b/src/main/scala/model/server/Server.scala @@ -1,6 +1,13 @@ package com.voronind.doublegis.test package model.server +/** + * Http server. + */ trait Server { + /** + * Bind to specified port and listen for inputs. + * @param port Port to bind the server to. Ranged 0-65535. Ports bellow 1024 require privileged access. + */ def listen(port: Int): Unit } diff --git a/src/main/scala/model/server/TitleCrawlerServer.scala b/src/main/scala/model/server/TitleCrawlerServer.scala index 7686c99..e92078c 100644 --- a/src/main/scala/model/server/TitleCrawlerServer.scala +++ b/src/main/scala/model/server/TitleCrawlerServer.scala @@ -8,7 +8,7 @@ import java.net.InetSocketAddress class TitleCrawlerServer extends Server { override def listen(port: Int): Unit = { val server = HttpServer.create(new InetSocketAddress(port), 0) - server.createContext(TitleCrawlerHandler.context, new TitleCrawlerHandler()) + server.createContext(TitleCrawlerHandler.CONTEXT, new TitleCrawlerHandler()) server.setExecutor(null) server.start()