Criar um iterador usando o pacote SDK

Em Automation 360, você pode criar um iterador com o pacote SDK. Um iterador é usado para fazer loop entre os vários objetos de tipo semelhante e é usado com o pacote do Loop. Ele consiste em dois métodos, next e hasNext, que retornam o objeto real e um valor booleano.

Anotações necessárias

Quando o iterador é usado, o método next retorna o próximo valor disponível. Se não houver mais valores disponíveis, é mostrada uma exceção. O método hasNext procura por outros valores e retornas false se não houver mais valores disponíveis. Em Automation 360quando o loop é executado, hasNext() é chamado primeiro, e next() só é chamado se hasNext() retornou um valor true.

Para criar um iterador, as seguintes anotações são necessárias.

Anotação Utilização
BotCommand Use a anotação BotCommand com o iterator como commandType. Isso garante que o objeto Java simples antigo (POJO) seja adequado para criar um iterador Automation 360.
CommandPkg Ao criar um pacote, forneça um nome, rótulo e descrição para a anotação.
Idx Anote todos os parâmetros e variáveis dos membros que são necessários e ajude na verificação de validação, ou eles podem ser exibidos na interface para a entrada. Forneça o Idx e o tipo.
Pkg Anote todos os parâmetros e variáveis de membros que serão exibidos na interface. Essa anotação será ignorada se não for acompanhada por Idx.
HasNext O método que deve ser chamado para testes se a iteração tiver mais elementos (retorna true se next() retornar um elemento em vez de lançar uma exceção). Deve retornar um valor booleano.

Se o método aceita parâmetros, eles devem ser anotados com o Idx. O método hasNext verifica-o e retorna false se não houver mais valores disponíveis. Em Automation 360, quando Loop é executado, hasNext() é chamado primeiro. next() só é chamado se hasNext() retornar um valor true.

Next O método retorna o próximo valor disponível na iteração. O tipo de retorno é um valor. Se não houver mais valores disponíveis, é mostrada uma exceção.
Exemplo de caso de uso

O caso de uso de exemplo percorre o número de vezes, por exemplo, para o construtor Java (int i=0; I<n; i++). Aceita o valor de n do Bot Creator quando o bot é criado.

  1. Você deverá ter importado os seguintes pacotes para garantir que todas as funcionalidades operem conforme descrito no exemplo.
    import com.automationanywhere.botcommand.data.Value;
    import com.automationanywhere.botcommand.data.impl.NumberValue;
    import com.automationanywhere.commandsdk.annotations.BotCommand;
    import com.automationanywhere.commandsdk.annotations.CommandPkg;
    import com.automationanywhere.commandsdk.annotations.HasNext;
    import com.automationanywhere.commandsdk.annotations.Idx;
    import com.automationanywhere.commandsdk.annotations.Inject;
    import com.automationanywhere.commandsdk.annotations.Next;
    import com.automationanywhere.commandsdk.annotations.Pkg;
    import com.automationanywhere.commandsdk.annotations.BotCommand.CommandType;
    import com.automationanywhere.commandsdk.annotations.rules.GreaterThanEqualTo;
    import com.automationanywhere.commandsdk.annotations.rules.NotEmpty;
    import com.automationanywhere.commandsdk.annotations.rules.NumberInteger;
    import com.automationanywhere.commandsdk.model.AttributeType;
    import com.automationanywhere.commandsdk.model.DataType;
  2. Crie a classe POJO com a lógica empresarial.

    Assegure-se de que o POJO tenha um método e retorne um valor booleano. Isto funcionará como um método de comparação.

    @BotCommand(commandType=CommandType.Iterator)
    @CommandPkg(return_label = "Return the value in variable", node_label = ": {{times}} times", 
    label = "Iterator demo", description = "Iterate number of times", name = "iteratorTypeDemo", return_type = DataType.NUMBER)
    public class IteratorTypeDemo {
        @Idx(index = "1", type = AttributeType.NUMBER)
        @Pkg(label = "times", default_value = "10", default_value_type = DataType.NUMBER)
        @GreaterThanEqualTo("0")
        @NumberInteger
        @NotEmpty
        @Inject
    	private Double times = 10d;
    
    	private Double counter = 0d;
    
        @HasNext
        public boolean hasNext() {
    		return counter < times;
        }
    
        @Next
        public Value<Double> next() throws Exception{
    		if (counter >= times)
    			throw new Exception("Counter '"+ counter +"' is exceed the times limit '"+times+"'");
    
    		counter++;
            NumberValue result = new NumberValue();
            result.set(counter);
            return result;
        }
    
        public void setTimes(Double times) {
            this.times = times;
        }
    }
  3. Anote a classe POJO para habilitá-la para o iterador Automation 360 e para criar o pacote.
    @BotCommand(commandType = CommandType.Iterator)
    @CommandPkg(return_label = "Return the value in variable", node_label = ": {{times}} times",
    	label = "Iterator demo", description = "Iterate number of times", name = "iteratorTypeDemo", return_type = DataType.NUMBER)
    public class IteratorTypeDemo {
    
    	private Double times = 10 d;
    	private Double counter = 0 d;
    
    	public boolean hasNext() {
    		return counter < times;
    	}
  4. Anote apropriadamente o método hasNext() e next().
    @HasNext
    public boolean hasNext() {
    	return counter < times;
    }
    
    @Next
    public Value < Double > next() throws Exception {
    	if (counter >= times)
    		throw new Exception("Counter '" + counter + "' is exceed the times limit '" + times + "'");
    
    	counter++;
    	NumberValue result = new NumberValue();
    	result.set(counter);
    	return result;
    }

    Os métodos são nomeados de maneira fácil de usar e estão em paralelo com a interface do iterador Java. Não há restrição do lado do SDK quando se trata de métodos de nomeação.

    Em um iterador, não use métodos de parâmetros, mas use setter injection.

  5. Anote as variáveis com Idx e Pkg.

    Adicione @NotEmpty para garantir que o valor não seja nulo, e adicione @GreaterThanEqualTo para garantir que o valor seja sempre maior do que 0.

    @Idx(index = "1", type = AttributeType.NUMBER)
    @Pkg(label = "times", default_value = "10", default_value_type = DataType.NUMBER)
    @GreaterThanEqualTo("0")
    @NotEmpty
    @Inject
    private Double times = 10 d;

    O número do tipo de atributo retorna um Double.