package nl.quintor.commons.util;

import javax.faces.component.StateHolder;
import javax.faces.context.FacesContext;

/**
 * Class that is able to store the state of itself completely through apache 
 * BeanUtils, using reflection that relies on getters and setters.
 * 
 * @author Benny Bottema
 * @see GenericUtils#cloneBean(Object)
 * @see GenericUtils#projectBean(Object, Object)
 */
public abstract class AbstractStateholder implements StateHolder {

	/**
	 * Necessary for {@link StateHolder}.
	 */
	private boolean isTransient;

	/*
	 * (non-Javadoc)
	 * 
	 * @see javax.faces.component.StateHolder#setTransient(boolean)
	 */
	public final void setTransient(final boolean isTransient) {
		this.isTransient = isTransient;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see javax.faces.component.StateHolder#isTransient()
	 */
	public final boolean isTransient() {
		return isTransient;
	}

	/**
	 * Saves the entire state of the current validator as clones bean
	 * 
	 * @see StateHolder#saveState(FacesContext)
	 * @see GenericUtils#cloneBean(Object)
	 */
	public final Object saveState(final FacesContext context) {
		return GenericUtils.cloneBean(this); // 'return this' might work as well
	}

	/**
	 * Restores the entire state through the use of project bean (project the previously cloned bean's 
	 * properties on the current validator)
	 * 
	 * @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object)
	 * @see GenericUtils#projectBean(Object, Object)
	 */
	public final void restoreState(final FacesContext context, final Object clonedValidatorBean) {
		GenericUtils.projectBean(clonedValidatorBean, this);
	}
}

