/*************************************************************************** * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.faq.webui.popup; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import org.exoplatform.faq.service.FAQEventQuery; import org.exoplatform.faq.service.FAQSetting; import org.exoplatform.faq.webui.BaseUIFAQForm; import org.exoplatform.faq.webui.FAQUtils; import org.exoplatform.ks.common.UserHelper; import org.exoplatform.ks.common.Utils; import org.exoplatform.ks.common.webui.UIPopupAction; import org.exoplatform.ks.common.webui.UIPopupContainer; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.form.UIFormDateTimeInput; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTextAreaInput; @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/templates/faq/webui/popup/UIAdvancedSearchForm.gtmpl", events = { @EventConfig(listeners = UIAdvancedSearchForm.SearchActionListener.class), @EventConfig(listeners = UIAdvancedSearchForm.OnchangeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIAdvancedSearchForm.CancelActionListener.class, phase = Phase.DECODE) } ) public class UIAdvancedSearchForm extends BaseUIFAQForm implements UIPopupComponent { final static private String FIELD_TEXT = "Text"; final static private String FIELD_SEARCHOBJECT_SELECTBOX = "SearchObject"; final static private String FIELD_CATEGORY_NAME = "CategoryName"; final static private String FIELD_ISMODERATEQUESTION = "IsModerateQuestion"; final static private String FIELD_CATEGORY_MODERATOR = "CategoryModerator"; final static private String FIELD_FROM_DATE = "FromDate"; final static private String FIELD_TO_DATE = "ToDate"; final static private String FIELD_AUTHOR = "Author"; final static private String FIELD_EMAIL_ADDRESS = "EmailAddress"; final static private String FIELD_LANGUAGE = "Language"; final static private String FIELD_QUESTION = "Question"; final static private String FIELD_RESPONSE = "Response"; final static private String FIELD_COMMENT = "Comment"; final static private String ITEM_EMPTY = "empty"; final static private String ITEM_CATEGORY = "faqCategory"; final static private String ITEM_QUESTION = "faqQuestion"; final static private String ITEM_MODERATEQUESTION_EMPTY2 = "empty2"; final static private String ITEM_MODERATEQUESTION_TRUE = "true"; final static private String ITEM_MODERATEQUESTION_FALSE = "false"; private FAQSetting faqSetting_ = new FAQSetting(); private String defaultLanguage_ = ""; public UIAdvancedSearchForm() throws Exception { faqSetting_ = new FAQSetting(); String currentUser = FAQUtils.getCurrentUser(); FAQUtils.getPorletPreference(faqSetting_); if (currentUser != null && currentUser.trim().length() > 0) { if (faqSetting_.getIsAdmin() == null || faqSetting_.getIsAdmin().trim().length() < 1) { if (getFAQService().isAdminRole(currentUser)) faqSetting_.setIsAdmin("TRUE"); else faqSetting_.setIsAdmin("FALSE"); } getFAQService().getUserSetting(currentUser, faqSetting_); } else { faqSetting_.setIsAdmin("FALSE"); } UIFormStringInput text = new UIFormStringInput(FIELD_TEXT, FIELD_TEXT, null); List<String> listLanguage = new ArrayList<String>(); LocaleConfigService configService = getApplicationComponent(LocaleConfigService.class); defaultLanguage_ = configService.getDefaultLocaleConfig().getLocale().getDisplayLanguage(); for (Object object : configService.getLocalConfigs()) { LocaleConfig localeConfig = (LocaleConfig) object; Locale locale = localeConfig.getLocale(); String displayName = locale.getDisplayLanguage(); listLanguage.add(displayName); } List<SelectItemOption<String>> list = new ArrayList<SelectItemOption<String>>(); list.add(new SelectItemOption<String>(ITEM_EMPTY, "categoryAndQuestion")); list.add(new SelectItemOption<String>(ITEM_CATEGORY, "faqCategory")); list.add(new SelectItemOption<String>(ITEM_QUESTION, "faqQuestion")); UIFormSelectBox searchType = new UIFormSelectBox(FIELD_SEARCHOBJECT_SELECTBOX, FIELD_SEARCHOBJECT_SELECTBOX, list); searchType.setOnChange("Onchange"); UIFormStringInput categoryName = new UIFormStringInput(FIELD_CATEGORY_NAME, FIELD_CATEGORY_NAME, null); list = new ArrayList<SelectItemOption<String>>(); list.add(new SelectItemOption<String>(ITEM_MODERATEQUESTION_EMPTY2, "AllCategories")); list.add(new SelectItemOption<String>(ITEM_MODERATEQUESTION_TRUE, "true")); list.add(new SelectItemOption<String>(ITEM_MODERATEQUESTION_FALSE, "false")); UIFormSelectBox modeQuestion = new UIFormSelectBox(FIELD_ISMODERATEQUESTION, FIELD_ISMODERATEQUESTION, list); UIFormStringInput moderator = new UIFormStringInput(FIELD_CATEGORY_MODERATOR, FIELD_CATEGORY_MODERATOR, null); UIFormDateTimeInput fromDate = new UIFormDateTimeInput(FIELD_FROM_DATE, FIELD_FROM_DATE, null, false); UIFormDateTimeInput toDate = new UIFormDateTimeInput(FIELD_TO_DATE, FIELD_TO_DATE, null, false); // search question UIFormStringInput author = new UIFormStringInput(FIELD_AUTHOR, FIELD_AUTHOR, null); UIFormStringInput emailAdress = new UIFormStringInput(FIELD_EMAIL_ADDRESS, FIELD_EMAIL_ADDRESS, null); list = new ArrayList<SelectItemOption<String>>(); list.add(new SelectItemOption<String>(defaultLanguage_, defaultLanguage_)); for (String language : listLanguage) { if (language.equals(defaultLanguage_)) continue; list.add(new SelectItemOption<String>(language, language)); } UIFormSelectBox language = new UIFormSelectBox(FIELD_LANGUAGE, FIELD_LANGUAGE, list); UIFormTextAreaInput question = new UIFormTextAreaInput(FIELD_QUESTION, FIELD_QUESTION, null); UIFormTextAreaInput response = new UIFormTextAreaInput(FIELD_RESPONSE, FIELD_RESPONSE, null); UIFormTextAreaInput comment = new UIFormTextAreaInput(FIELD_COMMENT, FIELD_COMMENT, null); addUIFormInput(text); addUIFormInput(searchType); addUIFormInput(categoryName); addUIFormInput(modeQuestion); addUIFormInput(moderator); addUIFormInput(author); addUIFormInput(emailAdress); addUIFormInput(language); addUIFormInput(question); addUIFormInput(response); addUIFormInput(comment); addUIFormInput(fromDate); addUIFormInput(toDate); } public void activate() throws Exception { } public void deActivate() throws Exception { } public Calendar getFromDate() { return getUIFormDateTimeInput(FIELD_FROM_DATE).getCalendar(); } public Calendar getToDate() { return getUIFormDateTimeInput(FIELD_TO_DATE).getCalendar(); } public void setText(String value) { getUIStringInput(FIELD_TEXT).setValue(value); } public String getText() { return getUIStringInput(FIELD_TEXT).getValue(); } public void setIsSearch(boolean isCategory, boolean isQuestion) { UIFormStringInput categoryName = getUIStringInput(FIELD_CATEGORY_NAME).setRendered(isCategory); UIFormSelectBox modeQuestion = getUIFormSelectBox(FIELD_ISMODERATEQUESTION).setRendered(isCategory); UIFormStringInput moderator = getUIStringInput(FIELD_CATEGORY_MODERATOR).setRendered(isCategory); categoryName.setValue(""); modeQuestion.setValue(""); moderator.setValue(""); UIFormStringInput author = getUIStringInput(FIELD_AUTHOR).setRendered(isQuestion); UIFormStringInput emailAddress = getUIStringInput(FIELD_EMAIL_ADDRESS).setRendered(isQuestion); UIFormSelectBox language = getUIFormSelectBox(FIELD_LANGUAGE).setRendered(isQuestion); UIFormTextAreaInput question = getUIFormTextAreaInput(FIELD_QUESTION).setRendered(isQuestion); UIFormTextAreaInput response = getUIFormTextAreaInput(FIELD_RESPONSE).setRendered(isQuestion); UIFormTextAreaInput comment = getUIFormTextAreaInput(FIELD_COMMENT).setRendered(isQuestion); author.setValue(""); emailAddress.setValue(""); language.setValue(""); question.setValue(""); response.setValue(""); comment.setValue(""); } public String getLabel(ResourceBundle res, String id) throws Exception { String label = getId() + ".label." + id; try { return res.getString(label); } catch (Exception e) { return id; } } public String[] getActions() { return new String[] { "Search", "Cancel" }; } private Calendar getCalendar(UIFormDateTimeInput dateTimeInput, String field) throws Exception { Calendar calendar = dateTimeInput.getCalendar(); if (!FAQUtils.isFieldEmpty(dateTimeInput.getValue())) { if (calendar == null) { warning("UIAdvancedSearchForm.msg.error-input-text-date", new String[] { getLabel(field) }); } } return calendar; } static public class OnchangeActionListener extends EventListener<UIAdvancedSearchForm> { public void execute(Event<UIAdvancedSearchForm> event) throws Exception { UIAdvancedSearchForm uiAdvancedSearchForm = event.getSource(); String type = uiAdvancedSearchForm.getUIFormSelectBox(FIELD_SEARCHOBJECT_SELECTBOX).getValue(); if (type.equals("faqCategory")) { uiAdvancedSearchForm.setIsSearch(true, false); } else if (type.equals("faqQuestion")) { uiAdvancedSearchForm.setIsSearch(false, true); } else { uiAdvancedSearchForm.setIsSearch(false, false); } event.getRequestContext().addUIComponentToUpdateByAjax(uiAdvancedSearchForm); } } static public class SearchActionListener extends EventListener<UIAdvancedSearchForm> { public void execute(Event<UIAdvancedSearchForm> event) throws Exception { UIAdvancedSearchForm advancedSearch = event.getSource(); /** * Get data from FormInput */ String type = advancedSearch.getUIFormSelectBox(FIELD_SEARCHOBJECT_SELECTBOX).getValue(); String text = advancedSearch.getUIStringInput(FIELD_TEXT).getValue(); String categoryName = advancedSearch.getUIStringInput(FIELD_CATEGORY_NAME).getValue(); String modeQuestion = advancedSearch.getUIFormSelectBox(FIELD_ISMODERATEQUESTION).getValue(); String moderator = advancedSearch.getUIStringInput(FIELD_CATEGORY_MODERATOR).getValue(); Calendar fromDate = advancedSearch.getCalendar(advancedSearch.getUIFormDateTimeInput(FIELD_FROM_DATE), FIELD_FROM_DATE); Calendar toDate = advancedSearch.getCalendar(advancedSearch.getUIFormDateTimeInput(FIELD_TO_DATE), FIELD_TO_DATE); String author = advancedSearch.getUIStringInput(FIELD_AUTHOR).getValue(); String emailAddress = advancedSearch.getUIStringInput(FIELD_EMAIL_ADDRESS).getValue(); String language = advancedSearch.getUIFormSelectBox(FIELD_LANGUAGE).getValue(); String question = advancedSearch.getUIFormTextAreaInput(FIELD_QUESTION).getValue(); String response = advancedSearch.getUIFormTextAreaInput(FIELD_RESPONSE).getValue(); String comment = advancedSearch.getUIFormTextAreaInput(FIELD_COMMENT).getValue(); try { if (fromDate.getTimeInMillis() >= toDate.getTimeInMillis()) { advancedSearch.warning("UIAdvancedSearchForm.msg.erro-from-less-than-to"); return; } } catch (Exception e) { } /** * Check validation of data inputed */ if (advancedSearch.getFromDate() != null && advancedSearch.getToDate() != null) { if (advancedSearch.getFromDate().after(advancedSearch.getToDate())) { advancedSearch.warning("UIAdvancedSearchForm.msg.date-time-invalid"); return; } } if (!FAQUtils.isValidEmailAddresses(emailAddress)) { advancedSearch.warning("UIAdvancedSearchForm.msg.email-invalid"); return; } text = Utils.encodeSpecialCharInSearchTerm(text); categoryName = Utils.encodeSpecialCharInSearchTerm(categoryName); question = Utils.encodeSpecialCharInSearchTerm(question); response = Utils.encodeSpecialCharInContent(response); comment = Utils.encodeSpecialCharInContent(comment); /** * Create query string from data inputed */ FAQEventQuery eventQuery = new FAQEventQuery(); eventQuery.setType(type); eventQuery.setText(text); eventQuery.setName(categoryName); eventQuery.setIsModeQuestion(modeQuestion); eventQuery.setModerator(moderator); eventQuery.setFromDate(fromDate); eventQuery.setToDate(toDate); eventQuery.setAuthor(author); eventQuery.setEmail(emailAddress); eventQuery.setAttachment(""); eventQuery.setQuestion(question); eventQuery.setResponse(response); eventQuery.setComment(comment); if (language != null && language.length() > 0 && !language.equals(advancedSearch.defaultLanguage_)) { eventQuery.setLanguage(language); eventQuery.setSearchOnDefaultLanguage(false); } else { eventQuery.setLanguage(advancedSearch.defaultLanguage_); eventQuery.setSearchOnDefaultLanguage(true); } // eventQuery.getQuery() ; /** * Check all values are got from UIForm, if don't have any thing then view warning */ String userName = FAQUtils.getCurrentUser(); eventQuery.setUserId(userName); eventQuery.setUserMembers(UserHelper.getAllGroupAndMembershipOfUser(userName)); eventQuery.setAdmin(Boolean.parseBoolean(advancedSearch.faqSetting_.getIsAdmin())); UIPopupContainer popupContainer = advancedSearch.getAncestorOfType(UIPopupContainer.class); ResultQuickSearch result = popupContainer.getChild(ResultQuickSearch.class); if (result == null) result = popupContainer.addChild(ResultQuickSearch.class, null, null); try { result.setSearchResults(advancedSearch.getFAQService().getSearchResults(eventQuery)); } catch (javax.jcr.query.InvalidQueryException e) { UIApplication uiApp = advancedSearch.getAncestorOfType(UIApplication.class); uiApp.addMessage(new ApplicationMessage("UIAdvancedSearchForm.msg.erro-empty-search", null, ApplicationMessage.WARNING)); event.getRequestContext().addUIComponentToUpdateByAjax(uiApp.getUIPopupMessages()); return; } event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } static public class CancelActionListener extends EventListener<UIAdvancedSearchForm> { public void execute(Event<UIAdvancedSearchForm> event) throws Exception { UIAdvancedSearchForm advancedSearch = event.getSource(); UIPopupAction uiPopupAction = advancedSearch.getAncestorOfType(UIPopupAction.class); uiPopupAction.deActivate(); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupAction); } } }