package com.apachecon.camel.trafficgen; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import com.apachecon.camel.trafficgen.TrafficGeneratorTest.RandomCloneable; public class Person implements Cloneable, RandomCloneable { private static final int BASE_ID = 1000000; private static final int BASE_PHONE = 5550000; // most popular names (source: http://names.mongabay.com/) private static final String[] FIRST_NAMES = { "JAMES", "JOHN", "ROBERT", "MICHAEL", "WILLIAM", "DAVID", "RICHARD", "CHARLES", "JOSEPH", "THOMAS", "CHRISTOPHER", "DANIEL", "PAUL", "MARK", "DONALD", "GEORGE", "KENNETH", "STEVEN", "EDWARD", "BRIAN", "RONALD", "ANTHONY", "KEVIN", "JASON", "MATTHEW", "GARY", "TIMOTHY", "JOSE", "LARRY", "JEFFREY", "FRANK", "SCOTT", "ERIC", "STEPHEN", "ANDREW", "RAYMOND", "GREGORY", "JOSHUA", "JERRY", "DENNIS", "MARY", "PATRICIA", "LINDA", "BARBARA", "ELIZABETH", "JENNIFER", "MARIA", "SUSAN", "MARGARET", "DOROTHY", "LISA", "NANCY", "KAREN", "BETTY", "HELEN", "SANDRA", "DONNA", "CAROL", "RUTH", "SHARON", "MICHELLE", "LAURA", "SARAH", "KIMBERLY", "DEBORAH", "JESSICA", "SHIRLEY", "CYNTHIA", "ANGELA", "MELISSA", "BRENDA", "AMY", "ANNA", "REBECCA", "VIRGINIA", "KATHLEEN", "PAMELA", "MARTHA", "DEBRA", "AMANDA" }; private static final String[] LAST_NAMES = { "SMITH", "JOHNSON", "WILLIAMS", "JONES", "BROWN", "DAVIS", "MILLER", "WILSON", "MOORE", "TAYLOR", "ANDERSON", "THOMAS", "JACKSON", "WHITE", "HARRIS", "MARTIN", "THOMPSON", "GARCIA", "MARTINEZ", "ROBINSON" }; private static final String CSV_SEP = ", "; private static final int POS_PER_AREA = 40; private static Random random = new Random(); private static AtomicInteger ID = new AtomicInteger(BASE_ID); private static AtomicInteger PHONE = new AtomicInteger(BASE_PHONE); private final String phone; private final String firstName; private final String lastName; private final String zip; private final String id; public Person(final String code) { // ignore range checks, safely assume safe usage int local = PHONE.incrementAndGet() % 10000000; phone = code + (local < 1000000 ? local + 1000000 : local); firstName = FIRST_NAMES[random.nextInt(FIRST_NAMES.length)]; lastName = LAST_NAMES[random.nextInt(LAST_NAMES.length)]; zip = code + (random.nextInt(POS_PER_AREA) + 10); id = newId(); } public Person(final Person other) { this.phone = other.phone; this.firstName = other.firstName; this.lastName = other.lastName; this.zip = other.zip; this.id = newId(); } @Override public Person clone() { return new Person(this); } @Override public int cloneCount() { int r = random.nextInt(100); // 10% of consumers have 3 Rx, 20% have 2 Rx return r >= 90 ? 3 : r >= 70 ? 2 : 1; } public RandomCloneable newClone() { return clone(); } @Override public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(phone); buffer.append(CSV_SEP); buffer.append(firstName); buffer.append(CSV_SEP); buffer.append(lastName); buffer.append(CSV_SEP); buffer.append(id); buffer.append(CSV_SEP); buffer.append(zip); buffer.append(CSV_SEP); buffer.append("NA"); return buffer.toString(); } public static String newId() { return Integer.toString(ID.incrementAndGet()); } }