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;
14 import org.objectweb.asm.Opcodes;
17 * Managing wellknown class checking rule.
19 * @author Haruaki TAMADA
22 public class WellknownClassManager implements Iterable<WellknownClassJudgeRule>{
23 private List<WellknownClassJudgeRule> rules = new ArrayList<WellknownClassJudgeRule>();
25 public WellknownClassManager(){
28 public WellknownClassManager(WellknownClassManager manager){
29 rules = new ArrayList<WellknownClassJudgeRule>(manager.rules);
32 public void remove(WellknownClassJudgeRule rule){
36 public void remove(String value, MatchType matchType, MatchPartType partType){
37 remove(new WellknownClassJudgeRule(value, matchType, partType));
44 public synchronized Iterator<WellknownClassJudgeRule> iterator(){
45 List<WellknownClassJudgeRule> copiedRules = new ArrayList<WellknownClassJudgeRule>(rules);
46 return copiedRules.iterator();
49 public synchronized WellknownClassJudgeRule[] getRules(){
50 return rules.toArray(new WellknownClassJudgeRule[rules.size()]);
53 public void add(WellknownClassJudgeRule rule){
54 if(!rules.contains(rule)){
59 private boolean checkSystemClass(String className){
60 FullyClassName name = new FullyClassName(className);
61 if(isMatch(name, true)){
64 return isMatch(name, false);
67 private boolean isMatch(FullyClassName name, boolean excludeFlag){
68 for(Iterator<WellknownClassJudgeRule> i = rules.iterator(); i.hasNext(); ){
69 WellknownClassJudgeRule s = i.next();
70 if(s.isExclude() == excludeFlag){
72 String partName = name.getFullyName();
73 if(s.getMatchPartType() == MatchPartType.CLASS_NAME){
74 partName = name.getClassName();
76 else if(s.getMatchPartType() == MatchPartType.PACKAGE_NAME){
77 partName = name.getPackageName();
79 switch(s.getMatchType()){
81 flag = partName.startsWith(s.getPattern());
84 flag = partName.endsWith(s.getPattern());
87 flag = partName.equals(s.getPattern());
90 flag = !partName.equals(s.getPattern());
102 * check system defined methods, which are following methods.
104 * <li><code>public static void main(String[])</code></li>
105 * <li><code>static void <clinit>(void)</code>(static initializer)</li>
106 * <li><code>void <init></code>(constructor)</li>
109 private boolean checkSystemMethod(int access, String methodName, String signature){
110 if(methodName.equals("main")){
111 return signature.equals("([Ljava/lang/String;)V")
112 && checkAccess(access, Opcodes.ACC_PUBLIC);
114 else if(methodName.equals("<clinit>")){
115 return signature.equals("()V")
116 && checkAccess(access, Opcodes.ACC_STATIC);
118 else if(methodName.equals("<init>")){
119 return !checkAccess(access, Opcodes.ACC_STATIC);
125 * check system defined field, which is following field.
127 * <code>static final long serialVersionUID</code>
130 private boolean checkSystemField(int access, String fieldName, String signature){
131 if(fieldName.equals("serialVersionUID")){
132 return checkAccess(access, Opcodes.ACC_STATIC) &&
133 checkAccess(access, Opcodes.ACC_FINAL) &&
134 signature.equals("J");
140 public boolean isWellKnownClass(String className){
141 return checkSystemClass(className);
144 public boolean isSystemMethod(int access, String methodName, String signature){
145 return checkSystemMethod(access, methodName, signature);
148 public boolean isSystemField(int access, String fieldName, String signature){
149 return checkSystemField(access, fieldName, signature);
152 private boolean checkAccess(int access, int code){
153 return (access & code) == code;