package humanize.faces.convert; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import javax.faces.component.PartialStateHolder; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import com.google.common.base.Preconditions; public abstract class BaseConverter implements Converter, Serializable, PartialStateHolder { private static final long serialVersionUID = -7333204612599724969L; private Locale locale; private boolean initialState; private boolean transientFlag = false; @Override public void clearInitialState() { initialState = false; } @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { return value; } public Locale getLocale() { if (locale == null) { locale = getLocale(FacesContext.getCurrentInstance()); } return locale; } @Override public boolean initialStateMarked() { return initialState; } @Override public boolean isTransient() { return transientFlag; } @Override public void markInitialState() { initialState = true; } @Override public void restoreState(FacesContext context, Object state) { Preconditions.checkNotNull(context); if (state != null) { @SuppressWarnings("unchecked") List<Object> values = (List<Object>) state; Iterator<Object> iterator = values.iterator(); locale = (Locale) iterator.next(); restore(iterator); } } @Override public Object saveState(FacesContext context) { Preconditions.checkNotNull(context); if (!initialStateMarked()) { List<Object> states = new ArrayList<Object>(); states.add(locale); save(states); return states; } return null; } public void setLocale(Locale locale) { clearInitialState(); this.locale = locale; } @Override public void setTransient(boolean transientFlag) { this.transientFlag = transientFlag; } protected Date asDate(Object value) { if (Date.class.isAssignableFrom(value.getClass())) { return (Date) value; } else { return new Date(Long.parseLong(value.toString())); } } protected Number asNumber(Object input) { if (input instanceof String) { try { String istr = (String) input; return (istr.indexOf('.') != -1) ? Double.valueOf(istr) : Long.valueOf(istr); } catch (NumberFormatException nfe) { throw new IllegalArgumentException(nfe); } } return (Number) input; } protected Locale getLocale(FacesContext context) { return locale == null ? context.getViewRoot().getLocale() : locale; } protected void restore(Iterator<Object> iterator) { // } protected void save(List<Object> states) { // } }