1 package jp.sourceforge.stigmata.utils;
3 import java.util.ArrayList;
4 import java.util.Iterator;
7 import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchPartType;
8 import jp.sourceforge.stigmata.utils.WellknownClassJudgeRule.MatchType;
11 * Managing wellknown class checking rule.
13 * @author Haruaki TAMADA
15 public class WellknownClassManager implements Iterable<WellknownClassJudgeRule>{
16 private List<WellknownClassJudgeRule> rules = new ArrayList<WellknownClassJudgeRule>();
19 * public field/method flag defined in JVM specification.
21 private static final int OPCODE_ACC_PUBLIC = 1;
23 * private field/method flag defined in JVM specification.
25 @SuppressWarnings("unused")
26 private static final int OPCODE_ACC_PRIVATE = 2;
28 * protected field/method flag defined in JVM specification.
30 @SuppressWarnings("unused")
31 private static final int OPCODE_ACC_PROTECTED = 4;
33 * static field/method flag defined in JVM specification.
35 private static final int OPCODE_ACC_STATIC = 8;
37 * final field/method flag defined in JVM specification.
39 private static final int OPCODE_ACC_FINAL = 16;
42 * default constructor.
44 public WellknownClassManager(){
48 * constructor with parent WellknownClassManager.
50 public WellknownClassManager(WellknownClassManager manager){
51 rules = new ArrayList<WellknownClassJudgeRule>(manager.rules);
54 public void remove(WellknownClassJudgeRule rule){
58 public void remove(String value, MatchType matchType, MatchPartType partType){
59 remove(new WellknownClassJudgeRule(value, matchType, partType));
67 public synchronized Iterator<WellknownClassJudgeRule> iterator(){
68 List<WellknownClassJudgeRule> copiedRules = new ArrayList<WellknownClassJudgeRule>(rules);
69 return copiedRules.iterator();
72 public synchronized WellknownClassJudgeRule[] getRules(){
73 return rules.toArray(new WellknownClassJudgeRule[rules.size()]);
76 public void add(WellknownClassJudgeRule rule){
77 if(!rules.contains(rule)){
82 private boolean checkSystemClass(String className){
83 FullyClassName name = new FullyClassName(className);
84 if(isMatch(name, true)){
87 return isMatch(name, false);
90 private boolean isMatch(FullyClassName name, boolean excludeFlag){
91 for(Iterator<WellknownClassJudgeRule> i = rules.iterator(); i.hasNext(); ){
92 WellknownClassJudgeRule s = i.next();
93 if(s.isExclude() == excludeFlag){
95 String partName = name.getFullyName();
96 if(s.getMatchPartType() == MatchPartType.CLASS_NAME){
97 partName = name.getClassName();
99 else if(s.getMatchPartType() == MatchPartType.PACKAGE_NAME){
100 partName = name.getPackageName();
102 switch(s.getMatchType()){
104 flag = partName.startsWith(s.getPattern());
107 flag = partName.endsWith(s.getPattern());
110 flag = partName.equals(s.getPattern());
113 flag = !partName.equals(s.getPattern());
125 * check system defined methods, which are following methods.
127 * <li><code>public static void main(String[])</code></li>
128 * <li><code>static void <clinit>(void)</code>(static initializer)</li>
129 * <li><code>void <init></code>(constructor)</li>
132 private boolean checkSystemMethod(int access, String methodName, String signature){
133 if(methodName.equals("main")){
134 return signature.equals("([Ljava/lang/String;)V")
135 && checkAccess(access, OPCODE_ACC_PUBLIC);
137 else if(methodName.equals("<clinit>")){
138 return signature.equals("()V")
139 && checkAccess(access, OPCODE_ACC_STATIC);
141 else if(methodName.equals("<init>")){
142 return !checkAccess(access, OPCODE_ACC_STATIC);
148 * check system defined field, which is following field.
150 * <code>static final long serialVersionUID</code>
153 private boolean checkSystemField(int access, String fieldName, String signature){
154 if(fieldName.equals("serialVersionUID")){
155 return checkAccess(access, OPCODE_ACC_STATIC) &&
156 checkAccess(access, OPCODE_ACC_FINAL) &&
157 signature.equals("J");
163 public boolean isWellKnownClass(String className){
164 return checkSystemClass(className);
167 public boolean isSystemMethod(int access, String methodName, String signature){
168 return checkSystemMethod(access, methodName, signature);
171 public boolean isSystemField(int access, String fieldName, String signature){
172 return checkSystemField(access, fieldName, signature);
175 private boolean checkAccess(int access, int code){
176 return (access & code) == code;