package org.ovirt.engine.ui.webadmin.widget.autocomplete;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import org.ovirt.engine.ui.uicommonweb.models.autocomplete.SearchSuggestModel;
import org.ovirt.engine.ui.uicommonweb.models.autocomplete.SuggestItemPartModel;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle;
public class SearchSuggestOracle extends MultiWordSuggestOracle {
private final SearchSuggestModel searchSuggestModel;
private String searchStringPrefix;
private CommonModel commonModel;
public SearchSuggestOracle() {
searchSuggestModel = new SearchSuggestModel();
searchStringPrefix = ""; //$NON-NLS-1$
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void requestSuggestions(SuggestOracle.Request request, SuggestOracle.Callback callback) {
// Search string
String search = request.getQuery();
// Create suggestions list
List<SearchSuggestion> suggestions = new ArrayList<>();
// Invoke model update options by search string method
searchSuggestModel.setSearchObjectFilter(getSearchObjectFilter());
searchSuggestModel.updateOptionsAsync(searchStringPrefix + search);
// Get options list
List options = searchSuggestModel.getItems();
for (Object option : options) {
List<SuggestItemPartModel> suggestItemPartModelList = (List<SuggestItemPartModel>) option;
if (suggestItemPartModelList != null) {
// Add the suggestion list
suggestions.add(new SearchSuggestion(suggestItemPartModelList, searchStringPrefix));
}
}
// Raise SuggestionsReady event for the specified request
callback.onSuggestionsReady(request, new Response(suggestions));
}
/**
* Returns search object suggestions that should be excluded due to their model being not available.
*/
private String[] getSearchObjectFilter() {
List<String> filter = new ArrayList<>();
for (SearchableListModel list : commonModel.getItems()) {
if (list != null && !list.getIsAvailable()) {
String[] searchObjects = list.getSearchObjects();
if (searchObjects != null) {
filter.addAll(Arrays.asList(searchObjects));
}
}
}
return filter.toArray(new String[0]);
}
public void setSearchPrefix(String searchStringPrefix) {
this.searchStringPrefix = searchStringPrefix;
}
public void setCommonModel(CommonModel commonModel) {
this.commonModel = commonModel;
}
}