In: Computer Science
Modify the supplied payroll system to include a private instance variable called joinDate in class Employee to represent when they joined the company. Use the Joda-Time library class LocalDate as the type for this variable. See http://www.joda.org/joda-time/index.html for details end examples of how to use this library. You may also have to download the Joda-Time library (JAR File) and include this in your CLASSPATH or IDE Project Libraries.
Use a static variable in the Employee class to help automatically assign each new employee a unique (incremental) id number.
Assume the payroll is processed once per week. Create an array of Employee variables to store references to the various employee objects. In a loop, calculate the payroll for each Employee, and add a €50.00 bonus to the person’s payroll if they joined the company more than five years before the current date.
Change the Earnings() method in Employee and all sub-classes to throw a user defined Exception if the total earnings are less than the equivalent of €10 per hour, define this amount as a minimum wage. The exception should have a message with the employee's name, the minimum wage that should be paid, and a short description of the problem.
Modify the Test class to be able to handle exceptions. When an exception is encountered calculating an employee's earnings, the Test class should print out the error message and continue as normal with the next employees. Test this by changing the Test class so that two of the employees will have earnings that are below the minimum wage.
Comment in each Java source file, and explain your code with comments.
Boss.java
// Boss class derived from Employee.
public final class Boss extends Employee {
private double weeklySalary;
// constructor for class Boss
public Boss(String first, String last, double salary) {
super(first, last); // call superclass constructor
setWeeklySalary(salary);
}
// set Boss's salary
public void setWeeklySalary(double salary) {
weeklySalary = (salary > 0 ? salary : 0);
}
// get Boss's pay
public double earnings() {
return weeklySalary;
}
// get String representation of Boss's name
public String toString() {
return "Boss: " + super.toString();
}
} // end class Boss
Commission worker.java
public final class CommissionWorker extends Employee {
private double salary; // base salary per week
private double commission; // amount per item sold
private int quantity; // total items sold for week
// constructor for class CommissionWorker
public CommissionWorker(String first, String last,
double salary, double commission, int quantity) {
super(first, last); // call superclass constructor
setSalary(salary);
setCommission(commission);
setQuantity(quantity);
}
// set CommissionWorker's weekly base salary
public void setSalary(double weeklySalary) {
salary = (weeklySalary > 0 ? weeklySalary : 0);
}
// set CommissionWorker's commission
public void setCommission(double itemCommission) {
commission = (itemCommission > 0 ? itemCommission : 0);
}
// set CommissionWorker's quantity sold
public void setQuantity(int totalSold) {
quantity = (totalSold > 0 ? totalSold : 0);
}
// determine CommissionWorker's earnings
public double earnings() {
return salary + commission * quantity;
}
// get String representation of CommissionWorker's name
public String toString() {
return "Commission worker: " + super.toString();
}
} // end class CommissionWorker
Employee.java
public abstract class Employee {
private String firstName;
private String lastName;
// constructor
public Employee(String first, String last) {
firstName = first;
lastName = last;
}
// get first name
public String getFirstName() {
return firstName;
}
// get last name
public String getLastName() {
return lastName;
}
public String toString() {
return firstName + ' ' + lastName;
}
public abstract double earnings();
}
HourlyWorker.java
public final class HourlyWorker extends Employee {
private double wage; // wage per hour
private double hours; // hours worked for week
// constructor for class HourlyWorker
public HourlyWorker(String first, String last,
double wagePerHour, double hoursWorked) {
super(first, last); // call superclass constructor
setWage(wagePerHour);
setHours(hoursWorked);
}
// Set the wage
public void setWage(double wagePerHour) {
wage = (wagePerHour > 0 ? wagePerHour : 0);
}
// Set the hours worked
public void setHours(double hoursWorked) {
hours = (hoursWorked >= 0 && hoursWorked < 168
? hoursWorked : 0);
}
// Get the HourlyWorker's pay
public double earnings() {
return wage * hours;
}
public String toString() {
return "Hourly worker: " + super.toString();
}
}
PieceWorker.java
public final class PieceWorker extends Employee {
private double wagePerPiece; // wage per piece output
private int quantity; // output for week
// constructor for class PieceWorker
public PieceWorker(String first, String last,
double wage, int numberOfItems) {
super(first, last); // call superclass constructor
setWage(wage);
setQuantity(numberOfItems);
}
// set PieceWorker's wage
public void setWage(double wage) {
wagePerPiece = (wage > 0 ? wage : 0);
}
// set number of items output
public void setQuantity(int numberOfItems) {
quantity = (numberOfItems > 0 ? numberOfItems : 0);
}
// determine PieceWorker's earnings
public double earnings() {
return quantity * wagePerPiece;
}
public String toString() {
return "Piece worker: " + super.toString();
}
}
Test.java
// Driver for Employee hierarchy
// Java core packages
import java.text.DecimalFormat;
// Java extension packages
import javax.swing.JOptionPane;
public class Test {
// test Employee hierarchy
public static void main(String args[]) {
Employee employee; // superclass reference
String output = "";
Boss boss = new Boss("John", "Smith", 800.0);
CommissionWorker commissionWorker =
new CommissionWorker(
"Sue", "Jones", 400.0, 3.0, 150);
PieceWorker pieceWorker =
new PieceWorker("Bob", "Lewis", 2.5, 200);
HourlyWorker hourlyWorker =
new HourlyWorker("Karen", "Price", 13.75, 40);
DecimalFormat precision2 = new DecimalFormat("0.00");
// Employee reference to a Boss
employee = boss;
output += employee.toString() + " earned $"
+ precision2.format(employee.earnings()) + "\n"
+ boss.toString() + " earned $"
+ precision2.format(boss.earnings()) + "\n";
// Employee reference to a CommissionWorker
employee = commissionWorker;
output += employee.toString() + " earned $"
+ precision2.format(employee.earnings()) + "\n"
+ commissionWorker.toString() + " earned $"
+ precision2.format(
commissionWorker.earnings()) + "\n";
// Employee reference to a PieceWorker
employee = pieceWorker;
output += employee.toString() + " earned $"
+ precision2.format(employee.earnings()) + "\n"
+ pieceWorker.toString() + " earned $"
+ precision2.format(pieceWorker.earnings()) + "\n";
// Employee reference to an HourlyWorker
employee = hourlyWorker;
output += employee.toString() + " earned $"
+ precision2.format(employee.earnings()) + "\n"
+ hourlyWorker.toString() + " earned $"
+ precision2.format(hourlyWorker.earnings()) + "\n";
JOptionPane.showMessageDialog(null, output,
"Demonstrating Polymorphism",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
} // end class Test
In above code