@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;
	}
@Override
	public MultiSelect<T> build() {
		final MultiSelectListBox<ITEM> component = getComponent();
	
		if (!new ExceptionSwallowingSupplier<>(() -> component.getDataProvider()).get().isPresent()) {
		
			component.setDataProvider(DataProvider.ofCollection(Collections.emptySet()));
		}
	
		if (!customItemCaptionGenerator && !itemCaptions.isEmpty()) {
			component.setRenderer(new TextRenderer<>(
					new DeferrableItemLabelGenerator<>(itemCaptions, component, isDeferredLocalizationEnabled())));
		}
	
		if (!items.isEmpty()) {
			component.setItems(items);
		}
		final Input<Set<ITEM>> itemInput = Input.builder(component).requiredPropertyHandler((f, c) -> {
			return false;
		
		
		}, (f, c, 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;
	}
@override public multiselect<t> build() { final multiselectlistbox<item> component = getcomponent(); if (!new exceptionswallowingsupplier<>(() -> component.getdataprovider()).get().ispresent()) { component.setdataprovider(dataprovider.ofcollection(collections.emptyset())); } if (!customitemcaptiongenerator && !itemcaptions.isempty()) { component.setrenderer(new textrenderer<>( new deferrableitemlabelgenerator<>(itemcaptions, component, isdeferredlocalizationenabled()))); } if (!items.isempty()) { component.setitems(items); } final input<set<item>> iteminput = input.builder(component).requiredpropertyhandler((f, c) -> { return false; }, (f, c, 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; }