package cars;
import java.sql.Date;
import java.sql.SQLException;
/*
* Main hire service class
*/
public class HireService {
private DbService db;
//called by rest servlet to make booking
public long hire(String name, String licenseNumber, String cd, String reg, String start, int days, double rate) throws SQLException {
boolean hired = false;
Client client = getClient(name, licenseNumber, cd);
Car car = getCarDetails(reg, cd);
if(car == null || car.hired) {
return -1;
}
long hireNumber = System.nanoTime(); //use as unique id
HireRecord hire = new HireRecord();
client.addHirerecrd(hire);
hire.setCar(car); hire.setDays(days);
hire.setClient(client.getName());
hire.setStartDate(Date.valueOf(start));
hire.setRate(rate); hire.setState(1);
hire.setHireno(hireNumber);
hire.setDays(days);
db.saveToDatabase(client, cd);
car.hire(db, cd, hire);
return hireNumber;
}
public void markReturned(String cd, long hireno) {
try {
Car car = (Car) db.loadFromDb(cd, "select * from crs where hrrnm = " + hireno, Car.class);
car.release(db, cd);
} catch (SQLException e) {
//nothing we can do
}
}
public Car getCarDetails(String rg, String cd) {
try {
return (Car) db.loadFromDb(cd, "select * from crs where rg = " + rg,Car.class);
} catch (SQLException e) {
return new Car(rg);
}
}
//dont use
private DbService getDb() {
return db;
}
public void setDb(DbService db) {
this.db = db;
}
public Client getClient(String name, String licenseNumber, String cd) {
Client client;
try {
client = (Client) db.loadFromDb(cd, "select * from clients where clientId = " + name,Client.class);
} catch (Exception e1) {
throw new RuntimeException();
}
if(client == null) {
client = new Client(name,licenseNumber,cd);
try {
db.saveToDatabase(client, cd);
} catch (Exception e) {
e.printStackTrace();
}
}
return client;
}
}
package cars;
import java.util.Date;
public class HireRecord {
private Car car;
private String client;
private Date startDate;
private int days;
private double rate;
private int state;
private long hireno;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public String getClient() {
return client;
}
public void setClient(String client) {
this.client = client;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public long getHireno() {
return hireno;
}
public void setHireno(long hireno) {
this.hireno = hireno;
}
public double getRate() {
if(car instanceof Bike) return rate; //no discount for bikes
return this.rate = car.getAge() > 3 ? rate * 0.9 : rate; //discount for older cars
}
public void setRate(double rate) {
this.rate = rate;
}
}
package cars;
import java.util.Vector;
public class Client {
private String name;
String licenseNumber;
private String cd;
private Vector records;
public Client(String name, String licenseNumber, String cd) {
this.name = name;
this.licenseNumber = licenseNumber;
this.cd = cd;
}
public String getName() {
return name;
}
public String getLicenseNumber() {
return licenseNumber;
}
public String getCd() {
return cd;
}
public Vector getRecords() {
return records;
}
public void addHirerecrd(HireRecord r) {
if(records == null) {
records = new Vector();
}
records.add(r);
}
@Override
public String toString() {
return name + licenseNumber;
}
}
package cars;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import org.joda.time.DateTime;
public class Car {
public String make;
public String reg;
public int category;
public boolean hired;
public Date hireEnd;
private int age;
private long hireNumber;
public Car(String reg) {
this.reg = reg;
}
public Car(String reg, String make, int category) {
this.make = make;
this.reg = reg;
this.category = category;
}
public int getAge() {
return 2015 - Integer.parseInt("20" +reg.substring(3, 2));
}
public void hire(DbService dbService, String cd, HireRecord record) throws SQLException {
hireEnd = new DateTime(record.getStartDate().getTime()).plusDays(record.getDays()).toDate();
hireNumber = record.getHireno();
Calendar.getInstance();
dbService.saveToDatabase(this, cd);
}
public void release(DbService dbService, String cd) throws SQLException {
hireNumber = 0;
hireEnd = null;
dbService.saveToDatabase(this, cd);
}
//disabled
public Car(String make, String reg, int category, boolean hired,Date hireEnd) {
// this.make = make;
// this.reg = reg;
// this.category = category;
// this.hired = hired;
// this.hireEnd = hireEnd;
throw new RuntimeException("disabled full constructor");
}
}
package cars;
/*
* Andyr request want to hire bikes too
*/
public class Bike extends Car {
public int cc;
public Bike(String reg) {
super(reg);
}
}