您将使用什么工具来完成此任务以重新格式化Java代码?

时间:2014-01-31 12:11:02

标签: java macros text-editor

这是我的问题。我们公司决定从专有数据访问系统转向使用弹簧数据访问。我们的大多数代码更改只是改变了我们调用存储过程的方式。例如。

输入:

public DataSet myMethodName1(Integer inputint1) {
    DAOInfo info = _newDAOInfo();
    info.setProperty(PROP_PROCNAME, "sp_name");
    info.addParameter("sp_param1", PARAMETER_TYPE_INPUT, DATATYPE_INT, inputint1);
    return _executeDAO(info);
}
public DataSet myMethodName2(String inputchar1, String inputchar2) {
    DAOInfo info = _newDAOInfo();
    info.setProperty(PROP_PROCNAME, "sp_name");
    info.addParameter("sp_param1", PARAMETER_TYPE_INPUT, DATATYPE_CHAR, inputchar1);
    info.addParameter("sp_param2", PARAMETER_TYPE_INPUT, DATATYPE_CHAR, inputchar2);
    return _executeDAO(info);
}

输出:

    public DataSet myMethodName1(Integer inputint1) {
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
        jdbcCall.setReturnValueRequired(true);
        jdbcCall.declareParameters(new SqlParameter("sp_param1", Types.INTEGER));
        jdbcCall.declareParameters(new SqlReturnResultSet(DATASET_PARAMETER_NAME, new DataSetResultSetExtractor()));

        Map<String, Object> in = new HashMap<String, Object>();
        in.put("sp_param1", profileId);
        return executeSP(jdbcCall, inputint1);
    }

    public DataSet myMethodName2(String inputchar1, String inputchar2) {
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
        jdbcCall.setReturnValueRequired(true);
        jdbcCall.declareParameters(new SqlParameter("sp_param1", Types.CHAR));
        jdbcCall.declareParameters(new SqlParameter("sp_param2", Types.CHAR));
        jdbcCall.declareParameters(new SqlReturnResultSet(DATASET_PARAMETER_NAME, new DataSetResultSetExtractor()));

        Map<String, Object> in = new HashMap<String, Object>();
        in.put("sp_param1", inputchar1);
        in.put("sp_param2", inputchar2);
        return executeSP(jdbcCall, in);
    }

我不是要求任何人解决问题。我只是在寻找可以帮助我解决这个问题的工具或工具的建议。意识到任何一种方法中的参数数量可以在0到30之间变化。

上面的例子有两种方法。我有一个包含100种方法的文件,就像这两种方法一样。还有其他较小的文件需要这些。所以值得花几个小时的时间。这是计算机要做得更好,更一致的事情,然后我手动做一堆重复的剪贴。

看起来好像有一段时间我可以制作一个TextPad宏来完成这项工作。但由于TextPad宏不可编辑,因此非常烦人。我可以使用的工具是Windows7,RAD,TextPad,Java或任何其他免费工具。感觉好像有一个免费的编辑器允许你编辑宏,这可能很容易。

更新:我忘了提到这个代码在jar中,需要向后兼容,所以我不需要解决方法来修复我的代码。

感谢您的想法或想法。

2 个答案:

答案 0 :(得分:2)

我的第一次尝试是将SimpleJdbcCall包裹在DAOInfo内,以保持API完全相同,并在内部使用新功能。

如果你想迁移到Spring,那么我建议考虑使用POJO而不是30参数方法,再加上JPA注释来将它们映射到SQL。 JPA 2.1 includes support for stored procedures

使用POJO有许多优点。旧代码:

 foo.method("hello","what","is","this",....);

新代码:

 UpdateFoo foo = new UpdateFoo();
 foo.setName("hello");
 foo.setQuestion("what");
 foo.setVerb("is");
 foo.setTarget("this");
 foo.execute();

- &GT;你将停止混合参数。

现在,某些流程可以实现自动化。 You can use the standalone Eclipse Java compiler to parse Java code。这为您提供了抽象语法树(AST) - 您可以分析和转换的Java代码的内存模型。重构使用它将一种形式的代码转换为另一种形式。

这种方法功能强大,但需要一些时间才能习惯使用AST。

另一种方法是使用正则表达式。您将获得更快的成功,但它们只能解析递归代码。如果你使用正则表达式,那么我建议用Java编写转换器:

  1. 您有一个功能强大的IDE来编辑和调试它们
  2. 您已经了解Java(您不必学习编辑器的宏语言)
  3. 您可以使用各种框架让您的生活更简单
  4. 如果你想要一个非常强大的解决方案,请看看jOOQ。 jOOQ 3.0 has support to call stored procedures代码生成器将为您构建大部分代码。

答案 1 :(得分:1)

这种变化远非微不足道 - 编写正确的解析器或正则表达式或宏或......可能比通过代码并手动进行更改需要更多的时间。

特别是,如果有一些注释,正则表达式将无法轻松工作,您将需要实际解析代码......

然而,一个正则表达式可能会处理你需要的70%,你可以手动完成其余的工作。

例如:

DAOInfo info = _newDAOInfo();
info.setProperty(PROP_PROCNAME, "sp_name");

变为:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("sp_name");
jdbcCall.setReturnValueRequired(true);

在Netbeans中,您可以使用以下正则表达式((?s)允许多行匹配 - 您可以使用\n手动插入换行符或使用与我下面示例中相同的缩进字段):

  • 查找

    (?s)DAOInfo\s+(.*?)\s*=\s*_newDAOInfo\(\);(\s+)(.*?)\.setProperty\(PROP_PROCNAME\, \"(.*?)\"\);
    
  • 取代:

    SimpleJdbcCall jdbcCall = new SimpleJdbcCall (dataSource).withProcedureName("$4");$2jdbcCall.setReturnValueRequired(true);
    

您可能需要清除格式。