Java:具有外部源的netbeans上源代码自动完成的方法

时间:2014-09-03 15:46:37

标签: java netbeans autocomplete static-analysis

首先,我不确定标题或标签是否正确。如果没有,请有人纠正我

我的问题是,是否有任何工具或方法可以使用来自外部源的项目创建自动完成列表,让netbeans解析它并在出现任何错误时发出警告。

- 问题:我使用JDBC,我想以某种方式模拟我的所有模式,表和列,以便netbeans可以解析它并在我有任何错误时警告我。例如,正常使用JDBC我会有一个函数:

ResultSet execSelect( String cols, String table ){
     return statement.executeQuery("SELECT "+cols+" FROM "+table); }

问题是有人应该确切知道传递正确字符串的可用参数是什么。

我希望netbeans以某种方式向我展示一个包含所有可用选项的自动完成列表。

PS。我在构建Web应用程序时遇到了完全相同的问题,我想以某种方式获取外部资源的所有路径,如图像,.js文件,.css文件等。

- 到目前为止的想法
到目前为止,我的想法是将一个带有公共静态最终String变量的.java文件与一些嵌套的静态类放在一起,以便我可以从任何地方访问。例如:

DatabaseModel.MySchema.TableName1.ColumnName2

将是一个String变量,其中包含' ColumnName2'列和' TableName1'表。这将有助于我自动完成,但问题是没有类型检查。换句话说,有人可以使用任何字符串,全局定义或不作为表和作为不正确的列。我想以某种方式使用嵌套枚举来涵盖关于类型检查的这些案例,但我不确定在任何情况下这是否都是一个好的解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后我想出了一个"脚本"连接到mysql获取所有元数据(每个模式的每个表的每一列)并创建一个带有预定义类的java文件和描述模型的字符串。例如:
- 如果要从模式S1中的表T1中获取列C1的名称,则应键入DatabaseModel.S1.T1.C1._,这是一个带有列名的公共静态最终字符串。
- 如果你想从模式S2中获取表T2,你可以输入DatabaseModel.S2.T2,这是一个实现DatabaseTable接口的类。所以函数:execSelect可以将DatabaseTable和DatabaseColumn作为参数。

这是代码(未经测试,但我认为这个想法很明确)。

public static void generateMysqlModel(String outputFile) throws IOException, SQLException{
    //** Gather the database model
    // Maps a schema -> table -> column
    HashMap<String,HashMap<String,ArrayList<String>>> model = 
            new HashMap<String,HashMap<String,ArrayList<String>>>();

    openDatabase();
    Connection sqlConn = DriverManager.getConnection(url, username, password);
    DatabaseMetaData md = sqlConn.getMetaData();

    ResultSet schemas = md.getSchemas(); // Get schemas
    while( schemas.next() ){ // For every schema
        String schemaName = schemas.getString(1);
        model.put( schemaName, new HashMap<String,ArrayList<String>>() );
        ResultSet tables = md.getTables(null, null, "%", null);  // Get tables
        while (tables.next()) { // For every table
            String tableName = tables.getString(3);
            model.get(schemaName).put( tableName, new ArrayList<String>() );
            // Get columns for table
            Statement s = sqlConn.createStatement();  // Get columns
            s.execute("show columns in "+tables.getString(3)+";");
            ResultSet columns = s.getResultSet();
            while( columns.next() ){ // For every column
                String columnName = columns.getString(1);
                model.get(schemaName).get(tableName).add( columnName );
            }
        }
    }

    closeDatabase();


    //** Create the java file from the collected model
    new File(outputFile).createNewFile();
    BufferedWriter bw = new BufferedWriter( new FileWriter(outputFile) ) ;

    bw.append( "public class DatabaseModel{\n" );
    bw.append( "\tpublic interface DatabaseSchema{};\n" );
    bw.append( "\tpublic interface DatabaseTable{};\n" );
    bw.append( "\tpublic interface DatabaseColumn{};\n\n" );
    for( String schema : model.keySet() ){
        HashMap<String,ArrayList<String>> schemaTables = model.get(schema);
        bw.append( "\tpublic static final class "+schema+" implements DatabaseSchema{\n" );
        //bw.append( "\t\tpublic static final String _ = \""+schema+"\";\n" );
        for( String table : schemaTables.keySet() ){
            System.out.println(table);
            ArrayList<String> tableColumns = schemaTables.get(table);
            bw.append( "\t\tpublic static final class "+table+" implements DatabaseTable{\n" );
            //bw.append( "\t\t\tpublic static final String _ = \""+table+"\";\n" );
            for( String column : tableColumns ){
                System.out.println("\t"+column);
                bw.append( "\t\t\tpublic static final class "+column+" implements DatabaseColumn{"
                        + " public static final String _ = \""+column+"\";\n"
                        + "}\n" );
            }
            bw.append( "\t\t\tpublic static String val(){ return this.toString(); }" );
            bw.append( "\t\t}\n" );
        }
        bw.append( "\t\tpublic static String val(){ return this.toString(); }" );
        bw.append( "\t}\n" );
    }
    bw.append( "}\n" );

    bw.close();
}

PS。对于Web应用程序中的资源案例,我猜有人可以从&#34;资源&#34;中递归获取所有文件。文件夹并填写模型变量。这将创建一个带有文件路径的java文件。在这种情况下,接口可以是文件类型或任何其他&#34;文件视图&#34;你想要的。

我还认为在任何情况下从XML文件创建.java文件会很有用,所以任何人都可以在xml文件中为此目的创建某种定义。 如果有人实现了类似的东西,可以在这里发布。

欢迎任何意见/改进。