package org.softlang.company.features.features; import org.softlang.company.model.company.*; import org.softlang.company.model.company.impl.bean.*; import java.util.Observable; import java.util.Observer; /** * Supervise all salary changes to obey the Precedence feature. */ public class Precedence implements Observer { public void update(Observable o, Object arg) { if (o instanceof EmployeeImpl && arg instanceof String) { EmployeeImpl e = (EmployeeImpl)o; if (((String)arg).equals("salary")) { DepartmentImpl d = (DepartmentImpl)e.getParent(); if (!e.getManager()) { // An employee must have a smaller salary than the manager of the department. if (e.getSalary() >= d.getManager().getSalary()) throw exception(e); } else { // A manager of the upper department, if any, must have a greater salary. if (d.getParent()!=null && d.getParent() instanceof DepartmentImpl) if (e.getSalary() >= ((DepartmentImpl)(d.getParent())).getManager().getSalary()) throw exception(e); // All managed employees must have smaller salaries. // For sub-departments, the manager is tested only. for (Subunit u : d.subunits()) if (u instanceof DepartmentImpl) { if (((DepartmentImpl)u).getManager().getSalary() >= e.getSalary()) throw exception(e); } else { if (u!=e && ((EmployeeImpl)u).getSalary() >= e.getSalary()) throw exception(e); } } } } } private RuntimeException exception(Employee e) { return new IllegalArgumentException("Precedence constraint violated for employee \"" + e.getName() + "\"."); } }