/*
* Created on Dec 22, 2004
*/
package com.openedit.webui.tree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.openedit.OpenEditException;
import com.openedit.WebPageRequest;
import com.openedit.modules.BaseModule;
import com.openedit.page.Page;
import com.openedit.page.manage.PageManager;
import com.openedit.users.User;
import com.openedit.util.strainer.AndFilter;
import com.openedit.util.strainer.Filter;
import com.openedit.util.strainer.NotFilter;
import com.openedit.util.strainer.PathMatchesFilter;
/**
* @author Matthew Avery, mavery@einnovation.com
*/
public class TreeModule extends BaseModule
{
private static final Log log = LogFactory.getLog(TreeModule.class);
public static final String PARAMETER_KEY = "treeName";
protected PageManager fieldPageManager;
protected String fieldTreeName;
public void toggleTreeNode(WebPageRequest inRequest) throws OpenEditException
{
WebTree tree = (WebTree) getTree(inRequest);
Object childNode = findNode(inRequest, tree);
if (childNode != null)
{
if (tree.getTreeRenderer().hasBeenExpanded(childNode))
{
tree.getTreeRenderer().collapseNode(childNode);
}
else
{
tree.getTreeRenderer().expandNode(childNode);
}
}
}
public void setCutOffNode(WebPageRequest inRequest) throws OpenEditException
{
WebTree tree = (WebTree) getTree(inRequest);
if (tree != null)
{
Object childNode = findNode(inRequest, tree);
tree.getTreeRenderer().setLastCutoffNode(childNode);
}
}
public void expandTreeNode(WebPageRequest inRequest) throws OpenEditException
{
WebTree tree = (WebTree) getTree(inRequest);
if (tree != null)
{
Object childNode = findNode(inRequest, tree);
if (childNode == null)
{
log.error("Must specify nodeID or nodePath for expansion");
return;
}
tree.getTreeRenderer().expandNode(childNode);
}
}
public void collapseTreeNode(WebPageRequest inRequest) throws OpenEditException
{
WebTree tree = getTree(inRequest);
if (tree == null)
{
return;
}
Object childNode = findNode(inRequest, tree);
// log.info("Collapse" + inRequest.getPathUrl() + " " + childNode);
if (childNode == null)
{
log.error("Most specify nodeID or nodePath for expansion");
return;
}
// WebTree tree = PageTree.getPageTree( getSiteContext() );
tree.getTreeRenderer().collapseNode(childNode);
}
protected Object findNode(WebPageRequest inRequest, WebTree tree)
{
String id = inRequest.getRequestParameter("nodeID");
if (id != null)
{
Object childNode = tree.getModel().getChildById(id);
if (childNode != null)
{
return childNode;
}
}
// This assumes that we're using DefaultWebTreeNodes.
String path = inRequest.getRequestParameter("nodePath");
if (path != null)
{
Object childNode = getNode((DefaultWebTreeNode) tree.getModel().getRoot(), path.split("/"));
return childNode;
}
return null;
}
public void reloadTree(WebPageRequest inRequest) throws OpenEditException
{
WebTree webTree = getTree(inRequest);
if( webTree != null)
{
inRequest.removeSessionValue(webTree.getId());
//inRequest.redirect(inRequest.getPath());
}
getTree(inRequest);
}
/**
* This method initializes the WebTree from the action config.
*
* @param inRequest
* @throws OpenEditException
*/
public WebTree getTree( WebPageRequest inRequest ) throws OpenEditException
{
String treeid = inRequest.getRequestParameter("treeid");
String name = null;
if( inRequest.getCurrentAction() != null)
{
name = inRequest.getCurrentAction().getChildValue("tree-name");
}
if( name == null)
{
name = inRequest.findValue("tree-name");
}
// The root is applicable to our model only
String root = inRequest.findValue("root");
if ((root == null) || root.equals("/"))
{
root = "/";
}
if( name == null)
{
name = inRequest.findValue("WebTreeName"); // legacy
}
if( treeid == null)
{
treeid = name + "_" + inRequest.getUserName() + root;
}
WebTree webTree = (WebTree) inRequest.getSessionValue(treeid);
if ( (webTree == null && name != null) || !treeid.equals( webTree.getId() ) ) //might have been serialized
{
RepositoryTreeModel model = null;
model = new RepositoryTreeModel(getPageManager().getRepository(), root );
getPageManager().addPageAccessListener(model);
AndFilter and = new AndFilter();
String ignore = inRequest.findValue("excludes");
if (ignore != null)
{
String[] types = ignore.split(",");
Filter[] not = new Filter[types.length];
for (int i = 0; i < types.length; i++)
{
not[i] = new NotFilter( new PathMatchesFilter(types[i].trim() ) );
}
and.setFilters(not);
}
User user = inRequest.getUser();
if( user != null && user.hasPermission("oe.filemanager.editall") )
{
}
else
{
//Look for hidden paths at the top level tree
populateRestrictedPaths(and, inRequest);
}
model.setPageManager(getPageManager());
model.setFilter(and);
webTree = new WebTree(model);
webTree.setName(name);
webTree.setId(treeid);
// setup the renderer
WebTreeNodeTreeRenderer renderero = new WebTreeNodeTreeRenderer(webTree);
String renderleaves = inRequest.findValue("renderleaves");
if( renderleaves != null )
{
renderero.setRenderLeaves(Boolean.parseBoolean(renderleaves));
}
String prefix = inRequest.findValue( "url-prefix" );
if (prefix != null)
{
renderero.setUrlPrefix(prefix);
}
String friendly = inRequest.findValue( "friendlyNames" );
if (friendly != null)
{
renderero.setFriendlyNames(Boolean.valueOf(friendly).booleanValue());
}
String home = (String) inRequest.getPageValue( "home" );
renderero.setHome(home);
String iconhome = (String) inRequest.findValue( "iconhome" );
renderero.setIconHome(iconhome);
String iconwidth = (String) inRequest.getPageProperty( "iconwidth" ); //must be saved to page path
if( iconwidth != null)
{
renderero.setIconWidth(Integer.parseInt(iconwidth));
}
webTree.setTreeRenderer(renderero);
inRequest.putSessionValue(treeid, webTree);
}
if( webTree != null)
{
inRequest.putPageValue("pageManager",getPageManager());
inRequest.putPageValue(name , webTree);
}
return webTree;
}
private void populateRestrictedPaths(AndFilter inAnd, WebPageRequest inRequest) throws OpenEditException
{
List not = new ArrayList();
if( inAnd.getFilters() != null )
{
not.addAll(Arrays.asList(inAnd.getFilters()));
}
PagePathViewFilter pathfilter = new PagePathViewFilter();
pathfilter.setPageManager(getPageManager());
pathfilter.setLoadingWebPageRequest(inRequest);
not.add(pathfilter);
inAnd.setFilters((Filter[])not.toArray(new Filter[not.size()]));
}
/*
* Uses a string path name
*/
protected DefaultWebTreeNode getNode(DefaultWebTreeNode inRoot, String[] inPath)
{
DefaultWebTreeNode currentPath = inRoot;
for (int i = 0; i < inPath.length; i++)
{
List children = currentPath.getChildren();
for (int j = 0; j < children.size(); j++)
{
DefaultWebTreeNode child = (DefaultWebTreeNode) children.get(j);
if (inPath[i].equals(child.getName()))
{
currentPath = child;
}
}
}
return currentPath;
}
public PageManager getPageManager()
{
return fieldPageManager;
}
public void setPageManager(PageManager pageManager)
{
fieldPageManager = pageManager;
}
public void selectNodeByPath(WebPageRequest inReq)
{
String path = inReq.getRequestParameter("path");
if (path != null)
{
WebTree tree = getTree(inReq);
Object node = tree.selectNodeByUrl(path);
if (node == null && path.endsWith("/") && "true".equals(inReq.findValue("createfolders")))
{
Page page = getPageManager().getPage(path);
getPageManager().getRepository().put(page.getContentItem());
reloadTree(inReq);
tree = getTree(inReq);
node = tree.selectNodeByUrl(path);
}
if (node != null)
{
String id = tree.getModel().getId(node);
inReq.setRequestParameter("tabid", id);
inReq.setRequestParameter("tabpath", path);
// inReq.setRequestParameter("tabname", tree.get);
}
}
}
}