package tutorial.jdo;
import java.util.*;
import javax.jdo.*;
public class Rabbit
extends Animal {
// the resale price of a rabbit
public static final float RESALE_PRICE = 3.0f;
private boolean isFemale = false;
private boolean isDead = false;
private Set parents = new HashSet();
private Set children = new HashSet();
// some rabbit names; used by breedHelper() to name new rabbits
private static final String[] maleRabbitNames = {
"Bugs",
"Peter",
"Roger",
"Buttons",
"John",
"Ed",
"Elvis",
};
private static final String[] femaleRabbitNames = {
"Babs",
"Fluffy",
"Cottontail",
"Daisie",
"Poofy",
"Flower",
"Britney",
};
public Rabbit(String name, boolean isFemale) {
super(name, RESALE_PRICE);
this.isFemale = isFemale;
}
public Rabbit(String name, Rabbit mother, Rabbit father,
boolean isFemale) {
super(name, RESALE_PRICE);
parents.add(mother);
parents.add(father);
this.isFemale = isFemale;
}
/**
* Return true
if this rabbit is female; else
* false
.
*/
public boolean isFemale() {
return isFemale;
}
/**
* Designate that this rabbit is dead.
*/
public void kill() {
isDead = true;
}
/**
* Adds child
to this rabbit's children collection.
* Performs no validation.
*/
public void addChild(Rabbit child) {
children.add(child);
}
public String toString(boolean detailed) {
StringBuffer buf = new StringBuffer(512);
buf.append("Rabbit ").append(getName());
buf.append(" (").append((isFemale) ? "female" : "male").append(")");
if (detailed) {
buf.append(" sells for ").append(getPrice());
buf.append(" dollars.\n\tparents: ").append(parents);
buf.append("\n\tchildren: ").append(children);
} else
buf.append("; has " + children.size() + " children.");
return buf.toString();
}
public static void main(String[] args) {
// create some new rabbits
try {
if (args.length == 2 && args[0].equals("breed")) {
int iters = Integer.parseInt(args[1]);
breed(iters);
return;
}
} catch (NumberFormatException e) {
}
// if we get here, something went wrong
System.out.println("Usage:");
System.out.println("\tjava tutorial.jdo.Rabbit breed 'iterations'");
}
/**
* Find two random compatible rabbits in the database, toss them
* in a dark room for a little while, and repeat iterations
* times.
*/
public static void breed(int iterations) {
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory
("META-INF/jdo.properties");
PersistenceManager pm = pmf.getPersistenceManager();
Transaction t = pm.currentTransaction();
t.begin();
while (iterations > 0) {
breedHelper(pm);
iterations--;
}
t.commit();
pm.close();
pmf.close();
}
private static void breedHelper(PersistenceManager pm) {
Random random = new Random();
// find a female rabbit
Query femaleQuery = pm.newQuery(Rabbit.class,
"isFemale == true && isDead == false");
List females = (List) femaleQuery.execute();
if (females.isEmpty())
throw new RuntimeException("No females in db. Please create one.");
Rabbit female = (Rabbit) females.get(random.nextInt(females.size()));
// find a male rabbit
Query maleQuery = pm.newQuery(Rabbit.class,
"isFemale == false && isDead == false");
List males = (List) maleQuery.execute();
if (males.isEmpty())
throw new RuntimeException("No males in db. Please create one.");
Rabbit male = (Rabbit) males.get(random.nextInt(males.size()));
// breed the two
for (int count = random.nextInt(3) + 1; count > 0; count--) {
boolean isFemale = random.nextBoolean();
String[] names;
if (isFemale)
names = femaleRabbitNames;
else
names = maleRabbitNames;
String name = names[random.nextInt(names.length)];
Rabbit kid = new Rabbit(name, female, male, isFemale);
female.addChild(kid);
male.addChild(kid);
pm.makePersistent(kid);
System.out.println("New rabbit born: " + kid);
}
}
}