1 package net.sf.uitags.tag; 2 3 import java.io.IOException ; 4 import java.util.LinkedList ; 5 import java.util.List ; 6 import java.util.ListIterator ; 7 8 import javax.servlet.jsp.JspException ; 9 import javax.servlet.jsp.PageContext ; 10 import javax.servlet.jsp.tagext.BodyTagSupport ; 11 12 import net.sf.uitags.tagutil.validation.DeferredValidationException; 13 14 19 public abstract class AbstractUiTag extends BodyTagSupport { 20 private static final String PARENT_LIST_KEY = 21 AbstractUiTag.class.getName() + "parentList"; 22 23 private List visibleParentList; 24 25 public void setPageContext(PageContext pageContext) { 26 super.setPageContext(pageContext); 27 28 this.visibleParentList = (List ) this.pageContext.getAttribute( 29 PARENT_LIST_KEY, PageContext.REQUEST_SCOPE); 30 if (this.visibleParentList == null) { 31 this.visibleParentList = new LinkedList (); 32 this.pageContext.setAttribute(PARENT_LIST_KEY, 33 this.visibleParentList, PageContext.REQUEST_SCOPE); 34 } 35 } 36 37 42 public String getTagName() { 43 return resolveTagNameForClass(this.getClass()); 44 } 45 46 56 private String resolveTagNameForClass(Class tagClass) { 57 String className = getUnqualifiedClassName(tagClass); 58 if (className.endsWith("Tag")) { 59 String firstCharInLowerCase = className.substring(0, 1).toLowerCase(); 60 return firstCharInLowerCase + omitFirstCharAndLastThreeChars(className); 61 } 62 63 return className; 64 } 65 66 private String getUnqualifiedClassName(Class tagClass) { 67 String qualifiedClassName = tagClass.getName(); 68 int cutOffPosition = qualifiedClassName.lastIndexOf('.'); 69 return qualifiedClassName.substring(cutOffPosition + 1); 70 } 71 72 private String omitFirstCharAndLastThreeChars(String target) { 73 return target.substring(1, target.length() - 3); 74 } 75 76 96 protected final void makeVisibleToChildren() { 97 this.visibleParentList.add(this); 98 } 99 100 103 protected final void makeInvisibleFromChildren() { 104 this.visibleParentList.remove(this); 105 } 106 107 114 protected final AbstractUiTag findParent(Class tagClass) { 115 int lastIndex = this.visibleParentList.size(); 118 for (ListIterator iter = this.visibleParentList.listIterator(lastIndex); 119 iter.hasPrevious(); ) { 120 Object potentialParent = iter.previous(); 121 if (tagClass.isInstance(potentialParent)) { 122 return (AbstractUiTag) potentialParent; 123 } 124 } 125 126 throw new DeferredValidationException("The parent tag '" + 127 resolveTagNameForClass(tagClass) + "' cannot be found."); 128 } 129 130 137 protected final void println(Object toPrint) throws JspException { 138 try { 139 this.pageContext.getOut().println(toPrint); 140 } 141 catch (IOException e) { 142 throw new JspException (e); 143 } 144 } 145 } 146 | Popular Tags |