/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * 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.drools.examples.broker.events; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import org.drools.examples.broker.model.Company; import org.drools.examples.broker.model.CompanyRegistry; import org.drools.examples.broker.model.StockTick; /** * A class to generate stock tick events */ public class EventGenerator { private static final String DATA_FILE = "src/main/resources/org/drools/examples/broker/data/stocktickstream.dat"; // creating 3 random objects to avoid interference among them on the distribution of values private static Random steps = new Random( System.currentTimeMillis() ); private static Random symbols = new Random( System.currentTimeMillis() ); private static Random prices = new Random( System.currentTimeMillis() ); public static void main(String args[]) throws IOException { // 20 minutes long timespam = 20 * 60 * 1000; // interval between events: [200ms,2s] long[] interval = new long[]{ 200, 2000 }; // price changes: +- 10% double[] priceChanges = new double[] { -0.1, 0.1 }; // starting price range double[] startingPrices = new double[]{ 50, 120 }; // companies Company[] companies = (new CompanyRegistry()).getCompanies().toArray( new Company[0] ); // persister helper StockTickPersister persister = new StockTickPersister(); persister.openForSave( new FileWriter( DATA_FILE ) ); System.out.print("Generating data for 20 min..."); // initializing starting prices for( Company company : companies ) { company.setCurrentPrice( nextStartingPrice( startingPrices ) ); StockTick tick = new StockTick( company.getSymbol(), company.getCurrentPrice(), 0 ); persister.save( tick ); } for( long offset = 0; offset < timespam; offset += nextStep( interval ) ) { int company = symbols.nextInt( companies.length ); double price = companies[company].getCurrentPrice() * (1 + nextPriceChange( priceChanges )); StockTick tick = new StockTick(companies[company].getSymbol(), price, offset ); persister.save( tick ); companies[company].setCurrentPrice( price ); } persister.close(); System.out.println("done."); } private static double nextStartingPrice(double[] startingPrices) { double range = startingPrices[1]-startingPrices[0]; return ( prices.nextDouble() * range ) + startingPrices[0]; } private static long nextStep(long[] interval) { long range = interval[1]-interval[0]; return (long) ( ( steps.nextFloat() * range ) + interval[0] ); } private static double nextPriceChange(double[] interval) { double range = interval[1]-interval[0]; return ( prices.nextDouble() * range ) + interval[0]; } }