/* *************************************************************************************** * 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.terminal.sender; import com.espertech.esper.example.terminal.common.*; import java.util.LinkedList; import java.util.List; import java.util.Random; public class EventGenerator { private final Random random; public EventGenerator() { this.random = new Random(); } public List<BaseTerminalEvent> generateBatch() { List<BaseTerminalEvent> batch = new LinkedList<BaseTerminalEvent>(); // Sometimes generate a low paper or out-of-order event generateTerminalEvent(batch); // Generate a couple of checkin, completed and cancelled events, and sometimes an out-of-order generateCheckin(batch); return batch; } private void generateCheckin(List<BaseTerminalEvent> eventBatch) { // Generate up to 100 unique terminal ids between 100 and 200 String[] termIds = new String[100]; for (int i = 0; i < termIds.length; i++) { termIds[i] = Long.toString(i + 1000); } // Swap terminals to get a random ordering randomize(termIds); // Add a check-in event for each for (int i = 0; i < termIds.length; i++) { Checkin checkin = new Checkin(new TerminalInfo(termIds[i])); eventBatch.add(checkin); } // Add a cancelled or completed or out-of-order for each int completedCount = 0; int cancelledCount = 0; int outOfOrderCount = 0; for (int i = 0; i < termIds.length; i++) { BaseTerminalEvent theEvent = null; // With a 1 in 1000 chance send an OutOfOrder if (random.nextInt(1000) == 0) { outOfOrderCount++; theEvent = new OutOfOrder(new TerminalInfo(termIds[i])); System.out.println("Generated an Checkin followed by " + theEvent.getType() + " event for terminal " + theEvent.getTerm().getId()); } else if (random.nextBoolean()) { completedCount++; theEvent = new Completed(new TerminalInfo(termIds[i])); } else { cancelledCount++; theEvent = new Cancelled(new TerminalInfo(termIds[i])); } eventBatch.add(theEvent); } System.out.println("Generated " + termIds.length + " Checkin events followed by " + completedCount + " Completed and " + cancelledCount + " Cancelled and " + outOfOrderCount + " OutOfOrder events"); } private void generateTerminalEvent(List<BaseTerminalEvent> eventBatch) { if (random.nextInt(10) > 0) { return; } BaseTerminalEvent theEvent = null; if (random.nextBoolean()) { theEvent = new LowPaper(getRandomTermInfo()); } else { theEvent = new OutOfOrder(getRandomTermInfo()); } eventBatch.add(theEvent); System.out.println("Generated " + theEvent.getType() + " event for terminal " + theEvent.getTerm().getId()); } // Swap 100 values in the array private void randomize(String[] values) { for (int i = 0; i < 100; i++) { int pos1 = random.nextInt(values.length); int pos2 = random.nextInt(values.length); String temp = values[pos2]; values[pos2] = values[pos1]; values[pos1] = temp; } } private TerminalInfo getRandomTermInfo() { return new TerminalInfo(getRandomTermId()); } private String getRandomTermId() { int id = random.nextInt(1000); return Integer.toString(id); } }