org.sencko.nalb.parser.Game.java Source code

Java tutorial

Introduction

Here is the source code for org.sencko.nalb.parser.Game.java

Source

/**
 * Copyright (c) 2013 by SAP Labs Bulgaria, url: http://www.sap.com All rights reserved.
 * 
 * This software is the confidential and proprietary information of SAP AG, Walldorf. You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered into with SAP.
 * 
 * Created on Oct 9, 2013 by I028512
 * 
 */

package org.sencko.nalb.parser;

import java.io.BufferedReader;
import java.io.CharArrayReader;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Formatter;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class Game {
    public static final String TOTAL = "";
    private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("EET");
    static final Pattern teamMatcher = Pattern.compile("(\\S+)\\s+(\\d+)\\s+\\-\\s+(\\d+)\\s+(\\S+).*");
    static final Pattern gameNumber = Pattern.compile(".+\\s+(\\d+)\\s*");
    static Pattern playerStats = Pattern.compile(
            "(\\*)*\\s*(\\d+)\\s+(.+)\\s+(\\d+):(\\d+)\\s+(\\d+)/(\\d+)\\s+(\\d+)\\s+(\\d+)/(\\d+)\\s+(\\d+)\\s+(\\d+)/(\\d+)\\s+(\\d+)\\s+(\\d+)/(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+).*");
    static Pattern teamTotals = Pattern
            .compile("Team Totals:\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s*");
    static Pattern dateTime = Pattern.compile("Date:\\s+(\\d+)\\.(\\d+)\\.(\\d+)\\s+Time:\\s+(\\d+):(\\d+)\\s+.*");
    static SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM yyyy HH:mm", new Locale("bg"));

    static String FORMAT = Util.readResource("game.html");

    TeamStats homeTeam;
    TeamStats awayTeam;
    Calendar date;

    List<Integer> scoring5minHome = new ArrayList<Integer>();
    List<Integer> scoring5minAway = new ArrayList<Integer>();
    BufferedReader reader;
    int gameNo;

    transient String rowCache = null;
    transient Matcher currentMatcher = null;

    public Game(InputStream stream, OptimizedCharArrayWriter writer, PDFTextStripper stripper) throws Exception {
        PDDocument document = PDDocument.load(stream);

        writer.reset();

        stripper.writeText(document, writer);

        reader = new BufferedReader(new CharArrayReader(writer.getBuffer(), 0, writer.size()));
        try {
            extractTeamNames();
            extractGameNumber();
            extractMatchTime();
            extract5minPeriodScore(scoring5minHome, homeTeam);
            extract5minPeriodScore(scoring5minAway, awayTeam);
            extractPlayerStats(homeTeam);
            extractPlayerStats(awayTeam);

            document.close();
            rowCache = null;
            currentMatcher = null;
        } catch (Exception ex) {
            System.out.println(rowCache);
            System.out.println(currentMatcher);
            throw ex;
        }
    }

    private void extractMatchTime() throws IOException {
        do {
            rowCache = readLine();
            currentMatcher = dateTime.matcher(rowCache);
        } while (!currentMatcher.matches());
        date = Calendar.getInstance(TIME_ZONE);
        date.set(Integer.parseInt(currentMatcher.group(3)), Integer.parseInt(currentMatcher.group(2)) - 1,
                Integer.parseInt(currentMatcher.group(1)), Integer.parseInt(currentMatcher.group(4)),
                Integer.parseInt(currentMatcher.group(5)), 0);
        if (date.get(Calendar.YEAR) < 2010) {
            date.set(Calendar.YEAR, 2013);
        }
    }

    private void extractGameNumber() throws IOException {
        rowCache = readLine();
        currentMatcher = gameNumber.matcher(rowCache);
        currentMatcher.matches();
        gameNo = Integer.parseInt(currentMatcher.group(1));
    }

    private void extractTeamNames() throws IOException {
        rowCache = readLine();
        currentMatcher = teamMatcher.matcher(rowCache);
        if (currentMatcher.matches()) {
            homeTeam = new TeamStats(currentMatcher.group(1));
            awayTeam = new TeamStats(currentMatcher.group(4));
        } else {
            throw new RuntimeException("Head error");
        }
    }

    private void extractPlayerStats(TeamStats teamName) throws IOException {
        do {
            rowCache = readLine();
            currentMatcher = playerStats.matcher(rowCache);
        } while (!currentMatcher.matches());
        Matcher totalsMatcher = null;
        do {
            if (currentMatcher.matches()) {
                PlayerStats ps = new PlayerStats(currentMatcher, teamName);
            }
            rowCache = readLine();
            currentMatcher = playerStats.matcher(rowCache);
        } while (!(totalsMatcher = teamTotals.matcher(rowCache)).matches());
        TeamTotals teamTotals = new TeamTotals(totalsMatcher);
        teamName.addTeamTotals(teamTotals);
    }

    private void extract5minPeriodScore(List<Integer> param, TeamStats teamName) throws IOException {
        Pattern fiveMinPatternHome = Pattern.compile(teamName.getAlias() + "(\\s+(\\d+)){8,}\\s*");
        do {
            rowCache = readLine();
            currentMatcher = fiveMinPatternHome.matcher(rowCache);
        } while (!currentMatcher.matches());

        String[] splitted = rowCache.split("\\s");
        for (int i = 2; i < 9; i += 2) {
            param.add(Integer.parseInt(splitted[i]));
        }
        for (int i = 9; i < splitted.length; i++) {
            param.add(Integer.parseInt(splitted[i]));
        }
    }

    private String readLine() throws IOException {
        String text = reader.readLine();
        // System.err.println(text);
        return text;
    }

    public void toHtml(Formatter formatter) {
        formatter.format(FORMAT, homeTeam.getTeam().getName(), awayTeam.getTeam().getName(),
                homeTeam.getTeam().getName(), awayTeam.getTeam().getName(), getScoreByPeriods(),
                homeTeam.getTeam().getName(), getPlayersToHtml(homeTeam.getPlayerStats()),
                getPlayersToHtml(homeTeam.getTeamTotals(), homeTeam), awayTeam.getTeam().getName(),
                getPlayersToHtml(awayTeam.getPlayerStats()), getPlayersToHtml(awayTeam.getTeamTotals(), awayTeam));
    }

    private String getScoreByPeriods() {
        StringBuilder sb = new StringBuilder(350);
        sb.append("<h3>");

        sb.append(sdf.format(date.getTime()));
        sb.append("</h3>");
        sb.append("<table border=\"1\" ><thead>");
        sb.append("<tr><th></th>");
        for (int i = 0; i < 4; i++) {
            sb.append("<th>").append((i + 1) * 10 + "'").append("</th>");
        }
        for (int i = 8; i < scoring5minHome.size(); i++) {
            sb.append("<th>").append((i + 1) * 5 + "'").append("</th>");
        }
        sb.append("<th></th>");
        sb.append("</tr></thead><tbody>");

        scoringPerPeriodInHtml(sb, homeTeam.getTeam().getName(), scoring5minHome);
        scoringPerPeriodInHtml(sb, awayTeam.getTeam().getName(), scoring5minAway);

        sb.append("</tbody></table>");
        return sb.toString();
    }

    private void scoringPerPeriodInHtml(StringBuilder sb, String teamName, List<Integer> param) {
        sb.append("<tr><th>");
        sb.append(teamName);
        sb.append("</th>");
        sb.append("<td>").append(param.get(0)).append("</td>");
        for (int i = 1; i < param.size(); i++) {
            sb.append("<td>").append(param.get(i) - param.get(i - 1)).append("</td>");
        }
        sb.append("<th>").append(param.get(param.size() - 1)).append("</th>");
        sb.append("</tr>");
    }

    private String getPlayersToHtml(List<PlayerStats> playersStatsHome2) {
        StringBuilder builder = new StringBuilder(playersStatsHome2.size() * 350);
        Formatter formatter = new Formatter(builder);
        for (PlayerStats ps : playersStatsHome2) {
            ps.toHTML(formatter);
        }
        return builder.toString();
    }

    private String getPlayersToHtml(PlayerStats... playersStatsHome2) {
        StringBuilder builder = new StringBuilder(playersStatsHome2.length * 350);
        Formatter formatter = new Formatter(builder);
        for (PlayerStats ps : playersStatsHome2) {
            ps.toHTML(formatter);
        }
        return builder.toString();
    }

}