package org.softlang.company.actors;
import java.util.ArrayList;
import java.util.List;
import org.softlang.company.messages.DepartmentsMessage;
import org.softlang.company.messages.EmployeeMessage;
import org.softlang.company.messages.EndMessage;
import org.softlang.company.model.Department;
import org.softlang.company.model.Employee;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedActor;
public class DepartmentsActor extends UntypedActor {
private ActorRef back = null;
private boolean end = false;
@Override
public void onReceive(Object message) throws Exception {
// TODO Auto-generated method stub
if (message instanceof DepartmentsMessage) {
back = this.getSender();
List<Employee> employees = this
.getEmployees(((DepartmentsMessage) message)
.getDepartments());
back.tell(new EmployeeMessage(employees), this.getSelf());
if (end) {
back.tell(new EndMessage(), this.getSelf());
}
} else if (message instanceof EndMessage)
back.tell(message, this.sender());
else {
unhandled(message);
}
}
/**
* collect employees from departments ds
*
* @param ds
* @return collected employees
*/
private List<Employee> getEmployees(List<Department> ds) {
ArrayList<Employee> employees = new ArrayList<Employee>();
List<Department> nextDepartments = new ArrayList<Department>();
for (Department d : ds) {
nextDepartments.addAll(d.getDepartments());
}
nextInstance(nextDepartments);
for (Department d : ds) {
if (d.getManager() != null)
employees.add(d.getManager());
employees.addAll(d.getEmployees());
}
return employees;
}
/**
* Create next instance if departments available
*
* @param nextDepartments
*/
private void nextInstance(List<Department> nextDepartments) {
if (!nextDepartments.isEmpty()) {
ActorRef child = this.context().actorOf(
Props.create(DepartmentsActor.class));
child.tell(new DepartmentsMessage(nextDepartments), this.back);
} else {
end = true;
}
}
}