/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.photoalbum.ui.search; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.inject.Inject; import javax.inject.Named; import org.richfaces.photoalbum.manager.NavigationEnum; import org.richfaces.photoalbum.model.event.ErrorEvent; import org.richfaces.photoalbum.model.event.EventType; import org.richfaces.photoalbum.model.event.Events; import org.richfaces.photoalbum.model.event.NavEvent; import org.richfaces.photoalbum.search.ISearchAction; import org.richfaces.photoalbum.util.Constants; import org.richfaces.photoalbum.util.PhotoAlbumException; /** * Class, that encapsulate functionality related to search process. * * @author Andrey Markavtsov * */ @Named @ApplicationScoped public class ImageSearchHelper implements Serializable { private static final long serialVersionUID = -304368268896942902L; @Inject ISearchAction searchAction; ISearchOption selectedOption; List<ISearchOption> options; String selectedTab; String searchQuery; String selectedKeyword; List<String> keywords = new ArrayList<String>(); boolean seachInMyAlbums; boolean searchInShared = true; private SearchInformationHolder searchOptionsHolder; @Inject @EventType(Events.ADD_ERROR_EVENT) Event<ErrorEvent> error; @Inject @EventType(Events.UPDATE_MAIN_AREA_EVENT) Event<NavEvent> navEvent; /** * Default constructor. During instantiation populate in field options all possible search options * */ public ImageSearchHelper() { options = new ArrayList<ISearchOption>(); options.add(new SearchOptionByShelf()); options.add(new SearchOptionByAlbum()); options.add(new SearchOptionByImage()); options.add(new SearchOptionByUser()); options.add(new SearchOptionByTag()); } /** * Method, used to construct criteria string, to represent this string in UI. */ public String getCriteriaString() { StringBuilder s = new StringBuilder(); for (ISearchOption option : options) { if (option.getSelected()) { s.append(option.getName() + Constants.COMMA + " "); } } if (s.length() >= 2) { s.delete(s.length() - 2, s.length()); } return s.toString(); } /** * Method, that perform search, when user clicks by 'Find' button. */ public void search() { searchOptionsHolder = null; if (!isSearchOptionSelected()) { // If no options selected error.fire(new ErrorEvent(Constants.SEARCH_NO_OPTIONS_ERROR)); return; } if (!isWhereSearchOptionSelected()) { // If both search in My and search is shared unselected error.fire(new ErrorEvent(Constants.SEARCH_NO_WHERE_OPTIONS_ERROR)); return; } keywords = new ArrayList<String>(); // Update view navEvent.fire(new NavEvent(NavigationEnum.SEARCH)); // parse query keywords = parse(searchQuery); Iterator<ISearchOption> it = options.iterator(); // Search by first keyword by default selectedKeyword = keywords.get(0).trim(); while (it.hasNext()) { ISearchOption option = it.next(); try { if (option.getSelected()) { option.search(searchAction, selectedKeyword, seachInMyAlbums, searchInShared); } } catch (PhotoAlbumException e) { error.fire(new ErrorEvent("Error", option.getName() + ":" + e.getMessage())); } } searchOptionsHolder = new SearchInformationHolder(new ArrayList<ISearchOption>(options), seachInMyAlbums, searchInShared); searchQuery = ""; } /** * Method, that perform search by particular phrase * * @param keyword - keyword to search */ public void searchKeyword(String keyword) { if (!isSearchOptionSelected()) { error.fire(new ErrorEvent(Constants.SEARCH_NO_OPTIONS_ERROR)); return; } Iterator<ISearchOption> it = searchOptionsHolder.getOptions().iterator(); selectedKeyword = keyword.trim(); while (it.hasNext()) { ISearchOption option = it.next(); try { if (option.getSelected()) { option.search(searchAction, selectedKeyword, searchOptionsHolder.isSeachInMyAlbums(), searchOptionsHolder.isSearchInShared()); } } catch (PhotoAlbumException e) { error.fire(new ErrorEvent(option.getName() + ":" + e.getMessage())); } } } /** * Method, invoked when user select or unselect search option. */ public void processSelection() { Iterator<ISearchOption> it = options.iterator(); while (it.hasNext()) { ISearchOption option = it.next(); if (option.getSelected()) { selectedOption = option; break; } } } public ISearchOption getSelectedOption() { return selectedOption; } public void setSelectedOption(ISearchOption selectedOption) { this.selectedOption = selectedOption; } public List<ISearchOption> getOptions() { return options; } public void setOptions(List<ISearchOption> options) { this.options = options; } public String getSearchQuery() { return searchQuery; } public void setSearchQuery(String searchQuery) { this.searchQuery = searchQuery; } public boolean isSeachInMyAlbums() { return seachInMyAlbums; } public void setSeachInMyAlbums(boolean seachInMyAlbums) { this.seachInMyAlbums = seachInMyAlbums; } public boolean isSearchInShared() { return searchInShared; } public void setSearchInShared(boolean searchInShared) { this.searchInShared = searchInShared; } public List<String> getKeywords() { return keywords; } public void setKeywords(List<String> keywords) { this.keywords = keywords; } public String getSelectedKeyword() { return selectedKeyword; } public void setSelectedKeyword(String selectedKeyword) { this.selectedKeyword = selectedKeyword; } public boolean isResultExist() { for (ISearchOption option : options) { if (option.getSelected() && option.getSearchResult() != null && option.getSearchResult().size() > 0) { return true; } } return false; } private List<String> parse(String searchQuery2) { return Arrays.asList(searchQuery2.split(Constants.COMMA)); } private boolean isWhereSearchOptionSelected() { return seachInMyAlbums || searchInShared; } boolean isOptionSelected() { return selectedOption != null; } private boolean isSearchOptionSelected() { boolean isOptionSelected = false; for (ISearchOption i : options) { if (i.getSelected()) { isOptionSelected = true; break; } } return isOptionSelected; } } class SearchInformationHolder { SearchInformationHolder(List<ISearchOption> options, boolean seachInMyAlbums, boolean searchInShared) { this.options = options; this.seachInMyAlbums = seachInMyAlbums; this.searchInShared = searchInShared; } List<ISearchOption> options; boolean seachInMyAlbums; boolean searchInShared; public List<ISearchOption> getOptions() { return options; } public boolean isSeachInMyAlbums() { return seachInMyAlbums; } public boolean isSearchInShared() { return searchInShared; } }