1 23 package org.hammurapi.inspectors; 24 import java.util.Iterator ; 25 26 import org.hammurapi.InspectorBase; 27 28 import com.pavelvlasov.config.ConfigurationException; 29 import com.pavelvlasov.config.Parameterizable; 30 import com.pavelvlasov.jsel.Initializer; 31 import com.pavelvlasov.jsel.JselException; 32 import com.pavelvlasov.jsel.Repository; 33 import com.pavelvlasov.jsel.VariableDefinition; 34 import com.pavelvlasov.jsel.expressions.Expression; 35 import com.pavelvlasov.jsel.expressions.MethodCall; 36 37 43 public class DefineLoggerForClassRule 44 extends InspectorBase 45 implements Parameterizable { 46 47 53 public void visit(com.pavelvlasov.jsel.Class clazz) { 54 if (loggerClassName!=null) { 55 Repository repository = clazz.getCompilationUnit().getPackage().getRepository(); 56 try { 57 Class loggerClass=repository.loadClass(loggerClassName); 58 Iterator it=clazz.getFields().iterator(); 59 while (it.hasNext()) { 60 Object field = it.next(); 61 if (field instanceof VariableDefinition) { 62 VariableDefinition variableDefinition=(VariableDefinition) field; 63 try { 64 if (variableDefinition.getTypeSpecification().getType().isKindOf(loggerClassName)) { 65 context.waive(variableDefinition, "AvoidHidingInheritedInstanceFields"); 66 67 if (!("logger".equals(variableDefinition.getName()) || "LOGGER".equals(variableDefinition.getName()))) { 68 context.reportViolation(variableDefinition, "Use unified name 'LOGGER' for loggers"); 70 } 71 72 if (!variableDefinition.getModifiers().contains("static")) { 73 context.reportViolation(variableDefinition, "Logger must be static"); 75 } 76 77 if (!variableDefinition.getModifiers().contains("private")) { 78 context.reportViolation(variableDefinition, "Logger must be private"); 80 } 81 82 if (!variableDefinition.getModifiers().contains("final")) { 83 context.reportViolation(variableDefinition, "Logger must be final"); 85 } 86 87 Initializer initializer = variableDefinition.getInitializer(); 88 if (initializer==null) { 89 context.reportViolation(variableDefinition, "Logger not initialized"); 90 } else { 91 if (initializer instanceof MethodCall) { 92 MethodCall mc = (MethodCall) initializer; 93 if (mc.getParameters().size()==1) { 94 Expression expr = (Expression) mc.getParameters().get(0); 95 if ("java.lang.Class".equals(expr.getTypeSpecification().getType().getName())) { 96 String paramTypeName = expr.toString(); 97 String classType = clazz.getFcn() + ".class"; 98 if (!paramTypeName.equals(classType) && !classType.endsWith("." + paramTypeName)) { 99 100 context.reportViolation(variableDefinition, "Parameter is not correct"); 101 } 102 } 103 } 104 } 105 } 106 return; 107 } 108 } catch (JselException e) { 109 context.warn(variableDefinition, e); 110 } 111 } 112 } 113 context.reportViolation(clazz); 114 } catch (ClassNotFoundException e) { 115 context.warn(clazz, e); 116 } 117 } 118 } 119 120 123 private String loggerClassName; 124 125 137 public boolean setParameter(String name, Object value) throws ConfigurationException { 138 if ("logger-class-name".equals(name)) { 139 loggerClassName=value.toString(); 140 return true; 141 } 142 143 throw new ConfigurationException("Parameter " + name 144 + " is not supported."); 145 } 146 147 150 public String getConfigInfo() { 151 StringBuffer ret=new StringBuffer ("Allowed logger class:\n"); 152 ret.append("logger-class-name: " + loggerClassName + "\n"); 153 return ret.toString(); 154 } 155 } 156 | Popular Tags |