package com.aggrepoint.winlet.jsp.site.taglib; import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; import javax.servlet.jsp.tagext.TagSupport; import com.aggrepoint.winlet.AuthorizationEngine; import com.aggrepoint.winlet.ContextUtils; import com.aggrepoint.winlet.site.SiteContext; import com.aggrepoint.winlet.site.domain.Page; /** * * * @author Jiangming Yang (yangjm@gmail.com) */ /* * <site:tree level="0" name="page0"> <site:name page="page0"/> <site:url * page="page0"/> <site:tree from="page0" name="page1"> <site:name * page="page1"/> </site:tree> </site:tree> */ public class TreeTag extends BodyTagSupport { static final long serialVersionUID = 0; int m_iLevel; String m_strParent; String m_strName; Enumeration<Page> m_enum; Page m_page; Page m_pagePreFetch; String m_strGap; /** 是否第一个页面 */ boolean m_bFirst; public TreeTag() { m_iLevel = -1; m_strParent = null; m_strName = null; m_page = m_pagePreFetch = null; } public void setLevel(int level) { m_iLevel = level; } public void setFrom(String parent) { m_strParent = parent; } public void setName(String name) { m_strName = name; } public void setGap(String gap) { m_strGap = gap; } public Page getPage() { return m_page; } /** * 是否还有下一个页面 * * @return */ public boolean hasNext() { return m_enum.hasMoreElements(); } /** * 是否第一个页面 * * @return */ public boolean isFirst() { return m_bFirst; } Page nextElement() { if (m_enum.hasMoreElements()) m_page = m_enum.nextElement(); else m_page = null; return m_page; } public int doStartTag() throws JspException { try { SiteContext sc = (SiteContext) pageContext.getRequest() .getAttribute(SiteContext.SITE_CONTEXT_KEY); AuthorizationEngine ap = ContextUtils .getAuthorizationEngine((HttpServletRequest) pageContext .getRequest()); Page page = null; Page currentInTree = sc.getPage(); if (m_strParent != null) // 直接指定了要展现的根栏目 page = (Page) pageContext.getAttribute(m_strParent); else if (m_iLevel > -1) { // 指定了要展现的级别 if (m_iLevel <= currentInTree.getLevel()) { page = currentInTree; while (m_iLevel < page.getLevel()) page = page.getParent(); } } else { // 没有指定根栏目 TreeTag tt = (TreeTag) TagSupport.findAncestorWithClass(this, TreeTag.class); if (tt != null) page = tt.getPage(); else page = sc.getBranch().getHome(ap); } if (page == null) return SKIP_BODY; m_enum = Collections.enumeration(page.getPages(ap, false, true, false)); Object next = nextElement(); if (next == null) return SKIP_BODY; m_bFirst = true; if (m_strName != null) pageContext.setAttribute(m_strName, next); return EVAL_BODY_BUFFERED; } catch (Exception e) { e.printStackTrace(); 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; m_bFirst = false; try { if (m_strGap != null) body.write(m_strGap); } catch (IOException e) { throw new JspTagException(e.getMessage()); } if (m_strName != null) pageContext.setAttribute(m_strName, next); return EVAL_BODY_BUFFERED; } }