1 18 package org.apache.beehive.netui.tags.tree; 19 20 import org.apache.beehive.netui.util.internal.InternalStringBuilder; 21 22 import org.apache.beehive.netui.pageflow.interceptor.InterceptorChain; 23 import org.apache.beehive.netui.pageflow.interceptor.InterceptorException; 24 import org.apache.beehive.netui.pageflow.interceptor.request.RequestInterceptor; 25 import org.apache.beehive.netui.pageflow.interceptor.request.RequestInterceptorContext; 26 import org.apache.beehive.netui.pageflow.requeststate.INameable; 27 import org.apache.beehive.netui.pageflow.requeststate.NameService; 28 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender; 29 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender; 30 import org.apache.beehive.netui.util.logging.Logger; 31 32 import javax.servlet.ServletContext ; 33 import javax.servlet.ServletResponse ; 34 import javax.servlet.http.HttpServletRequest ; 35 import javax.servlet.http.HttpServletResponse ; 36 import javax.servlet.jsp.JspException ; 37 import java.io.IOException ; 38 import java.io.Writer ; 39 40 public class TreeCRI extends RequestInterceptor 41 { 42 private static final String TREE_COLLAPSE = "treeCollapse"; 43 private static final String TREE_EXPAND = "treeExpand"; 44 45 private static final Logger logger = Logger.getInstance(TreeCRI.class); 46 47 private static final String TREE_EXPAND_ELEM = "treeExpand"; 49 50 public void preRequest(RequestInterceptorContext ctxt, InterceptorChain chain) throws InterceptorException 51 { 52 HttpServletRequest request = ctxt.getRequest(); 53 54 String cmd = request.getRequestURI(); 56 57 try { 59 int dot = cmd.lastIndexOf('.'); 60 int slash = cmd.lastIndexOf('/'); 61 if (slash != -1 && slash != -1) { 62 cmd = cmd.substring(slash + 1, dot); 63 } 64 } 65 catch (RuntimeException e) { 66 System.err.println("Runtime Error creating XmlRequestServlet Command:" + e.getClass().getName()); 67 } 68 69 if (TREE_COLLAPSE.equals(cmd)) { 71 handleExpandCollapse(false, request, ctxt.getResponse(), ctxt.getServletContext()); 72 } 73 else if (TREE_EXPAND.equals(cmd)) { 74 handleExpandCollapse(true, request, ctxt.getResponse(), ctxt.getServletContext()); 75 } 76 77 chain.continueChain(); 78 } 79 80 public void postRequest(RequestInterceptorContext context, InterceptorChain chain) throws InterceptorException 81 { 82 chain.continueChain(); 83 } 84 85 private void handleExpandCollapse(boolean expand, HttpServletRequest req, ServletResponse response, 86 ServletContext ctxt) 87 { 88 String tree = req.getParameter("tree"); 89 String node = req.getParameter("node"); 90 String expandSvr = req.getParameter("expandOnServer"); 91 94 NameService ns = NameService.instance(req.getSession()); 95 assert(ns != null); 96 97 INameable n = ns.get(tree); 99 if (n == null) { 100 logger.error("Tree '" + tree + "' was not found in the NameService"); 101 return; 102 } 103 if (!(n instanceof ITreeRootElement)) { 104 logger.error("Named Tree was not an instance of a ITreeRootElement"); 105 return; 106 } 107 108 ITreeRootElement root = (ITreeRootElement) n; 109 TreeElement elem = ((TreeElement) root).findNode(node); 110 if (elem == null) { 111 System.err.println("Element '" + node + "' not found in the tree"); 112 return; 113 } 114 elem.onExpand(req, response); 115 elem.setExpanded(expand); 116 117 if (expandSvr != null) { 118 InternalStringBuilder sb = new InternalStringBuilder(1024); 119 StringBuilderRenderAppender writer = new StringBuilderRenderAppender(sb); 120 writeStartElement(writer, TREE_EXPAND_ELEM); 122 123 writeElement(writer, "node", node); 125 writeElement(writer, "treeId", tree); 126 127 try { 128 TreeElement children[] = elem.getChildren(); 129 AttributeRenderer extraAttrs = new AttributeRenderer(); 130 int newLevel = elem.getLevel() + 1; 131 InternalStringBuilder treeRendering = new InternalStringBuilder(); 132 TreeElement tmp = elem; 133 InheritableState iState = null; 134 while (iState == null && tmp != null) { 135 iState = tmp.getInheritableState(); 136 tmp = tmp.getParent(); 137 } 138 if (iState == null) { 139 System.err.println("Unable to find InheritableState"); 140 iState = root.getInheritableState(); 141 } 142 143 ServletTreeRenderer str = new ServletTreeRenderer(root.getTreeRenderState(), req, 144 (HttpServletResponse ) response, ctxt, writer, treeRendering); 145 for (int i = 0; i < children.length; i++) { 146 treeRendering.setLength(0); 147 str.render(treeRendering, children[i], newLevel, extraAttrs, iState); 148 } 149 } 150 catch (JspException se) { 151 se.printStackTrace(); 152 logger.error("Received a JSP excpetion Rendering the Tree", se); 153 return; 154 } 155 catch (RuntimeException re) { 156 logger.error("Received a JSP excpetion Rendering the Tree", re); 158 return; 159 } 160 161 writeEndElement(writer, TREE_EXPAND_ELEM); 163 write(response, sb.toString()); 164 } 165 } 166 167 public static void writeStartElement(AbstractRenderAppender writer, String elementName) 168 { 169 writer.append("<"); 170 writer.append(elementName); 171 writer.append(">"); 172 173 } 174 175 public static void writeEndElement(AbstractRenderAppender writer, String elementName) 176 { 177 writer.append("</"); 178 writer.append(elementName); 179 writer.append(">"); 180 } 181 182 public static void writeElement(AbstractRenderAppender writer, String elementName, String value) 183 { 184 writeStartElement(writer, elementName); 185 writer.append(value); 186 writeEndElement(writer, elementName); 187 188 } 189 190 private void write(ServletResponse response, String string) 191 { 192 try { 193 Writer writer = response.getWriter(); 194 writer.write(string); 195 } 196 catch (IOException e) { 197 } 198 } 199 } 200 | Popular Tags |