是否有Java/JDBC代码分析验证工具?

是否有Java/JDBC代码分析验证工具?,java,eclipse,jdbc,Java,Eclipse,Jdbc,我从事的是一个非常庞大而古老的项目。我的任务是在try块中查找所有未初始化的JDBC连接。我还必须找到所有未关闭(或以错误顺序关闭)的结果集、语句和连接。是否有任何代码验证工具来搜索此类不良实践(可能与Eclispe集成,但不是必需的) 您正在寻找一个静态分析工具。我认为这可能会有所帮助,但也有(在较小程度上) 两个FingBugs检查可能特别有用: 我编写了小脚本来验证源代码。请随意修改/使用: import java.io.File; import java.nio.charset.C

我从事的是一个非常庞大而古老的项目。我的任务是在try块中查找所有未初始化的JDBC连接。我还必须找到所有未关闭(或以错误顺序关闭)的结果集、语句和连接。是否有任何代码验证工具来搜索此类不良实践(可能与Eclispe集成,但不是必需的)

您正在寻找一个静态分析工具。我认为这可能会有所帮助,但也有(在较小程度上)

两个FingBugs检查可能特别有用:


我编写了小脚本来验证源代码。请随意修改/使用:

import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class DbValidator
{

  public static void main(String[] args)
  {
    if (args.length < 0)
    {
      return;
    }

    Path lvRootPath = Paths.get(args[0]);

    findAndParse(lvRootPath);
  }

  private static void findAndParse(Path pmPath)
  {
    File lvDir = pmPath.toFile();

    if (!lvDir.exists())
    {
      return;
    }

    File[] lvFiles = lvDir.listFiles();

    for (File file : lvFiles)
    {
      if (file.isDirectory())
      {
        findAndParse(file.toPath());
      }
      else
      {
        if (file.getName().endsWith(".java"))
          parseFile(file.toPath());
      }
    }
  }

  private static void parseFile(Path pmPath)
  {
    // System.out.println("#Validating file: " + pmPath);
    try
    {
      List<String> lvLines = Files.readAllLines(pmPath,Charset.forName("UTF-8"));
      Map<String, Integer> lvConNames = new HashMap<String, Integer>(); // map var-name : level;
      Map<String, Integer> lvPsNames = new HashMap<String, Integer>();
      Map<String, Integer> lvRsNames = new HashMap<String, Integer>();
      List<Integer> lvTryBlocks = new ArrayList<Integer>(); // opened try blocks
      int lvLevel = 0;
      int lvLineIdx = 1;

      for (String line : lvLines)
      {
        lvLevel = checkLevel(line,lvLevel);
        closeTryBlocks(lvTryBlocks,lvLevel);
        checkIfConectionGetter(lvTryBlocks,line,lvLineIdx,pmPath);

        line = line.trim();

        if (line.startsWith("Connection"))
        {
          String lvName = line.replaceFirst("Connection\\s","").replaceAll("\\s*=\\s*(.)*+","");
          lvConNames.put(lvName,lvLevel);
          lvLineIdx++;
          continue;
        }
        else if (line.startsWith("PreparedStatement"))
        {
          String lvName = line.replaceFirst("PreparedStatement\\s","").replaceAll("\\s=\\s*(.)*+","");
          lvPsNames.put(lvName,lvLevel);
          lvLineIdx++;
          continue;
        }
        else if (line.startsWith("ResultSet"))
        {
          String lvName = line.replaceFirst("ResultSet\\s","").replaceAll("\\s=\\s*(.)*+","");
          lvRsNames.put(lvName,lvLevel);
        }
        else if (line.startsWith("try"))
        {
          lvTryBlocks.add(lvLevel);
          lvLineIdx++;
          continue;
        }
        else if (line.startsWith("StreamUtils.closeQuietly"))
        {
          String[] lvElements = line.replaceAll("StreamUtils.closeQuietly\\(","").replaceAll("\\);","").split(",");

          boolean lvWasPs = false;
          boolean lvWasCon = false;

          for (String element : lvElements)
          {
            element = element.trim();

            if (lvPsNames.get(element) != null)
            {
              lvPsNames.remove(element);
              if (lvWasCon)
              {
                System.out.println("#######################################################################");
                System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + lvLineIdx);
                System.out.println("#Wrong closing order");
                System.out.println("#######################################################################");
              }

              lvWasPs = true;
            }
            else if (lvRsNames.get(element) != null)
            {
              lvRsNames.remove(element);

              if (lvWasCon || lvWasPs)
              {
                System.out.println("#######################################################################");
                System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + lvLineIdx);
                System.out.println("#Wrong closing order");
                System.out.println("#######################################################################");
              }
            }
            else if (lvConNames.get(element) != null)
            {
              lvConNames.remove(element);
              lvWasCon = true;
            }
          }
        }

        Map<String, Integer> lvConNamesTmp = new HashMap<String, Integer>(lvConNames);
        for (Entry<String, Integer> entry : lvConNamesTmp.entrySet())
        {
          Integer lvValue = entry.getValue();

          if (lvValue > lvLevel)
          {
            System.out.println("#######################################################################");
            System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + lvLineIdx);
            System.out.println("#Not closed Connection");
            System.out.println("#######################################################################");
            lvConNames.remove(entry.getKey());
          }
        }

        Map<String, Integer> lvPsNamesTmp = new HashMap<String, Integer>(lvPsNames);
        for (Entry<String, Integer> entry : lvPsNamesTmp.entrySet())
        {
          Integer lvValue = entry.getValue();

          if (lvValue > lvLevel)
          {
            System.out.println("#######################################################################");
            System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + lvLineIdx);
            System.out.println("#Not closed PreparedStatement");
            System.out.println("#######################################################################");

            lvPsNamesTmp.remove(entry.getKey());
          }
        }

        Map<String, Integer> lvRsNamesTmp = new HashMap<String, Integer>(lvRsNames);
        for (Entry<String, Integer> entry : lvRsNamesTmp.entrySet())
        {
          Integer lvValue = entry.getValue();

          if (lvValue > lvLevel)
          {
            System.out.println("#######################################################################");
            System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + lvLineIdx);
            System.out.println("#Not closed ResultSet");
            System.out.println("#######################################################################");

            lvRsNames.remove(entry.getKey());
          }
        }

        ++lvLineIdx;
      }

    }
    catch (Exception e)
    {
      // System.out.println("#Parsing error at file: " + pmPath);
      // e.printStackTrace();
    }
  }

  private static void checkIfConectionGetter(List<Integer> pmTryBlocks, String pmLine, int pmLineIndex, Path pmPath)
  {
    if (pmLine.indexOf("DbUtils.getConnection") != -1 && pmTryBlocks.isEmpty())
    {
      System.out.println("#######################################################################");
      System.out.println("#!!! Warning at file \"" + pmPath + "\" at line: " + pmLineIndex);
      System.out.println("#!!! Connection initialize outisde of try block");
      System.out.println("#######################################################################");
    }
  }

  private static void closeTryBlocks(List<Integer> pmTryBlocks, int pmLevel)
  {
    int lvIndexOf = pmTryBlocks.indexOf(new Integer(pmLevel));

    if (lvIndexOf != -1)
    {
      pmTryBlocks.remove(lvIndexOf);
    }
  }

  private static int checkLevel(String pmLine, int pmCurrentLevel)
  {
    // check level
    int lvIndexOfStart = -1;
    int lvIndexOfEnd = -1;
    int lvLevel = pmCurrentLevel;

    String lvLineTmp = pmLine;

    do
    {
      if (lvLineTmp.indexOf("}") != -1)
      {
        lvLineTmp = lvLineTmp.replaceFirst("\\}","");
        lvLevel--;
      }
      else if (lvLineTmp.indexOf("{") != -1)
      {
        lvLineTmp = lvLineTmp.replaceFirst("\\{","");
        lvLevel++;
      }
      else
      {
        break;
      }

    }
    while (true);

    return lvLevel;
  }

}
导入java.io.File;
导入java.nio.charset.charset;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
公共类DbValidator
{
公共静态void main(字符串[]args)
{
如果(参数长度<0)
{
返回;
}
Path lvRootPath=Path.get(args[0]);
findAndParse(lvRootPath);
}
私有静态void findAndParse(路径pmPath)
{
文件lvDir=pmPath.toFile();
如果(!lvDir.exists())
{
返回;
}
File[]lvFiles=lvDir.listFiles();
用于(文件:lvFiles)
{
if(file.isDirectory())
{
findAndParse(file.toPath());
}
其他的
{
if(file.getName().endsWith(“.java”))
parseFile(file.toPath());
}
}
}
私有静态无效解析文件(路径pmPath)
{
//System.out.println(“#验证文件:+pmPath”);
尝试
{
List lvLines=Files.readAllLines(pmPath,Charset.forName(“UTF-8”));
Map lvConNames=newhashmap();//映射变量名称:level;
Map lvPsNames=newhashmap();
Map lvRsNames=newhashmap();
List lvTryBlocks=new ArrayList();//打开的try块
int lvLevel=0;
int lvLineIdx=1;
用于(字符串行:lvLines)
{
lvLevel=检查级别(行,lvLevel);
closeTryBlocks(lvTryBlocks,lvLevel);
检查连接器(lvTryBlocks、line、lvLineIdx、pmPath);
line=line.trim();
if(线路开始与(“连接”))
{
字符串lvName=line.replaceFirst(“连接\\s”,“连接”).replaceAll(\\s*=\\s*(.)*+”,“”);
lvConNames.put(lvName,lvLevel);
lvLineIdx++;
继续;
}
else if(第行开始使用(“准备好的报表”))
{
字符串lvName=line.replaceFirst(“PreparedStatement\\s”,”).replaceAll(\\s=\\s*(.)*+“,”);
lvPsNames.put(lvName,lvLevel);
lvLineIdx++;
继续;
}
else if(line.startsWith(“ResultSet”))
{
字符串lvName=line.replaceFirst(“结果集\\s”,”).replaceAll(\\s=\\s*(.*+),”);
lvRsNames.put(lvName,lvLevel);
}
else if(line.startsWith(“try”))
{
lvTryBlocks.add(lvLevel);
lvLineIdx++;
继续;
}
else if(line.startsWith(“StreamUtils.closes”))
{
String[]lvElements=line.replaceAll(“StreamUtils.closeName\\(“,”).replaceAll(\\);“,”).split(“,”);
布尔lvWasPs=false;
布尔lvWasCon=false;
for(字符串元素:lvElements)
{
element=element.trim();
if(lvPsNames.get(element)!=null)
{
lvPsNames.remove(元素);
if(lvWasCon)
{
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
System.out.println(“#!!!警告在文件\”+pmPath+“\”在第行:“+lvLineIdx”);
System.out.println(“错误的关闭顺序”);
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
}
lvWasPs=true;
}
else if(lvRsNames.get(element)!=null)
{
lvRsNames.remove(元素);
if(lvWasCon | | lvWasPs)
{
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
System.out.println(“#!!!警告在文件\”+pmPath+“\”在第行:“+lvLineIdx”);
System.out.println(“错误的关闭顺序”);
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
}
}
else if(lvConNames.get(element)!=null)
{
lvConNames.移除(元件);
lvWasCon=true;
}
}
}
Map lvconnamestp=新HashMap(lvConNames);
for(条目:lvConNamesTmp.entrySet())
{
整数lvValue=entry.getValue();
如果(lvValue>lvLevel)
{
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
System.out.println(“#!!!警告在文件\”+pmPath+“\”在第行:“+lvLineIdx”);
System.out.println(“非闭合连接”);
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
移除(entry.getKey());
}
}
Map lvPsNamesTmp=新HashMap(lvPsNames);
for(条目:lvPsNamesTmp.entrySet())
{
整数lvValue=entry.getValue();
如果(lvValue>lvLevel)
{
3.系统。输出。系统。输出。印刷LN(系统。系统。系统。输出。系统。输出。印印印(“(“(“联合35)))系统。系统。系统。系统。系统。系统。系统。系统。系统。输出。系统。系统。输出。系统。输出。系统。印印民民民民民方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方######################################;
System.out.println(“#!!!警告在文件\”+pmPath+“\”在第行:“+lvLineIdx”);
System.out.println(“#未关闭的准备报表”);
System.out.println(“######################################################