1 package jp.sourceforge.stigmata.utils;
7 import java.util.ArrayList;
8 import java.util.Iterator;
11 import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchPartType;
12 import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchType;
15 * Managing wellknown class checking rule.
17 * @author Haruaki TAMADA
20 public class WellknownClassManager implements Iterable<WellknownClassJudgeRule>{
21 private List<WellknownClassJudgeRule> rules = new ArrayList<WellknownClassJudgeRule>();
24 * public field/method flag defined in JVM specification.
26 private static final int OPCODE_ACC_PUBLIC = 1;
28 * private field/method flag defined in JVM specification.
30 private static final int OPCODE_ACC_PRIVATE = 2;
32 * protected field/method flag defined in JVM specification.
34 private static final int OPCODE_ACC_PROTECTED = 4;
36 * static field/method flag defined in JVM specification.
38 private static final int OPCODE_ACC_STATIC = 8;
40 * final field/method flag defined in JVM specification.
42 private static final int OPCODE_ACC_FINAL = 16;
45 * default constructor.
47 public WellknownClassManager(){
51 * constructor with parent WellknownClassManager.
53 public WellknownClassManager(WellknownClassManager manager){
54 rules = new ArrayList<WellknownClassJudgeRule>(manager.rules);
57 public void remove(WellknownClassJudgeRule rule){
61 public void remove(String value, MatchType matchType, MatchPartType partType){
62 remove(new WellknownClassJudgeRule(value, matchType, partType));
70 public synchronized Iterator<WellknownClassJudgeRule> iterator(){
71 List<WellknownClassJudgeRule> copiedRules = new ArrayList<WellknownClassJudgeRule>(rules);
72 return copiedRules.iterator();
75 public synchronized WellknownClassJudgeRule[] getRules(){
76 return rules.toArray(new WellknownClassJudgeRule[rules.size()]);
79 public void add(WellknownClassJudgeRule rule){
80 if(!rules.contains(rule)){
85 private boolean checkSystemClass(String className){
86 FullyClassName name = new FullyClassName(className);
87 if(isMatch(name, true)){
90 return isMatch(name, false);
93 private boolean isMatch(FullyClassName name, boolean excludeFlag){
94 for(Iterator<WellknownClassJudgeRule> i = rules.iterator(); i.hasNext(); ){
95 WellknownClassJudgeRule s = i.next();
96 if(s.isExclude() == excludeFlag){
98 String partName = name.getFullyName();
99 if(s.getMatchPartType() == MatchPartType.CLASS_NAME){
100 partName = name.getClassName();
102 else if(s.getMatchPartType() == MatchPartType.PACKAGE_NAME){
103 partName = name.getPackageName();
105 switch(s.getMatchType()){
107 flag = partName.startsWith(s.getPattern());
110 flag = partName.endsWith(s.getPattern());
113 flag = partName.equals(s.getPattern());
116 flag = !partName.equals(s.getPattern());
128 * check system defined methods, which are following methods.
130 * <li><code>public static void main(String[])</code></li>
131 * <li><code>static void <clinit>(void)</code>(static initializer)</li>
132 * <li><code>void <init></code>(constructor)</li>
135 private boolean checkSystemMethod(int access, String methodName, String signature){
136 if(methodName.equals("main")){
137 return signature.equals("([Ljava/lang/String;)V")
138 && checkAccess(access, OPCODE_ACC_PUBLIC);
140 else if(methodName.equals("<clinit>")){
141 return signature.equals("()V")
142 && checkAccess(access, OPCODE_ACC_STATIC);
144 else if(methodName.equals("<init>")){
145 return !checkAccess(access, OPCODE_ACC_STATIC);
151 * check system defined field, which is following field.
153 * <code>static final long serialVersionUID</code>
156 private boolean checkSystemField(int access, String fieldName, String signature){
157 if(fieldName.equals("serialVersionUID")){
158 return checkAccess(access, OPCODE_ACC_STATIC) &&
159 checkAccess(access, OPCODE_ACC_FINAL) &&
160 signature.equals("J");
166 public boolean isWellKnownClass(String className){
167 return checkSystemClass(className);
170 public boolean isSystemMethod(int access, String methodName, String signature){
171 return checkSystemMethod(access, methodName, signature);
174 public boolean isSystemField(int access, String fieldName, String signature){
175 return checkSystemField(access, fieldName, signature);
178 private boolean checkAccess(int access, int code){
179 return (access & code) == code;