1 23 package org.hammurapi.inspectors; 24 25 import org.hammurapi.InspectorBase; 26 27 import com.pavelvlasov.jsel.JselException; 28 import com.pavelvlasov.jsel.LanguageElement; 29 import com.pavelvlasov.jsel.Method; 30 import com.pavelvlasov.jsel.Operation; 31 import com.pavelvlasov.jsel.Parameter; 32 import com.pavelvlasov.jsel.statements.SynchronizedStatement; 33 import com.pavelvlasov.util.Visitor; 34 35 36 42 public class SynchronizationInServletsRule extends InspectorBase { 43 44 private static final String JAVAX_SERVLET_SERVLETRESPONSE = "javax.servlet.ServletResponse"; 45 private static final String JAVAX_SERVLET_SERVLETREQUEST = "javax.servlet.ServletRequest"; 46 private static final String JAVAX_SERVLET_SERVLET = "javax.servlet.Servlet"; 47 48 public void visit(SynchronizedStatement element) { 49 if (((LanguageElement) element).getEnclosingCode() instanceof Method) { 50 checkCallers((Method) ((LanguageElement) element).getEnclosingCode()); 51 } 52 } 53 54 private boolean j2eeChecked=false; 55 56 public void visit(Method element) { 57 if (element.getModifiers().contains("synchronized")) { 58 checkCallers(element); 59 } 60 } 61 62 65 private void checkCallers(Method method) { 66 if (!j2eeChecked) { 67 j2eeChecked=true; 68 try { 69 method.getRepository().loadClass(JAVAX_SERVLET_SERVLET); 70 } catch (ClassNotFoundException e) { 71 disable(e.getMessage()); 72 return; 73 } 74 } 75 76 try { 77 80 final StringBuffer sb=new StringBuffer (); 81 82 method.visitCallers(new Visitor() { 85 86 public boolean visit(Object target) { 87 Operation.Invocation inv=(Operation.Invocation) target; 88 if (inv.getCaller() instanceof Method) { 89 Method caller=(Method) inv.getCaller(); 90 try { 91 if (caller.getEnclosingType().isKindOf(JAVAX_SERVLET_SERVLET) 92 && caller.getParameters().size()==2 93 && ((Parameter) caller.getParameters().get(0)).isTypeOf(JAVAX_SERVLET_SERVLETREQUEST) 94 && ((Parameter) caller.getParameters().get(0)).isTypeOf(JAVAX_SERVLET_SERVLETRESPONSE)) { 95 if (sb.length()>0) { 96 sb.append(", "); 97 } 98 sb.append(caller.getEnclosingType().getFcn()); 99 sb.append("."); 100 sb.append(caller.getOperationSignature()); 101 } 102 } catch (JselException e) { 103 context.warn(caller, e); 104 } 105 } 106 return true; 107 } 108 109 }); 110 111 if (sb.length()>0) { 112 context.reportViolation( 113 method, 114 context.getDescriptor().getMessage() 115 +". Synchronized method " 116 +method.getOperationSignature() 117 + " is invoked from servlet method(s) " 118 + sb.toString()); 119 } 120 } catch (JselException e) { 121 context.warn(method, e); 122 } 123 } 124 } 125 | Popular Tags |