package org.jboss.seam.faces;
import java.io.Serializable;
import javax.faces.context.FacesContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.core.AbstractMutable;
/**
* Support for selector objects which remember their selection as a cookie
*
* @author Gavin King
*/
public abstract class Selector extends AbstractMutable implements Serializable
{
public static final int DEFAULT_MAX_AGE = 31536000; // 1 year in seconds
private boolean cookieEnabled;
private int cookieMaxAge = DEFAULT_MAX_AGE;
private String cookiePath= "/";
/**
* Is the cookie enabled?
* @return false by default
*/
public boolean isCookieEnabled()
{
return cookieEnabled;
}
public void setCookieEnabled(boolean cookieEnabled)
{
setDirty(this.cookieEnabled, cookieEnabled);
this.cookieEnabled = cookieEnabled;
}
/**
* The max age of the cookie
* @return 1 year by default
*/
public int getCookieMaxAge()
{
return cookieMaxAge;
}
public void setCookieMaxAge(int cookieMaxAge)
{
this.cookieMaxAge = cookieMaxAge;
}
public String getCookiePath()
{
return cookiePath;
}
public void setCookiePath(String cookiePath)
{
this.cookiePath = cookiePath;
}
/**
* Override to define the cookie name
*/
protected abstract String getCookieName();
/**
* Get the value of the cookie
*/
protected String getCookieValueIfEnabled()
{
return isCookieEnabled() ?
getCookieValue() : null;
}
protected Cookie getCookie()
{
FacesContext ctx = FacesContext.getCurrentInstance();
if (ctx != null)
{
return (Cookie) ctx.getExternalContext().getRequestCookieMap()
.get( getCookieName() );
}
else
{
return null;
}
}
protected String getCookieValue()
{
Cookie cookie = getCookie();
return cookie==null ? null : cookie.getValue();
}
protected void clearCookieValue()
{
Cookie cookie = getCookie();
if ( cookie!=null )
{
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
cookie.setValue(null);
cookie.setPath(cookiePath);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
/**
* Set the cookie
*/
protected void setCookieValueIfEnabled(String value)
{
FacesContext ctx = FacesContext.getCurrentInstance();
if ( isCookieEnabled() && ctx != null)
{
HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
Cookie cookie = new Cookie( getCookieName(), value );
cookie.setMaxAge( getCookieMaxAge() );
cookie.setPath(cookiePath);
response.addCookie(cookie);
}
}
}