package tutorial.jdo; import java.util.*; import javax.jdo.*; /** * A snake is an animal that is likely to eat rabbits. * This class will be used in Chapter V. */ public class Snake extends Animal { // the resale price of a snake public static final float RESALE_PRICE = 150.0f; // member variable declarations go here private short length = 0; // This list will be persisted into the database as // a one-to-many relation. private Set giTract = new HashSet(); /** * Constructor. * * @param name the name of this snake * @param feet the length of the snake, in feet */ public Snake(String name, short feet) { super(name, RESALE_PRICE); length = feet; } public String toString(boolean detailed) { StringBuffer buf = new StringBuffer(1024); buf.append("Snake ").append(getName()); if (detailed) { buf.append(" (").append(length).append(" feet long) sells for "); buf.append(getPrice()).append(" dollars."); buf.append(" Its gastrointestinal tract contains:\n"); for (Iterator iter = giTract.iterator(); iter.hasNext();) buf.append("\t").append(iter.next()).append("\n"); } else buf.append("; ate " + giTract.size() + " rabbits."); return buf.toString(); } /** * Kills the specified rabbit and eats it. */ public void eat(Rabbit dinner) { // Consume the rabbit. dinner.kill(); dinner.eater = this; giTract.add(dinner); System.out.println("Snake " + getName() + " ate rabbit " + dinner.getName() + "."); } /** * Locates the specified snake and tells it to eat a rabbit. */ public static void eat(String filter) { PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory ("META-INF/jdo.properties"); PersistenceManager pm = pmf.getPersistenceManager(); Transaction transaction = pm.currentTransaction(); transaction.begin(); // Find the desired snake(s) in the data store. Query query = pm.newQuery(Snake.class, filter); List results = (List) query.execute(); if (results.isEmpty()) { System.out.println("No snakes matching '" + filter + "' found"); return; } Query uneatenQuery = pm.newQuery(Rabbit.class, "isDead == false"); Random random = new Random(); for (Iterator iter = results.iterator(); iter.hasNext();) { // Run a query for a rabbit whose 'isDead' field indicates // that it is alive. List menu = (List) uneatenQuery.execute(); if (menu.isEmpty()) { System.out.println("No live rabbits in DB."); break; } // Select a random rabbit from the list. Rabbit dinner = (Rabbit) menu.get(random.nextInt(menu.size())); // Perform the eating. Snake snake = (Snake) iter.next(); System.out.println(snake + " is eating:"); snake.eat(dinner); } transaction.commit(); pm.close(); pmf.close(); } public static void main(String[] args) { if (args.length == 2 && args[0].equals("eat")) { eat(args[1]); return; } // If we get here, something went wrong. System.out.println("Usage:"); System.out.println(" java tutorial.Snake eat \"snakequery\""); } }