JavaCode function provided I/O Hooks (Bozza)

This advanced [JSup] feature enable a [JSup Channels|I/O Channel] to get its I/O hooks from a [JavaCode functions|JavaCode function] that will decide which tag (for instance based according to the tag class) will be bound to which device item and if in read/write only mode.

The [JavaCode functions|JavaCode function] must accept an unique parameter: ChannelInfo ch
And must return an Iterable<IOHookCodeCreatedInfo> object.
Its signature should be:
Iterable<IOHookCodeCreatedInfo> functionName ( ChannelInfo ch ) throws JException;

The [JavaCode functions|JavaCode function] can determine which tag to include be enumerating the tags that belong to a certain [JSup Tag classes|tag class]. The following example provides MQTT I/O hook for the tag of [JSup Tag classes|tag class] named /device/onoff:

final Vector<IOHookCodeCreatedInfo> v = new Vector<>();
for( final TagRef tag : getTagClass( "/device/onoff" ).tags() ) {
  v.add( new IOHookCodeCreatedInfo.N.Adapter(
     tag, "/JSupTest/device/onoff/"+tag.getName(), true, false, null, null, false )
  );
}


An [JSup Channels|I/O Channel] can have both [IOHook|I/O hooks] statically entered in the [JSup Tag dialog|tag dialog] and JavaCode function provided ones.

The name of the [JavaCode functions|JavaCode function] that will provide [IOHook|I/O hooks] to a channel have to be specified in the Auto I/O hook JavaCode fun: in the [JSup Channels#Channel configuration|I/O channel dialog] dialog.