package com.aggrepoint.winlet.jsp.site.taglib; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; import com.aggrepoint.winlet.site.SiteContext; import com.aggrepoint.winlet.site.domain.Page; /** * * * @author Jiangming Yang (yangjm@gmail.com) */ /* * <ae:path level="0" name="page" gap="  "><a href="<ae:url * page="page"/>"><ae:name page="page"/></a></ae:path> */ public class PathTag extends BodyTagSupport { static final long serialVersionUID = 0; int m_iLevel; String m_strName; String m_strGap; Enumeration<Page> m_enum; Page m_page; public PathTag() { m_iLevel = 0; m_page = null; m_strName = null; } public void setLevel(int level) { if (level >= 0) m_iLevel = level; } public void setName(String name) { m_strName = name; } public void setGap(String gap) { m_strGap = gap; } public Page getPage() { return m_page; } Object nextElement() { while (m_enum.hasMoreElements()) { m_page = m_enum.nextElement(); return m_page; } m_page = null; return null; } public int doStartTag() throws JspException { try { SiteContext sc = (SiteContext) pageContext.getRequest() .getAttribute(SiteContext.SITE_CONTEXT_KEY); Page currentInTree = sc.getPage(); Vector<Page> vecPages = new Vector<Page>(); if (currentInTree != null) { vecPages.add(currentInTree); while (currentInTree.getParent() != null && currentInTree.getParent() != currentInTree) { currentInTree = currentInTree.getParent(); vecPages.add(currentInTree); } } // 将vecPages的顺序调转过来 Vector<Page> vec = new Vector<Page>(); for (int i = vecPages.size() - 1 - m_iLevel; i >= 0; i--) vec.add(vecPages.elementAt(i)); m_enum = vec.elements(); Object next = nextElement(); if (next == null) return SKIP_BODY; if (m_strName != null) pageContext.setAttribute(m_strName, next); return EVAL_BODY_BUFFERED; } catch (Exception e) { throw new JspException(e.getMessage()); } } public int doAfterBody() throws JspTagException { BodyContent body = getBodyContent(); try { body.writeOut(getPreviousOut()); } catch (IOException e) { throw new JspTagException(e.getMessage()); } body.clearBody(); Object next = nextElement(); if (next == null) return SKIP_BODY; try { getPreviousOut().write(m_strGap); } catch (IOException e) { throw new JspTagException(e.getMessage()); } if (m_strName != null) pageContext.setAttribute(m_strName, next); return EVAL_BODY_BUFFERED; } }