1 23 package org.hammurapi.inspectors; 24 25 import org.hammurapi.InspectorBase; 26 27 import com.pavelvlasov.config.ConfigurationException; 28 import com.pavelvlasov.config.Parameterizable; 29 import com.pavelvlasov.jsel.JselException; 30 import com.pavelvlasov.jsel.JselRuntimeException; 31 import com.pavelvlasov.jsel.LanguageElement; 32 import com.pavelvlasov.jsel.OperationInfo; 33 import com.pavelvlasov.jsel.expressions.MethodCall; 34 import com.pavelvlasov.jsel.statements.Handler; 35 import com.pavelvlasov.review.SourceMarker; 36 import com.pavelvlasov.util.Visitor; 37 38 39 45 public class LogExceptionsRule extends InspectorBase implements Parameterizable { 46 47 52 public void visit(Handler handler) { 53 class LoggedException extends com.pavelvlasov.RuntimeException { 54 55 58 private static final long serialVersionUID = -1481467503705295388L; 59 60 }; 61 62 try { 63 handler.accept(new Visitor() { 64 public boolean visit(Object target) { 65 if (target instanceof MethodCall) { 66 MethodCall mc = (MethodCall) target; 67 try { 68 OperationInfo operationInfo = mc.getProvider(); 69 if (operationInfo==null) { 70 context.warn((SourceMarker) mc, "Provider is null for "+mc+" at "+((LanguageElement) mc).getLocation()); 71 } else if (loggerMethods.contains(operationInfo.getName()) && operationInfo.getDeclaringType().isKindOf(loggerClass) && operationInfo.getParameterTypes().length>1) { 72 throw new LoggedException(); 73 } 74 } catch (JselException e) { 75 context.warn((SourceMarker) mc, e); 76 } catch (JselRuntimeException e) { 77 context.warn((SourceMarker) mc, e); 78 } 79 } 80 return true; 81 } 82 }); 83 context.reportViolation((SourceMarker) handler); 84 } catch (LoggedException e) { 85 } 87 } 88 89 92 private String loggerClass; 93 94 97 private java.util.Set loggerMethods = new java.util.HashSet (); 98 99 107 public boolean setParameter(String name, Object value) throws ConfigurationException { 108 if ("logger_class".equals(name)) { 109 loggerClass= value.toString(); 110 } else if ("logger_method".equals(name)) { 111 loggerMethods.add(value.toString()); 112 } else { 113 throw new ConfigurationException("Parameter '"+name+"' is not supported"); 114 } 115 return true; 116 } 117 118 121 public String getConfigInfo() { 122 StringBuffer ret=new StringBuffer ("Used logger class: " + loggerClass + "\n"); 123 java.util.Iterator iter = loggerMethods.iterator(); 124 while (iter.hasNext()) { 125 ret.append("operation: " + iter.next().toString() + "\t"); 126 } 127 ret.append("\n"); 128 return ret.toString(); 129 } 130 } 131 | Popular Tags |