package jdepend.parse.impl; import java.util.Collection; import java.util.HashSet; import org.apache.bcel.Const; import jdepend.metadata.HttpInvokeItem; import jdepend.metadata.Method; import jdepend.parse.ParseConfigurator; /** * 识别Http调用的方法读取器 * * @author user * */ public class HttpInvokeMethodReader extends MethodReader { private String url; private String constantClassName; private String constantAttributeName; private Collection<String> invokeClassNames = new HashSet<String>(); public HttpInvokeMethodReader(Method method, ParseConfigurator parseConfigurator) { super(method); if (parseConfigurator.getHttpInvokeClassNames() != null) { for (String invokeClassName : parseConfigurator.getHttpInvokeClassNames()) { this.invokeClassNames.add(invokeClassName); } } } public void addInvokeClassName(String invokeClassName) { this.invokeClassNames.add(invokeClassName); } @Override protected void readInfo(int opcode, String info) { if (invokeClassNames.size() == 0) { return; } String[] infos; int pos; String calledName; if (opcode == Const.INVOKEVIRTUAL || opcode == Const.INVOKESPECIAL || opcode == Const.INVOKESTATIC) { infos = info.split("\\s+"); if (infos.length > 1) { pos = infos[1].lastIndexOf('.'); if (pos != -1) { calledName = infos[1].substring(0, pos); if (invokeClassNames.contains(calledName)) { if (url != null || constantClassName != null) { HttpInvokeItem item = new HttpInvokeItem(url, constantClassName, constantAttributeName); method.addInvokeItem(item); url = null; constantClassName = null; constantAttributeName = null; } } } } } else if (opcode == Const.LDC) { infos = info.split("\\s+"); if (infos.length > 0 && infos[1].startsWith("\"/")) { url = infos[1]; } } else if (opcode == Const.GETSTATIC) { infos = info.split("\\s+"); if (infos.length > 0) { pos = infos[1].lastIndexOf('.'); if (pos != -1) { constantClassName = infos[1].substring(0, pos); constantAttributeName = infos[1].substring(pos + 1); } } } } }