package org.eclipse.jst.jsf.common.internal.finder; import java.util.Collections; import java.util.List; /** * A finder that finds it's OUTPUT in INPUT by using a matching strategy. * @author cbateman * @param <INPUT> * @param <OUTPUT> * @param <IDTYPE> * */ public abstract class AbstractMatcher<INPUT, OUTPUT, IDTYPE> extends AbstractFinder<INPUT, OUTPUT, IDTYPE> { private final List<? extends IMatcher> _matchers; /** * An interface that defines a match. * */ public interface IMatcher { /** * @param matchThis * @return true if T matches the expected critieria */ boolean matches(Object matchThis); } /** * A matcher that matches always. * @author cbateman * */ public static final class AlwaysMatcher implements IMatcher { public boolean matches(Object matchThis) { return true; } } /** * @param id * @param displayName * @param noResultValue * @param matchers */ public AbstractMatcher(final IDTYPE id, final String displayName, final OUTPUT noResultValue, final List<? extends IMatcher> matchers) { super(id, displayName, noResultValue); _matchers = matchers; } @Override public abstract OUTPUT perform(INPUT input) throws Exception; /** * @return the matchers */ protected final List<IMatcher> getMatchers() { return Collections.unmodifiableList(_matchers); } }