package org.jboss.seam.core; import static org.jboss.seam.ScopeType.PAGE; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.ListIterator; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.web.Session; /** * Factory for the "breadcrumbs", a stack with all * parent conversations of the current conversation. * * @author Gavin King */ @Scope(ScopeType.STATELESS) @Name("org.jboss.seam.core.conversationStackFactory") @Install(precedence=BUILT_IN) @BypassInterceptors public class ConversationStack { protected List<ConversationEntry> createConversationEntryStack() { ConversationEntries conversationEntries = ConversationEntries.getInstance(); if (conversationEntries==null) { return Collections.EMPTY_LIST; } else { ConversationEntry currentConversationEntry = Manager.instance().getCurrentConversationEntry(); if (currentConversationEntry==null) { return Collections.EMPTY_LIST; } else { List<String> idStack = currentConversationEntry.getConversationIdStack(); List<ConversationEntry> conversationEntryStack = new ArrayList<ConversationEntry>( conversationEntries.size() ); ListIterator<String> ids = idStack.listIterator( idStack.size() ); while ( ids.hasPrevious() ) { ConversationEntry entry = conversationEntries.getConversationEntry( ids.previous() ); if ( entry.isDisplayable() && !Session.instance().isInvalid() ) { conversationEntryStack.add(entry); } } return conversationEntryStack; } } } @Factory(value="org.jboss.seam.core.conversationStack", autoCreate=true, scope=PAGE) public List<ConversationEntry> getConversationEntryStack() { return createConversationEntryStack(); } }