[LIB-13] Locale resource settings
[chesshog-scanner.git] / src / main / java / org / hedgecode / chess / scanner / portal / ChessGamesScanner.java
index c07e392..392f398 100644 (file)
@@ -20,18 +20,18 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.hedgecode.chess.scanner.ChessHogScannerException;
+import org.hedgecode.chess.scanner.Scanner;
+import org.hedgecode.chess.scanner.ScannerException;
+import org.hedgecode.chess.scanner.StringUtils;
 import org.hedgecode.chess.scanner.entity.PGNGame;
 import org.hedgecode.chess.scanner.entity.PGNTournament;
-import org.hedgecode.chess.scanner.regex.RegexMatcherResult;
-import org.hedgecode.chess.scanner.regex.RegexResult;
 
 /**
  * ChessGamesScanner
  *
  * @author Dmitry Samoshin aka gotty
  */
-public class ChessGamesScanner extends AbstractSettingsScanner {
+public class ChessGamesScanner extends AbstractSettingsScanner implements Scanner {
 
     private static final String SETTINGS_FILENAME = "chessgames.settings";
 
@@ -41,26 +41,23 @@ public class ChessGamesScanner extends AbstractSettingsScanner {
     }
 
     @Override
-    public PGNTournament getTournament(String tournamentId) throws ChessHogScannerException {
+    public PGNTournament scanTournament(String tournamentId) throws ScannerException {
         PGNTournament tournament = new PGNTournament(tournamentId);
         assignTournamentGames(tournament);
         return tournament;
     }
 
     @Override
-    public PGNTournament findTournament(String tournamentName) throws ChessHogScannerException {
-        RegexResult result = matchRequest(
+    public PGNTournament findTournament(String tournamentName) throws ScannerException {
+        PGNTournament tournament = null;
+        Map<String, String> result = matchMap(
                 assignUrl(
                         tournamentName, true
                 ),
-                new RegexMatcherResult(
-                        getSettings().getTournamentQueryUrlRegex(),
-                        true,
-                        true
-                )
+                getSettings().getTournamentQueryUrlRegex(),
+                true
         );
-        PGNTournament tournament = null;
-        for (Map.Entry<String, String> entry : result.resultMap().entrySet()) {
+        for (Map.Entry<String, String> entry : result.entrySet()) {
             if (entry.getValue().contains(tournamentName)) { // todo: contains?
                 tournament = new PGNTournament(
                         entry.getKey(),
@@ -75,23 +72,51 @@ public class ChessGamesScanner extends AbstractSettingsScanner {
     }
 
     @Override
-    public PGNGame getGame(String gameId) throws ChessHogScannerException {
+    public PGNGame scanGame(String gameId) throws ScannerException {
         String pgn = request(
                 assignUrl(gameId)
         );
+        if (!StringUtils.isPgn(pgn)) {
+            throw new ScannerException(
+                    "scanner.failed.request.game", gameId
+            );
+        }
         return new PGNGame(
                 gameId, pgn
         );
     }
 
-    private void assignTournamentGames(PGNTournament tournament) throws ChessHogScannerException {
+    @Override
+    public PGNGame scanGame(String gameId, String tournamentId) throws ScannerException {
+        return scanGame(gameId);
+    }
+
+    @Override
+    public PGNGame scanUrl(String gameUrl) throws ScannerException {
+        String gamePage = request(gameUrl);
+        String pgn = StringUtils.match(
+                gamePage,
+                getSettings().getGameUrlRegex()
+        );
+        if (pgn == null || !StringUtils.isPgn(pgn)) {
+            throw new ScannerException(
+                    "scanner.failed.request.url", gameUrl
+            );
+        }
+        return new PGNGame(
+                null,
+                pgn
+        );
+    }
+
+    private void assignTournamentGames(PGNTournament tournament) throws ScannerException {
         tournament.clearGames();
         List<String> gamesId = new ArrayList<>();
 
         List<String> pageGamesId;
         int pageId = 0;
         do {
-            pageGamesId = matchRequest(
+            pageGamesId = match(
                     assignUrl(
                             tournament.id(),
                             Integer.toString(++pageId)
@@ -106,7 +131,7 @@ public class ChessGamesScanner extends AbstractSettingsScanner {
 
         for (String gameId : gamesId) {
             tournament.addGame(
-                    getGame(gameId)
+                    scanGame(gameId)
             );
         }
     }