1 package com.sri.emo.controller;
2
3 import com.jcorporate.expresso.core.controller.ControllerException;
4 import com.jcorporate.expresso.core.controller.ExpressoRequest;
5 import com.jcorporate.expresso.core.controller.ExpressoResponse;
6 import com.jcorporate.expresso.core.controller.Output;
7 import com.jcorporate.expresso.core.db.DBException;
8 import com.jcorporate.expresso.core.registry.RequestRegistry;
9 import com.jcorporate.expresso.services.dbobj.Setup;
10 import com.sri.common.controller.StateHandler;
11 import com.sri.common.taglib.TreeNode;
12 import com.sri.emo.EmoSchema;
13 import com.sri.emo.dbobj.Node;
14
15
16 /***
17 * This is a state handler that renders the node into a javascript-based
18 * tree menu.
19 *
20 * @author Michael Rimov
21 */
22 public class ViewNodeAsTree implements StateHandler {
23
24 /***
25 * The node to render.
26 */
27 private final Node renderNode;
28
29 /***
30 * The attribute in the request where the tree view data structure is
31 * stored. This is picked up by the TreeMenuTag for actual rendering.
32 */
33 public static final String TREE_VIEW_ATTRIBUTE = "TreeView";
34
35 /***
36 * Parameter for expand all comand.
37 */
38 public static final String PARAM_EXPAND_ALL = "ExpandAll";
39
40 /***
41 * Parameter for collapse all command.
42 */
43 public static final String PARAM_COLLAPSE_ALL = "CollapseAll";
44
45 /***
46 * Constructor that takes the node to render as a parameter.
47 *
48 * @param nodeToRender Node the node to render, must not be null.
49 */
50 public ViewNodeAsTree(Node nodeToRender) {
51
52 assert nodeToRender != null;
53
54 renderNode = nodeToRender;
55 }
56
57 /***
58 * Called to handle the request.
59 *
60 * @param request ExpressoRequest The Function's ExpressoRequest
61 * object.
62 * @param response ExpressoResponse The Function's ExpressoResponse
63 * object.
64 * @throws DBException upon underlying database exception error.
65 * @throws ControllerException upon underlying ControllerException error.
66 */
67 public void handleRequest(ExpressoRequest request, ExpressoResponse response) throws DBException,
68 ControllerException {
69 try {
70 assert request != null;
71 assert response != null;
72
73 response.add(new Output(Node.NODE_TITLE, renderNode.getNodeTitle()));
74
75 //Build the factory to iterate the appropriate node to X-many levels
76 //deep as determined by the setup value.
77 TreeViewFactory factory = new TreeViewFactory(renderNode,
78 response,
79 Integer.parseInt(Setup.getValueRequired(RequestRegistry.getDataContext(),
80 EmoSchema.class.getName(),
81 EmoSchema.TREEVIEW_NESTING_LIMIT)));
82
83 //Build the tree
84 TreeNode treeNode = factory.buildTree();
85
86 //Expand the folders for visually appealing display.
87 if (request.getParameter(PARAM_EXPAND_ALL) != null) {
88 treeNode.expandAllFolders();
89 } else if (request.getParameter(PARAM_COLLAPSE_ALL) != null) {
90 treeNode.collapseAllFolders();
91 } else {
92 treeNode.setSelected(true);
93 }
94
95 //Save the tree to the request scope.
96 request.getSession().setAttribute(TREE_VIEW_ATTRIBUTE, treeNode);
97
98 // System.out.println("Rendered Model as TreeView in " + (System.currentTimeMillis() - startTime) + "ms.");
99
100 // handle tree
101 // ********** Old Way of Displaying Tree **************
102 // HashMap allNodeHash = new HashMap();
103 // renderNode.setAttribute(Node.INDENT, new Integer(1)); // root node starts at level 1; used for formatting output
104 //
105 // String omitTypes = Setup.getValueUnrequired(request.getDataContext()
106 // , NodeAction.OMIT_TYPES);
107 // if (omitTypes != null) {
108 // String[] omissions = omitTypes.split("//" + NodeAction.DELIMIT);
109 // HashMap omitMap = new HashMap(omissions.length);
110 // for (int i = 0; i < omissions.length; i++) {
111 // String omission = omissions[i];
112 // omitMap.put(omission, omission);
113 // }
114 // renderNode.getNodesInTree(request, allNodeHash, omitMap);
115 //
116 // } else {
117 // renderNode.getNodesInTree(request, allNodeHash);
118 // }
119 // List list = new ArrayList(allNodeHash.values());
120 // Collections.sort(list, new IndentComparator());
121 //
122 // Block block = new Block(NodeAction.ROW_BLOCK);
123 // response.add(block);
124 // for (Iterator iterator = list.iterator(); iterator.hasNext();) {
125 // Node anode = (Node) iterator.next();
126 // String blkname = "";
127 // Integer indent = (Integer) anode.getAttribute(Node.INDENT);
128 //
129 // if (indent != null) {
130 // blkname = StringUtil.repeatString(" ",
131 // indent.intValue());
132 // }
133 // Block rowblk = new Block(blkname);
134 // block.add(rowblk);
135
136 // this related item is in the main set to be deleted--it 'wraps around'--ok to delete
137 // Transition trans = AddNodeAction.getViewTrans(anode.getNodeId());
138 // trans.setLabel(anode.getNodeTitle());
139 // rowblk.add(trans);
140 // rowblk.add(new Output(Node.NODE_TYPE,
141 // anode.getEntity().getDisplayName()));
142 // }
143 } catch (Exception dbe) {
144 throw new ControllerException(dbe);
145 }
146
147 }
148 }