duke@1: /* ohair@554: * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as ohair@554: * published by the Free Software Foundation. Oracle designates this duke@1: * particular file as subject to the "Classpath" exception as provided ohair@554: * by Oracle in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@554: * or visit www.oracle.com if you need additional information or have any ohair@554: * questions. duke@1: */ duke@1: duke@1: package com.sun.tools.javadoc; duke@1: duke@1: import static com.sun.tools.javac.code.Flags.*; duke@1: duke@1: /** duke@1: * A class whose instances are filters over Modifier bits. duke@1: * Filtering is done by returning boolean values. duke@1: * Classes, methods and fields can be filtered, or filtering duke@1: * can be done directly on modifier bits. duke@1: * @see com.sun.tools.javac.code.Flags; duke@1: * @author Robert Field duke@1: */ duke@1: duke@1: public class ModifierFilter { duke@1: duke@1: /** duke@1: * Package private access. duke@1: * A "pseudo-" modifier bit that can be used in the duke@1: * constructors of this class to specify package private duke@1: * access. This is needed since there is no Modifier.PACKAGE. duke@1: */ duke@1: public static final long PACKAGE = 0x8000000000000000L; duke@1: duke@1: /** duke@1: * All access modifiers. duke@1: * A short-hand set of modifier bits that can be used in the duke@1: * constructors of this class to specify all access modifiers, duke@1: * Same as PRIVATE | PROTECTED | PUBLIC | PACKAGE. duke@1: */ duke@1: public static final long ALL_ACCESS = duke@1: PRIVATE | PROTECTED | PUBLIC | PACKAGE; duke@1: duke@1: private long oneOf; duke@1: private long must; duke@1: private long cannot; duke@1: duke@1: private static final int ACCESS_BITS = PRIVATE | PROTECTED | PUBLIC; duke@1: duke@1: /** duke@1: * Constructor - Specify a filter. duke@1: * duke@1: * @param oneOf If zero, everything passes the filter. duke@1: * If non-zero, at least one of the specified duke@1: * bits must be on in the modifier bits to duke@1: * pass the filter. duke@1: */ duke@1: public ModifierFilter(long oneOf) { duke@1: this(oneOf, 0, 0); duke@1: } duke@1: duke@1: /** duke@1: * Constructor - Specify a filter. duke@1: * For example, the filter below will only pass synchronized duke@1: * methods that are private or package private access and are duke@1: * not native or static. duke@1: *
duke@1:      * ModifierFilter(  Modifier.PRIVATE | ModifierFilter.PACKAGE,
duke@1:      *                  Modifier.SYNCHRONIZED,
duke@1:      *                  Modifier.NATIVE | Modifier.STATIC)
duke@1:      * 

duke@1: * Each of the three arguments must either be duke@1: * zero or the or'ed combination of the bits specified in the duke@1: * class Modifier or this class. During filtering, these values duke@1: * are compared against the modifier bits as follows: duke@1: * duke@1: * @param oneOf If zero, ignore this argument. duke@1: * If non-zero, at least one of the bits must be on. duke@1: * @param must All bits specified must be on. duke@1: * @param cannot None of the bits specified can be on. duke@1: */ duke@1: public ModifierFilter(long oneOf, long must, long cannot) { duke@1: this.oneOf = oneOf; duke@1: this.must = must; duke@1: this.cannot = cannot; duke@1: } duke@1: duke@1: /** duke@1: * Filter on modifier bits. duke@1: * duke@1: * @param modifierBits Bits as specified in the Modifier class duke@1: * duke@1: * @return Whether the modifierBits pass this filter. duke@1: */ duke@1: public boolean checkModifier(int modifierBits) { duke@1: // Add in the "pseudo-" modifier bit PACKAGE, if needed duke@1: long fmod = ((modifierBits & ACCESS_BITS) == 0) ? duke@1: modifierBits | PACKAGE : duke@1: modifierBits; duke@1: return ((oneOf == 0) || ((oneOf & fmod) != 0)) && duke@1: ((must & fmod) == must) && duke@1: ((cannot & fmod) == 0); duke@1: } duke@1: duke@1: } // end ModifierFilter