public void fireAfterSolveEvent(SolverJob<?> job, ChallengeSolver<?> solver) {
   synchronized (job) {
     job.getLogger().info("Solver " + solver + " finished job " + job);
     job.notifyAll();
   }
   eventSender.fireEvent(
       new ChallengeResponseEvent(this, ChallengeResponseEvent.Type.SOLVER_END, solver, job));
 }
 private void fireJobDone(SolverJob<?> job) {
   eventSender.fireEvent(
       new ChallengeResponseEvent(this, ChallengeResponseEvent.Type.JOB_DONE, job));
 }
 private void fireNewJobEvent(SolverJob<?> job) {
   eventSender.fireEvent(
       new ChallengeResponseEvent(this, ChallengeResponseEvent.Type.NEW_JOB, job));
 }
 public void fireBeforeSolveEvent(SolverJob<?> job, ChallengeSolver<?> solver) {
   eventSender.fireEvent(
       new ChallengeResponseEvent(this, ChallengeResponseEvent.Type.SOLVER_START, solver, job));
 }
 public <E> void fireNewAnswerEvent(SolverJob<E> job, AbstractResponse<E> abstractResponse) {
   eventSender.fireEvent(
       new ChallengeResponseEvent(
           this, ChallengeResponseEvent.Type.JOB_ANSWER, abstractResponse, job));
 }