package fr.openwide.core.wicket.more.util.convert.converters; import java.util.Locale; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; import com.google.common.collect.ImmutableList; public class CascadingConverter<T> implements IConverter<T> { private static final long serialVersionUID = 4943347630093315725L; private final Iterable<? extends IConverter<? extends T>> preemptiveConverters; private final IConverter<T> mainConverter; private final Iterable<? extends IConverter<? extends T>> alternativeConverters; public CascadingConverter(IConverter<T> mainConverter, Iterable<? extends IConverter<? extends T>> preemptiveConverters, Iterable<? extends IConverter<? extends T>> alternativeConverters) { super(); this.preemptiveConverters = ImmutableList.copyOf(preemptiveConverters); this.mainConverter = mainConverter; this.alternativeConverters = ImmutableList.copyOf(alternativeConverters); } @Override public T convertToObject(String value, Locale locale) throws ConversionException { // First try the preemptive converters for (IConverter<? extends T> preemptiveConverter : preemptiveConverters) { try { return preemptiveConverter.convertToObject(value, locale); } catch (ConversionException ignored) { } } // If they didn't work, ignore the errors and try the main converter try { return mainConverter.convertToObject(value, locale); } catch (ConversionException e) { // If the main converter didn't work, try an alternative converter for (IConverter<? extends T> alternativeConverter : alternativeConverters) { try { return alternativeConverter.convertToObject(value, locale); } catch (ConversionException ignored) { e.addSuppressed(ignored); } } // If no alternative converter managed to convert, just throw the original exception. throw e; } } @Override public String convertToString(T value, Locale locale) { // Just use the main converter. return mainConverter.convertToString(value, locale); } }