001 package org.cocome.tradingsystem.systests.util; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 import java.util.Random; 006 007 import org.cocome.tradingsystem.systests.interfaces.IProduct; 008 import org.cocome.tradingsystem.systests.interfaces.IStorePC; 009 010 /** 011 * This class is used to generate (reproducably) random stock items. 012 * 013 * @author Benjamin Hummel 014 * @author Christian Pfaller 015 * @author $Author: pfaller $ 016 * @version $Rev: 60 $ 017 * @levd.rating GREEN Rev: 60 018 */ 019 public class StockGenerator { 020 021 /** The random number generator used. */ 022 private final Random rng; 023 024 /** The storePC used for adding stock. */ 025 private final IStorePC storePC; 026 027 /** The product generator containing all products we may refer to. */ 028 private final ProductGenerator productGenerator; 029 030 /** A list of all stock items generated so far. */ 031 private final List<GeneratedStockItem> generatedStock = new ArrayList<GeneratedStockItem>(); 032 033 /** 034 * Construct a new stock generator. 035 * 036 * @param randomSeed 037 * the random seed used for initializing the random number 038 * generator. 039 * @param storePC 040 * the store used for generating stock. 041 * @param productGenerator 042 * the product generator containing all products we may refer to. 043 */ 044 public StockGenerator(long randomSeed, IStorePC storePC, 045 ProductGenerator productGenerator) { 046 rng = new Random(randomSeed); 047 this.storePC = storePC; 048 this.productGenerator = productGenerator; 049 } 050 051 /** Returns the number of stock items generated so far. */ 052 public int getNumberOfStockItems() { 053 return generatedStock.size(); 054 } 055 056 /** 057 * Returns the stock item generated when <code>i</code> stock items had 058 * been generated already. 059 */ 060 public GeneratedStockItem getGeneratedStockItem(int i) { 061 return generatedStock.get(i); 062 } 063 064 /** Generate stock items for all known products. */ 065 public void generateAll() throws Exception { 066 for (int i = generatedStock.size(); i < productGenerator 067 .getNumberOfProducts(); ++i) { 068 generate(i); 069 } 070 } 071 072 073 /** 074 * Generate a single random stock item from the product of index 075 * <code>i</code> in the product generator. 076 */ 077 private void generate(int productIndex) throws Exception { 078 079 int minAmount = 1 + rng.nextInt(50); 080 int amount = minAmount + rng.nextInt(1000); 081 int maxAmount = amount + rng.nextInt(1000); 082 083 generate(productIndex, minAmount, amount, maxAmount); 084 } 085 086 /** 087 * Generate a single random stock item from the product of index 088 * <code>i</code> in the product generator with the given amounts in stock. 089 */ 090 public void generate(int productIndex, int minAmount, int amount, int maxAmount) throws Exception { 091 GeneratedProduct gp = productGenerator 092 .getGeneratedProduct(productIndex); 093 094 IProduct product = gp.getProduct(); 095 096 // prices may at most triple 097 int salesPrice = (int) (gp.getPurchasePrice() * (1. + 2. * rng 098 .nextDouble())); 099 100 101 storePC.insertStockItem(product, salesPrice, amount, minAmount); 102 generatedStock.add(new GeneratedStockItem(gp, salesPrice, amount, 103 minAmount, maxAmount)); 104 } 105 }