/*
* Copyright (C) 2003-2008 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;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.portlet.PortletPreferences;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.download.DownloadService;
import org.exoplatform.download.InputStreamDownloadResource;
import org.exoplatform.faq.service.FAQService;
import org.exoplatform.faq.service.FAQSetting;
import org.exoplatform.faq.service.FileAttachment;
import org.exoplatform.faq.service.JcrInputProperty;
import org.exoplatform.ks.common.Utils;
import org.exoplatform.ks.common.user.CommonContact;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.UserProfile;
import org.exoplatform.services.resources.LocaleConfig;
import org.exoplatform.services.resources.LocaleConfigService;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.form.UIFormDateTimeInput;
import org.exoplatform.webui.form.UIFormInputBase;
import org.exoplatform.webui.form.UIFormMultiValueInputSet;
import org.exoplatform.webui.form.UIFormUploadInput;
/**
* Created by The eXo Platform SARL
* Author : Truong Nguyen
* truong.nguyen@exoplatform.com
* Apr 14, 2008, 2:56:30 PM
*/
public class FAQUtils {
public static String DISPLAYAPPROVED = "approved";
public static String DISPLAYBOTH = "both";
public static String UPLOAD_FILE_SIZE = "uploadFileSizeLimitMB";
public static String UPLOAD_AVATAR_SIZE = "uploadAvatarSizeLimitMB";
public static final int DEFAULT_VALUE_UPLOAD_PORTAL = -1;
static private Log log = ExoLogger.getLogger(FAQUtils.class);
public static FAQService getFAQService() throws Exception {
return (FAQService) PortalContainer.getComponent(FAQService.class);
}
public static String getDefaultLanguage() {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
return context.getLocale().getDisplayLanguage();
}
public static List<String> getAllLanguages(UIComponent component) {
LocaleConfigService configService = component.getApplicationComponent(LocaleConfigService.class);
List<String> languages = new ArrayList<String>();
for (LocaleConfig localeConfig : configService.getLocalConfigs()) {
languages.add(localeConfig.getLocale().getDisplayLanguage());
}
return languages;
}
/**
* Find category which is already exist.<br/>
* for example: when you are standing in category D in path: Root\A\B\C\D, you do some action (add new category, add question, go out to category C or B) but another moderator delete category C (or
* B, A). Then this function will be use to find the nearest category with category D (which is exist) and move you into this category.<br/>
* <u>Detail:</u><br/>
* the first, system get category C, if C is exist, you will be moved into C else jump to B and test again.<br/>
* This processing is done until find a category already exist.
*
* @param faqService_
* FAQ Service
* @param fAQContainer
* UIAnswersContainer this component is used to updated data
* @param sessionProvider
* SessionProvider
* @throws Exception
*/
public static void findCateExist(FAQService faqService_, UIAnswersContainer fAQContainer) throws Exception {
UIBreadcumbs breadcumbs = fAQContainer.findFirstComponentOfType(UIBreadcumbs.class);
String pathCate = "";
for (String path : breadcumbs.pathList_.get(breadcumbs.pathList_.size() - 1).split("/")) {
if (path.equals("FAQService")) {
pathCate = path;
continue;
}
try {
faqService_.getCategoryById(path);
if (pathCate.trim().length() > 0)
pathCate += "/";
pathCate += path;
} catch (Exception pathExc) {
UIQuestions questions = fAQContainer.findFirstComponentOfType(UIQuestions.class);
try {
breadcumbs.setUpdataPath(pathCate);
} catch (Exception exc) {
log.debug("Setting update path fail: " + exc.getMessage(), exc);
}
if (pathCate.indexOf("/") > 0) {
questions.setCategoryId(pathCate.substring(pathCate.lastIndexOf("/") + 1));
} else {
questions.categoryId_ = null;
questions.setListObject();
// questions.setIsNotChangeLanguage() ;
}
fAQContainer.findFirstComponentOfType(UICategories.class).setPathCategory(pathCate);
break;
}
}
}
public static boolean checkSpecial(String text) {
if (!isFieldEmpty(text)) {
String[] specialString = { "?", "[", "(", "|", ")", "*", "\\", "+", "}", "{", "^", "$", "#", "%", ":", "&", ">", "<", "'", "\"", "`", "!", "~", "]", "/" };
for (int i = 0; i < specialString.length; i++) {
if (text.indexOf(specialString[i]) >= 0)
return true;
}
}
return false;
}
public static InternetAddress[] getInternetAddress(String addressList) throws Exception {
if (isFieldEmpty(addressList))
return new InternetAddress[1];
try {
return InternetAddress.parse(addressList);
} catch (Exception e) {
return new InternetAddress[1];
}
}
public static void setCommonContactInfor(String userId, CommonContact contact, FAQService faqService, DownloadService dservice) throws Exception {
OrganizationService organizationService = (OrganizationService) PortalContainer.getComponent(OrganizationService.class);
UserProfile profile = organizationService.getUserProfileHandler().findUserProfileByName(userId);
if (profile.getAttribute("user.bdate") != null)
contact.setBirthday(profile.getAttribute("user.bdate"));
if (profile.getAttribute("user.gender") != null)
contact.setGender(profile.getAttribute("user.gender"));
if (profile.getAttribute("user.jobtitle") != null)
contact.setJob(profile.getAttribute("user.jobtitle"));
if (profile.getAttribute("user.business-info.online.email") != null)
contact.setEmailAddress(profile.getAttribute("user.business-info.online.email"));
if (profile.getAttribute("user.business-info.postal.city") != null)
contact.setCity(profile.getAttribute("user.business-info.postal.city"));
if (profile.getAttribute("user.business-info.postal.country") != null)
contact.setCountry(profile.getAttribute("user.business-info.postal.country"));
if (profile.getAttribute("user.business-info.telecom.mobile.number") != null)
contact.setMobile(profile.getAttribute("user.business-info.telecom.mobile.number"));
if (profile.getAttribute("user.business-info.telecom.telephone.number") != null)
contact.setPhone(profile.getAttribute("user.business-info.telecom.telephone.number"));
if (profile.getAttribute("user.home-info.online.uri") != null)
contact.setWebSite(profile.getAttribute("user.home-info.online.uri"));
String urlAvt = getUserAvatar(userId);
if (urlAvt.indexOf(org.exoplatform.faq.service.Utils.DEFAULT_AVATAR_URL) >= 0 && profile.getAttribute("user.other-info.avatar.url") != null) {
contact.setAvatarUrl(profile.getAttribute("user.other-info.avatar.url"));
} else {
contact.setAvatarUrl(urlAvt);
}
}
public static String[] splitForFAQ(String str) throws Exception {
if (str != null && str.length() > 0) {
String[] temp;
if (str.contains(","))
temp = str.trim().split(",");
else if (str.contains(";"))
temp = str.split(";");
else
return new String[] { str };
List<String> ids = new ArrayList<String>();
for (String id : temp) {
ids.add(id.trim());
}
return ids.toArray(new String[ids.size()]);
} else
return new String[] {};
}
/*
* public static SessionProvider getSystemProvider() { return SessionProviderFactory.createSystemProvider(); }
*/
static public String getCurrentUser() throws Exception {
return Util.getPortalRequestContext().getRemoteUser();
}
static public String getEmailUser(String userName) throws Exception {
OrganizationService organizationService = (OrganizationService) PortalContainer.getComponent(OrganizationService.class);
User user = organizationService.getUserHandler().findUserByName(userName);
String email = user.getEmail();
return email;
}
static public String getFullName(String userName) throws Exception {
try {
OrganizationService organizationService = (OrganizationService) PortalContainer.getComponent(OrganizationService.class);
User user = organizationService.getUserHandler().findUserByName(userName);
String fullName = user.getFullName();
if (isFieldEmpty(fullName))
fullName = userName;
return fullName;
} catch (Exception e) {
return getScreenName(userName, "");
}
}
public static String getScreenName(String userName, String fullName) {
return (userName.contains(org.exoplatform.faq.service.Utils.DELETED)) ? ("<s>" + ((isFieldEmpty(fullName)) ? (userName.substring(0, userName.indexOf(org.exoplatform.faq.service.Utils.DELETED))) : fullName) + "</s>") : userName;
}
public static boolean isFieldEmpty(String s) {
return (s == null || s.trim().length() <= 0) ? true : false;
}
public static boolean isValidEmailAddresses(String addressList) throws Exception {
if (isFieldEmpty(addressList))
return true;
boolean isInvalid = true;
try {
InternetAddress[] iAdds = InternetAddress.parse(addressList, true);
String emailRegex = "[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9-.]+\\.[A-Za-z]{2,5}";
for (int i = 0; i < iAdds.length; i++) {
if (!iAdds[i].getAddress().matches(emailRegex))
isInvalid = false;
}
} catch (AddressException e) {
return false;
}
return isInvalid;
}
public static String getResourceBundle(String resourceBundl) {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
return res.getString(resourceBundl);
}
/*
* public static String[] getQuestionLanguages() { return null ; }
*/
@SuppressWarnings("unchecked")
public static Map prepareMap(List inputs, Map properties) throws Exception {
Map<String, JcrInputProperty> rawinputs = new HashMap<String, JcrInputProperty>();
HashMap<String, JcrInputProperty> hasMap = new HashMap<String, JcrInputProperty>();
for (int i = 0; i < inputs.size(); i++) {
JcrInputProperty property = null;
if (inputs.get(i) instanceof UIFormMultiValueInputSet) {
String inputName = ((UIFormMultiValueInputSet) inputs.get(i)).getName();
if (!hasMap.containsKey(inputName)) {
List<String> values = (List<String>) ((UIFormMultiValueInputSet) inputs.get(i)).getValue();
property = (JcrInputProperty) properties.get(inputName);
if (property != null) {
property.setValue(values.toArray(new String[values.size()]));
}
}
hasMap.put(inputName, property);
} else {
UIFormInputBase input = (UIFormInputBase) inputs.get(i);
property = (JcrInputProperty) properties.get(input.getName());
if (property != null) {
if (input instanceof UIFormUploadInput) {
byte[] content = ((UIFormUploadInput) input).getUploadData();
property.setValue(content);
} else if (input instanceof UIFormDateTimeInput) {
property.setValue(((UIFormDateTimeInput) input).getCalendar());
} else {
property.setValue(input.getValue());
}
}
}
}
Iterator iter = properties.values().iterator();
JcrInputProperty property;
while (iter.hasNext()) {
property = (JcrInputProperty) iter.next();
rawinputs.put(property.getJcrPath(), property);
}
return rawinputs;
}
public static String getSubString(String str, int max) {
if (str.length() > max) {
String newStr = str.substring(0, (max - 3));
return newStr.trim() + "...";
}
return str;
}
public static String getTitle(String text) {
/*
* int i = 0 ; while (i < text.length()) { if(text.codePointAt(i) < 10) continue; if (text.charAt(i) == '"' ) text = text.replace((text.charAt(i)) + "", """) ; else i ++ ; }
*/
return StringUtils.replace(text, "\"", """);
}
public static List<String> getCategoriesIdFAQPortlet() throws Exception {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
String str = portletPref.getValue("displayCategories", "");
List<String> list = new ArrayList<String>();
if (!isFieldEmpty(str)) {
list.addAll(Arrays.asList(str.split(",")));
}
return list;
}
public static boolean getUseAjaxFAQPortlet() {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
return Boolean.parseBoolean(portletPref.getValue("useAjax", ""));
}
public static void saveFAQPortletPreference(List<String> list, boolean useAjax) throws Exception {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
String str = list.toString();
str = str.replace("[", "").replace("]", "").replaceAll(" ", "");
portletPref.setValue("displayCategories", str);
portletPref.setValue("useAjax", String.valueOf(useAjax));
portletPref.store();
}
public static void getPorletPreference(FAQSetting faqSetting) {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
faqSetting.setEnableViewAvatar(Boolean.parseBoolean(portletPref.getValue("enableViewAvatar", "")));
faqSetting.setEnableAutomaticRSS(Boolean.parseBoolean(portletPref.getValue("enableAutomaticRSS", "")));
faqSetting.setEnanbleVotesAndComments(Boolean.parseBoolean(portletPref.getValue("enanbleVotesAndComments", "")));
faqSetting.setEnableAnonymousSubmitQuestion(Boolean.parseBoolean(portletPref.getValue("enableAnonymousSubmitQuestion", "")));
faqSetting.setDisplayMode(portletPref.getValue("display", ""));
faqSetting.setOrderBy(portletPref.getValue("orderBy", ""));
faqSetting.setOrderType(portletPref.getValue("orderType", ""));
faqSetting.setIsDiscussForum(Boolean.parseBoolean(portletPref.getValue("isDiscussForum", "")));
faqSetting.setIdNameCategoryForum(portletPref.getValue("idNameCategoryForum", ""));
faqSetting.setEmailMoveQuestion(portletPref.getValue("emailMoveQuestion", ""));
faqSetting.setPostQuestionInRootCategory(Boolean.parseBoolean(portletPref.getValue("isPostQuestionInRootCategory", "true")));
}
public static void getEmailSetting(FAQSetting faqSetting, boolean isNew, boolean isSettingForm) {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
String emailContent = "";
if (isNew) {
emailContent = portletPref.getValue("SendMailAddNewQuestion", "");
} else {
if (isSettingForm)
emailContent = portletPref.getValue("SendMailEditResponseQuestion", "");
}
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
// if(!isSettingForm){
if (emailContent == null || emailContent.trim().length() < 1) {
if (isNew) {
emailContent = res.getString("SendEmail.AddNewQuestion.Default");
} else {
if (isSettingForm)
emailContent = res.getString("SendEmail.EditQuestion.Default");
else
emailContent = res.getString("SendEmail.ResponseQuestion.Default");
}
}
// }
faqSetting.setEmailSettingSubject(res.getString("SendEmail.Default.Subject"));
faqSetting.setEmailSettingContent(emailContent);
}
public static String getEmailMoveQuestion(FAQSetting faqSetting) {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
String str = portletPref.getValue("emailMoveQuestion", "");
if (isFieldEmpty(str)) {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
str = res.getString("SendEmail.MoveQuetstion.Default");
}
faqSetting.setEmailMoveQuestion(str);
return str;
}
public static void savePortletPreference(FAQSetting setting, String emailAddNewQuestion, String emailEditResponseQuestion) {
try {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
portletPref.setValue("display", setting.getDisplayMode());
portletPref.setValue("orderBy", setting.getOrderBy());
portletPref.setValue("orderType", setting.getOrderType());
portletPref.setValue("isDiscussForum", String.valueOf(setting.getIsDiscussForum()));
portletPref.setValue("idNameCategoryForum", setting.getIdNameCategoryForum());
portletPref.setValue("enableAutomaticRSS", setting.isEnableAutomaticRSS() + "");
portletPref.setValue("enableViewAvatar", setting.isEnableViewAvatar() + "");
portletPref.setValue("enanbleVotesAndComments", setting.isEnanbleVotesAndComments() + "");
portletPref.setValue("enableAnonymousSubmitQuestion", setting.isEnableAnonymousSubmitQuestion() + "");
portletPref.setValue("SendMailAddNewQuestion", emailAddNewQuestion);
portletPref.setValue("SendMailEditResponseQuestion", emailEditResponseQuestion);
portletPref.setValue("emailMoveQuestion", setting.getEmailMoveQuestion());
portletPref.setValue("isPostQuestionInRootCategory", setting.isPostQuestionInRootCategory() + "");
portletPref.store();
} catch (Exception e) {
log.error("Fail to save portlet preferences: ", e);
}
}
private static String getFormatDate(int dateFormat, Date myDate) {
if (myDate == null)
return "";
String format = (dateFormat == DateFormat.LONG) ? "DDD,MMM dd,yyyy" : "MM/dd/yyyy";
try {
String userName = getCurrentUser();
if (!isFieldEmpty(userName)) {
org.exoplatform.forum.service.ForumService forumService = (org.exoplatform.forum.service.ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(org.exoplatform.forum.service.ForumService.class);
org.exoplatform.forum.service.UserProfile profile = forumService.getUserSettingProfile(userName);
format = (dateFormat == DateFormat.LONG) ? profile.getLongDateFormat() : profile.getShortDateFormat();
}
} catch (Exception e) {
log.debug("No forum settings found for date format. Will use format " + format);
}
if (!isFieldEmpty(format)) {
if (format.indexOf("DDDD") >= 0)
format = format.replaceAll("DDDD", "EEEE");
if (format.indexOf("DDD") >= 0)
format = format.replaceAll("DDD", "EEE");
}
PortalRequestContext portalContext = Util.getPortalRequestContext();
Format formatter = new SimpleDateFormat(format, portalContext.getLocale());
return formatter.format(myDate);
}
public static String getLongDateFormat(Date myDate) {
return getFormatDate(DateFormat.LONG, myDate);
}
public static String getShortDateFormat(Date myDate) {
return getFormatDate(DateFormat.SHORT, myDate);
}
public static String getUserAvatar(String userName) throws Exception {
String url = "";
try {
FAQService service = getFAQService();
FileAttachment avatar = service.getUserAvatar(userName);
if (avatar != null) {
url = Utils.getImageUrl(avatar.getPath()) + "?size=" + avatar.getSize();
}
} catch (Exception e) {
log.debug("Failed to get user avatar of user: " + userName, e);
}
return (isFieldEmpty(url)) ? org.exoplatform.faq.service.Utils.DEFAULT_AVATAR_URL : url;
}
public static String getFileSource(FileAttachment attachment) throws Exception {
DownloadService dservice = (DownloadService)PortalContainer.getComponent(DownloadService.class);
try {
InputStream input = attachment.getInputStream();
String fileName = attachment.getName();
byte[] imageBytes = null;
if (input != null) {
imageBytes = new byte[input.available()];
input.read(imageBytes);
ByteArrayInputStream byteImage = new ByteArrayInputStream(imageBytes);
InputStreamDownloadResource dresource = new InputStreamDownloadResource(byteImage, "image");
dresource.setDownloadName(fileName);
return dservice.getDownloadLink(dservice.addDownloadResource(dresource));
}
} catch (Exception e) {
log.error("Can not get File Source, exception: " + e.getMessage());
}
return "";
}
public static String getLink(String link, String componentId, String componentIdhasAction, String action, String actionRep, String objectId) {
PortalRequestContext portalContext = Util.getPortalRequestContext();
String url = portalContext.getRequest().getRequestURL().toString();
url = url.substring(0, url.indexOf("/", 8));
link = link.replaceFirst(componentId, componentIdhasAction).replaceFirst(action, actionRep).replaceFirst("OBJECTID", objectId).replaceAll("amp;", "");
link = url + link;
return link;
}
public static String getLinkDiscuss(String topicId) throws Exception {
PortalRequestContext portalContext = Util.getPortalRequestContext();
String link = portalContext.getRequest().getRequestURL().toString();
try {
String selectedNode = Util.getUIPortal().getSelectedUserNode().getURI();
String portalName = "/" + Util.getUIPortal().getName();
if (link.indexOf(portalName) > 0) {
if (link.indexOf(portalName + "/" + selectedNode) < 0) {
link = link.replaceFirst(portalName, portalName + "/" + selectedNode);
}
}
link = link.substring(0, link.indexOf(selectedNode) + selectedNode.length());
link = link.replaceAll(selectedNode, "forum") + "/" + org.exoplatform.forum.service.Utils.TOPIC + "/" + topicId;
} catch (Exception e) {
log.error("Fail to get link discuss: ", e);
}
return link;
}
public static int getLimitUploadSize(boolean isAvatar) {
PortletRequestContext pcontext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPref = pcontext.getRequest().getPreferences();
int limitMB = DEFAULT_VALUE_UPLOAD_PORTAL;
try {
if (isAvatar) {
limitMB = Integer.parseInt(portletPref.getValue(UPLOAD_AVATAR_SIZE, "").trim());
} else {
limitMB = Integer.parseInt(portletPref.getValue(UPLOAD_FILE_SIZE, "").trim());
}
} catch (Exception e) {
}
return limitMB;
}
}