/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.example.trivia; import com.espertech.esper.client.EPServiceProvider; import com.espertech.esper.client.time.CurrentTimeEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.LineNumberReader; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; public class TriviaMain { private static Logger log = LoggerFactory.getLogger(TriviaMain.class); public static void main(String[] args) { try { TriviaMain main = new TriviaMain(); main.run(); } catch (RuntimeException ex) { log.error("Unexpected exception encountered: " + ex.getMessage(), ex); } } public void run() { TriviaExample example = new TriviaExample(); EPServiceProvider engine = example.setup(); // parse test data List<Round> rounds = parse(TESTDATA); // loop through the rounds for (int i = 0; i < rounds.size(); i++) { Round round = rounds.get(i); System.out.println("\n\nRound " + i); System.out.println("============"); System.out.println(round); // set time setTime(engine, round.getTime()); // send question event engine.getEPRuntime().sendEvent(round.getQuestion(), "TriviaQuestion"); // send player activity for (PlayerAction action : round.getPlayerActions()) { engine.getEPRuntime().sendEvent(action.getData(), action.getEventName()); } // trigger score update engine.getEPRuntime().sendEvent(EventFactory.makeUpdateScore(round.getQuestionId()), "UpdateScore"); printScore(round.getQuestionId(), TriviaHelper.getScores(engine)); } } private List<Round> parse(String testdata) { List<String> lines = parseLines(testdata); List<List<String>> roundLines = parseRounds(lines); List<Round> rounds = new ArrayList<Round>(); for (List<String> roundLineBuf : roundLines) { rounds.add(parseRoundBuf(roundLineBuf)); } return rounds; } private Round parseRoundBuf(List<String> roundLineBuf) { String question = roundLineBuf.remove(0); if (!question.startsWith("QuestionEvent")) { throw new RuntimeException("First line is not a QuestionEvent"); } // Format expected: // QuestionEvent(Q4, q, a, b, c, d) at 09:01:30 String questionTime = question.split(" at ")[1] + ".000"; String questionId = question.split(",")[0].substring(question.indexOf("(") + 1); String correctAnswer = question.split(",")[1].trim(); Map<String, Object> questionEvent = EventFactory.makeTriviaQuestion(questionId, "<Question Here>", correctAnswer, getTime(questionTime), new String[]{"a", "b", "c", "d"}); List<PlayerAction> playerActions = parsePlayerActions(roundLineBuf); return new Round(questionId, questionTime, questionEvent, playerActions); } private List<PlayerAction> parsePlayerActions(List<String> roundLineBuf) { // Format expected: // AnswerEvent(User1, Q1, 1) at 09:00:01.32 // RequestAnswerEvent(User6, Q2) at 09:00:45.37 // AnswerAnnulmentEvent(User1, Q10) at 09:04:48.51 List<PlayerAction> actions = new ArrayList<PlayerAction>(); for (String line : roundLineBuf) { String[] split = line.split(","); String playerId = split[0].substring(line.indexOf("(") + 1).trim(); if (line.startsWith("AnswerEvent")) { String questionId = split[1].trim(); String answer = split[2].substring(0, split[2].indexOf(")")).trim(); String answerTime = line.split(" at ")[1] + "0"; Map<String, Object> data = EventFactory.makePlayerAnswer(playerId, questionId, answer, getTime(answerTime)); actions.add(new PlayerAction("PlayerAnswer", data)); } else if (line.startsWith("RequestAnswerEvent")) { String questionId = split[1].substring(1, split[1].indexOf(")")).trim(); String requestTime = line.split(" at ")[1] + "0"; Map<String, Object> data = EventFactory.makePlayerFARequest(playerId, questionId); actions.add(new PlayerAction("PlayerFARequest", data)); } else if (line.startsWith("AnswerAnnulmentEvent")) { String questionId = split[1].trim(); String requestTime = line.split(" at ")[1] + "0"; Map<String, Object> data = EventFactory.makePlayerAnnulment(playerId, questionId, getTime(requestTime)); actions.add(new PlayerAction("PlayerAnnulment", data)); } else { throw new RuntimeException("Unrecognized line: " + line); } } return actions; } private List<List<String>> parseRounds(List<String> lines) { List<List<String>> result = new ArrayList<List<String>>(); List<String> currentRound = null; for (String line : lines) { if (line.trim().isEmpty()) { continue; } if (line.startsWith("QuestionEvent")) { if (currentRound != null) { result.add(currentRound); } currentRound = new ArrayList<String>(); } currentRound.add(line.trim()); } result.add(currentRound); return result; } private List<String> parseLines(String testdata) { List<String> result = new ArrayList<String>(); StringReader buf = new StringReader(testdata); LineNumberReader reader = new LineNumberReader(buf); try { while (true) { String line = reader.readLine(); if (line == null) { break; } result.add(line); } } catch (IOException ex) { throw new RuntimeException("Failed to parse lines: " + ex.getMessage(), ex); } return result; } private void printScore(String questionId, Map<String, Integer> scores) { System.out.println("Score after question " + questionId + ":"); for (Map.Entry<String, Integer> score : scores.entrySet()) { System.out.println(" User " + score.getKey() + " : " + score.getValue()); } } private static long getTime(String time) { String date = "2011-07-01T" + time; return TriviaHelper.parseGetMSec(date); } private static void setTime(EPServiceProvider engine, String time) { engine.getEPRuntime().sendEvent(new CurrentTimeEvent(getTime(time))); } private static String printMapWithTime(Map<String, Object> map) { StringWriter writer = new StringWriter(); String delimiter = ""; writer.write("{"); for (Map.Entry<String, Object> entry : map.entrySet()) { writer.write(delimiter); writer.write(entry.getKey()); writer.write("="); if (entry.getKey().toLowerCase(Locale.ENGLISH).contains("time")) { writer.write(TriviaHelper.print(entry.getValue())); } else { writer.write(entry.getValue().toString()); } delimiter = ", "; } writer.write("}"); return writer.toString(); } private static class Round { private final String questionId; private final String time; private final Map<String, Object> question; private final List<PlayerAction> playerActions; private Round(String questionId, String time, Map<String, Object> question, List<PlayerAction> playerActions) { this.questionId = questionId; this.time = time; this.question = question; this.playerActions = playerActions; } public String getQuestionId() { return questionId; } public String getTime() { return time; } public Map<String, Object> getQuestion() { return question; } public List<PlayerAction> getPlayerActions() { return playerActions; } public String toString() { return "Round{" + "questionId='" + questionId + '\'' + ", time='" + time + '\'' + ", question=" + printMapWithTime(question) + ", \nplayerActions=" + playerActions + '}'; } } private static class PlayerAction { private final String eventName; private final Map<String, Object> data; private PlayerAction(String eventName, Map<String, Object> data) { this.eventName = eventName; this.data = data; } public String getEventName() { return eventName; } public Map<String, Object> getData() { return data; } public String toString() { return "\n\t\tPlayerAction{" + "eventName='" + eventName + '\'' + ", data=" + printMapWithTime(data) + '}'; } } private final static String TESTDATA = "QuestionEvent(Q1, 2, a, b, c, d) at 09:00:00\n" + "AnswerEvent(User1, Q1, 1) at 09:00:01.32\n" + "AnswerEvent(User2, Q1, 2) at 09:00:01.18\n" + "AnswerEvent(User3, Q1, 3) at 09:00:02.10\n" + "AnswerEvent(User4, Q1, 1) at 09:00:03.34\n" + "AnswerEvent(User5, Q1, 2) at 09:00:04.21\n" + "AnswerEvent(User6, Q1, 4) at 09:00:04.44\n" + "AnswerEvent(User7, Q1, 1) at 09:00:05.32\n" + "AnswerEvent(User8, Q1, 2) at 09:00:06.55\n" + "AnswerEvent(User9, Q1, 2) at 09:00:12.10\n" + "AnswerEvent(User10, Q1, 1) at 09:00:15.34\n" + "AnswerEvent(User11, Q1, 3) at 09:00:24.21\n" + "AnswerEvent(User12, Q1, 2) at 09:00:28.44\n" + "\n" + "QuestionEvent(Q2, 1, a, b, c, d) at 09:00:30\n" + "AnswerEvent(User1, Q2, 1) at 09:00:31.32\n" + "AnswerEvent(User8, Q2, 2) at 09:00:42.18\n" + "AnswerEvent(User11, Q2, 3) at 09:00:44.10\n" + "AnswerEvent(User7, Q2, 1) at 09:00:45.34\n" + "RequestAnswerEvent(User6, Q2) at 09:00:45.37\n" + "AnswerEvent(User12, Q2, 3) at 09:00:46.21\n" + "AnswerEvent(User6, Q2, 3) at 09:00:54.44\n" + "AnswerEvent(User4, Q2, 1) at 09:00:55.32\n" + "AnswerEvent(User2, Q2, 1) at 09:00:56.55\n" + "AnswerEvent(User9, Q2, 2) at 09:00:57.10\n" + "AnswerEvent(User10, Q2, 2) at 09:00:58.34\n" + "AnswerEvent(User3, Q2, 1) at 09:00:58.41\n" + "AnswerEvent(User5, Q2, 1) at 09:00:59.44\n" + "\n" + "QuestionEvent(Q3, 4, a, b, c, d) at 09:01:00\n" + "AnswerEvent(User11, Q3, 4) at 09:01:01.33\n" + "AnswerEvent(User12, Q3, 4) at 09:01:02.18\n" + "RequestAnswerEvent(User7, Q3) at 09:01:02.37\n" + "AnswerEvent(User4, Q3, 3) at 09:01:02.44\n" + "AnswerAnnulmentEvent(User11, Q3) at 09:01:02.51\n" + "AnswerEvent(User3, Q3, 4) at 09:01:03.54\n" + "AnswerEvent(User5, Q3, 2) at 09:01:07.21\n" + "AnswerEvent(User7, Q3, 4) at 09:01:11.44\n" + "AnswerEvent(User6, Q3, 4) at 09:01:15.32\n" + "AnswerEvent(User8, Q3, 2) at 09:01:19.56\n" + "AnswerEvent(User9, Q3, 3) at 09:01:21.10\n" + "AnswerEvent(User10, Q3, 4) at 09:01:23.34\n" + "AnswerEvent(User1, Q3, 3) at 09:01:24.24\n" + "AnswerEvent(User2, Q3, 4) at 09:01:29.55\n" + "\n" + "QuestionEvent(Q4, 2, a, b, c, d) at 09:01:30\n" + "AnswerEvent(User5, Q4, 2) at 09:01:32.32\n" + "AnswerEvent(User9, Q4, 2) at 09:01:33.18\n" + "AnswerEvent(User3, Q4, 2) at 09:01:34.10\n" + "AnswerEvent(User4, Q4, 2) at 09:01:35.34\n" + "AnswerEvent(User1, Q4, 3) at 09:01:41.21\n" + "AnswerEvent(User7, Q4, 2) at 09:01:44.44\n" + "AnswerEvent(User6, Q4, 1) at 09:01:45.32\n" + "AnswerAnnulmentEvent(User1, Q4) at 09:01:45.51\n" + "AnswerEvent(User12, Q4, 2) at 09:01:46.55\n" + "AnswerEvent(User2, Q4, 2) at 09:01:57.10\n" + "AnswerEvent(User1, Q4, 2) at 09:01:41.21\n" + "AnswerEvent(User10, Q4, 2) at 09:01:59.34\n" + "AnswerEvent(User11, Q4, 1) at 09:01:59.42\n" + "AnswerEvent(User8, Q4, 1) at 09:01:59.44\n" + "\n" + "QuestionEvent(Q5, 3, a, b, c, d) at 09:02:00\n" + "AnswerEvent(User7, Q5, 3) at 09:02:01.33\n" + "AnswerEvent(User6, Q5, 1) at 09:02:02.18\n" + "AnswerEvent(User4, Q5, 3) at 09:02:02.15\n" + "RequestAnswerEvent(User8, Q5) at 09:02:02.37\n" + "AnswerEvent(User3, Q5, 3) at 09:02:03.54\n" + "AnswerEvent(User5, Q5, 3) at 09:02:07.21\n" + "AnswerEvent(User2, Q5, 2) at 09:02:11.44\n" + "AnswerEvent(User1, Q5, 4) at 09:02:15.32\n" + "AnswerEvent(User11, Q5, 1) at 09:02:19.56\n" + "AnswerEvent(User9, Q5, 3) at 09:02:21.10\n" + "RequestAnswerEvent(User11, Q5) at 09:02:22.37\n" + "AnswerEvent(User11, Q5, 4) at 09:02:23.34\n" + "AnswerEvent(User8, Q5, 3) at 09:02:24.24\n" + "AnswerEvent(User12, Q5, 3) at 09:02:29.55\n" + "\n" + "QuestionEvent(Q6, 4, a, b, c, d) at 09:02:30\n" + "AnswerEvent(User4, Q6, 2) at 09:02:34.32\n" + "AnswerEvent(User8, Q6, 4) at 09:02:35.18\n" + "AnswerEvent(User6, Q6, 1) at 09:02:36.10\n" + "AnswerEvent(User1, Q6, 4) at 09:02:36.34\n" + "AnswerEvent(User5, Q6, 3) at 09:02:38.21\n" + "RequestAnswerEvent(User2, Q6) at 09:02:39.37\n" + "AnswerEvent(User6, Q6, 2) at 09:02:41.44\n" + "AnswerEvent(User3, Q6, 4) at 09:02:41.33\n" + "AnswerEvent(User2, Q6, 2) at 09:02:43.55\n" + "AnswerEvent(User9, Q6, 4) at 09:02:46.10\n" + "AnswerEvent(User10, Q6, 4) at 09:02:48.34\n" + "AnswerEvent(User11, Q6, 4) at 09:02:52.23\n" + "AnswerEvent(User12, Q6, 1) at 09:02:54.46\n" + "\n" + "QuestionEvent(Q7, 3, a, b, c, d) at 09:03:00\n" + "AnswerEvent(User1, Q7, 3) at 09:00:03.32\n" + "AnswerEvent(User2, Q7, 3) at 09:00:03.17\n" + "AnswerEvent(User3, Q7, 3) at 09:00:03.05\n" + "AnswerEvent(User4, Q7, 1) at 09:00:03.34\n" + "AnswerEvent(User5, Q7, 2) at 09:03:04.21\n" + "AnswerEvent(User6, Q7, 1) at 09:03:05.12\n" + "AnswerEvent(User7, Q7, 3) at 09:03:05.32\n" + "RequestAnswerEvent(User10, Q7) at 09:03:06.37\n" + "AnswerEvent(User8, Q7, 2) at 09:03:07.52\n" + "AnswerEvent(User9, Q7, 3) at 09:03:08.10\n" + "AnswerEvent(User10, Q7, 1) at 09:03:11.33\n" + "AnswerEvent(User11, Q7, 3) at 09:03:12.57\n" + "AnswerEvent(User12, Q7, 3) at 09:03:15.42\n" + "\n" + "QuestionEvent(Q8, 1, a, b, c, d) at 09:03:30\n" + "AnswerEvent(User1, Q8, 1) at 09:03:31.32\n" + "AnswerEvent(User8, Q8, 1) at 09:03:42.18\n" + "AnswerEvent(User7, Q8, 3) at 09:03:44.10\n" + "AnswerEvent(User11, Q8, 1) at 09:03:45.34\n" + "AnswerEvent(User12, Q8, 3) at 09:03:46.21\n" + "AnswerEvent(User4, Q8, 3) at 09:03:54.44\n" + "AnswerEvent(User6, Q8, 2) at 09:03:55.32\n" + "AnswerEvent(User9, Q8, 1) at 09:03:56.55\n" + "AnswerEvent(User2, Q8, 2) at 09:03:57.10\n" + "AnswerEvent(User10, Q8, 1) at 09:03:58.34\n" + "AnswerEvent(User3, Q8, 1) at 09:03:58.41\n" + "AnswerEvent(User5, Q8, 1) at 09:03:59.44\n" + "\n" + "QuestionEvent(Q9, 4, a, b, c, d) at 09:04:00\n" + "AnswerEvent(User11, Q9, 4) at 09:04:01.33\n" + "AnswerEvent(User12, Q9, 4) at 09:04:02.18\n" + "AnswerEvent(User5, Q9, 3) at 09:04:02.15\n" + "AnswerEvent(User3, Q9, 4) at 09:04:03.54\n" + "AnswerEvent(User4, Q9, 2) at 09:04:07.21\n" + "RequestAnswerEvent(User1, Q9) at 09:04:10.37\n" + "AnswerEvent(User7, Q9, 4) at 09:04:11.44\n" + "AnswerEvent(User6, Q9, 4) at 09:04:15.32\n" + "AnswerEvent(User8, Q9, 2) at 09:04:19.56\n" + "AnswerEvent(User1, Q9, 3) at 09:04:21.10\n" + "AnswerEvent(User10, Q9, 4) at 09:04:23.34\n" + "AnswerEvent(User1, Q9, 3) at 09:04:24.24\n" + "AnswerEvent(User2, Q9, 4) at 09:04:29.55\n" + "\n" + "QuestionEvent(Q10, 2, a, b, c, d) at 09:04:30\n" + "AnswerEvent(User5, Q10, 2) at 09:04:32.32\n" + "AnswerEvent(User9, Q10, 2) at 09:04:33.18\n" + "AnswerEvent(User3, Q10, 2) at 09:04:34.10\n" + "AnswerEvent(User4, Q10, 2) at 09:04:35.34\n" + "AnswerEvent(User1, Q10, 3) at 09:04:41.21\n" + "AnswerEvent(User7, Q10, 2) at 09:04:44.44\n" + "AnswerEvent(User6, Q10, 1) at 09:04:45.32\n" + "AnswerEvent(User12, Q10, 2) at 09:04:46.55\n" + "AnswerAnnulmentEvent(User1, Q10) at 09:04:48.51\n" + "AnswerEvent(User2, Q10, 2) at 09:04:57.10\n" + "AnswerEvent(User10, Q10, 2) at 09:04:59.34\n" + "AnswerEvent(User11, Q10, 1) at 09:04:59.42\n" + "AnswerEvent(User8, Q10, 1) at 09:01:59.44\n" + "\n" + "QuestionEvent(Q11, 2, a, b, c, d) at 09:05:00\n" + "AnswerEvent(User7, Q11, 2) at 09:05:01.33\n" + "AnswerEvent(User6, Q11, 2) at 09:05:02.18\n" + "AnswerEvent(User2, Q11, 2) at 09:05:02.15\n" + "AnswerEvent(User9, Q11, 2) at 09:05:03.54\n" + "AnswerEvent(User5, Q11, 3) at 09:05:07.21\n" + "AnswerEvent(User4, Q11, 2) at 09:05:11.44\n" + "AnswerEvent(User1, Q11, 2) at 09:05:15.32\n" + "AnswerEvent(User11, Q11, 1) at 09:05:19.56\n" + "AnswerEvent(User3, Q11, 2) at 09:05:21.10\n" + "AnswerEvent(User11, Q11, 2) at 09:05:23.34\n" + "AnswerEvent(User8, Q11, 3) at 09:05:24.24\n" + "AnswerEvent(User12, Q11, 3) at 09:05:29.55\n" + "\n" + "QuestionEvent(Q12, 2, a, b, c, d) at 09:05:30\n" + "AnswerEvent(User4, Q12, 2) at 09:05:33.32\n" + "AnswerEvent(User8, Q12, 4) at 09:05:35.18\n" + "AnswerEvent(User6, Q12, 2) at 09:05:36.10\n" + "AnswerEvent(User1, Q12, 2) at 09:05:36.34\n" + "AnswerEvent(User5, Q12, 3) at 09:05:39.23\n" + "AnswerEvent(User6, Q12, 2) at 09:05:41.44\n" + "AnswerEvent(User3, Q12, 2) at 09:05:42.34\n" + "AnswerEvent(User2, Q12, 2) at 09:05:43.55\n" + "AnswerEvent(User9, Q12, 4) at 09:05:47.10\n" + "AnswerEvent(User10, Q12, 4) at 09:05:49.33\n" + "AnswerEvent(User11, Q12, 3) at 09:05:53.23\n" + "AnswerEvent(User12, Q12, 1) at 09:05:53.46\n" + "\n" + "QuestionEvent(Q13, 4, a, b, c, d) at 09:06:00\n" + "AnswerEvent(User1, Q13, 1) at 09:06:01.32\n" + "AnswerEvent(User2, Q13, 2) at 09:06:02.18\n" + "AnswerEvent(User3, Q13, 4) at 09:06:03.10\n" + "AnswerEvent(User4, Q13, 1) at 09:06:05.34\n" + "AnswerEvent(User5, Q13, 2) at 09:06:08.21\n" + "AnswerEvent(User6, Q13, 4) at 09:06:08.44\n" + "AnswerEvent(User7, Q13, 1) at 09:06:09.32\n" + "AnswerEvent(User8, Q13, 2) at 09:06:10.55\n" + "AnswerEvent(User9, Q13, 2) at 09:06:12.10\n" + "AnswerEvent(User10, Q13, 1) at 09:06:15.34\n" + "AnswerEvent(User11, Q13, 3) at 09:06:24.21\n" + "AnswerEvent(User12, Q13, 2) at 09:06:28.44\n" + "\n" + "QuestionEvent(Q14, 4, a, b, c, d) at 09:06:30\n" + "AnswerEvent(User1, Q14, 2) at 09:06:32.32\n" + "AnswerEvent(User3, Q14, 4) at 09:06:33.18\n" + "AnswerEvent(User9, Q14, 4) at 09:06:34.10\n" + "AnswerEvent(User4, Q14, 2) at 09:06:37.34\n" + "AnswerEvent(User5, Q14, 3) at 09:06:39.21\n" + "AnswerEvent(User7, Q14, 2) at 09:06:41.42\n" + "AnswerEvent(User6, Q14, 1) at 09:06:43.32\n" + "AnswerEvent(User2, Q14, 2) at 09:06:46.55\n" + "AnswerEvent(User12, Q14, 2) at 09:06:57.10\n" + "AnswerEvent(User11, Q14, 2) at 09:06:59.34\n" + "AnswerEvent(User10, Q14, 1) at 09:06:59.42\n" + "AnswerEvent(User7, Q14, 1) at 09:06:59.44\n" + "\n" + "QuestionEvent(Q15, 2, a, b, c, d) at 09:07:00\n" + "AnswerEvent(User7, Q15, 3) at 09:07:01.33\n" + "AnswerEvent(User6, Q15, 4) at 09:07:02.18\n" + "AnswerEvent(User4, Q15, 3) at 09:07:02.15\n" + "AnswerEvent(User3, Q15, 3) at 09:07:03.54\n" + "AnswerEvent(User5, Q15, 3) at 09:07:07.21\n" + "AnswerEvent(User2, Q15, 2) at 09:07:11.44\n" + "AnswerEvent(User1, Q15, 2) at 09:07:15.32\n" + "AnswerEvent(User11, Q15, 1) at 09:07:19.56\n" + "AnswerEvent(User9, Q15, 2) at 09:07:21.10\n" + "AnswerEvent(User11, Q15, 2) at 09:02:23.34\n" + "AnswerEvent(User8, Q15, 3) at 09:02:24.24\n" + "AnswerEvent(User12, Q15, 2) at 09:02:29.55\n" + "\n" + "QuestionEvent(Q16, 1, a, b, c, d) at 09:07:30\n" + "AnswerEvent(User4, Q16, 1) at 09:07:34.32\n" + "AnswerEvent(User8, Q16, 1) at 09:07:35.18\n" + "AnswerEvent(User6, Q16, 1) at 09:07:36.10\n" + "AnswerEvent(User1, Q16, 4) at 09:07:36.34\n" + "AnswerEvent(User5, Q16, 3) at 09:07:38.21\n" + "AnswerEvent(User6, Q16, 2) at 09:07:41.22\n" + "AnswerEvent(User3, Q16, 4) at 09:07:41.33\n" + "AnswerEvent(User2, Q16, 2) at 09:07:44.55\n" + "AnswerEvent(User9, Q16, 1) at 09:07:46.10\n" + "AnswerEvent(User10, Q16, 4) at 09:07:48.34\n" + "AnswerEvent(User11, Q16, 4) at 09:07:52.23\n" + "AnswerEvent(User12, Q16, 1) at 09:07:54.46"; }