X-Git-Url: https://git.hedgecode.org/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fhedgecode%2Fchess%2Fscanner%2FChessHogScanner.java;h=87037de57dcfafa0de88c954cbadf767042fcb76;hb=d0c369def92e6876e8f37d257e2fe1b38013b005;hp=1b05efec05af87f8e49dfc69879466200f78bbb3;hpb=412ff2a5b5855bf769e2b767896bfa59f927dde2;p=chesshog-scanner.git diff --git a/src/main/java/org/hedgecode/chess/scanner/ChessHogScanner.java b/src/main/java/org/hedgecode/chess/scanner/ChessHogScanner.java index 1b05efe..87037de 100644 --- a/src/main/java/org/hedgecode/chess/scanner/ChessHogScanner.java +++ b/src/main/java/org/hedgecode/chess/scanner/ChessHogScanner.java @@ -16,10 +16,20 @@ package org.hedgecode.chess.scanner; +import java.net.MalformedURLException; +import java.net.URL; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import org.hedgecode.chess.scanner.entity.PGNGame; +import org.hedgecode.chess.scanner.portal.Chess24Scanner; +import org.hedgecode.chess.scanner.portal.Chess2700Scanner; +import org.hedgecode.chess.scanner.portal.ChessBombScanner; +import org.hedgecode.chess.scanner.portal.ChessComScanner; import org.hedgecode.chess.scanner.portal.ChessGamesScanner; +import org.hedgecode.chess.scanner.portal.LiChessScanner; /** * ChessHogScanner @@ -28,44 +38,94 @@ import org.hedgecode.chess.scanner.portal.ChessGamesScanner; */ public final class ChessHogScanner { - private static ChessHogScanner _instance; + private static ChessHogScanner singleton; - private final Map SCANNERS = new HashMap() { + private final Map scanners = new HashMap() { { - put(ScannerType.CHESSGAMES, new ChessGamesScanner()); + put( ScannerType.CHESSGAMES, new ChessGamesScanner() ); + put( ScannerType.LICHESS, new LiChessScanner() ); + put( ScannerType.CHESSBOMB, new ChessBombScanner() ); + put( ScannerType.CHESS24, new Chess24Scanner() ); + put( ScannerType.CHESSCOM, new ChessComScanner() ); + put( ScannerType.CHESS2700, new Chess2700Scanner() ); } }; - public static Scanner get(ScannerType type) { - return getInstance().scanner(type); + private final Set initScanners = new HashSet<>(); + + /** + * Get Scanner by {@code ScannerType}. + * + * @param type Scanner type (binding to specific chess portal). + * @return Implementation of {@code Scanner} for specific portal. + */ + public static Scanner scanner(ScannerType type) { + return getStore().getScanner(type); + } + + /** + * Scan PGN game by URL (for all scanner types). + * + * @param url URL string for scan. + * @return PGN game. + * @throws ScannerException Incorrect URL or unknown chess portal. + */ + public static PGNGame scan(String url) throws ScannerException { + String hostName; + try { + hostName = new URL(url).getHost(); + } catch (MalformedURLException cause) { + throw new ScannerException( + "scanner.incorrect.url", cause, url + ); + } + ScannerType type = ScannerType.byHost(hostName); + if (type == null) { + throw new ScannerException( + "scanner.host.unknown", hostName + ); + } + return scanner(type).scanUrl(url); } private void init() { + for (ScannerType type : scanners.keySet()) { + init(type); + } + } + + private void init(ScannerType type) { + Scanner scanner = scanners.get(type); try { - for (Scanner scanner : SCANNERS.values()) { - if (scanner instanceof Initiable) { - Initiable initiableScanner = (Initiable) scanner; - initiableScanner.init(); - } + if (scanner instanceof Initiable) { + Initiable initiableScanner = (Initiable) scanner; + initiableScanner.init(); } - } catch (ChessHogScannerException e) { + initScanners.add(type); + } catch (ScannerException e) { throw new RuntimeException(e); } } - private Scanner scanner(ScannerType type) { - return SCANNERS.get(type); + + private Scanner getScanner(ScannerType type) { + if (!initScanners.contains(type)) { + init(type); + } + return scanners.get(type); } private ChessHogScanner() { + if (!ScannerProperties.is("scanner.lazy.init")) { + init(); + } } - private static ChessHogScanner getInstance() { - if (_instance == null) { - _instance = new ChessHogScanner(); - _instance.init(); + private static ChessHogScanner getStore() { + if (singleton == null) { + singleton = new ChessHogScanner(); } - return _instance; + return singleton; } }