/*
* Copyright (C) 2003-2009 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;
import java.util.ArrayList;
import java.util.List;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.service.Watch;
import org.exoplatform.forum.webui.popup.UIGroupSelector;
import org.exoplatform.ks.common.webui.BaseUIForm;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.ks.common.webui.UIUserSelect;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupWindow;
/**
* Base class for UIForm used in forum application.
* Provides convenience methods to access the service
* @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a>
* @version $Revision$
*/
public class BaseForumForm extends BaseUIForm {
private ForumService forumService;
public UserProfile userProfile = null;
public List<Watch> listWatches = new ArrayList<Watch>();
/**
* Get a reference to the forum service
* @return
*/
protected ForumService getForumService() {
if (forumService == null) {
forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class);
}
return forumService;
}
/**
* Set forum service (used by unit tests)
* @param forumService
*/
protected void setForumService(ForumService forumService) {
this.forumService = forumService;
}
public UserProfile getUserProfile() throws Exception {
if (this.userProfile == null) {
setUserProfile(null);
}
return this.userProfile;
}
public void setUserProfile(UserProfile userProfile) throws Exception {
if (userProfile == null) {
this.userProfile = this.getAncestorOfType(UIForumPortlet.class).getUserProfile();
} else {
this.userProfile = userProfile;
}
}
protected void setListWatches() throws Exception {
listWatches = getForumService().getWatchByUser(getUserProfile().getUserId());
}
protected boolean isWatching(String path) throws Exception {
for (Watch watch : listWatches) {
if (path.equals(watch.getNodePath()) && watch.isAddWatchByEmail())
return true;
}
return false;
}
protected String getEmailWatching(String path) throws Exception {
for (Watch watch : listWatches) {
try {
if (watch.getNodePath().endsWith(path))
return watch.getEmail();
} catch (Exception e) {
log.debug("Failed to check email watching.");
}
}
return ForumUtils.EMPTY_STR;
}
protected String getScreenName(String userName) throws Exception {
return getForumService().getScreenName(userName);
}
protected String getShortScreenName(String screenName) throws Exception {
if (screenName != null && screenName.length() > 17 && !screenName.trim().contains(" ")) {
boolean isDelted = false;
if (screenName.indexOf("<s>") >= 0) {
screenName = screenName.replaceAll("<s>", ForumUtils.EMPTY_STR).replaceAll("</s>", ForumUtils.EMPTY_STR);
isDelted = true;
}
screenName = (new StringBuilder().append("<span title=\"").append(screenName).append("\">").append(((isDelted) ? "<s>" : ForumUtils.EMPTY_STR)).append(ForumUtils.getSubString(screenName, 15)).append(((isDelted) ? "</s></span>" : "</span>"))).toString();
}
return screenName;
}
protected <T extends UIComponent> T openPopup(Class<T> componentType, String popupId, int width, int height) throws Exception {
UIForumPortlet forumPortlet = getAncestorOfType(UIForumPortlet.class);
return openPopup(forumPortlet, componentType, popupId, width, height);
}
protected <T extends UIComponent> T openPopup(Class<T> componentType, int width, int height) throws Exception {
UIForumPortlet forumPortlet = getAncestorOfType(UIForumPortlet.class);
return openPopup(forumPortlet, componentType, width, height);
}
protected <T extends UIComponent> T openPopup(Class<T> componentType, int width) throws Exception {
return openPopup(componentType, width, 0);
}
protected <T extends UIComponent> T openPopup(Class<T> componentType, String popupId, int width) throws Exception {
return openPopup(componentType, popupId, width, 0);
}
protected boolean addWatch(String path, UserProfile userProfile) {
List<String> values = new ArrayList<String>();
try {
values.add(userProfile.getEmail());
getForumService().addWatch(1, path, values, userProfile.getUserId());
setListWatches();
info("UIAddWatchingForm.msg.successfully");
return true;
} catch (Exception e) {
warning("UIAddWatchingForm.msg.fall");
return false;
}
}
protected boolean unWatch(String path, UserProfile userProfile) {
try {
getForumService().removeWatch(1, path, userProfile.getUserId() + ForumUtils.SLASH + getEmailWatching(path));
setListWatches();
info("UIAddWatchingForm.msg.UnWatchSuccessfully");
return true;
} catch (Exception e) {
warning("UIAddWatchingForm.msg.UnWatchfall");
log.debug("Failed to add watch.");
return false;
}
}
protected static void closePopupWindow(UIPopupWindow popupWindow) {
popupWindow.setUIComponent(null);
popupWindow.setShow(false);
popupWindow.setRendered(false);
WebuiRequestContext context = RequestContext.getCurrentInstance();
context.addUIComponentToUpdateByAjax(popupWindow.getParent());
}
protected void showUIUserSelect(UIPopupContainer uiPopupContainer, String popupWinDowId, String id) throws Exception {
UIGroupSelector uiGroupSelector = uiPopupContainer.findFirstComponentOfType(UIGroupSelector.class);
if (uiGroupSelector != null) {
UIPopupWindow popupWindow = uiGroupSelector.getAncestorOfType(UIPopupWindow.class);
closePopupWindow(popupWindow);
}
UIPopupWindow uiPopupWindow = uiPopupContainer.getChildById(popupWinDowId);
if (uiPopupWindow == null)
uiPopupWindow = uiPopupContainer.addChild(UIPopupWindow.class, popupWinDowId, popupWinDowId);
UIUserSelect uiUserSelector = uiPopupContainer.createUIComponent(UIUserSelect.class, null, "UIUserSelector");
uiUserSelector.setShowSearch(true);
uiUserSelector.setShowSearchUser(true);
uiUserSelector.setShowSearchGroup(false);
uiUserSelector.setPermisionType(id);
uiPopupWindow.setUIComponent(uiUserSelector);
uiPopupWindow.setShow(true);
uiPopupWindow.setWindowSize(740, 400);
uiPopupWindow.setRendered(true);
uiPopupContainer.setRendered(true);
}
}