package org.jboss.seam.core;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
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.contexts.Contexts;
/**
* Manages a map of conversation id to ConversationEntry
* in the session context.
*
* @author Gavin King
*/
@Name("org.jboss.seam.core.conversationEntries")
@Install(precedence=BUILT_IN)
@Scope(ScopeType.SESSION)
@BypassInterceptors
public class ConversationEntries extends AbstractMutable implements Serializable
{
private static final long serialVersionUID = 7996835952419813634L;
private Map<String, ConversationEntry> conversationIdEntryMap = new HashMap<String, ConversationEntry>();
public synchronized Collection<ConversationEntry> getConversationEntries()
{
return Collections.unmodifiableCollection( conversationIdEntryMap.values() );
}
public synchronized int size()
{
return conversationIdEntryMap.size();
}
public synchronized Set<String> getConversationIds()
{
return Collections.unmodifiableSet( conversationIdEntryMap.keySet() );
}
public synchronized ConversationEntry createConversationEntry(String id, List<String> stack)
{
ConversationEntry entry = new ConversationEntry(id, stack, this);
conversationIdEntryMap.put(id, entry);
setDirty();
return entry;
}
public synchronized ConversationEntry getConversationEntry(String id)
{
return conversationIdEntryMap.get(id);
}
public synchronized ConversationEntry removeConversationEntry(String id)
{
ConversationEntry entry = conversationIdEntryMap.remove(id);
if ( entry!=null ) setDirty();
return entry;
}
public synchronized ConversationEntry updateConversationId(String oldId, String newId)
{
ConversationEntry entry = conversationIdEntryMap.remove(oldId);
if (entry==null)
{
return null;
}
else
{
entry.setId(newId);
entry.getConversationIdStack().set(0, newId);
conversationIdEntryMap.put(newId, entry);
setDirty();
return entry;
}
}
public static ConversationEntries instance()
{
if ( !Contexts.isSessionContextActive() )
{
throw new IllegalStateException("No session context active");
}
return (ConversationEntries) Component.getInstance(ConversationEntries.class, ScopeType.SESSION);
}
public static ConversationEntries getInstance()
{
if ( !Contexts.isSessionContextActive() )
{
throw new IllegalStateException("No session context active");
}
return (ConversationEntries) Component.getInstance(ConversationEntries.class, ScopeType.SESSION, false);
}
@Override
public String toString()
{
return "ConversationEntries(" + conversationIdEntryMap.values() + ")";
}
}