/***************************************************************************
* 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.forum.webui.popup;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jcr.PathNotFoundException;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.forum.ForumTransformHTML;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.TimeConvertUtils;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.ForumAttachment;
import org.exoplatform.forum.service.Post;
import org.exoplatform.forum.service.Topic;
import org.exoplatform.forum.service.TopicType;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIBreadcumbs;
import org.exoplatform.forum.webui.UICategories;
import org.exoplatform.forum.webui.UICategoryContainer;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.forum.webui.UITopicContainer;
import org.exoplatform.forum.webui.UITopicDetail;
import org.exoplatform.forum.webui.popup.UIForumInputWithActions.ActionData;
import org.exoplatform.ks.bbcode.core.ExtendedBBCodeProvider;
import org.exoplatform.ks.common.UserHelper;
import org.exoplatform.ks.common.webui.BaseEventListener;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.ks.common.webui.UISelector;
import org.exoplatform.ks.common.webui.UIUserSelect;
import org.exoplatform.ks.common.webui.WebUIUtils;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.UITree;
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.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
import org.exoplatform.webui.form.UIFormInputIconSelector;
import org.exoplatform.webui.form.UIFormInputInfo;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput;
import org.exoplatform.webui.organization.account.UIUserSelector;
/**
* Created by The eXo Platform SARL
* Author : Vu Duy Tu
* tu.duy@exoplatform.com
* Aug 22, 2007
*/
@ComponentConfigs ( {
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/forum/webui/popup/UITopicForm.gtmpl",
events = {
@EventConfig(listeners = UITopicForm.PreviewThreadActionListener.class),
@EventConfig(listeners = UITopicForm.SubmitThreadActionListener.class),
@EventConfig(listeners = UITopicForm.AttachmentActionListener.class,phase = Phase.DECODE),
@EventConfig(listeners = UITopicForm.RemoveAttachmentActionListener.class,phase = Phase.DECODE),
@EventConfig(listeners = UITopicForm.CancelActionListener.class,phase = Phase.DECODE),
@EventConfig(listeners = UITopicForm.SelectTabActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UITopicForm.SelectIconActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UITopicForm.AddTypeTopicActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UITopicForm.AddValuesUserActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UITopicForm.AddUserActionListener.class, phase=Phase.DECODE)
}
)
,
@ComponentConfig(
id = "UITopicUserPopupWindow",
type = UIPopupWindow.class,
template = "system:/groovy/webui/core/UIPopupWindow.gtmpl",
events = {
@EventConfig(listeners = UITopicForm.ClosePopupActionListener.class, name = "ClosePopup") ,
@EventConfig(listeners = UITopicForm.AddActionListener.class, name = "Add", phase = Phase.DECODE),
@EventConfig(listeners = UITopicForm.CloseActionListener.class, name = "Close", phase = Phase.DECODE)
}
)
}
)
public class UITopicForm extends BaseForumForm implements UISelector {
public static final String FIELD_THREADCONTEN_TAB = "ThreadContent";
public static final String FIELD_THREADICON_TAB = "ThreadIcon";
public static final String FIELD_THREADOPTION_TAB = "ThreadOption";
public static final String FIELD_THREADPERMISSION_TAB = "ThreadPermission";
public static final String FIELD_TOPICTITLE_INPUT = "ThreadTitle";
public static final String FIELD_EDITREASON_INPUT = "editReason";
public static final String FIELD_MESSAGE_TEXTAREA = "Message";
final static public String FIELD_MESSAGECONTENT = "messageContent";
public static final String FIELD_TOPICSTATUS_SELECTBOX = "TopicStatus";
public static final String FIELD_TOPICTYPE_SELECTBOX = "TopicType";
public static final String FIELD_TOPICSTATE_SELECTBOX = "TopicState";
public static final String FIELD_APPROVED_CHECKBOX = "Approved";
public static final String FIELD_MODERATEPOST_CHECKBOX = "ModeratePost";
public static final String FIELD_NOTIFYWHENADDPOST_CHECKBOX = "NotifyWhenAddPost";
public static final String FIELD_STICKY_CHECKBOX = "Sticky";
public static final String FIELD_CANVIEW_INPUT = "CanView";
public static final String FIELD_CANPOST_INPUT = "CanPost";
final static public String ACT_REMOVE = "remove";
final static public String FIELD_ATTACHMENTS = "attachments";
final static public String USER_SELECTOR_POPUPWINDOW = "UITopicUserPopupWindow";
private List<ForumAttachment> attachments_ = new ArrayList<ForumAttachment>();
private String categoryId;
private String forumId;
private String topicId;
private String link = ForumUtils.EMPTY_STR;
private Forum forum;
private boolean isMod = false;
private boolean isDetail = false;
private int id = 0;
private Topic topic = new Topic();
private List<TopicType> listTT = new ArrayList<TopicType>();
private boolean isDoubleClickSubmit = false;
@SuppressWarnings("unchecked")
public UITopicForm() throws Exception {
if (getId() == null)
setId("UITopicForm");
isDoubleClickSubmit = false;
UIFormStringInput topicTitle = new UIFormStringInput(FIELD_TOPICTITLE_INPUT, FIELD_TOPICTITLE_INPUT, null);
topicTitle.addValidator(MandatoryValidator.class);
UIFormStringInput editReason = new UIFormStringInput(FIELD_EDITREASON_INPUT, FIELD_EDITREASON_INPUT, null);
editReason.setRendered(false);
// UIFormTextAreaInput message = new UIFormTextAreaInput(FIELD_MESSAGE_TEXTAREA, FIELD_MESSAGE_TEXTAREA, null);
List<SelectItemOption<String>> ls = new ArrayList<SelectItemOption<String>>();
ls.add(new SelectItemOption<String>(getLabel("Open"), "open"));
ls.add(new SelectItemOption<String>(getLabel("Closed"), "closed"));
UIFormSelectBox topicState = new UIFormSelectBox(FIELD_TOPICSTATE_SELECTBOX, FIELD_TOPICSTATE_SELECTBOX, ls);
topicState.setDefaultValue("open");
List<SelectItemOption<String>> ls1 = new ArrayList<SelectItemOption<String>>();
ls1.add(new SelectItemOption<String>(getLabel("UnLock"), "unlock"));
ls1.add(new SelectItemOption<String>(getLabel("Locked"), "locked"));
UIFormSelectBox topicStatus = new UIFormSelectBox(FIELD_TOPICSTATUS_SELECTBOX, FIELD_TOPICSTATUS_SELECTBOX, ls1);
topicStatus.setDefaultValue("unlock");
setTopicType();
ls = new ArrayList<SelectItemOption<String>>();
ls.add(new SelectItemOption<String>(getLabel("None"), "none"));
for (TopicType topicType : listTT) {
ls.add(new SelectItemOption<String>(topicType.getName(), topicType.getId()));
}
UIFormSelectBox topicType = new UIFormSelectBox(FIELD_TOPICTYPE_SELECTBOX, FIELD_TOPICTYPE_SELECTBOX, ls);
topicType.setDefaultValue(TopicType.DEFAULT_ID);
UIFormCheckBoxInput moderatePost = new UIFormCheckBoxInput<Boolean>(FIELD_MODERATEPOST_CHECKBOX, FIELD_MODERATEPOST_CHECKBOX, false);
UIFormCheckBoxInput checkWhenAddPost = new UIFormCheckBoxInput<Boolean>(FIELD_NOTIFYWHENADDPOST_CHECKBOX, FIELD_NOTIFYWHENADDPOST_CHECKBOX, false);
UIFormCheckBoxInput sticky = new UIFormCheckBoxInput<Boolean>(FIELD_STICKY_CHECKBOX, FIELD_STICKY_CHECKBOX, false);
UIFormTextAreaInput canView = new UIFormTextAreaInput(FIELD_CANVIEW_INPUT, FIELD_CANVIEW_INPUT, null);
UIFormTextAreaInput canPost = new UIFormTextAreaInput(FIELD_CANPOST_INPUT, FIELD_CANPOST_INPUT, null);
UIFormWYSIWYGInput formWYSIWYGInput = new UIFormWYSIWYGInput(FIELD_MESSAGECONTENT, FIELD_MESSAGECONTENT, ForumUtils.EMPTY_STR);
formWYSIWYGInput.addValidator(MandatoryValidator.class);
formWYSIWYGInput.setFCKConfig(WebUIUtils.getFCKConfig());
formWYSIWYGInput.setToolBarName("Basic");
UIFormInputIconSelector uiIconSelector = new UIFormInputIconSelector(FIELD_THREADICON_TAB, FIELD_THREADICON_TAB);
uiIconSelector.setSelectedIcon("IconsView");
UIForumInputWithActions threadContent = new UIForumInputWithActions(FIELD_THREADCONTEN_TAB);
threadContent.addUIFormInput(topicTitle);
threadContent.addUIFormInput(editReason);
threadContent.addUIFormInput(formWYSIWYGInput);
threadContent.addUIFormInput(new UIFormInputInfo(FIELD_ATTACHMENTS, FIELD_ATTACHMENTS, null));
threadContent.setActionField(FIELD_THREADCONTEN_TAB, getUploadFileList());
threadContent.setActionIdAddItem(FIELD_ATTACHMENTS);
threadContent.setActionAddItem("Attachment");
threadContent.setLabelActionAddItem(getLabel("Attachment"));
UIForumInputWithActions threadOption = new UIForumInputWithActions(FIELD_THREADOPTION_TAB);
threadOption.addUIFormInput(topicType);
threadOption.addUIFormInput(topicState);
threadOption.addUIFormInput(topicStatus);
threadOption.addUIFormInput(moderatePost);
threadOption.addUIFormInput(checkWhenAddPost);
threadOption.addUIFormInput(sticky);
UIForumInputWithActions threadPermission = new UIForumInputWithActions(FIELD_THREADPERMISSION_TAB);
threadPermission.addUIFormInput(canPost);
threadPermission.addUIFormInput(canView);
String[] fieldPermissions = new String[] { FIELD_CANVIEW_INPUT, FIELD_CANPOST_INPUT };
String[] strings = new String[] { "SelectUser", "SelectMemberShip", "SelectGroup" };
List<ActionData> actions;
ActionData ad;
int i;
for (String fieldPermission : fieldPermissions) {
actions = new ArrayList<ActionData>();
i = 0;
for (String string : strings) {
ad = new ActionData();
if (i == 0)
ad.setActionListener("AddUser");
else
ad.setActionListener("AddValuesUser");
ad.setActionParameter(fieldPermission + ForumUtils.SLASH + String.valueOf(i));
ad.setCssIconClass(string + "Icon");
ad.setActionName(string);
actions.add(ad);
++i;
}
threadPermission.setActionField(fieldPermission, actions);
}
addUIFormInput(threadContent);
addUIFormInput(uiIconSelector);
addUIFormInput(threadOption);
addUIFormInput(threadPermission);
this.setActions(new String[] { "PreviewThread", "SubmitThread", "Cancel" });
}
private void addActionAddTopicType() throws Exception {
List<ActionData> actions = new ArrayList<ActionData>();
ActionData ad = new ActionData();
ad.setActionListener("AddTypeTopic");
ad.setCssIconClass("AddIcon16x16");
ad.setActionName("AddTypeTopic");
actions.add(ad);
UIForumInputWithActions threadOption = this.getChildById(FIELD_THREADOPTION_TAB);
threadOption.setActionField(FIELD_TOPICTYPE_SELECTBOX, actions);
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public void setIsDetail(boolean isDetail) {
this.isDetail = isDetail;
}
public void setTopicIds(String categoryId, String forumId, Forum forum, long userRole) throws Exception {
this.categoryId = categoryId;
this.forumId = forumId;
this.topic = new Topic();
this.forum = forum;
UIForumInputWithActions threadContent = this.getChildById(FIELD_THREADCONTEN_TAB);
threadContent.getUIStringInput(FIELD_EDITREASON_INPUT).setRendered(false);
if (userRole == 0) {
addActionAddTopicType();
}
setShowInfo();
}
private void setShowInfo() throws Exception {
String info = getLabel("CanViewInfo");
String[] canV = forum.getViewer();
UIForumInputWithActions threadPermission = this.getChildById(FIELD_THREADPERMISSION_TAB);
if (!ForumUtils.isArrayEmpty(canV)) {
info = getLabel("CanViewParentInfo");
} else {
canV = getForumService().getPermissionTopicByCategory(categoryId, "viewer");
if (!ForumUtils.isArrayEmpty(canV)) {
info = getLabel("CanViewParentInfo");
}
}
threadPermission.setMapLabelInfo(FIELD_CANVIEW_INPUT, info);
info = getLabel("CanPostInfo");
canV = forum.getPoster();
if (!ForumUtils.isArrayEmpty(canV)) {
info = getLabel("CanPostParentInfo");
} else {
canV = getForumService().getPermissionTopicByCategory(categoryId, "poster");
if (!ForumUtils.isArrayEmpty(canV)) {
info = getLabel("CanPostParentInfo");
}
}
threadPermission.setMapLabelInfo(FIELD_CANPOST_INPUT, info);
}
private void setTopicType() throws Exception {
listTT.clear();
listTT.addAll(getForumService().getTopicTypes());
}
public void addNewTopicType() throws Exception {
setTopicType();
List<SelectItemOption<String>> ls = new ArrayList<SelectItemOption<String>>();
ls.add(new SelectItemOption<String>(getLabel("None"), "none"));
for (TopicType topicType : listTT) {
ls.add(new SelectItemOption<String>(topicType.getName(), topicType.getId()));
}
UIForumInputWithActions threadOption = this.getChildById(FIELD_THREADOPTION_TAB);
threadOption.getUIFormSelectBox(FIELD_TOPICTYPE_SELECTBOX).setOptions(ls);
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
@SuppressWarnings("unused")
private boolean getIsSelected(int id) {
if (this.id == id)
return true;
return false;
}
public List<ActionData> getUploadFileList() {
List<ActionData> uploadedFiles = new ArrayList<ActionData>();
for (ForumAttachment attachdata : attachments_) {
ActionData fileUpload = new ActionData();
fileUpload.setActionListener(ForumUtils.EMPTY_STR);
fileUpload.setActionType(ActionData.TYPE_ATT);
fileUpload.setCssIconClass("AttachmentIcon ZipFileIcon");
String fileName = ForumUtils.getSizeFile(attachdata.getSize());
fileName = attachdata.getName() + "(" + fileName + ")";
fileUpload.setActionName(fileName);
fileUpload.setShowLabel(true);
uploadedFiles.add(fileUpload);
ActionData removeAction = new ActionData();
removeAction.setActionListener("RemoveAttachment");
removeAction.setActionName(ACT_REMOVE);
removeAction.setActionParameter(attachdata.getId());
removeAction.setActionType(ActionData.TYPE_ICON);
removeAction.setCssIconClass("DustBin");
removeAction.setBreakLine(true);
uploadedFiles.add(removeAction);
}
return uploadedFiles;
}
public void refreshUploadFileList() throws Exception {
UIForumInputWithActions inputSet = getChildById(FIELD_THREADCONTEN_TAB);
inputSet.setActionField(FIELD_ATTACHMENTS, getUploadFileList());
}
public void addToUploadFileList(ForumAttachment attachfile) {
attachments_.add(attachfile);
}
public void removeFromUploadFileList(ForumAttachment attachfile) {
attachments_.remove(attachfile);
}
public void removeUploadFileList() {
attachments_.clear();
}
public List<ForumAttachment> getAttachFileList() {
return attachments_;
}
public boolean isMod() {
return isMod;
}
public void setMod(boolean isMod) {
this.isMod = isMod;
}
public void setUpdateTopic(Topic topic, boolean isUpdate) throws Exception {
if (isUpdate) {
this.topicId = topic.getId();
this.topic = getForumService().getTopic(categoryId, forumId, topicId, ForumUtils.EMPTY_STR);
UIForumInputWithActions threadContent = this.getChildById(FIELD_THREADCONTEN_TAB);
threadContent.getUIStringInput(FIELD_EDITREASON_INPUT).setRendered(true);
threadContent.getUIStringInput(FIELD_TOPICTITLE_INPUT).setValue(this.topic.getTopicName());
threadContent.getChild(UIFormWYSIWYGInput.class).setValue(this.topic.getDescription());
UIForumInputWithActions threadOption = this.getChildById(FIELD_THREADOPTION_TAB);
String stat = "open";
if (this.topic.getIsClosed())
stat = "closed";
threadOption.getUIFormSelectBox(FIELD_TOPICSTATE_SELECTBOX).setValue(stat);
if (this.topic.getIsLock())
stat = "locked";
else
stat = "unlock";
threadOption.getUIFormSelectBox(FIELD_TOPICSTATUS_SELECTBOX).setValue(stat);
threadOption.getUIFormCheckBoxInput(FIELD_MODERATEPOST_CHECKBOX).setChecked(this.topic.getIsModeratePost());
if (this.topic.getIsNotifyWhenAddPost() != null && this.topic.getIsNotifyWhenAddPost().trim().length() > 0) {
threadOption.getUIFormCheckBoxInput(FIELD_NOTIFYWHENADDPOST_CHECKBOX).setChecked(true);
}
threadOption.getUIFormSelectBox(FIELD_TOPICTYPE_SELECTBOX).setValue(this.topic.getTopicType());
threadOption.getUIFormCheckBoxInput(FIELD_STICKY_CHECKBOX).setChecked(this.topic.getIsSticky());
UIForumInputWithActions threadPermission = this.getChildById(FIELD_THREADPERMISSION_TAB);
threadPermission.getUIFormTextAreaInput(FIELD_CANVIEW_INPUT).setValue(ForumUtils.unSplitForForum(this.topic.getCanView()));
threadPermission.getUIFormTextAreaInput(FIELD_CANPOST_INPUT).setValue(ForumUtils.unSplitForForum(this.topic.getCanPost()));
String postId = topicId.replaceFirst(Utils.TOPIC, Utils.POST);
Post post = getForumService().getPost(this.categoryId, this.forumId, this.topicId, postId);
if (post != null && post.getAttachments() != null && post.getAttachments().size() > 0) {
this.attachments_ = post.getAttachments();
this.refreshUploadFileList();
}
getChild(UIFormInputIconSelector.class).setSelectedIcon(topic.getIcon());
}
}
static public class PreviewThreadActionListener extends BaseEventListener<UITopicForm> {
public void onEvent(Event<UITopicForm> event, UITopicForm uiForm, final String objectId) throws Exception {
int t = 0, k = 1;
UIForumInputWithActions threadContent = uiForm.getChildById(FIELD_THREADCONTEN_TAB);
UIFormStringInput stringInputTitle = threadContent.getUIStringInput(FIELD_TOPICTITLE_INPUT);
String topicTitle = " " + stringInputTitle.getValue();
topicTitle = topicTitle.trim();
String message = threadContent.getChild(UIFormWYSIWYGInput.class).getValue();
String checksms = ForumTransformHTML.cleanHtmlCode(message, new ArrayList<String>((new ExtendedBBCodeProvider()).getSupportedBBCodes()));
checksms = checksms.replaceAll(" ", " ");
t = checksms.trim().length();
if (topicTitle.length() < 1 && topicTitle.equals("null")) {
k = 0;
}
topicTitle = org.exoplatform.ks.common.Utils.encodeSpecialCharInTitle(topicTitle);
if (t > 0 && k != 0 && !checksms.equals("null")) {
String userName = UserHelper.getCurrentUser();
Post postNew = new Post();
postNew.setOwner(userName);
postNew.setName(topicTitle);
if (ForumUtils.isEmpty(uiForm.topicId)) {
postNew.setCreatedDate(TimeConvertUtils.getInstanceTempCalendar().getTime());
postNew.setModifiedDate(TimeConvertUtils.getInstanceTempCalendar().getTime());
} else {
postNew.setCreatedDate(uiForm.topic.getCreatedDate());
postNew.setModifiedDate(uiForm.topic.getModifiedDate());
}
postNew.setModifiedBy(userName);
postNew.setMessage(message);
postNew.setAttachments(uiForm.attachments_);
UIFormInputIconSelector uiIconSelector = uiForm.getChild(UIFormInputIconSelector.class);
postNew.setIcon(uiIconSelector.getSelectedIcon());
UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
UIViewPost viewPost = openPopup(popupContainer, UIViewPost.class, "ViewTopic", 670, 0);
viewPost.setPostView(postNew);
viewPost.setActionForm(new String[] { "Close" });
} else {
String[] args = { ForumUtils.EMPTY_STR };
if (k == 0) {
args = new String[] { uiForm.getLabel(FIELD_TOPICTITLE_INPUT) };
if (t == 0)
args = new String[] { uiForm.getLabel(FIELD_TOPICTITLE_INPUT) + ", " + uiForm.getLabel(FIELD_MESSAGECONTENT) };
warning("NameValidator.msg.ShortText", args);
} else if (t == 0) {
args = new String[] { uiForm.getLabel(FIELD_MESSAGECONTENT) };
warning("NameValidator.msg.ShortMessage", args);
}
}
}
}
static public class SubmitThreadActionListener extends BaseEventListener<UITopicForm> {
public void onEvent(Event<UITopicForm> event, UITopicForm uiForm, final String objectId) throws Exception {
if (uiForm.isDoubleClickSubmit)
return;
uiForm.isDoubleClickSubmit = true;
UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
UserProfile userProfile = forumPortlet.getUserProfile();
try {
if (forumPortlet.checkForumHasAddTopic(uiForm.categoryId, uiForm.forumId)) {
int t = 0, k = 1;
UIForumInputWithActions threadContent = uiForm.getChildById(FIELD_THREADCONTEN_TAB);
UIFormStringInput stringInputTitle = threadContent.getUIStringInput(FIELD_TOPICTITLE_INPUT);
String topicTitle = " " + stringInputTitle.getValue();
topicTitle = topicTitle.trim();
int maxText = ForumUtils.MAXTITLE;
if (topicTitle.length() > maxText) {
String[] args = { uiForm.getLabel(FIELD_TOPICTITLE_INPUT), String.valueOf(maxText) };
warning("NameValidator.msg.warning-long-text", args);
uiForm.isDoubleClickSubmit = false;
return;
}
String editReason = threadContent.getUIStringInput(FIELD_EDITREASON_INPUT).getValue();
if (!ForumUtils.isEmpty(editReason) && editReason.length() > maxText) {
String[] args = { uiForm.getLabel(FIELD_EDITREASON_INPUT), String.valueOf(maxText) };
warning("NameValidator.msg.warning-long-text", args);
uiForm.isDoubleClickSubmit = false;
return;
}
String message = threadContent.getChild(UIFormWYSIWYGInput.class).getValue();
message = message.replaceAll("<script", "<script").replaceAll("<link", "<link").replaceAll("</script>", "</script>");
String checksms = ForumTransformHTML.cleanHtmlCode(message, new ArrayList<String>((new ExtendedBBCodeProvider()).getSupportedBBCodes()));
message = StringUtils.replace(message, "'", "'");
checksms = checksms.replaceAll(" ", " ");
t = checksms.trim().length();
if (topicTitle.length() <= 0 && topicTitle.equals("null")) {
k = 0;
}
if (t > 0 && k != 0 && !checksms.equals("null")) {
boolean isOffend = false;
boolean hasForumMod = false;
if (!uiForm.isMod()) {
String[] censoredKeyword = ForumUtils.getCensoredKeyword(uiForm.getForumService());
checksms = checksms.toLowerCase();
for (String string : censoredKeyword) {
if (checksms.indexOf(string.trim()) >= 0) {
isOffend = true;
break;
}
if (topicTitle.toLowerCase().indexOf(string.trim()) >= 0) {
isOffend = true;
break;
}
}
if (uiForm.forum != null)
hasForumMod = uiForm.forum.getIsModerateTopic();
}
topicTitle = org.exoplatform.ks.common.Utils.encodeSpecialCharInTitle(topicTitle);
editReason = org.exoplatform.ks.common.Utils.encodeSpecialCharInTitle(editReason);
UIForumInputWithActions threadOption = uiForm.getChildById(FIELD_THREADOPTION_TAB);
String topicType = threadOption.getUIFormSelectBox(FIELD_TOPICTYPE_SELECTBOX).getValue();
if (topicType.equals("none"))
topicType = " ";
String topicState = threadOption.getUIFormSelectBox(FIELD_TOPICSTATE_SELECTBOX).getValue();
String topicStatus = threadOption.getUIFormSelectBox(FIELD_TOPICSTATUS_SELECTBOX).getValue();
Boolean moderatePost = (Boolean) threadOption.getUIFormCheckBoxInput(FIELD_MODERATEPOST_CHECKBOX).getValue();
Boolean whenNewPost = (Boolean) threadOption.getUIFormCheckBoxInput(FIELD_NOTIFYWHENADDPOST_CHECKBOX).getValue();
Boolean sticky = (Boolean) threadOption.getUIFormCheckBoxInput(FIELD_STICKY_CHECKBOX).getValue();
UIForumInputWithActions threadPermission = uiForm.getChildById(FIELD_THREADPERMISSION_TAB);
String canPost = threadPermission.getUIFormTextAreaInput(FIELD_CANPOST_INPUT).getValue();
String canView = threadPermission.getUIFormTextAreaInput(FIELD_CANVIEW_INPUT).getValue();
canPost = ForumUtils.removeSpaceInString(canPost);
canPost = ForumUtils.removeStringResemble(canPost);
canView = ForumUtils.removeSpaceInString(canView);
canView = ForumUtils.removeStringResemble(canView);
String erroUser = UserHelper.checkValueUser(canPost);
if (!ForumUtils.isEmpty(erroUser)) {
String[] args = { uiForm.getLabel(FIELD_CANPOST_INPUT), erroUser };
warning("NameValidator.msg.erroUser-input", args);
uiForm.isDoubleClickSubmit = false;
return;
}
erroUser = UserHelper.checkValueUser(canView);
if (!ForumUtils.isEmpty(erroUser)) {
String[] args = { uiForm.getLabel(FIELD_CANVIEW_INPUT), erroUser };
warning("NameValidator.msg.erroUser-input", args);
uiForm.isDoubleClickSubmit = false;
return;
}
// set link
Topic topicNew = uiForm.topic;
String link = ForumUtils.createdForumLink(ForumUtils.TOPIC, topicNew.getId()).replaceFirst("private", "public");
//
String userName = userProfile.getUserId();
topicNew.setOwner(userName);
topicNew.setTopicName(topicTitle);
topicNew.setCreatedDate(new Date());
topicNew.setModifiedBy(userName);
topicNew.setModifiedDate(new Date());
topicNew.setLastPostBy(userName);
topicNew.setLastPostDate(new Date());
topicNew.setDescription(message);
topicNew.setTopicType(topicType);
topicNew.setLink(link);
if (whenNewPost) {
String email = userProfile.getEmail();
if (ForumUtils.isEmpty(email)) {
try {
email = UserHelper.getUserByUserId(userName).getEmail();
} catch (Exception e) {
}
if (ForumUtils.isEmpty(email)) {
email = "true";
}
}
topicNew.setIsNotifyWhenAddPost(email);
} else {
topicNew.setIsNotifyWhenAddPost(ForumUtils.EMPTY_STR);
}
topicNew.setIsModeratePost(moderatePost);
topicNew.setIsWaiting(isOffend);
topicNew.setAttachments(uiForm.attachments_);
if (topicState.equals("closed")) {
topicNew.setIsClosed(true);
} else {
topicNew.setIsClosed(false);
}
if (topicStatus.equals("locked")) {
topicNew.setIsLock(true);
} else {
topicNew.setIsLock(false);
}
topicNew.setIsSticky(sticky);
UIFormInputIconSelector uiIconSelector = uiForm.getChild(UIFormInputIconSelector.class);
topicNew.setIcon(uiIconSelector.getSelectedIcon());
String[] canPosts = ForumUtils.splitForForum(canPost);
String[] canViews = ForumUtils.splitForForum(canView);
topicNew.setCanView(canViews);
topicNew.setCanPost(canPosts);
topicNew.setIsApproved(!hasForumMod);
if (!ForumUtils.isEmpty(uiForm.topicId)) {
topicNew.setId(uiForm.topicId);
topicNew.setEditReason(editReason);
try {
uiForm.getForumService().saveTopic(uiForm.categoryId, uiForm.forumId, topicNew, false, false, ForumUtils.getDefaultMail());
if (uiForm.isDetail) {
forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath((uiForm.categoryId + ForumUtils.SLASH + uiForm.forumId + ForumUtils.SLASH + uiForm.topicId));
UITopicDetail topicDetail = forumPortlet.findFirstComponentOfType(UITopicDetail.class);
topicDetail.setIsEditTopic(true);
uiForm.isDetail = false;
}
} catch (PathNotFoundException e) {
forumPortlet.rederForumHome();
forumPortlet.cancelAction();
warning("UITopicForm.msg.forum-deleted");
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
uiForm.isDoubleClickSubmit = false;
return;
}
} else {
topicNew.setVoteRating(0.0);
topicNew.setUserVoteRating(new String[] {});
try {
String remoteAddr = ForumUtils.EMPTY_STR;
if (forumPortlet.isEnableIPLogging()) {
remoteAddr = WebUIUtils.getRemoteIP();
}
topicNew.setRemoteAddr(remoteAddr);
uiForm.getForumService().saveTopic(uiForm.categoryId, uiForm.forumId, topicNew, true, false, ForumUtils.getDefaultMail());
if (userProfile.getIsAutoWatchMyTopics()) {
List<String> values = new ArrayList<String>();
values.add(userProfile.getEmail());
String path = uiForm.categoryId + ForumUtils.SLASH + uiForm.forumId + ForumUtils.SLASH + topicNew.getId();
uiForm.getForumService().addWatch(1, path, values, userName);
}
} catch (PathNotFoundException e) {
forumPortlet.updateIsRendered(ForumUtils.CATEGORIES);
UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class);
categoryContainer.updateIsRender(true);
categoryContainer.getChild(UICategories.class).setIsRenderChild(false);
forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(Utils.FORUM_SERVICE);
forumPortlet.cancelAction();
warning("UITopicForm.msg.forum-deleted");
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
uiForm.isDoubleClickSubmit = false;
return;
}
}
uiForm.topic = new Topic();
forumPortlet.cancelAction();
if (isOffend || hasForumMod) {
if (isOffend)
warning("MessagePost.msg.isOffend");
else {
String[] args = new String[] { "forum", "thread" };
warning("MessageThread.msg.isModerate", args);
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
} else {
if (k == 0) {
String[] args = new String[] { uiForm.getLabel(FIELD_TOPICTITLE_INPUT) };
if (t <= 0)
args = new String[] { uiForm.getLabel(FIELD_TOPICTITLE_INPUT) + " and " + uiForm.getLabel(FIELD_MESSAGECONTENT) };
warning("NameValidator.msg.ShortText", args);
uiForm.isDoubleClickSubmit = false;
} else if (t <= 0) {
warning("NameValidator.msg.ShortMessage", new String[] { "Message" });
uiForm.isDoubleClickSubmit = false;
}
}
} else {
forumPortlet.cancelAction();
UITopicContainer topicContainer = forumPortlet.findFirstComponentOfType(UITopicContainer.class);
topicContainer.setUpdateForum(uiForm.categoryId, uiForm.forum, 0);
warning("UITopicForm.msg.no-permission");
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
uiForm.isDoubleClickSubmit = false;
return;
}
} catch (Exception e) {
forumPortlet.updateIsRendered(ForumUtils.CATEGORIES);
UICategoryContainer categoryContainer = forumPortlet.getChild(UICategoryContainer.class);
categoryContainer.updateIsRender(true);
categoryContainer.getChild(UICategories.class).setIsRenderChild(false);
forumPortlet.getChild(UIBreadcumbs.class).setUpdataPath(Utils.FORUM_SERVICE);
forumPortlet.cancelAction();
warning("UITopicForm.msg.forum-deleted");
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
}
}
static public class AttachmentActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
UITopicForm uiForm = event.getSource();
UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
UIAttachFileForm attachFileForm = uiForm.openPopup(popupContainer, UIAttachFileForm.class, 500, 0);
attachFileForm.updateIsTopicForm(true);
attachFileForm.setMaxField(5, false);
}
}
static public class RemoveAttachmentActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
UITopicForm uiTopicForm = event.getSource();
String attFileId = event.getRequestContext().getRequestParameter(OBJECTID);
for (ForumAttachment att : uiTopicForm.attachments_) {
if (att.getId().equals(attFileId)) {
uiTopicForm.removeFromUploadFileList(att);
uiTopicForm.attachments_.remove(att);
break;
}
}
uiTopicForm.refreshUploadFileList();
}
}
static public class AddTypeTopicActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
UITopicForm topicForm = event.getSource();
UIPopupContainer popupContainer = topicForm.getAncestorOfType(UIPopupContainer.class);
topicForm.openPopup(popupContainer, UIAddTopicTypeForm.class, "AddTopicTypeForm", 700, 0);
}
}
static public class CancelActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
forumPortlet.cancelAction();
}
}
static public class SelectTabActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
String id = event.getRequestContext().getRequestParameter(OBJECTID);
UITopicForm topicForm = event.getSource();
topicForm.id = Integer.parseInt(id);
event.getRequestContext().addUIComponentToUpdateByAjax(topicForm.getParent());
}
}
static public class SelectIconActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
String iconName = event.getRequestContext().getRequestParameter(OBJECTID);
UITopicForm topicForm = event.getSource();
UIFormInputIconSelector iconSelector = topicForm.getChild(UIFormInputIconSelector.class);
if (!iconSelector.getValue().equals(iconName)) {
iconSelector.setSelectedIcon(iconName);
event.getRequestContext().addUIComponentToUpdateByAjax(topicForm.getParent());
}
}
}
public void updateSelect(String selectField, String value) throws Exception {
UIFormTextAreaInput fieldInput = getUIFormTextAreaInput(selectField);
String values = fieldInput.getValue();
fieldInput.setValue(ForumUtils.updateMultiValues(value, values));
}
static public class AddValuesUserActionListener extends BaseEventListener<UITopicForm> {
public void onEvent(Event<UITopicForm> event, UITopicForm uiTopicForm, String objctId) throws Exception {
String[] array = objctId.split(ForumUtils.SLASH);
String childId = array[0];
if (!ForumUtils.isEmpty(childId)) {
UIPopupContainer popupContainer = uiTopicForm.getAncestorOfType(UIPopupContainer.class);
UIUserSelect uiUserSelect = popupContainer.findFirstComponentOfType(UIUserSelect.class);
if (uiUserSelect != null) {
UIPopupWindow popupWindow = uiUserSelect.getParent();
closePopupWindow(popupWindow);
}
UIGroupSelector uiGroupSelector = null;
if (array[1].equals(UIGroupSelector.TYPE_MEMBERSHIP)) {
uiGroupSelector = openPopup(popupContainer, UIGroupSelector.class, "UIMemberShipSelector", 600, 0);
} else if (array[1].equals(UIGroupSelector.TYPE_GROUP)) {
uiGroupSelector = openPopup(popupContainer, UIGroupSelector.class, "GroupSelector", 600, 0);
}
uiGroupSelector.setType(array[1]);
uiGroupSelector.setSelectedGroups(null);
uiGroupSelector.setComponent(uiTopicForm, new String[] { childId });
uiGroupSelector.getChild(UITree.class).setId(UIGroupSelector.TREE_GROUP_ID);
uiGroupSelector.getChild(org.exoplatform.webui.core.UIBreadcumbs.class).setId(UIGroupSelector.BREADCUMB_GROUP_ID);
}
}
}
static public class CloseActionListener extends EventListener<UIUserSelector> {
public void execute(Event<UIUserSelector> event) throws Exception {
UIUserSelector uiUserSelector = event.getSource();
UIPopupWindow popupWindow = uiUserSelector.getParent();
closePopupWindow(popupWindow);
}
}
static public class ClosePopupActionListener extends EventListener<UIPopupWindow> {
public void execute(Event<UIPopupWindow> event) throws Exception {
UIPopupWindow popupWindow = event.getSource();
closePopupWindow(popupWindow);
}
}
private void setValueField(UIForumInputWithActions withActions, String field, String values) throws Exception {
try {
UIFormTextAreaInput textArea = withActions.getUIFormTextAreaInput(field);
String vls = textArea.getValue();
if (!ForumUtils.isEmpty(vls)) {
values = values + ForumUtils.COMMA + vls;
values = ForumUtils.removeStringResemble(values.replaceAll(",,", ForumUtils.COMMA));
}
textArea.setValue(values);
} catch (Exception e) {
log.warn("Declare " + values + " for " + field + "fail: " + e.getMessage() + "\n" + e.getCause());
}
}
static public class AddActionListener extends EventListener<UIUserSelect> {
public void execute(Event<UIUserSelect> event) throws Exception {
UIUserSelect uiUserSelector = event.getSource();
String values = uiUserSelector.getSelectedUsers();
UIForumPortlet forumPortlet = uiUserSelector.getAncestorOfType(UIForumPortlet.class);
UITopicForm topicForm = forumPortlet.findFirstComponentOfType(UITopicForm.class);
UIPopupWindow popupWindow = uiUserSelector.getParent();
String id = uiUserSelector.getPermisionType();
if (topicForm != null) {
UIForumInputWithActions topicPermission = topicForm.getChildById(FIELD_THREADPERMISSION_TAB);
if (id.equals(FIELD_CANVIEW_INPUT)) {
topicForm.setValueField(topicPermission, FIELD_CANVIEW_INPUT, values);
} else if (id.equals(FIELD_CANPOST_INPUT)) {
topicForm.setValueField(topicPermission, FIELD_CANPOST_INPUT, values);
}
}
closePopupWindow(popupWindow);
event.getRequestContext().addUIComponentToUpdateByAjax(topicForm);
}
}
static public class AddUserActionListener extends EventListener<UITopicForm> {
public void execute(Event<UITopicForm> event) throws Exception {
UITopicForm topicForm = event.getSource();
String id = event.getRequestContext().getRequestParameter(OBJECTID).replace("/0", ForumUtils.EMPTY_STR);
UIPopupContainer uiPopupContainer = topicForm.getAncestorOfType(UIPopupContainer.class);
topicForm.showUIUserSelect(uiPopupContainer, USER_SELECTOR_POPUPWINDOW, id);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupContainer);
}
}
}