var mapper = mapperFactory.createMapperMult(["EstProd"]);
var jsonConvert = new com.google.gson.GsonBuilder().create();
var result = [];

var processarItens = function(produtos, inicio, fim){
   let param = [];

    for(let i = inicio; i<fim; i++)
        param.push(produtos.get(i));

    param = mapper.selectList('EstProd.listarEstProdDescricaoProdutos', {'produtos':param, 'sts': message.get('sts'), 'filiais': message.get('filiais')});
    for(let i = 0; i<param.size(); i++)
        result.push(param.get(i));

};

var getDescricaoDoArquivo = function(produtos){
     let tamanho = 400;

    if(!produtos || produtos.size() == 0)
        return ;

    if(produtos.size() <= tamanho){
        processarItens(produtos, 0, produtos.size());
    }else{
        let tamanhoPull = Math.ceil(produtos.size()/tamanho);
        let service = java.util.concurrent.Executors.newFixedThreadPool(tamanhoPull);
        let futureList = new java.util.ArrayList();

        for (let i=0; i<tamanhoPull; i++){
            if(i == (tamanhoPull-1)){
                let param = {
                    'i': i,
                    'produtos': produtos,
                    'tamanho': tamanho,
                    'call': function(){
                        processarItens(this.produtos, (this.i*this.tamanho), this.produtos.size());
                    }
                };

                let callable = new java.util.concurrent.Callable(param);
                futureList.add(callable);
            } else{

                let param = {
                    'i': i,
                    'produtos': produtos,
                    'tamanho': tamanho,
                    'call': function(){
                        processarItens(this.produtos, (this.i*this.tamanho), (this.tamanho*this.i+this.tamanho));
                    }
                };

                let callable = new java.util.concurrent.Callable(param);
                futureList.add(callable);
            }
        }
        service.invokeAll(futureList);
        service.shutdown();
    }
};

var removerItensNulos = function(){
    for(let i = 0; i<result.length; i++){
        if(result[i] == null){
            result.splice(i, 1);
            i--;
        }
    }
};

try{
    if(message.get('itens') != null && message.get('itens').size() > 0)
	    getDescricaoDoArquivo(message.get('itens'));

    removerItensNulos(result);
	result;

  }catch(err){
  	if(err.code)
        throw JSON.stringify(err);
  	else
  		throw err;
}