/* * Created on 04/11/2006 10:29:00 */ package net.jforum.wiki.tags; import java.io.IOException; import java.io.Serializable; import java.util.Iterator; import java.util.LinkedList; import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspWriter; import com.ecyrd.jspwiki.WikiContext; import com.ecyrd.jspwiki.WikiEngine; import com.ecyrd.jspwiki.tags.WikiTagBase; /** * Implement a "breadcrumb" (most recently visited) trail. * This is a slightly changed version of the BreadcrumbsTag of JSPWiki. * * @author Ken Liu ken@kenliu.net * @version $Id: TrailTag.java,v 1.3 2006/11/15 15:46:26 rafaelsteil Exp $ */ public class TrailTag extends WikiTagBase { private static final String BREADCRUMBTRAIL_KEY = "__Trail"; private int maxPages = 11; private String trailSeparator = " | "; // set to "visit" to show pages that were visited private String trailType = "breadcrumb"; /** * @see com.ecyrd.jspwiki.tags.WikiTagBase#doWikiStartTag() */ public final int doWikiStartTag() throws IOException { HttpSession session = pageContext.getSession(); FixedQueue trail = (FixedQueue) session.getAttribute(BREADCRUMBTRAIL_KEY); String page = m_wikiContext.getPage().getName(); if (trail == null) { trail = new FixedQueue(maxPages); } if (m_wikiContext.getRequestContext().equals(WikiContext.VIEW)) { if (trail.isEmpty()) { trail.push(page); } else { // Don't add the page to the queue if the page was just refreshed if (!((String) trail.getLast()).equals(page)) { if (trailType.equalsIgnoreCase("visit")) { if (!trail.contains(page)) { trail.push(page); } } else { trail.push(page); } } } } session.setAttribute(BREADCRUMBTRAIL_KEY, trail); // our trail JspWriter out = pageContext.getOut(); int queueSize = trail.size(); String linkClass = "wikipage"; WikiEngine engine = m_wikiContext.getEngine(); int i = 0; for (Iterator iter = trail.iterator(); iter.hasNext(); i++) { String currentPage = (String)iter.next(); StringBuffer sb = new StringBuffer(128) .append("<a class='") .append(linkClass) .append("' href='") .append(engine.getViewURL(currentPage)) .append("'>"); if (currentPage == page) { sb.append("<b>").append(currentPage).append("</b>"); } else { sb.append(currentPage); } sb.append("</a>"); out.print(sb.toString()); if (i + 1 < queueSize) { out.print(trailSeparator); } } return SKIP_BODY; } public int getMaxpages() { return maxPages; } public void setMaxpages(int maxpages) { maxPages = maxpages + 1; } public String getSeparator() { return trailSeparator; } public void setSeparator(String separator) { trailSeparator = separator; } public String getTrailType() { return trailType; } public void setTrailType(String type) { trailType = type; } /** * Extends the LinkedList class to provide a fixed-size queue implementation */ private class FixedQueue extends LinkedList implements Serializable { private int size; FixedQueue(int size) { this.size = size; } Object push(Object o) { add(o); return this.size() > this.size ? this.removeFirst() : null; } } }