Java tutorial
/******************************************************************************* * Copyright 2013 Ednovo d/b/a Gooru. All rights reserved. * * http://www.goorulearning.org/ * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************************/ /** * */ package org.ednovo.gooru.client.mvp.search; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ednovo.gooru.client.PlaceTokens; import org.ednovo.gooru.client.SearchAsyncCallback; import org.ednovo.gooru.client.SeoTokens; import org.ednovo.gooru.client.SimpleAsyncCallback; import org.ednovo.gooru.client.event.RegisterTabDndEvent; import org.ednovo.gooru.client.gin.AppClientFactory; import org.ednovo.gooru.client.gin.BasePlacePresenter; import org.ednovo.gooru.client.mvp.authentication.SignUpPresenter; import org.ednovo.gooru.client.mvp.home.event.HeaderTabType; import org.ednovo.gooru.client.mvp.home.event.HomeEvent; import org.ednovo.gooru.client.mvp.resource.dnd.ResourceDropController; import org.ednovo.gooru.client.mvp.search.event.ConfirmStatusPopupEvent; import org.ednovo.gooru.client.mvp.search.event.ConsumeShelfCollectionsEvent; import org.ednovo.gooru.client.mvp.search.event.PostSearchEvent; import org.ednovo.gooru.client.mvp.search.event.PreSearchEvent; import org.ednovo.gooru.client.mvp.search.event.RefreshSearchEvent; import org.ednovo.gooru.client.mvp.search.event.RegisterSearchDropEvent; import org.ednovo.gooru.client.mvp.search.event.RegisterSearchDropEvent.DROP_AREA; import org.ednovo.gooru.client.mvp.search.event.SearchEvent; import org.ednovo.gooru.client.mvp.search.event.SearchPaginationEvent; import org.ednovo.gooru.client.mvp.search.event.SetFooterEvent; import org.ednovo.gooru.client.mvp.search.event.SetHeaderZIndexEvent; import org.ednovo.gooru.client.mvp.search.event.SourceSuggestionEvent; import org.ednovo.gooru.client.mvp.search.event.StandardsSuggestionEvent; import org.ednovo.gooru.client.mvp.search.event.StandardsSuggestionInfoEvent; import org.ednovo.gooru.client.mvp.search.event.SwitchSearchEvent; import org.ednovo.gooru.client.mvp.search.event.UnregisterSearchDropEvent; import org.ednovo.gooru.client.service.SearchServiceAsync; import org.ednovo.gooru.shared.model.code.CodeDo; import org.ednovo.gooru.shared.model.folder.FolderDo; import org.ednovo.gooru.shared.model.search.ResourceSearchResultDo; import org.ednovo.gooru.shared.model.search.SearchDo; import org.ednovo.gooru.shared.model.search.SearchFilterDo; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.inject.Inject; import com.gwtplatform.mvp.client.View; import com.gwtplatform.mvp.client.proxy.PlaceRequest; import com.gwtplatform.mvp.client.proxy.Proxy; import com.gwtplatform.mvp.client.proxy.RevealContentEvent; /** * @author Search Team * * @param <T> * @param <C> * @param <V> * @param <P> */ public abstract class AbstractSearchPresenter<T extends ResourceSearchResultDo, C extends ResourceSearchResultDo, V extends IsSearchView<T>, P extends Proxy<?>> extends BasePlacePresenter<IsSearchView<T>, P> implements SearchUiHandlers { @Inject private SearchServiceAsync searchService; private final String QUERY = "query"; private final String PAGE_NUM = "pageNum"; private final String PAGE_SIZE = "pageSize"; private SearchDo<T> searchDo = new SearchDo<T>(); private SearchAsyncCallback<SearchDo<T>> searchAsyncCallback; private SearchAsyncCallback<SearchDo<CodeDo>> standardSuggestionAsyncCallback; private SearchAsyncCallback<SearchDo<CodeDo>> standardSuggestionInfoAsyncCallback; private SearchAsyncCallback<SearchDo<String>> sourceSuggestionAsyncCallback; protected static final String ALL = "*"; SignUpPresenter signUpViewPresenter = null; private boolean setFilter = true; /** * Class constructor * * @param view * {@link View} * @param proxy * {@link Proxy} */ public AbstractSearchPresenter(V view, P proxy, SignUpPresenter signUpViewPresenter) { super(view, proxy); this.signUpViewPresenter = signUpViewPresenter; addRegisteredHandler(SearchPaginationEvent.TYPE, this); addRegisteredHandler(RefreshSearchEvent.TYPE, this); addRegisteredHandler(SwitchSearchEvent.TYPE, this); addRegisteredHandler(SearchEvent.TYPE, this); addRegisteredHandler(StandardsSuggestionEvent.TYPE, this); addRegisteredHandler(StandardsSuggestionInfoEvent.TYPE, this); addRegisteredHandler(RegisterSearchDropEvent.TYPE, this); addRegisteredHandler(UnregisterSearchDropEvent.TYPE, this); addRegisteredHandler(ConsumeShelfCollectionsEvent.TYPE, this); if (getViewToken().equals(PlaceTokens.RESOURCE_SEARCH)) { addRegisteredHandler(SourceSuggestionEvent.TYPE, this); } } @Override protected void revealInParent() { RevealContentEvent.fire(this, SearchRootPresenter.TYPE_VIEW, this); } @Override public void onBind() { super.onBind(); setSearchAsyncCallback(new SearchAsyncCallback<SearchDo<T>>() { @Override protected void run(SearchDo<T> searchDo) { requestSearch(searchDo, this); } @Override public void onCallSuccess(SearchDo<T> result) { setSearchDo(result); getEventBus().fireEvent(new PostSearchEvent(result)); getView().postSearch(result); } }); setStandardSuggestionAsyncCallback(new SearchAsyncCallback<SearchDo<CodeDo>>() { @Override protected void run(SearchDo<CodeDo> searchDo) { getSearchService().getSuggestStandard(searchDo, this); } @Override public void onCallSuccess(SearchDo<CodeDo> result) { getView().setStandardsSuggestions(result); } }); setStandardSuggestionInfoAsyncCallback(new SearchAsyncCallback<SearchDo<CodeDo>>() { @Override protected void run(SearchDo<CodeDo> searchDo) { getSearchService().getSuggestStandard(searchDo, this); } @Override public void onCallSuccess(SearchDo<CodeDo> result) { getView().setStandardsSuggestionsInfo(result); } }); if (getViewToken().equals(PlaceTokens.RESOURCE_SEARCH)) { setSourceSuggestionAsyncCallback(new SearchAsyncCallback<SearchDo<String>>() { @Override protected void run(SearchDo<String> searchDo) { getSearchService().getSuggestSource(searchDo, this); } @Override public void onCallSuccess(SearchDo<String> result) { getView().setSourceSuggestions(result); } }); } } @Override protected void onReveal() { super.onReveal(); AppClientFactory.fireEvent(new RegisterTabDndEvent()); AppClientFactory.fireEvent(new ConfirmStatusPopupEvent(true)); AppClientFactory.fireEvent(new HomeEvent(HeaderTabType.NONE)); } @Override protected void onReset() { super.onReset(); String count = Cookies.getCookie("MyCookie"); if (count != null && Integer.parseInt(count) == 7) { Window.enableScrolling(false); Cookies.setCookie("MyCookie", "8"); } else { Window.enableScrolling(true); } AppClientFactory.fireEvent( new SetFooterEvent(AppClientFactory.getPlaceManager().getCurrentPlaceRequest().getNameToken())); if (AppClientFactory.getPlaceManager().refreshPlace()) { if (setFilter) { searchDo.setPageNum(1); getSearchService().getSearchFilters(getCurrentPlaceToken(), new SimpleAsyncCallback<SearchFilterDo>() { @Override public void onSuccess(SearchFilterDo searchFilterDo) { getView().setSearchFilter(searchFilterDo); } }); setFilter = false; } else { initiateSearch(); } } if (getPlaceManager().getRequestParameter("callback") != null && getPlaceManager().getRequestParameter("callback").equalsIgnoreCase("signup")) { //To show SignUp (Registration popup) Window.enableScrolling(false); AppClientFactory.fireEvent(new SetHeaderZIndexEvent(98, false)); String type = getPlaceManager().getRequestParameter("type"); int displayScreen = getPlaceManager().getRequestParameter("type") != null ? Integer.parseInt(type) : 1; signUpViewPresenter.displayPopup(displayScreen); addToPopupSlot(signUpViewPresenter); } Document doc = Document.get(); doc.getElementById("uvTab").getStyle().setDisplay(Display.BLOCK); AppClientFactory.fireEvent(new HomeEvent(HeaderTabType.NONE)); } @Override public void prepareFromRequest(PlaceRequest request) { super.prepareFromRequest(request); if (AppClientFactory.getPlaceManager().refreshPlace()) { // if (getPlaceManager().getRequestParameter("callback") != null // && !getPlaceManager().getRequestParameter("callback") // .equalsIgnoreCase("signup")) { initParam(); // } } } @Override public void initiateSearch() { AppClientFactory.fireEvent(new PreSearchEvent(getSearchDo())); getView().preSearch(getSearchDo()); setPageTitle(getSearchDo().getSearchQuery()); AppClientFactory.setMetaDataDescription(SeoTokens.HOME_META_DESCRIPTION); if (getSearchDo().getSearchQuery() != null && getSearchDo().getSearchQuery().trim().length() >= 0) { getSearchAsyncCallback().execute(getSearchDo()); } } public void setPageTitle(String searchQuery) { String pageToken = AppClientFactory.getPlaceManager().getCurrentPlaceRequest().getNameToken(); if (pageToken.equals(PlaceTokens.COLLECTION_SEARCH)) { AppClientFactory.setBrowserWindowTitle(SeoTokens.COLLECTION_SEARCH_TITLE + searchQuery); } else if (pageToken.equals(PlaceTokens.RESOURCE_SEARCH)) { AppClientFactory.setBrowserWindowTitle(SeoTokens.RESOURCE_SEARCH_TITLE + searchQuery); } } /** * @return search filters such as category, subject, grade, etc.. */ protected Map<String, String> getSearchFilters() { Map<String, String> filters = new HashMap<String, String>(); String category = getPlaceManager().getRequestParameter(IsSearchView.CATEGORY_FLT); if (category != null) { filters.put(IsSearchView.CATEGORY_FLT, category); } String subject = getPlaceManager().getRequestParameter(IsSearchView.SUBJECT_FLT); if (subject != null) { filters.put(IsSearchView.SUBJECT_FLT, subject); } String grade = getPlaceManager().getRequestParameter(IsSearchView.GRADE_FLT); if (grade != null) { filters.put(IsSearchView.GRADE_FLT, grade); } String standard = getPlaceManager().getRequestParameter(IsSearchView.STANDARD_FLT); if (standard != null) { filters.put(IsSearchView.STANDARD_FLT, standard); } if (AppClientFactory.getPlaceManager().getCurrentPlaceRequest().getNameToken() .equalsIgnoreCase(PlaceTokens.RESOURCE_SEARCH)) { String notFriendly = getPlaceManager().getRequestParameter(IsSearchView.MEDIATYPE_FLT); if (notFriendly != null && notFriendly.equalsIgnoreCase("not_ipad_friendly")) { filters.put(IsSearchView.MEDIATYPE_FLT, notFriendly); } } return filters; } public SearchAsyncCallback<SearchDo<T>> getSearchAsyncCallback() { return searchAsyncCallback; } public void setSearchAsyncCallback(SearchAsyncCallback<SearchDo<T>> searchAsyncCallback) { this.searchAsyncCallback = searchAsyncCallback; } /** * @return type of {@link SearchDo} */ public SearchDo<T> getSearchDo() { return searchDo; } /** * @param searchDo * , assign searchDo */ public void setSearchDo(SearchDo<T> searchDo) { this.searchDo = searchDo; } public SearchServiceAsync getSearchService() { return searchService; } /** * Assign page number and page size for search */ private void initParam() { getSearchDo().setSearchResults(null); String queryVal = ""; if (getPlaceManager().getRequestParameter(QUERY) != null) { queryVal = getPlaceManager().getRequestParameter(QUERY); queryVal = queryVal.replaceAll("%5C1", "&"); } try { queryVal = URL.decodeQueryString(queryVal); } catch (Exception ex) { } getSearchDo().setQuery(queryVal); getSearchDo().setPageNum(getPlaceManager().getRequestParameterAsInt(PAGE_NUM)); getSearchDo().setPageSize(getPlaceManager().getRequestParameterAsInt(PAGE_SIZE)); getSearchDo().setFilters(getSearchFilters()); } @Override public void paginateSearch(int pageNum) { String queryVal = ""; if (getPlaceManager().getRequestParameter(QUERY) != null) { queryVal = getPlaceManager().getRequestParameter(QUERY); queryVal = queryVal.replaceAll("%5C1", "&"); } try { queryVal = URL.decodeQueryString(queryVal); } catch (Exception ex) { } if (getViewToken().equalsIgnoreCase(getCurrentPlaceToken())) { getSearchDo().setPageNum(pageNum); getSearchDo().setQuery(queryVal); onSearchRequest(null); } } @Override public void refreshSearch(String query) { getSearchDo().setQuery(query); getSearchDo().setPageNum(null); getSearchDo().setPageSize(null); onSearchRequest(null); } @Override public void switchSearch(String viewToken, String searchQuery) { getSearchDo().setPageNum(null); getSearchDo().setPageSize(null); getSearchDo().setNotFriendly(null); getSearchDo().setQuery(searchQuery); onSearchRequest(viewToken); } @Override public void onSearch(String query) { getSearchDo().setPageNum(null); getSearchDo().setPageSize(null); getSearchDo().setQuery(query); onSearchRequest(null); } /** * Set search view token ,assign search query, page number and page size * * @param viewToken * is a page view url */ public void onSearchRequest(String viewToken) { if (viewToken == null) { viewToken = getCurrentPlaceToken(); } if (getViewToken().equalsIgnoreCase(viewToken)) { Map<String, String> params = getView().getSearchFilters(); if (!viewToken.equalsIgnoreCase(AppClientFactory.getCurrentPlaceToken())) { params.clear(); params.put(IsSearchView.CATEGORY_FLT, "all"); String subject = getPlaceManager().getRequestParameter(IsSearchView.SUBJECT_FLT); if (subject != null) { params.put(IsSearchView.SUBJECT_FLT, subject); } String grade = getPlaceManager().getRequestParameter(IsSearchView.GRADE_FLT); if (grade != null) { params.put(IsSearchView.GRADE_FLT, grade); } String standard = getPlaceManager().getRequestParameter(IsSearchView.STANDARD_FLT); if (standard != null) { params.put(IsSearchView.STANDARD_FLT, standard); } if (viewToken.equalsIgnoreCase(PlaceTokens.RESOURCE_SEARCH)) { String notFriendly = getPlaceManager().getRequestParameter(IsSearchView.MEDIATYPE_FLT); if (notFriendly != null) { params.put(IsSearchView.MEDIATYPE_FLT, notFriendly); } } else { params.remove(IsSearchView.MEDIATYPE_FLT); } getView().resetFilters(); } params.put(QUERY, getSearchDo().getUrlQuery()); params.put(PAGE_SIZE, getSearchDo().getPageSize() + ""); params.put(PAGE_NUM, getSearchDo().getPageNum() + ""); getPlaceManager().revealPlace(viewToken, params, true); } } public SearchAsyncCallback<SearchDo<CodeDo>> getStandardSuggestionAsyncCallback() { return standardSuggestionAsyncCallback; } public void setStandardSuggestionAsyncCallback( SearchAsyncCallback<SearchDo<CodeDo>> standardSuggestionAsyncCallback) { this.standardSuggestionAsyncCallback = standardSuggestionAsyncCallback; } public SearchAsyncCallback<SearchDo<String>> getSourceSuggestionAsyncCallback() { return sourceSuggestionAsyncCallback; } public void setSourceSuggestionAsyncCallback( SearchAsyncCallback<SearchDo<String>> sourceSuggestionAsyncCallback) { this.sourceSuggestionAsyncCallback = sourceSuggestionAsyncCallback; } @Override public void requestStandardsSuggestion(SearchDo<CodeDo> searchDo) { if (isCurrentView()) { getStandardSuggestionAsyncCallback().execute(searchDo); } } @Override public void requestSourceSuggestion(SearchDo<String> searchDo) { if (isCurrentView()) { getSourceSuggestionAsyncCallback().execute(searchDo); } } protected abstract void requestSearch(SearchDo<T> searchDo, SearchAsyncCallback<SearchDo<T>> searchAsyncCallback); @Override public void registerDropController(ResourceDropController dropController, DROP_AREA type) { if (isCurrentView()) { getView().registerDropController(dropController, type); } } @Override public void unregisterDropController(ResourceDropController dropController, DROP_AREA dropType) { if (isCurrentView()) { getView().unregisterDropController(dropController, dropType); } } @Override public void consumeShelfCollections(List<FolderDo> shelfCollections) { if (isCurrentView()) { getView().setShelfCollections(shelfCollections); } } /** * @return the standardSuggestionInfoAsyncCallback */ public SearchAsyncCallback<SearchDo<CodeDo>> getStandardSuggestionInfoAsyncCallback() { return standardSuggestionInfoAsyncCallback; } /** * @param standardSuggestionInfoAsyncCallback * the standardSuggestionInfoAsyncCallback to set */ public void setStandardSuggestionInfoAsyncCallback( SearchAsyncCallback<SearchDo<CodeDo>> standardSuggestionInfoAsyncCallback) { this.standardSuggestionInfoAsyncCallback = standardSuggestionInfoAsyncCallback; } @Override public void requestStandardsSuggestionInfo(SearchDo<CodeDo> searchDo) { if (isCurrentView()) { getStandardSuggestionInfoAsyncCallback().execute(searchDo); } } }