/*
* Copyright (C) 2003-2011 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.wiki.tree.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.portal.config.model.PortalConfig;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.wiki.mow.api.Page;
import org.exoplatform.wiki.mow.api.Wiki;
import org.exoplatform.wiki.mow.core.api.wiki.PageImpl;
import org.exoplatform.wiki.mow.core.api.wiki.WikiHome;
import org.exoplatform.wiki.rendering.macro.MacroUtils;
import org.exoplatform.wiki.service.WikiPageParams;
import org.exoplatform.wiki.service.WikiService;
import org.exoplatform.wiki.tree.JsonNodeData;
import org.exoplatform.wiki.tree.PageTreeNode;
import org.exoplatform.wiki.tree.SpaceTreeNode;
import org.exoplatform.wiki.tree.TreeNode;
import org.exoplatform.wiki.tree.TreeNodeType;
import org.exoplatform.wiki.tree.WikiHomeTreeNode;
import org.exoplatform.wiki.tree.WikiTreeNode;
import org.exoplatform.wiki.utils.Utils;
/**
* Created by The eXo Platform SAS
* Author : Lai Trung Hieu
* hieu.lai@exoplatform.com
* 7 Jan 2011
*/
public class TreeUtils {
public static TreeNode getDescendants(WikiPageParams params, HashMap<String, Object> context) throws Exception {
Object wikiObject = Utils.getObjectFromParams(params);
if (wikiObject instanceof WikiHome) {
WikiHome wikiHome = (WikiHome) wikiObject;
WikiHomeTreeNode wikiHomeNode = new WikiHomeTreeNode(wikiHome);
wikiHomeNode.pushDescendants(context);
return wikiHomeNode;
} else if (wikiObject instanceof Page) {
PageImpl page = (PageImpl) wikiObject;
PageTreeNode pageNode = new PageTreeNode(page);
pageNode.pushDescendants(context);
return pageNode;
} else if (wikiObject instanceof Wiki) {
Wiki wiki = (Wiki) wikiObject;
WikiTreeNode wikiNode = new WikiTreeNode(wiki);
wikiNode.pushDescendants(context);
return wikiNode;
} else if (wikiObject instanceof String) {
SpaceTreeNode spaceNode = new SpaceTreeNode((String) wikiObject);
spaceNode.pushDescendants(context);
return spaceNode;
}
return null;
}
public static List<JsonNodeData> tranformToJson(TreeNode treeNode, HashMap<String, Object> context) throws Exception {
WikiService wikiService = (WikiService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(WikiService.class);
List<JsonNodeData> children = new ArrayList<JsonNodeData>();
int counter = 1;
boolean isSelectable = true;
boolean isLastNode = false;
Boolean showExcerpt = false;
String excerpt = null;
PageImpl page = null;
PageImpl currentPage = null;
WikiPageParams currentPageParams = null;
String currentPath = null;
if (context != null) {
currentPath = (String) context.get(TreeNode.CURRENT_PATH);
showExcerpt = (Boolean) context.get(TreeNode.SHOW_EXCERPT);
}
currentPageParams = getPageParamsFromPath(currentPath);
for (TreeNode child : treeNode.getChildren()) {
isSelectable = true;
isLastNode = false;
if (counter >= treeNode.getChildren().size()) {
isLastNode = true;
}
// if (child.getNodeType().equals(TreeNodeType.WIKIHOME)) { isSelectable =
// true;}
if (child.getNodeType().equals(TreeNodeType.WIKI)) {
isSelectable = false;
} else if (currentPath != null && child.getNodeType().equals(TreeNodeType.PAGE)) {
page = ((PageTreeNode) child).getPage();
currentPage = (PageImpl) wikiService.getPageById(currentPageParams.getType(),
currentPageParams.getOwner(),
currentPageParams.getPageId());
if (currentPage != null
&& (currentPage.equals(page) || Utils.isDescendantPage(page, currentPage)))
isSelectable = false;
}
if (showExcerpt != null && showExcerpt) {
WikiPageParams params = getPageParamsFromPath(child.getPath());
excerpt = MacroUtils.getExcerpts(params);
}
children.add(new JsonNodeData(child, isLastNode, isSelectable, currentPath, excerpt, context));
counter++;
}
return children;
}
public static WikiPageParams getPageParamsFromPath(String path) throws Exception {
if (path == null) {
return null;
}
WikiPageParams result = new WikiPageParams();
path = path.trim();
if (path.indexOf("/") < 0) {
result.setType(path);
} else {
String[] array = path.split("/");
result.setType(array[0]);
if (array.length < 3) {
result.setOwner(array[1]);
} else if (array.length >= 3) {
if (array[0].equals(PortalConfig.GROUP_TYPE)) {
OrganizationService oService = (OrganizationService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(OrganizationService.class);
String groupId = path.substring(path.indexOf("/"));
if (oService.getGroupHandler().findGroupById(groupId) != null) {
result.setOwner(groupId);
} else {
result.setPageId(path.substring(path.lastIndexOf("/") + 1));
String owner = path.substring(path.indexOf("/"), path.lastIndexOf("/"));
while (oService.getGroupHandler().findGroupById(owner) == null) {
owner = owner.substring(0,owner.lastIndexOf("/"));
}
result.setOwner(owner);
}
} else {
// if (array[0].equals(PortalConfig.PORTAL_TYPE) || array[0].equals(PortalConfig.USER_TYPE))
result.setOwner(array[1]);
result.setPageId(array[array.length-1]);
}
}
}
return result;
}
public static String getPathFromPageParams(WikiPageParams param) {
StringBuilder sb = new StringBuilder();
if (param.getType() != null) {
sb.append(param.getType());
}
if (param.getOwner() != null) {
sb.append("/").append(Utils.validateWikiOwner(param.getType(), param.getOwner()));
}
if (param.getPageId() != null) {
sb.append("/").append(param.getPageId());
}
return sb.toString();
}
}