@Override
 public Object[] toArray() {
   return queue.toArray();
 }
 @Override
 public <T> T[] toArray(T[] a) {
   return queue.toArray(a);
 }
  public void start(String configFileName, Reporter reporter)
      throws PropertiesException, ConectionToExecNodesException, ChannelException,
          WorkerInstantiationException, TaskInstantiationException, StartFailureException {
    this.reporter = reporter;
    reporter.report(1, "MasterServant::start - Lendo configuracoes de " + configFileName);

    /* lê arquivo de configuração */
    if (!getProperties(configFileName)) {
      throw new PropertiesException();
    }
    reporter.report(1, "MasterServant::start - Arquivo de configuracao lido");

    /* cria objeto que inicializa workers e fila de tarefas */
    try {
      initializer = new WorkerInitializer(this);
    } catch (Exception e) {
      throw new WorkerInstantiationException();
    }
    reporter.report(1, "MasterServant::start - WorkerInitializer instanciado");

    /* conecta-se com os execution nodes dos workers*/
    reporter.report(1, "MasterServant::start - Conectando aos outros execution nodes");
    hashNodes = this.initializer.connectToExecNodes();
    if (hashNodes == null) {
      throw new ConectionToExecNodesException();
    }
    reporter.report(1, "MasterServant::start - Conectado ao execution node dos workers");

    /* cria canal de evento entre master e workers*/
    reporter.report(1, "MasterServant::start - Criando canal de evento entre master e workers");
    channel = initializer.buildChannel();
    if (channel == null) {
      throw new ChannelException();
    }

    /*instancia workers*/
    reporter.report(1, "MasterServant::start - Instanciando Workers");
    workerQueue = initializer.buildWorkerQueue();
    if (workerQueue == null) {
      throw new WorkerInstantiationException();
    }

    /*instancia tarefas*/
    reporter.report(1, "MasterServant::start - Instanciando Tarefas");
    ioformat = initializer.createIOFormatServant(ioformatClassName);
    if (ioformat == null) {
      throw new TaskInstantiationException();
    }

    taskQueue = initializer.buildTaskQueue();
    if ((taskQueue == null) || (taskQueue.toArray().length == 0)) {
      throw new TaskInstantiationException();
    }
    num_partitions = taskQueue.toArray().length;

    /* inicia escalonamento das tarefas map-reduce*/
    reporter.report(1, "MasterServant::start - Iniciando escalonamento");
    if (!schedule()) {
      initializer.finish();
      throw new StartFailureException();
    }
    initializer.finish();
  }