package scrum.client.search; import ilarkesto.core.base.Str; import java.util.ArrayList; import java.util.Collection; import java.util.List; import scrum.client.common.AScrumGwtEntity; public class Search extends GSearch implements SearchResultsChangedHandler { private SearchResults results = new SearchResults(); private SearchResultsWidget resultsWidget; private String searchText; public void search(String text) { if (text != null) text = text.toLowerCase(); this.searchText = text; log.info("Searching:", searchText); results.clear(); if (Str.isBlank(searchText)) return; new SearchServiceCall(searchText).execute(new Runnable() { public void run() { searchClient(searchText); getResultsWidget().update(); } }); projectWorkspaceWidgets.showSearchResults(); searchClient(searchText); } private void searchClient(String text) { String[] keys = parseKeys(text); results.addEntities(getMatching(project.getRequirements(), keys)); results.addEntities(getMatching(project.getQualitys(), keys)); results.addEntities(getMatching(project.getTasks(), keys)); results.addEntities(getMatching(project.getWikipages(), keys)); results.addEntities(getMatching(project.getFiles(), keys)); results.addEntities(getMatching(project.getIssues(), keys)); results.addEntities(getMatching(project.getImpediments(), keys)); results.addEntities(getMatching(project.getRisks(), keys)); } private <T extends AScrumGwtEntity> List<T> getMatching(Collection<T> entities, String[] keys) { List<T> ret = new ArrayList<T>(); for (T entity : entities) { if (matchesKeys(entity, keys)) ret.add(entity); } return ret; } private boolean matchesKeys(AScrumGwtEntity entity, String[] keys) { for (String key : keys) { if (!entity.matchesKey(key)) return false; } return true; } private String[] parseKeys(String text) { List<String> ret = new ArrayList<String>(); char sep = ' '; int idx = text.indexOf(sep); while (idx > 0) { ret.add(text.substring(0, idx)); text = text.substring(idx + 1); idx = text.indexOf(sep); } ret.add(text); return ret.toArray(new String[ret.size()]); } public SearchResults getResults() { return results; } public void onSearchResultsChanged(SearchResultsChangedEvent event) { getResultsWidget().update(); } public SearchResultsWidget getResultsWidget() { if (resultsWidget == null) resultsWidget = new SearchResultsWidget(); return resultsWidget; } }