001 package org.cocome.tradingsystem.systests.util;
002
003 import java.util.ArrayList;
004 import java.util.HashSet;
005 import java.util.List;
006 import java.util.Random;
007 import java.util.Set;
008
009 import org.cocome.tradingsystem.systests.interfaces.IEnterprise;
010 import org.cocome.tradingsystem.systests.interfaces.IProduct;
011
012 /**
013 * This class is used to generate random but reproducable products.
014 *
015 * @author Benjamin Hummel
016 * @author Christian Pfaller
017 * @author $Author: pfaller $
018 * @version $Rev: 60 $
019 * @levd.rating GREEN Rev: 60
020 */
021 public class ProductGenerator {
022
023 /** Available alphabet for product name generation. */
024 private static final String ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_";
025
026 /** The random number generator used. */
027 private final Random rng;
028
029 /** The enterprise used for creating products. */
030 private final IEnterprise enterprise;
031
032 /** The set of used barcodes to avoid repetition. */
033 private final Set<Integer> usedBarcodes = new HashSet<Integer>();
034
035 /** The set of used names to avoid repetition. */
036 private final Set<String> usedNames = new HashSet<String>();
037
038 /** A list of all products generated so far. */
039 private final List<GeneratedProduct> generatedProducts = new ArrayList<GeneratedProduct>();
040
041 /**
042 * Construct a new product generator.
043 *
044 * @param randomSeed
045 * the random seed used for initializing the random number
046 * generator.
047 * @param enterprise
048 * the enterprise used for creating products.
049 */
050 public ProductGenerator(long randomSeed, IEnterprise enterprise) {
051 rng = new Random(randomSeed);
052 this.enterprise = enterprise;
053 }
054
055 /** Returns the number of products generated so far. */
056 public int getNumberOfProducts() {
057 return generatedProducts.size();
058 }
059
060 /**
061 * Returns the product generated when <code>i</code> products had been
062 * generated already.
063 */
064 public GeneratedProduct getGeneratedProduct(int i) {
065 return generatedProducts.get(i);
066 }
067
068 /** Generate the given number of random products. */
069 public void generate(int n) throws Exception {
070 for (int i = 0; i < n; ++i) {
071 generate();
072 }
073 }
074
075
076 /** Generate a single random product.
077 * @return index of new product
078 * @throws Exception
079 */
080 public int generate() throws Exception {
081
082 int barcode = getUnusedBarcode();
083 int purchasePrice = rng.nextInt(100000);
084
085 String name;
086 do {
087 name = "Prod";
088 for (int i = 0; i < 4; ++i) {
089 name += ALPHA.charAt(rng.nextInt(ALPHA.length()));
090 }
091 } while (usedNames.contains(name));
092
093 IProduct product = enterprise.createProduct(barcode, purchasePrice,
094 name);
095 generatedProducts.add(new GeneratedProduct(barcode, purchasePrice,
096 name, product));
097
098 return generatedProducts.size() - 1;
099 }
100
101 /**
102 * Returns a new barcode which is not already used for any product.
103 */
104 public int getUnusedBarcode() {
105 int barcode = 0;
106 do {
107 barcode = rng.nextInt(1000000);
108 } while (usedBarcodes.contains(barcode));
109 return barcode;
110 }
111
112 }