/*
* Copyright (C) 2003-2013 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.create;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.common.CommonUtils;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.config.UserPortalConfigService;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.mop.navigation.NavigationContext;
import org.exoplatform.portal.mop.navigation.NavigationService;
import org.exoplatform.portal.mop.navigation.NodeContext;
import org.exoplatform.portal.mop.navigation.NodeModel;
import org.exoplatform.portal.mop.navigation.Scope;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserNode;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.webui.portal.UIPortal;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.social.core.space.model.Space;
import org.exoplatform.social.core.space.spi.SpaceService;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.web.url.navigation.NavigationResource;
import org.exoplatform.web.url.navigation.NodeURL;
public class CreateUtils {
public static final String SPACES_GROUP = "spaces";
public static final String CATEGORY = "category";
private static final String FORUM_PAGE_NAGVIGATION = "forum";
private static final String FORUM_PORTLET_NAME = "ForumPortlet";
public static List<String> getAllPortalNames() {
UserPortalConfigService dataStorage = (UserPortalConfigService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(UserPortalConfigService.class);
try {
return dataStorage.getAllPortalNames();
} catch (Exception e) {
return new ArrayList<String>();
}
}
public static String getCurrentPortalName() {
UIPortal uiPortal = Util.getUIPortal();
SiteKey siteKey = uiPortal.getSiteKey();
if(siteKey.getType() == SiteType.PORTAL) {
return siteKey.getName();
}
return SiteType.GROUP.name();
}
private static String getType(String categoryId, String forumId, String topicId) {
if(!CommonUtils.isEmpty(topicId)) return Utils.TOPIC;
if(!CommonUtils.isEmpty(forumId)) return Utils.FORUM;
if(!CommonUtils.isEmpty(categoryId)) return CATEGORY;
return "";
}
private static String getObjectId(String categoryId, String forumId, String topicId) {
if(!CommonUtils.isEmpty(topicId)) return topicId;
if(!CommonUtils.isEmpty(forumId)) return forumId;
if(!CommonUtils.isEmpty(categoryId)) return categoryId;
return "";
}
/**
*
* @param categoryId
* @param forumId
* @param topicId
* @return
*/
public static String buildLink(String categoryId, String forumId, String topicId) {
return buildLink(categoryId, forumId, topicId, null);
}
/**
*
* @param categoryId
* @param forumId
* @param topicId
* @return
*/
public static String buildLink(String categoryId, String forumId, String topicId, String siteName) {
try {
String link = "";
String objectType = getType(categoryId, forumId, topicId);
String objectId = getObjectId(categoryId, forumId, topicId);
//
if (categoryId.indexOf(SPACES_GROUP) > 0 && !objectType.equals(CATEGORY)) {
String prefixId = Utils.FORUM_SPACE_ID_PREFIX;
String spaceGroupId = "/".concat(SPACES_GROUP).concat("/").concat(forumId.replaceFirst(prefixId, ""));
link = buildSpaceLink(spaceGroupId, objectType, objectId);
} else {
PortalRequestContext prc = Util.getPortalRequestContext();
if (!CommonUtils.isEmpty(siteName) && !prc.getSiteKey().getName().equals(siteName)) {
SiteKey siteKey = SiteKey.portal(siteName);
String nodeURI = getSiteName(siteKey);
//
if (!CommonUtils.isEmpty(nodeURI)) {
String siteHomeLink = getSiteHomeURL(siteName, nodeURI);
link = String.format("%s/%s/%s", siteHomeLink, objectType, objectId);
}
} else {
UserPortal userPortal = prc.getUserPortal();
UserNavigation userNav = userPortal.getNavigation(prc.getSiteKey());
UserNode userNode = userPortal.getNode(userNav, Scope.ALL, null, null);
//
UserNode forumNode = userNode.getChild(FORUM_PAGE_NAGVIGATION);
if (forumNode != null) {
String forumURI = getNodeURL(forumNode);
link = String.format("%s/%s/%s", forumURI, objectType, objectId);
}
}
}
//
return link;
} catch (Exception ex) {
return "";
}
}
private static String getNodeURL(UserNode node) {
RequestContext ctx = RequestContext.getCurrentInstance();
NodeURL nodeURL = ctx.createURL(NodeURL.TYPE);
return nodeURL.setNode(node).toString();
}
/**
*
* @param spaceGroupId
* @param objectType
* @param objectId
* @return
* @throws Exception
*/
public static String buildSpaceLink(String spaceGroupId, String objectType, String objectId) throws Exception {
String nodeURI = getSiteName(SiteKey.group(spaceGroupId));
if (!CommonUtils.isEmpty(nodeURI)) {
String spaceLink = getSpaceHomeURL(spaceGroupId);
String objectLink = String.format("%s/%s/%s/%s", spaceLink, nodeURI, objectType, objectId);
return objectLink;
}
return CommonUtils.EMPTY_STR;
}
public static String getSiteName(SiteKey siteKey) {
ExoContainer container = ExoContainerContext.getCurrentContainer();
NavigationService navService = (NavigationService) container.getComponentInstance(NavigationService.class);
NavigationContext nav = navService.loadNavigation(siteKey);
NodeContext<NodeContext<?>> parentNodeCtx = navService.loadNode(NodeModel.SELF_MODEL, nav, Scope.ALL, null);
if (parentNodeCtx.getSize() >= 1) {
Collection<NodeContext<?>> children = parentNodeCtx.getNodes();
if (siteKey.getType() == SiteType.GROUP) {
children = parentNodeCtx.get(0).getNodes();
}
Iterator<NodeContext<?>> it = children.iterator();
NodeContext<?> child = null;
while (it.hasNext()) {
child = it.next();
if (FORUM_PAGE_NAGVIGATION.equals(child.getName()) || child.getName().indexOf(FORUM_PORTLET_NAME) >= 0) {
break;
}
}
return child.getName();
}
return CommonUtils.EMPTY_STR;
}
/**
*
* @param portalName
* @param nodeURI
* @return
*/
public static String getSiteHomeURL(String portalName, String nodeURI) {
NodeURL nodeURL = RequestContext.getCurrentInstance().createURL(NodeURL.TYPE);
NavigationResource resource = new NavigationResource(SiteType.PORTAL, portalName, nodeURI);
return nodeURL.setResource(resource).toString();
}
/**
* Gets the space home url of a space.
*
* @param spaceGroupId
* @return
* @since 4.0
*/
public static String getSpaceHomeURL(String spaceGroupId) {
Space space = CommonUtils.getComponent(SpaceService.class).getSpaceByGroupId(spaceGroupId);
String permanentSpaceName = space.getPrettyName();
NodeURL nodeURL = RequestContext.getCurrentInstance().createURL(NodeURL.TYPE);
NavigationResource resource = new NavigationResource(SiteType.GROUP, spaceGroupId, permanentSpaceName);
return nodeURL.setResource(resource).toString();
}
}