// default data provider
@Override
	public MultiSelect<T> build() {
		final MultiSelectListBox<ITEM> component = getComponent();
		// check DataProvider
		if (!new ExceptionSwallowingSupplier<>(() -> component.getDataProvider()).get().isPresent()) {
			// default data provider
			component.setDataProvider(DataProvider.ofCollection(Collections.emptySet()));
		}
		// configure captions
		if (!customItemCaptionGenerator && !itemCaptions.isEmpty()) {
			component.setRenderer(new TextRenderer<>(
					new DeferrableItemLabelGenerator<>(itemCaptions, component, isDeferredLocalizationEnabled())));
		}
		// items
		if (!items.isEmpty()) {
			component.setItems(items);
		}
		final Input<Set<ITEM>> itemInput = Input.builder(component).requiredPropertyHandler((f, c) -> {
			return false;
			// TODO not supported by web component at time of writing
			// return f.isRequiredIndicatorVisible();
		}, (f, c, v) -> {
			// TODO not supported by web component at time of writing
			// f.setRequiredIndicatorVisible(v);
		}).isEmptySupplier(f -> f.getValue() == null || f.getValue().isEmpty()).build();
		final MultiSelectInputAdapter<T, ITEM, MultiSelectListBox<ITEM>> multiSelect = new MultiSelectInputAdapter<>(
				itemInput, new MultiSelectListBoxItemConverterAdapter<>(component, itemConverter),
				ms -> component.getDataProvider().refreshAll(), () -> {
					if (component.getDataProvider() != null) {
						return component.getDataProvider().fetch(new Query<>()).collect(Collectors.toSet());
					}
					return null;
				});
		selectionListeners.forEach(listener -> multiSelect.addSelectionListener(listener));
		getValueChangeListeners().forEach(listener -> multiSelect.addValueChangeListener(listener));
		getReadonlyChangeListeners().forEach(listener -> multiSelect.addReadonlyChangeListener(listener));
		getAdapters().getAdapters().forEach((t, a) -> multiSelect.setAdapter(t, a));
		return multiSelect;
	}
// check DataProvider
if (!new ExceptionSwallowingSupplier<>(() -> component.getDataProvider()).get().isPresent()) {
// default data provider
component.setDataProvider(DataProvider.ofCollection(Collections.emptySet()));
}
@Override
public MultiSelect<T> build() {
final MultiSelectListBox<ITEM> component = getComponent();
// check DataProvider
if (!new ExceptionSwallowingSupplier<>(() -> component.getDataProvider()).get().isPresent()) {
// default data provider
component.setDataProvider(DataProvider.ofCollection(Collections.emptySet()));
}
// configure captions
if (!customItemCaptionGenerator && !itemCaptions.isEmpty()) {
component.setRenderer(new TextRenderer<>(
new DeferrableItemLabelGenerator<>(itemCaptions, component, isDeferredLocalizationEnabled())));
}
// items
if (!items.isEmpty()) {
component.setItems(items);
@Override
public MultiSelect<T> build() {
final MultiSelectListBox<ITEM> component = getComponent();
// check DataProvider
if (!new ExceptionSwallowingSupplier<>(() -> component.getDataProvider()).get().isPresent()) {
// default data provider
component.setDataProvider(DataProvider.ofCollection(Collections.emptySet()));
}
// configure captions
if (!customItemCaptionGenerator && !itemCaptions.isEmpty()) {
component.setRenderer(new TextRenderer<>(
new DeferrableItemLabelGenerator<>(itemCaptions, component, isDeferredLocalizationEnabled())));
}
// items
if (!items.isEmpty()) {
component.setItems(items);
}
final Input<Set<ITEM>> itemInput = Input.builder(component).requiredPropertyHandler((f, c) -> {
return false;
// TODO not supported by web component at time of writing
// return f.isRequiredIndicatorVisible();
}, (f, c, v) -> {
// TODO not supported by web component at time of writing
// f.setRequiredIndicatorVisible(v);
}).isEmptySupplier(f -> f.getValue() == null || f.getValue().isEmpty()).build();
final MultiSelectInputAdapter<T, ITEM, MultiSelectListBox<ITEM>> multiSelect = new MultiSelectInputAdapter<>(