1995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll/*
2995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * Copyright (C) 2009 The Android Open Source Project
3995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll *
4995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * Licensed under the Apache License, Version 2.0 (the "License");
5995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * you may not use this file except in compliance with the License.
6995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * You may obtain a copy of the License at
7995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll *
8995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll *      http://www.apache.org/licenses/LICENSE-2.0
9995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll *
10995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * Unless required by applicable law or agreed to in writing, software
11995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * distributed under the License is distributed on an "AS IS" BASIS,
12995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * See the License for the specific language governing permissions and
14995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll * limitations under the License.
15995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll */
16995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
17995b5ac934a7b584fecfa055d422fdba93aef812Raphael Mollpackage com.android.mkstubs;
18995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
19995b5ac934a7b584fecfa055d422fdba93aef812Raphael Mollimport java.util.TreeSet;
20995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
21995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll/**
22adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * A "filter" holds the various patterns that MkStubs should accept (include)
23adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * or reject (exclude). Patterns can be of two kind:
24adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * <ul>
25adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * <li>Full patterns are simple string matches, similar to a "^pattern$" regex.
26adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * <li>Prefix patterns are partial string matches, similar to a "^pattern.*" regex.
27adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * </ul>
28adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * <p/>
29adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * The {@link #accept(String)} method examines a given string against the known
30adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll * pattern to decide if it should be included.
31995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll */
32995b5ac934a7b584fecfa055d422fdba93aef812Raphael Mollclass Filter {
33995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    private TreeSet<String> mIncludePrefix = new TreeSet<String>();
34995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    private TreeSet<String> mIncludeFull   = new TreeSet<String>();
35995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    private TreeSet<String> mExcludePrefix = new TreeSet<String>();
36995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    private TreeSet<String> mExcludeFull   = new TreeSet<String>();
37995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
38adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll    /**
39adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * Returns the set of all full patterns to be included.
40adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     */
41995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    public TreeSet<String> getIncludeFull() {
42995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        return mIncludeFull;
43995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    }
44adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll
45adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll    /**
46adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * Returns the set of all prefix patterns to be included.
47adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     */
48995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    public TreeSet<String> getIncludePrefix() {
49995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        return mIncludePrefix;
50995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    }
51995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
52adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll    /**
53adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * Returns the set of all full patterns to be excluded.
54adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     */
55995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    public TreeSet<String> getExcludeFull() {
56995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        return mExcludeFull;
57995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    }
58995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
59adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll    /**
60adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * Returns the set of all prefix patterns to be excluded.
61adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     */
62995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    public TreeSet<String> getExcludePrefix() {
63995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        return mExcludePrefix;
64995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    }
65adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll
66adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll    /**
67adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * Checks if the given string passes the various include/exclude rules.
68adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * The matching is done as follows:
69adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * <ul>
70adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * <li> The string must match either a full include or a prefix include.
71adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * <li> The string must not match any full exclude nor any prefix exclude.
72adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * </ul>
73adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * @param s The string to accept or reject.
74adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     * @return True if the string can be accepted, false if it must be rejected.
75adf4543e57086070c95b3ef439dbb6679b0bd562Raphael Moll     */
76995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    public boolean accept(String s) {
77995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
78995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        // Check if it can be included.
79995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        boolean accept = mIncludeFull.contains(s);
80995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        if (!accept) {
81995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            // Check for a prefix inclusion
82995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            for (String prefix : mIncludePrefix) {
83995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                if (s.startsWith(prefix)) {
84995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                    accept = true;
85995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                    break;
86995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                }
87995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            }
88995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        }
89995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
90995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        if (accept) {
91995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            // check for a full exclusion
92995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            accept = !mExcludeFull.contains(s);
93995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        }
94995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        if (accept) {
95995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            // or check for prefix exclusion
96995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            for (String prefix : mExcludePrefix) {
97995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                if (s.startsWith(prefix)) {
98995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                    accept = false;
99995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                    break;
100995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll                }
101995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll            }
102995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        }
103995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll
104995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll        return accept;
105995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll    }
106995b5ac934a7b584fecfa055d422fdba93aef812Raphael Moll}
107