1 /*
2  * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.tools.javadoc.main;
27 
28 import static com.sun.tools.javac.code.Flags.*;
29 
30 /**
31  *   A class whose instances are filters over Modifier bits.
32  *   Filtering is done by returning boolean values.
33  *   Classes, methods and fields can be filtered, or filtering
34  *   can be done directly on modifier bits.
35  *
36  *  <p><b>This is NOT part of any supported API.
37  *  If you write code that depends on this, you do so at your own risk.
38  *  This code and its internal interfaces are subject to change or
39  *  deletion without notice.</b>
40  *
41  *   @see com.sun.tools.javac.code.Flags
42  *   @author Robert Field
43  */
44 
45 @Deprecated(since="9", forRemoval=true)
46 @SuppressWarnings("removal")
47 public class ModifierFilter {
48 
49     /**
50     * Package private access.
51     * A "pseudo-" modifier bit that can be used in the
52     * constructors of this class to specify package private
53     * access. This is needed since there is no Modifier.PACKAGE.
54     */
55     public static final long PACKAGE = 0x8000000000000000L;
56 
57     /**
58     * All access modifiers.
59     * A short-hand set of modifier bits that can be used in the
60     * constructors of this class to specify all access modifiers,
61     * Same as PRIVATE | PROTECTED | PUBLIC | PACKAGE.
62     */
63     public static final long ALL_ACCESS =
64                 PRIVATE | PROTECTED | PUBLIC | PACKAGE;
65 
66     private long oneOf;
67     private long must;
68     private long cannot;
69 
70     private static final int ACCESS_BITS = PRIVATE | PROTECTED | PUBLIC;
71 
72     /**
73      * Constructor - Specify a filter.
74      *
75      * @param   oneOf   If zero, everything passes the filter.
76      *                  If non-zero, at least one of the specified
77      *                  bits must be on in the modifier bits to
78      *                  pass the filter.
79      */
ModifierFilter(long oneOf)80     public ModifierFilter(long oneOf) {
81         this(oneOf, 0, 0);
82     }
83 
84     /**
85      * Constructor - Specify a filter.
86      * For example, the filter below  will only pass synchronized
87      * methods that are private or package private access and are
88      * not native or static.
89      * <pre>
90      * ModifierFilter(  Modifier.PRIVATE | ModifierFilter.PACKAGE,
91      *                  Modifier.SYNCHRONIZED,
92      *                  Modifier.NATIVE | Modifier.STATIC)
93      * </pre><p>
94      * Each of the three arguments must either be
95      * zero or the or'ed combination of the bits specified in the
96      * class Modifier or this class. During filtering, these values
97      * are compared against the modifier bits as follows:
98      *
99      * @param   oneOf   If zero, ignore this argument.
100      *                  If non-zero, at least one of the bits must be on.
101      * @param   must    All bits specified must be on.
102      * @param   cannot  None of the bits specified can be on.
103      */
ModifierFilter(long oneOf, long must, long cannot)104     public ModifierFilter(long oneOf, long must, long cannot) {
105         this.oneOf = oneOf;
106         this.must = must;
107         this.cannot = cannot;
108     }
109 
110     /**
111      * Filter on modifier bits.
112      *
113      * @param   modifierBits    Bits as specified in the Modifier class
114      *
115      * @return                  Whether the modifierBits pass this filter.
116      */
checkModifier(int modifierBits)117     public boolean checkModifier(int modifierBits) {
118         // Add in the "pseudo-" modifier bit PACKAGE, if needed
119         long fmod = ((modifierBits & ACCESS_BITS) == 0) ?
120                         modifierBits | PACKAGE :
121                         modifierBits;
122         return ((oneOf == 0) || ((oneOf & fmod) != 0)) &&
123                 ((must & fmod) == must) &&
124                 ((cannot & fmod) == 0);
125     }
126 
127 } // end ModifierFilter
128