package frostillicus.xsp.converter; import javax.faces.component.StateHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.el.ValueBinding; import com.ibm.commons.util.StringUtil; /** * @since 1.0 */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class EnumBindingConverter implements Converter, StateHolder { private Class<? extends Enum> enumType_ = null; private boolean transient_ = false; public EnumBindingConverter() { } public EnumBindingConverter(final Class<? extends Enum> enumType) { enumType_ = enumType; } @Override public Object getAsObject(final FacesContext facesContext, final UIComponent component, final String value) { if(StringUtil.isEmpty(value)) { return value; } if(enumType_ == null) { ValueBinding binding = component.getValueBinding("value"); Class<? extends Enum> enumType = binding.getType(facesContext); return Enum.valueOf(enumType, value); } else { return Enum.valueOf(enumType_, value); } } @Override public String getAsString(final FacesContext facesContext, final UIComponent component, final Object value) { return String.valueOf(value); } @Override public Object saveState(final FacesContext facesContext) { return new Object[] { enumType_, transient_ }; } @Override public void restoreState(final FacesContext facesContext, final Object stateObj) { Object[] state = (Object[])stateObj; enumType_ = (Class<? extends Enum>)state[0]; transient_ = (Boolean)state[1]; } @Override public boolean isTransient() { return transient_; } @Override public void setTransient(final boolean isTransient) { transient_ = isTransient; } }