KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fr > improve > struts > taglib > layout > util > ParentFinder


1 package fr.improve.struts.taglib.layout.util;
2 import java.util.Stack JavaDoc;
3
4 import javax.servlet.ServletRequest JavaDoc;
5 import javax.servlet.jsp.PageContext JavaDoc;
6 import javax.servlet.jsp.tagext.Tag JavaDoc;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10
11 import fr.improve.struts.taglib.layout.LayoutTag;
12
13 /**
14  * API to use instead of findAncestorWithClass which only uses the pageContext,
15  * so get lost in case of dynamic includes.
16  */

17 public class ParentFinder {
18   public static final String JavaDoc TAGS_KEY = "fr.improve.struts.taglib.layout.util.ParentFinder";
19   private static Log LOG = LogFactory.getLog(ParentFinder.class);
20   
21   /**
22    * Find an tag being an instance of the specified class and an ancestor of the specified tag.
23    */

24   public static Tag JavaDoc findLayoutTag(LayoutTag tag, Class JavaDoc clazz) {
25     // Get the tag stack.
26
Stack JavaDoc lc_stack = getTagsStack(tag.getPageContext().getRequest());
27     Tag JavaDoc lc_result = null;
28     
29     // Get the index of the specified tag.
30
// The specified tag is usually the last item in the stack.
31
int i = lc_stack.lastIndexOf(tag) - 1;
32     
33     // Should not happen.
34
// The tag was not in the stack !
35
if (i==-2) {
36         LOG.error("The requested tag" + tag + " was not found in the following stack :\n "+ lc_stack);
37     }
38     
39     // Look for a tag
40
while (lc_result==null && i>=0) {
41       Tag JavaDoc lc_someTag = (Tag JavaDoc) lc_stack.get(i);
42       if (clazz.isInstance(lc_someTag)) {
43         lc_result = lc_someTag;
44       }
45       i--;
46     }
47     
48     return lc_result;
49   }
50   
51   public static final Tag JavaDoc getLastTag(PageContext JavaDoc in_context) {
52     // Get the tag stack.
53
Stack JavaDoc lc_stack = getTagsStack(in_context.getRequest());
54     
55     return (Tag JavaDoc) lc_stack.lastElement();
56   }
57   
58   public static void registerTag(PageContext JavaDoc context, Tag JavaDoc tag) {
59     LOG.debug("Registering tag " + tag);
60     Stack JavaDoc lc_stack = getTagsStack(context.getRequest());
61     lc_stack.push(tag);
62   }
63   
64   public static void deregisterTag(PageContext JavaDoc context) {
65     Stack JavaDoc lc_stack = getTagsStack(context.getRequest());
66     Object JavaDoc o = lc_stack.pop();
67     LOG.debug("Deregistering tag " + o);
68     
69   }
70   
71   private static Stack JavaDoc getTagsStack(ServletRequest JavaDoc request) {
72     Stack JavaDoc lc_stack = (Stack JavaDoc) request.getAttribute(TAGS_KEY);
73     if (lc_stack==null) {
74       lc_stack = new Stack JavaDoc();
75       request.setAttribute(TAGS_KEY, lc_stack);
76     }
77     return lc_stack;
78   }
79 }
80
Popular Tags