Lendo Coleções com Serviços

Podemos receber coleções como parâmetros de serviços.

Dada a tabela abaixo:

../../_images/service_execute_params.png

Queremos que os parâmetros PARAM_1, PARAM_2 ... PARAM_N sejam passados para o serviço como uma lista de String. Basta indicarmos um padrão nos nomes das propriedades e todas com esse padrão serão incluídas na lista. Podemos fazer isto através da anotação @SuffixOf, indicando qual é o prefixo padrão.

@ServiceImplementor(action=ActionsEnum.EXECUTAR, serviceName="SERVICE")
public class SuffixListService {

         @Execution
         public void executeService(@SuffixOf(preffix="PARAM_") List<String> parameters){
             System.out.println(parameters);
         }
}

Todas as propriedades em que o nome começa com PARAM_ serão incluídas na lista. Logo, o resultado será algo como: [1, 2, 3, 4, 5], não necessariamente na ordem passada. Mas e se quiséssemos usar um map? O que seria a chave e o valor? Vamos utilizar um exemplo mais claro.

../../_images/service_execute_calc.png

Um serviço que realiza um cálculo baseado em valores separados por meses do ano.

@ServiceImplementor(action=ActionsEnum.EXECUTAR, serviceName="CALC")
public class CalcService {

         @Execution
         public void executeService(@SuffixOf(preffix="VAL_") Map<String, String>parameters){
             System.out.println(parameters);
         }
}

Se utilizarmos map, a chave será o sufixo do nome da propriedade e o valor será o da célula correspondente. Logo, o resultado será algo como:

{JAN_2012=100.0, FEV_2012=200.0, MAR_2012=300.0, ABR_2012=400.0, MAI_2012=500.0, JUN_2012=600.0}

Também poderíamos utilizar a anotação @WithPrefix em que a chave do map também conterá o prefixo.

@ServiceImplementor(action=ActionsEnum.EXECUTAR, serviceName="CALC")
public class CalcService {

         @Execution
         public void executeService(@WithPreffix(preffix="VAL_") Map<String, String> parameters){
             System.out.println(parameters);
         }
}

Logo, o resultado será algo como:

{VAL_JAN_2012=100.0, VAL_FEV_2012=200.0, VAL_MAR_2012=300.0, VAL_ABR_2012=400.0, VAL_MAI_2012=500.0, VAL_JUN_2012=600.0}

Também podemos utilizar a anotação @WithRegex para expressões regulares.

@ServiceImplementor(action=ActionsEnum.EXECUTAR, serviceName="CALC")
public class CalcService {

         @Execution
         public void executeService(@WithRegex(regex=".{3}_([A-Z]{3})_[0-9]{4}", groupIndex=1)Map<String, String>parameters){
             System.out.println(parameters);
         }
}

A chave da propriedade será definida pelo groupIndex. No exemplo acima, definimos que o groupIndex é 1. Então a chave será os três caracteres entre os underscores. Logo, o resultado será algo como:

{JAN=100.0, FEV=200.0, MAR=300.0, ABR=400.0, MAI=500.0, JUN=600.0}

Objetos persistíveis

Mas e se quiséssemos passar uma lista de objetos para um serviço que realize a soma dos valores de Stocks?

@ServiceImplementor(action=ActionsEnum.EXECUTAR, serviceName="SOMA")
public class SomaService {

         @Execution
         public void executeService(@SuffixOf(preffix="STOCK")List<Stock> parameters){
             System.out.println(parameters);
         }
}

Basta que o objeto seja um PersistableBusinessObject e que possua um atributo anotado com @NaturalKey. Na tabela, tudo que precisamos é passar o atributo @NaturalKey e o objeto será populado e passado para o serviço. Supondo que o atributo name de Stock é o natural key, a planilha ficaria assim:

../../_images/service_execute_sum.png

Isto funciona tanto para @Input, @SuffixOf, @WithPreffix, @WithRegex.