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