package org.jboss.seam.navigation;
import java.util.Map;
import org.jboss.seam.core.ConversationPropagation;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Expressions.ValueExpression;
/**
* A conversation parameter strategy for "natural" conversation ids.
* Natural conversation ids are defined using <conversation/> in
* pages.xml.
*
* @author Shane Bryzak
*/
public class NaturalConversationIdParameter implements ConversationIdParameter
{
private String name;
private String parameterName;
private ValueExpression vb;
public NaturalConversationIdParameter(String name, String paramName, String expression)
{
this.name = name;
this.parameterName = paramName;
this.vb = expression != null ?
Expressions.instance().createValueExpression(expression) : null;
}
public String getName()
{
return name;
}
public String getParameterName()
{
return parameterName;
}
public String getInitialConversationId(Map parameters)
{
String id = getRequestConversationId(parameters);
return id==null ? getConversationId() : id;
}
public String getRequestConversationId(Map parameters)
{
String value = ConversationPropagation.getRequestParameterValue(parameters, parameterName);
if (value==null)
{
return null;
}
else
{
return name + ':' + value;
}
}
public String getConversationId()
{
return name + ':' + getParameterValue();
}
public String getParameterValue()
{
Object value = vb.getValue();
if (value==null)
{
throw new IllegalStateException("conversation id evaluated to null: " + name);
}
else
{
//TODO: use a JSF converter!
return vb.getValue().toString();
}
}
public String getParameterValue(String value)
{
return value.startsWith(name + ":") ? value.substring(name.length() + 1) : value;
}
}