diff --git a/java/com/aa/act/interview/org/Organization.java b/java/com/aa/act/interview/org/Organization.java index 5060509..67a01ad 100644 --- a/java/com/aa/act/interview/org/Organization.java +++ b/java/com/aa/act/interview/org/Organization.java @@ -5,7 +5,8 @@ public abstract class Organization { private Position root; - + private int id = 1; + public Organization() { root = createOrganization(); } @@ -20,10 +21,42 @@ public Organization() { * @return the newly filled position or empty if no position has that title */ public Optional hire(Name person, String title) { - //your code here + // assign employee if title is CEO/root + if (root.getTitle().equals(title)) { + return assignEmployee(root, person); + } else { + // or visit direct reports + return hire(root, person, title); + } + } + + private Optional hire(Position currentPosition, Name person, String title) { + // visit all direct reports + for (Position pos : currentPosition.getDirectReports()) { + if (pos.getTitle().equals(title)) { + // Assign employee if title matches + return assignEmployee(pos, person); + } else if (!pos.getDirectReports().isEmpty()) { + // Recursively visit direct reports + Optional newPos = hire(pos, person, title); + if (newPos.isPresent()) { + return newPos; + } + } + } return Optional.empty(); } + private Optional assignEmployee(Position position, Name person) { + if (!position.isFilled()) { + position.setEmployee(Optional.of(new Employee(id, person))); + id += 1; + return Optional.of(position); + } else { + throw new IllegalArgumentException("Position is already filled."); + } + } + @Override public String toString() { return printOrganization(root, "");