package org.jboss.seam.ui.converter; import javax.el.ValueExpression; import javax.faces.component.StateHolder; import javax.faces.component.UIComponent; import javax.faces.component.UIComponentBase; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; /** * Helper class for ConverterChain * */ public class PrioritizableConverter implements Converter, Comparable<PrioritizableConverter>, StateHolder { private ValueExpression valueExpression; private Converter delegate; private int priority; public PrioritizableConverter() { } public PrioritizableConverter(ValueExpression vb, int priority) { this.valueExpression = vb; this.priority = priority; } public PrioritizableConverter(Converter delegate, int priority) { this.delegate = delegate; this.priority = priority; } public Converter getDelegate() { if (valueExpression != null) { return (Converter) valueExpression.getValue(FacesContext.getCurrentInstance().getELContext()); } else { return delegate; } } public int getPriority() { return priority; } public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { return getDelegate().getAsObject(context, component, value); } public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException { return getDelegate().getAsString(context, component, value); } public int compareTo(PrioritizableConverter o) { return this.getPriority() - o.getPriority(); } private boolean _transient; public boolean isTransient() { return _transient; } public void restoreState(FacesContext context, Object state) { Object[] values = (Object[]) state; delegate = (Converter) UIComponentBase.restoreAttachedState(context, values[0]); priority = (Integer) values[1]; valueExpression = (ValueExpression) values[2]; } public Object saveState(FacesContext context) { Object[] values = new Object[3]; values[0] = UIComponentBase.saveAttachedState(context, delegate); values[1] = priority; values[2] = valueExpression; return values; } public void setTransient(boolean newTransientValue) { this._transient = newTransientValue; } }