Custom filtering using Matchers

Just as we filtered issues for text using TextFilterList, we can filter with arbitrary criteria by implementing our own Matcher. This interface specifies a single method, matches() that tests whether an element matches. If you've worked with predicates, a Matcher is the same thing.

For our filter, we implement a Matcher that matches all Issues reported by a predefined set of users.

import java.util.*;
// glazed lists
import ca.odell.glazedlists.*;
import ca.odell.glazedlists.matchers.*;
// a simple issues library
import ca.odell.issuezilla.*;

 * This {@link Matcher} only matches users in a predefined set.
 * @author <a href="">Jesse Wilson</a>
public class IssuesForUsersMatcher implements Matcher {
    /** the users to match */
    private Set users = new HashSet();
     * Create a new {@link IssuesForUsersMatcher} that matches only 
     * {@link Issue}s that have one or more user in the specified list.
    public IssuesForUsersMatcher(Collection users) {
        // defensive copy all the users
     * Test whether to include or not include the specified issue based
     * on whether or not their user is selected.
    public boolean matches(Object o) {
        if(o == null) return false;
        if(users.isEmpty()) return true;
        Issue issue = (Issue)o;
        String user = issue.getReporter();
        return users.contains(user);

With this IssuesForUsersMatcher in place, we can create an EventList that contains only issues that match the users we specify:

        List users = new ArrayList();
        Matcher usersMatcher = new IssuesForUsersMatcher(users);
        EventList issues = ...
        FilterList IssuesForUsers = new FilterList(issues, usersMatcher);

To avoid concurrency and consistency problems, it is best to make all Matcher implementations immutable. This will guarantee that your matches() method can be safely called from any thread without synchronization.