/* * Copyright (c) 2019-2020. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.scanner.portal; import java.util.ArrayList; import java.util.List; import java.util.Map; 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; /** * ChessGamesScanner * * @author Dmitry Samoshin aka gotty */ public class ChessGamesScanner extends AbstractSettingsScanner implements Scanner { private static final String SETTINGS_FILENAME = "chessgames.settings"; @Override protected String getResourceName() { return SETTINGS_FILENAME; } @Override public PGNTournament scanTournament(String tournamentId) throws ScannerException { PGNTournament tournament = new PGNTournament(tournamentId); assignTournamentGames(tournament); return tournament; } @Override public PGNTournament findTournament(String tournamentName) throws ScannerException { PGNTournament tournament = null; Map result = matchMap( assignUrl( tournamentName, true ), getSettings().getTournamentQueryUrlRegex(), true ); for (Map.Entry entry : result.entrySet()) { if (entry.getValue().contains(tournamentName)) { // todo: contains? tournament = new PGNTournament( entry.getKey(), entry.getValue() ); } } if (tournament != null) { assignTournamentGames(tournament); } return tournament; } @Override public PGNGame scanGame(String gameId) throws ScannerException { String pgn = request( assignUrl(gameId) ); if (!StringUtils.isPgn(pgn)) { throw new ScannerException( String.format("Failed to get PGN for requesting game ID: %s", gameId) ); } return new PGNGame( gameId, pgn ); } @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( String.format("Failed to get PGN for requesting URL: %s", gameUrl) ); } return new PGNGame( null, pgn ); } private void assignTournamentGames(PGNTournament tournament) throws ScannerException { tournament.clearGames(); List gamesId = new ArrayList<>(); List pageGamesId; int pageId = 0; do { pageGamesId = match( assignUrl( tournament.id(), Integer.toString(++pageId) ), getSettings().getTournamentGamesUrlRegex(), false ); gamesId.addAll( pageGamesId ); } while (!pageGamesId.isEmpty()); for (String gameId : gamesId) { tournament.addGame( scanGame(gameId) ); } } }