UIPollForm.java
/***************************************************************************
* Copyright (C) 2003-2010 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.poll.webui.popup;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.exoplatform.commons.utils.StringCommonUtils;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.common.UserHelper;
import org.exoplatform.forum.common.webui.BaseEventListener;
import org.exoplatform.forum.common.webui.UIFormMultiValueInputSet;
import org.exoplatform.forum.common.webui.UIGroupSelector;
import org.exoplatform.forum.common.webui.UIPopupAction;
import org.exoplatform.forum.common.webui.UIPopupContainer;
import org.exoplatform.forum.common.webui.UISelector;
import org.exoplatform.poll.Utils;
import org.exoplatform.poll.service.Poll;
import org.exoplatform.poll.service.PollNodeTypes;
import org.exoplatform.poll.webui.BasePollForm;
import org.exoplatform.poll.webui.UIPollManagement;
import org.exoplatform.poll.webui.UIPollPortlet;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.webui.form.validator.PositiveNumberFormatValidator;
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/poll/webui/popup/UIPollForm.gtmpl",
events = {
@EventConfig(listeners = UIPollForm.SaveActionListener.class),
@EventConfig(listeners = UIPollForm.RefreshActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPollForm.AddGroupActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIPollForm.CancelActionListener.class, phase = Phase.DECODE)
}
)
public class UIPollForm extends BasePollForm implements UIPopupComponent, UISelector {
public static final String FIELD_QUESTION_INPUT = "Question";
final static public String FIELD_OPTIONS = "Option";
public static final String FIELD_TIMEOUT_INPUT = "TimeOut";
public static final String FIELD_GROUP_PRIVATE_INPUT = "GroupPrivate";
public static final String FIELD_AGAINVOTE_CHECKBOX = "VoteAgain";
public static final String FIELD_MULTIVOTE_CHECKBOX = "MultiVote";
public static final String FIELD_PUBLIC_DATA_CHECKBOX = "PublicData";
public static final String COLON = ":";
public static final String DELETED = "deleted";
public static final String ZERO = "0.0";
private UIFormMultiValueInputSet uiFormMultiValue = new UIFormMultiValueInputSet(FIELD_OPTIONS, FIELD_OPTIONS);
private Poll poll = new Poll();
private boolean isUpdate = false;
public boolean isEditPath = true;
private boolean isPublic = true;
public UIPollForm() throws Exception {
UIFormStringInput question = new UIFormStringInput(FIELD_QUESTION_INPUT, FIELD_QUESTION_INPUT, "");
UIFormStringInput timeOut = new UIFormStringInput(FIELD_TIMEOUT_INPUT, FIELD_TIMEOUT_INPUT, "");
timeOut.addValidator(PositiveNumberFormatValidator.class);
UICheckBoxInput VoteAgain = new UICheckBoxInput(FIELD_AGAINVOTE_CHECKBOX, FIELD_AGAINVOTE_CHECKBOX, false);
UICheckBoxInput MultiVote = new UICheckBoxInput(FIELD_MULTIVOTE_CHECKBOX, FIELD_MULTIVOTE_CHECKBOX, false);
UICheckBoxInput PublicData = new UICheckBoxInput(FIELD_PUBLIC_DATA_CHECKBOX, FIELD_PUBLIC_DATA_CHECKBOX, true);
PublicData.setChecked(isPublic);
UIFormStringInput GroupPrivate = new UIFormStringInput(FIELD_GROUP_PRIVATE_INPUT, FIELD_GROUP_PRIVATE_INPUT, "");
GroupPrivate.setReadOnly(true);
addUIFormInput(question.addValidator(MandatoryValidator.class));
addUIFormInput(timeOut);
addUIFormInput(VoteAgain);
addUIFormInput(MultiVote);
addUIFormInput(PublicData);
addUIFormInput(GroupPrivate);
setDefaulFall();
setActions(new String[] { "Save", "Refresh", "Cancel" });
}
private void initMultiValuesField(List<String> list) throws Exception {
if (uiFormMultiValue != null)
removeChildById(FIELD_OPTIONS);
uiFormMultiValue = createUIComponent(UIFormMultiValueInputSet.class, null, null);
uiFormMultiValue.addValidator(MandatoryValidator.class);
uiFormMultiValue.setId(FIELD_OPTIONS);
uiFormMultiValue.setName(FIELD_OPTIONS);
uiFormMultiValue.setType(UIFormStringInput.class);
uiFormMultiValue.setValue(list);
addUIFormInput(uiFormMultiValue);
}
protected String getDateAfter() throws Exception {
Date date = new Date();
if (poll != null && poll.getTimeOut() > 0) {
date = poll.getModifiedDate();
}
String format = "MM-dd-yyyy";
return Utils.getFormatDate(format, date);
}
public void setUpdatePoll(Poll poll, boolean isUpdate) throws Exception {
if (isUpdate) {
this.poll = poll;
getUIStringInput(FIELD_QUESTION_INPUT).setValue(StringCommonUtils.decodeSpecialCharToHTMLnumber(poll.getQuestion()));
getUIStringInput(FIELD_TIMEOUT_INPUT).setValue(String.valueOf(poll.getTimeOut()));
getUICheckBoxInput(FIELD_AGAINVOTE_CHECKBOX).setChecked(poll.getIsAgainVote());
UICheckBoxInput multiVoteCheckInput = getUICheckBoxInput(FIELD_MULTIVOTE_CHECKBOX);
multiVoteCheckInput.setChecked(poll.getIsMultiCheck());
multiVoteCheckInput.setDisabled(true);
String group = poll.getParentPath();
poll.setOldParentPath(group);
if (group.indexOf(PollNodeTypes.APPLICATION_DATA) > 0) {
isPublic = false;
getUICheckBoxInput(FIELD_PUBLIC_DATA_CHECKBOX).setChecked(isPublic);
group = group.substring(group.indexOf("/", 2), group.indexOf(PollNodeTypes.APPLICATION_DATA) - 1);
getUIStringInput(FIELD_GROUP_PRIVATE_INPUT).setValue(group);
} else if (group.indexOf(PollNodeTypes.POLLS) < 0) {
isEditPath = false;
}
this.isUpdate = isUpdate;
setDefaulFall();
}
}
private void setDefaulFall() throws Exception {
List<String> list = new ArrayList<String>();
if (isUpdate) {
for (String string : this.poll.getOption()) {
list.add(StringCommonUtils.decodeSpecialCharToHTMLnumber(string));
}
} else {
list.add("");
list.add("");
}
this.initMultiValuesField(list);
}
public void activate() {
}
public void deActivate() {
}
public void updateSelect(String selectField, String value) throws Exception {
getUIStringInput(selectField).setValue(value);
getUICheckBoxInput(FIELD_PUBLIC_DATA_CHECKBOX).setValue(false);
}
static public class SaveActionListener extends EventListener<UIPollForm> {
public void execute(Event<UIPollForm> event) throws Exception {
UIPollForm uiForm = event.getSource();
String question = uiForm.getUIStringInput(FIELD_QUESTION_INPUT).getValue();
question = StringCommonUtils.encodeSpecialCharForSimpleInput(question);
String timeOutStr = uiForm.getUIStringInput(FIELD_TIMEOUT_INPUT).getValue();
timeOutStr = Utils.removeZeroFirstNumber(timeOutStr);
long timeOut = 0;
if (!Utils.isEmpty(timeOutStr)) {
if (timeOutStr.length() > 4) {
uiForm.warning("UIPollForm.msg.longTimeOut", new String[] { uiForm.getLabel(FIELD_TIMEOUT_INPUT) }, false);
}
timeOut = Long.parseLong(timeOutStr);
}
boolean isAgainVote = uiForm.getUICheckBoxInput(FIELD_AGAINVOTE_CHECKBOX).isChecked();
boolean isMultiVote = uiForm.getUICheckBoxInput(FIELD_MULTIVOTE_CHECKBOX).isChecked();
String sms = "";
List<UIComponent> childs = uiForm.uiFormMultiValue.getChildren();
List<String> values = (List<String>) uiForm.uiFormMultiValue.getValue() ;
List<String> values_ = new ArrayList<String>();
if (childs.size() != values.size()) {
uiForm.warning("UIPollForm.msg.FillAllOptions", false);
return;
}
int i = 1;
for (String value : values) {
if (!Utils.isEmpty(value)) {
if (value.length() > org.exoplatform.poll.service.Utils.MAX_TITLE) {
String[] args = new String[] { uiForm.getLabel(FIELD_OPTIONS) + "(" + i + ")", String.valueOf(org.exoplatform.poll.service.Utils.MAX_TITLE) };
uiForm.warning("NameValidator.msg.warning-long-text", args, false);
return;
}
values_.add(StringCommonUtils.encodeSpecialCharForSimpleInput(value));
}
++i;
}
String[] options = values_.toArray(new String[] {});
int sizeOption = values_.size();
if (sizeOption < 2)
sms = "Minimum";
if (sizeOption > 10)
sms = "Maximum";
if (Utils.isEmpty(question)) {
sms = "NotQuestion";
sizeOption = 0;
} else {
if (question.length() > org.exoplatform.poll.service.Utils.MAX_TITLE) {
String[] args = { uiForm.getLabel(FIELD_QUESTION_INPUT), String.valueOf(org.exoplatform.poll.service.Utils.MAX_TITLE) };
uiForm.warning("NameValidator.msg.warning-long-text", args, false);
return;
}
}
if (sizeOption >= 2 && sizeOption <= 10) {
String[] newUser = null;
String[] vote = new String[sizeOption];
for (int j = 0; j < sizeOption; j++) {
vote[j] = ZERO;
}
if (uiForm.isUpdate) {
List<Integer> listIndexItemRemoved = uiForm.uiFormMultiValue.getListIndexItemRemoved();
String[] oldVote = uiForm.poll.getVote();
String[] oldUserVote = uiForm.poll.getUserVote();
String[] voteTp = new String[oldVote.length];
double rmPecent = 0;
List<String> voteRemoved = new ArrayList<String>();
for (Integer integer : listIndexItemRemoved) {
if (integer < oldVote.length) {
rmPecent = rmPecent + Double.parseDouble(oldVote[integer]);
voteRemoved.add(String.valueOf(integer));
}
}
double leftPecent = 100 - rmPecent;
i = 0;
for (int k = 0; k < oldVote.length; ++k) {
if (listIndexItemRemoved.contains(k)) {
voteTp[k] = DELETED;
continue;
}
if (leftPecent > 1) {
double newVote = Double.parseDouble(oldVote[k]);
String vl = String.valueOf((newVote * 100) / leftPecent);
voteTp[k] = vl;
vote[i] = vl;
} else {
voteTp[k] = ZERO;
vote[i] = ZERO;
}
++i;
}
if (!uiForm.poll.getIsMultiCheck()) {
if (leftPecent > 1) {
List<String> userL = new ArrayList<String>();
for (String string : oldUserVote) {
boolean isAdd = true;
for (String j : voteRemoved) {
if (string.indexOf(COLON + j) > 0) {
isAdd = false;
}
}
if (isAdd)
userL.add(string);
}
newUser = new String[] {};
i = 0;
Map<String, String> mab = new HashMap<String, String>();
for (int j = 0; j < voteTp.length; j++) {
if (voteTp[j].equals(DELETED)) {
continue;
}
// vote[i] = voteTp[j];
for (String str : userL) {
if (str.indexOf(COLON + j) > 0) {
mab.put(str, str.replace(COLON + j, COLON + i));
} else {
if (!mab.keySet().contains(str)) {
mab.put(str, str);
}
}
}
++i;
}
newUser = mab.values().toArray(new String[userL.size()]);
} else if (voteRemoved.size() > 0 && rmPecent > 0.0) {
newUser = new String[] {};
}
// multi vote
} else {
List<String> newUserVote = new ArrayList<String>();
for (String uv : oldUserVote) {
StringBuffer sbUserInfo = new StringBuffer();
for (String string : uv.split(COLON)) {
if (!voteRemoved.contains(string)) {
if (sbUserInfo.length() > 0)
sbUserInfo.append(COLON);
sbUserInfo.append(string);
}
}
String userInfo = sbUserInfo.toString();
if (userInfo.split(COLON).length >= 2)
newUserVote.add(userInfo);
}
i = 0;
Map<String, String> mab = new HashMap<String, String>();
for (int j = 0; j < voteTp.length; j++) {
if (voteTp[j].equals(DELETED)) {
continue;
}
// vote[i] = voteTp[j];
for (String str : newUserVote) {
if (str.indexOf(COLON + j) > 0) {
if (mab.containsKey(str))
mab.put(str, mab.get(str).replace(COLON + j, COLON + i));
else
mab.put(str, str.replace(COLON + j, COLON + i));
} else {
if (!mab.keySet().contains(str)) {
mab.put(str, str);
}
}
}
++i;
}
newUser = mab.values().toArray(new String[newUserVote.size()]);
}
}
String userName = UserHelper.getCurrentUser();
Poll poll = uiForm.poll;
poll.setQuestion(question);
poll.setModifiedBy(userName);
poll.setModifiedDate(new Date());
poll.setIsAgainVote(isAgainVote);
poll.setIsMultiCheck(isMultiVote);
poll.setOption(options);
poll.setVote(vote);
poll.setTimeOut(timeOut);
poll.setIsClosed(uiForm.poll.getIsClosed());
try {
if (Utils.isEmpty(poll.getParentPath()) || poll.getParentPath().contains(PollNodeTypes.POLLS) || poll.getParentPath().contains(PollNodeTypes.EXO_POLLS)) {
boolean isPublic = uiForm.getUICheckBoxInput(FIELD_PUBLIC_DATA_CHECKBOX).isChecked();
String parentPath = "";
// if poll of topic : parentPath = topic.getPath();
// if poll of Group : parentPath = $GROUP/${PollNodeTypes.APPLICATION_DATA}/${PollNodeTypes.EXO_POLLS}
// if poll of public: parentPath = $PORTAL/${PollNodeTypes.POLLS}
if (isPublic) {
// test for public:
parentPath = ExoContainerContext.getCurrentContainer().getContext().getName() + "/" + PollNodeTypes.POLLS;
} else {
parentPath = uiForm.getUIStringInput(FIELD_GROUP_PRIVATE_INPUT).getValue();
if (parentPath.indexOf("/") == 0)
parentPath = parentPath.substring(1);
parentPath = parentPath + "/" + PollNodeTypes.APPLICATION_DATA + "/" + PollNodeTypes.EXO_POLLS;
}
poll.setParentPath(parentPath);
}
if (uiForm.isUpdate) {
if (newUser != null) {
poll.setUserVote(newUser);
}
uiForm.getPollService().savePoll(poll, false, false);
} else {
poll.setOwner(userName);
poll.setCreatedDate(new Date());
poll.setUserVote(new String[] {});
uiForm.getPollService().savePoll(poll, true, false);
}
} catch (Exception e) {
uiForm.warning("UIPollForm.msg.fail-save");
return;
}
uiForm.isUpdate = false;
UIPollPortlet pollPortlet = uiForm.getAncestorOfType(UIPollPortlet.class);
pollPortlet.cancelAction();
pollPortlet.getChild(UIPollManagement.class).updateGrid();
event.getRequestContext().addUIComponentToUpdateByAjax(pollPortlet);
}
if (!Utils.isEmpty(sms)) {
uiForm.warning("UIPollForm.msg." + sms, false);
}
}
}
static public class RefreshActionListener extends EventListener<UIPollForm> {
public void execute(Event<UIPollForm> event) throws Exception {
UIPollForm uiForm = event.getSource();
if(uiForm.isUpdate) {
uiForm.setUpdatePoll(uiForm.poll, uiForm.isUpdate);
} else {
List<String> list = new ArrayList<String>();
list.add("");
list.add("");
uiForm.initMultiValuesField(list);
uiForm.getUIStringInput(FIELD_QUESTION_INPUT).setValue("");
uiForm.getUIStringInput(FIELD_TIMEOUT_INPUT).setValue("0");
uiForm.getUICheckBoxInput(FIELD_AGAINVOTE_CHECKBOX).setChecked(false);
uiForm.getUICheckBoxInput(FIELD_MULTIVOTE_CHECKBOX).setChecked(false);
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
}
}
static public class AddGroupActionListener extends BaseEventListener<UIPollForm> {
public void onEvent(Event<UIPollForm> event, UIPollForm uiForm, String objctId) throws Exception {
UIPopupContainer popupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class);
popupAction.getChild(UIPopupWindow.class).setId("UIPopupChildWindow");
UIGroupSelector uiGroupSelector = popupAction.activate(UIGroupSelector.class, 600);
uiGroupSelector.setId("UIGroupSelector");
uiGroupSelector.setType(UISelectComponent.TYPE_GROUP);
uiGroupSelector.setSelectedGroups(null);
uiGroupSelector.setComponent(uiForm, new String[] { FIELD_GROUP_PRIVATE_INPUT });
event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer);
}
}
static public class CancelActionListener extends EventListener<UIPollForm> {
public void execute(Event<UIPollForm> event) throws Exception {
UIPollForm uiForm = event.getSource();
UIPollPortlet pollPortlet = uiForm.getAncestorOfType(UIPollPortlet.class);
pollPortlet.cancelAction();
uiForm.isUpdate = false;
}
}
}