View Javadoc

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("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",
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 }