001: /*
002: * Created on Dec 22, 2004
003: */
004: package com.openedit.webui.tree;
005:
006: import java.util.ArrayList;
007: import java.util.Arrays;
008: import java.util.Iterator;
009: import java.util.List;
010:
011: import org.apache.commons.logging.Log;
012: import org.apache.commons.logging.LogFactory;
013:
014: import com.openedit.OpenEditException;
015: import com.openedit.WebPageRequest;
016: import com.openedit.modules.BaseModule;
017: import com.openedit.page.Page;
018: import com.openedit.page.manage.PageManager;
019: import com.openedit.users.User;
020: import com.openedit.util.strainer.AndFilter;
021: import com.openedit.util.strainer.Filter;
022: import com.openedit.util.strainer.NotFilter;
023: import com.openedit.util.strainer.PathMatchesFilter;
024:
025: /**
026: * @author Matthew Avery, mavery@einnovation.com
027: */
028: public class TreeModule extends BaseModule {
029: private static final Log log = LogFactory.getLog(TreeModule.class);
030: public static final String PARAMETER_KEY = "treeName";
031: protected PageManager fieldPageManager;
032: protected String fieldTreeName;
033:
034: public void toggleTreeNode(WebPageRequest inRequest)
035: throws OpenEditException {
036: WebTree tree = (WebTree) getTree(inRequest);
037: Object childNode = findNode(inRequest, tree);
038: if (childNode != null) {
039: if (tree.getTreeRenderer().hasBeenExpanded(childNode)) {
040: tree.getTreeRenderer().collapseNode(childNode);
041: } else {
042: tree.getTreeRenderer().expandNode(childNode);
043: }
044: }
045: }
046:
047: public void expandTreeNode(WebPageRequest inRequest)
048: throws OpenEditException {
049: WebTree tree = (WebTree) getTree(inRequest);
050: if (tree != null) {
051: Object childNode = findNode(inRequest, tree);
052:
053: if (childNode == null) {
054: log
055: .error("Must specify nodeID or nodePath for expansion");
056: return;
057: }
058:
059: tree.getTreeRenderer().expandNode(childNode);
060: }
061: }
062:
063: public void collapseTreeNode(WebPageRequest inRequest)
064: throws OpenEditException {
065: WebTree tree = getTree(inRequest);
066: if (tree == null) {
067: return;
068: }
069: Object childNode = findNode(inRequest, tree);
070: // log.info("Collapse" + inRequest.getPathUrl() + " " + childNode);
071:
072: if (childNode == null) {
073: log.error("Most specify nodeID or nodePath for expansion");
074: return;
075: }
076:
077: // WebTree tree = PageTree.getPageTree( getSiteContext() );
078: tree.getTreeRenderer().collapseNode(childNode);
079: }
080:
081: protected Object findNode(WebPageRequest inRequest, WebTree tree) {
082: String id = inRequest.getRequestParameter("nodeID");
083: if (id != null) {
084: Object childNode = tree.getModel().getChildById(id);
085: if (childNode != null) {
086: return childNode;
087: }
088: }
089:
090: // This assumes that we're using DefaultWebTreeNodes.
091: String path = inRequest.getRequestParameter("nodePath");
092: if (path != null) {
093: Object childNode = getNode((DefaultWebTreeNode) tree
094: .getModel().getRoot(), path.split("/"));
095: return childNode;
096: }
097: return null;
098: }
099:
100: public void reloadTree(WebPageRequest inRequest)
101: throws OpenEditException {
102: WebTree webTree = getTree(inRequest);
103: if (webTree != null) {
104: inRequest.removeSessionValue(webTree.getId());
105: inRequest.redirect(inRequest.getPath());
106: }
107: }
108:
109: /**
110: * This method initializes the WebTree from the action config.
111: *
112: * @param inRequest
113: * @throws OpenEditException
114: */
115: public WebTree getTree(WebPageRequest inRequest)
116: throws OpenEditException {
117: String treeid = inRequest.getRequestParameter("treeid");
118: String name = findValue("tree-name", inRequest);
119: if (name == null) {
120: name = findValue("WebTreeName", inRequest); // legacy
121: }
122: if (treeid == null) {
123: treeid = name + "_" + inRequest.getUserName();
124: }
125: WebTree webTree = (WebTree) inRequest.getSessionValue(treeid);
126:
127: if (webTree == null && name != null) {
128: // The root is applicable to our model only
129: String root = findValue("root", inRequest);
130:
131: RepositoryTreeModel model = null;
132:
133: if ((root == null) || root.equals("/")) {
134: root = "/";
135: }
136: model = new RepositoryTreeModel(getPageManager()
137: .getRepository(), root);
138: getPageManager().addPageAccessListener(model);
139:
140: AndFilter and = new AndFilter();
141:
142: String ignore = (String) findValue("excludes", inRequest);
143: if (ignore != null) {
144: String[] types = ignore.split(",");
145: Filter[] not = new Filter[types.length];
146: for (int i = 0; i < types.length; i++) {
147: not[i] = new NotFilter(new PathMatchesFilter(
148: types[i].trim()));
149: }
150: and.setFilters(not);
151: }
152: User user = inRequest.getUser();
153: if (user != null
154: && user.hasPermission("oe.filemanager.editall")) {
155:
156: } else {
157: //Look for hidden paths at the top level tree
158: populateRestrictedPaths(and, inRequest, root);
159: }
160: model.setPageManager(getPageManager());
161: model.setFilter(and);
162: webTree = new WebTree(model);
163: webTree.setName(name);
164: webTree.setId(treeid);
165: // setup the renderer
166: WebTreeNodeTreeRenderer renderero = new WebTreeNodeTreeRenderer(
167: webTree);
168: String prefix = findValue("url-prefix", inRequest);
169: if (prefix != null) {
170: renderero.setUrlPrefix(prefix);
171: }
172: String friendly = findValue("friendlyNames", inRequest);
173: if (friendly != null) {
174: renderero.setFriendlyNames(Boolean.valueOf(friendly)
175: .booleanValue());
176: }
177: String home = (String) inRequest.getPageValue("home");
178: renderero.setHome(home);
179:
180: webTree.setTreeRenderer(renderero);
181:
182: inRequest.putSessionValue(treeid, webTree);
183: }
184: if (webTree != null) {
185: inRequest.putPageValue("pageManager", getPageManager());
186: inRequest.putPageValue(name, webTree);
187: }
188: return webTree;
189: }
190:
191: private void populateRestrictedPaths(AndFilter inAnd,
192: WebPageRequest inRequest, String inRoot)
193: throws OpenEditException {
194: List not = new ArrayList();
195:
196: if (inAnd.getFilters() != null) {
197: not.addAll(Arrays.asList(inAnd.getFilters()));
198: }
199: PagePathViewFilter pathfilter = new PagePathViewFilter();
200: pathfilter.setPageManager(getPageManager());
201: pathfilter.setLoadingWebPageRequest(inRequest);
202: not.add(pathfilter);
203: inAnd
204: .setFilters((Filter[]) not.toArray(new Filter[not
205: .size()]));
206: }
207:
208: /*
209: * Uses a string path name
210: */
211: protected DefaultWebTreeNode getNode(DefaultWebTreeNode inRoot,
212: String[] inPath) {
213: DefaultWebTreeNode currentPath = inRoot;
214:
215: for (int i = 0; i < inPath.length; i++) {
216: List children = currentPath.getChildren();
217:
218: for (int j = 0; j < children.size(); j++) {
219: DefaultWebTreeNode child = (DefaultWebTreeNode) children
220: .get(j);
221:
222: if (inPath[i].equals(child.getName())) {
223: currentPath = child;
224: }
225: }
226: }
227:
228: return currentPath;
229: }
230:
231: public PageManager getPageManager() {
232: return fieldPageManager;
233: }
234:
235: public void setPageManager(PageManager pageManager) {
236: fieldPageManager = pageManager;
237: }
238: }
|