import jdsl.core.api.*;
import jdsl.core.ref.*;
/**
* Simulates an auction. New bids always must exceed the
* current highest bid.
*
* @author Robert Cohen (rfc)
* @version JDSL 2
*/
public class Auction {
/* ************************************ */
/* The members described in the lesson. */
/* ************************************ */
//b3.1
private Sequence bids = new NodeSequence();
private double highBid;
//e3.1
/**
* Place an initial bid for a person.
*/
//b3.2
public Position initial(String name, double amount) throws InvalidBidException{
checkBid(amount);
Bid b = new Bid(name, amount);
highBid=amount;
return bids.insertLast(b);
}
//e3.2
/**
* Perform validity checks on a bid.
*/
//b3.3
private void checkBid(double amount) throws InvalidBidException {
if (closed)
throw new InvalidBidException("Bids have closed.");
if (amount<=0)
throw new InvalidBidException("Bid must be positive.");
else if (amount <= highBid)
throw new InvalidBidException("Bid must top current high bid.");
}
//e3.3
/**
* Top the current high bid for someone already in the auction.
*/
//b3.4
public Position top(Position p, double amount) throws InvalidBidException {
checkBid(amount);
Bid b = (Bid)p.element();
b.setAmount(amount);
try {
bids.remove(p);
} catch (InvalidAccessorException e) {
throw new InvalidBidException("Bidder not in Auction.");
}
highBid=amount;
return bids.insertLast(b);
}
//e3.4
/**
* Remove someone from the auction.
*/
//b3.5
public void quit(Position p) {
bids.remove(p);
if (bids.size()==0)
highBid=0;
else
highBid=((Bid)bids.last().element()).amount();
}
//e3.5
/* ************************************ */
/* Members not described in the lesson. */
/* ************************************ */
private boolean closed=false;
/**
* Place an initial bid for an amount 1 more than the
* current highest bid.
*/
public Position initial(String name) throws InvalidBidException{
return initial(name, highBid+1);
}
/**
* Top the current high bid for someone already in the auction
* for an amount 1 more than the current highest bid.
*/
public Position top(Position p) throws InvalidBidException {
return top(p, highBid+1);
}
public int numBidders(){
return bids.size();
}
/**
* Close the auction and print the results.
*/
public Position close() {
closed = true;
if (bids.size() == 0)
return null;
else {
return bids.last();
}
}
public double highBid() {return highBid;}
/**
* Overrides the default.
*/
public String toString() {
String ret = "";
if (bids.size()==0)
return ret;
for(int i=0; i<bids.size()-1; ++i)
ret += ((Bid)bids.atRank(i).element()).toString() +'\n';
ret += ((Bid)bids.atRank(bids.size()-1).element()).toString();
return ret;
}
}