top / index / prev / next / target / source

2005-08-17 diary: Java: blancoIgを用いたJavaソースコード生成シンプルサンプル

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: blancoIgを用いたJavaソースコード生成シンプルサンプル

blanco Frameworkの根っこのライブラリである blancoIgを用いた Javaソースコード自動生成のシンプルサンプルを作成しました。

blancoIgを用いた Javaソースコード生成シンプルサンプル

blancoIgを用いた Javaソースコード生成シンプルサンプルを作りました。

依存するライブラリ

/*
 * すごく単純な blancoIg利用サンプル 
 * Copyright (C) 2005 Tosiki Iga
 */
import java.io.IOException;

import blanco.ig.expander.ClassExpander;
import blanco.ig.expander.Type;
import blanco.ig.expander.Value;
import blanco.ig.expander.field.PrivateField;
import blanco.ig.expander.method.MethodExpander;
import blanco.ig.generator.GeneratorSetting;
import blanco.ig.generator.ImplementGenerator;
import blanco.ig.service.ServiceClass;

/**
 * すごく単純な blancoIgの利用サンプルです。
 * 
 * @author Tosiki Iga
 */
public class BlancoIgSimpleGenerator {

    public static void main(String[] args) {
        // パッケージ名やクラス名を指定します。
        ClassExpander classExpander = new ClassExpander(new Type("my.pkg",
                "MyClass")) {
            protected void expandClassStruct() {
                addFileComment("はじめての blancoIg動作サンプル<br>");
                addFileComment("このサンプルは機械的に生成されました。");
                getJavaDoc().addLine("はじめてのクラスのサンプル<br>");
                getJavaDoc().addLine("このサンプルはblancoIgにより機械的に自動生成されています。");
                getJavaDoc().addLine("");
                getJavaDoc().addLine("@version 2005.08.16");
                getJavaDoc().addLine("@author Tosiki Iga");

                // フィールド変数を宣言します。
                PrivateField field1 = new PrivateField(new Type(
                        "java.sql.Connection"), "Connection");
                field1.getJavaDoc().addLine("フィールド変数の例となります。<br>");
                field1.getJavaDoc().addLine("ただしこのサンプルでは利用されていませんね…");
                addField(field1);

                addMethod(new MethodExpander("myMethod") {
                    // メソッドのシグニチャ指定
                    public void setupSignature() {
                        getJavaDoc().addLine("はじめてのメソッド");
                        getJavaDoc().addParameter("argInt", "単なる引数です");
                        addArgument(new Value(int.class, "argInt"));
                        getJavaDoc().addParameter("argString", "単なる引数2です");
                        addArgument(new Value(String.class, "argString"));
                        getJavaDoc().addParameter("argString", "文字列渡しによる引数3です");
                        addArgument(new Value(new Type("java.lang.String"),
                                "argString3"));
                        getJavaDoc().addReturn("このメソッドの実行結果です");
                        setReturnType(new Type(int.class));
                        getJavaDoc().addException(
                                new Type("java.sql.SQLException"), "データベース例外");
                        addException(new Type("java.sql.SQLException"));
                    }

                    // メソッドの実装
                    public void implement() {
                        String escapedQuery = "はろう\"わーるど\"".replaceAll("\"",
                                "\\\\\"");
                        getData().addLine(
                                "System.out.println(\"" + escapedQuery
                                        + "\" + argString);");

                        getData().addLine("return argInt;");
                    }
                });

                addMethod(new MethodExpander("main") {
                    protected boolean isStatic() {
                        return true;
                    }

                    // メソッドのシグニチャ指定
                    public void setupSignature() {
                        setFinal(true);
                        getJavaDoc().addLine("はじめてのクラスのメインメソッド");
                        getJavaDoc().addLine("メインメソッドは このように実装されます。");
                        getJavaDoc().addParameter("args", "メインメソッドへの引数。");
                        addArgument(new Value(new Type("java.lang.String[]"),
                                "args"));
                    }

                    // メソッドの実装
                    public void implement() {
                        getData().addLine("try {");
                        getData().addLine(
                                "new MyClass().myMethod(1, \"引数の値\", \"3\");");
                        getData().addLine("} catch(SQLException ex) {");
                        getData().addLine("ex.printStackTrace();");
                        getData().addLine("}");
                    }
                });
            }
        };

        // 実際にJavaソースコードを生成します。
        GeneratorSetting setting = new GeneratorSetting();
        // 出力先ディレクトリを設定します。
        setting.setWorkDirectory("blanco");
        ImplementGenerator implementGenerator = new ImplementGenerator(
                new ServiceClass("DummyService"), setting);
        // 作成したクラスを登録します。
        implementGenerator.addMain(classExpander);
        try {
            // 実際にソースコード生成を実行します。
            implementGenerator.generate();
            System.out.println("ソースコード生成が完了しました。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

サンプルを動作させてみて、実際にJavaソースコードが生成されるのは、ふだん blancoDbなどで動作は知っているとはいえ、とても印象的でした。

blancoIgを利用するソースコードを、私は初めてスクラッチから作成しました。フラットに記述したら結構シンプルに記述できることを知り、嬉しかったです。

書籍やひげ剃りの購入

世間のニュースから


この日記について