パッケージ SDK を使用した反復子の作成
- 最終更新日2022/07/22
パッケージ SDK を使用した反復子の作成
Automation 360 では、SDK パッケージで反復子を作成できます。反復子は、類似したタイプの複数のオブジェクトをループすることができ、ループ パッケージで使用します。これは、next
と hasNext
の 2 つのメソッドで構成され、実際のオブジェクトとブール値を返します。
必要な注釈
反復子が使用されている場合、next
メソッドは次に使用可能な値を返します。使用可能な値がなくなると、例外が表示されます。hasNext
メソッドは、その他の値の有無をチェックし、使用可能な値がない場合は false
を返します。Automation 360 でループが実行されると、まず hasNext()
が呼び出されます。next()
は、hasNext()
が true
値を返した場合のみ呼び出されます。
反復子を作成するには、次の注釈が必要です。
注釈 | 使用状況 |
---|---|
BotCommand |
commandType として iterator を使用して、BotCommand 注釈を使用します。これにより、POJO (plain old Java object) が Automation 360 反復子の作成に適するようになります。 |
CommandPkg |
パッケージの作成では、注釈に名前、ラベル、説明を指定します。 |
Idx |
検証チェックに役立つよう、必要なすべてのパラメーターとメンバー変数に注釈を付けます。これらは、入力時のインターフェースに表示することもできます。Idx とタイプを指定します。 |
Pkg |
インターフェースに表示するすべてのパラメーターとメンバー変数に注釈を付けます。Idx が付いていない注釈は無視されます。 |
HasNext |
反復にさらに要素があるかどうかをテストするために呼び出す必要があるメソッド (例外がスローされずに next() から要素が返された場合は true を返す)。ブール値を返す必要があります。メソッドがパラメーターを受け付ける場合は、 |
Next |
反復で次に使用可能な値を返します。リターンタイプは値です。使用可能な値がなくなると、例外が表示されます。 |
このユースケースは、たとえば (int i=0; I<n; i++
) Java 構文をループする例です。Bot が作成されると、Bot Creator から n
の値を受け付けます。
- 以下のパッケージをインポートしたことを確認し、サンプルで説明されているようにすべての機能が動作することを確認してください。
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;
- 次のビジネス ロジックを持つ POJO クラスを作成します。
POJO にはメソッドが 1 つ必要であり、ブール値を返す必要があります。これは、比較メソッドの働きをします。
@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; } }
- POJO クラスに注釈を付けることで Automation 360 反復子に対して有効にし、パッケージを作成します。
@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; }
hasNext()
および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; }
メソッドには使いやすい名前を付け、Java 反復子インターフェースに沿ったものにします。メソッドの命名で SDK 側の制限はありません。
反復子では、パラメーター メソッドは使わずに、
setter injection
を使用します。Idx
とPkg
で変数に注釈を付けます。値が null にならないよう
@NotEmpty
を追加し、値が必ず0
より大きくなるよう@GreaterThanEqualTo
を追加します。@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;
属性の型番号は
Double
を返します。