0

GroovyとFreemarker(特にGFreeMarker)を使用してコードを生成したい-ストアドプロシージャを呼び出すためのJavaラッパーを生成したい。したがって、次のステートメントを使用してORACLEにクエリを実行します。

select PACKAGE_NAME, OBJECT_NAME, POSITION, ARGUMENT_NAME, DATA_TYPE, IN_OUT
from USER_ARGUMENTS

このデータは非正規化され(各パラメーターは1行にあります)、階層化されています。

- Package (PACKAGE_NAME)
  - Function (OBJECT_NAME)
    - Arguments (ARGUMENT_NAME, DATA_TYPE, IN_OUT)

それを階層構造に格納してFreemarkerにフィードし、コードを生成したいと思います。つまり、すべての行について、新しいPackageインスタンスを作成するか、既存のonを選択してから、新しいFunctionインスタンスを作成するか、既存のインスタンスを選択して新しい引数を作成する必要があります。

これはObjectGraphBuilderを介して実行できますか、それともマップやリストと組み合わせて使用​​する必要がありますか?
これは「グルーヴィーな方法」でどのように行われますか?ご協力いただきありがとうございます!

4

1 に答える 1

0

Groovyであろうとなかろうと、私は次のようにそれを行いました。より良い答えを提供してください。私はそれを受け入れます!

まず、次の構造を構築します。

Map packages = new LinkedHashMap()  

class Package {
    String name
    Map functions = [:]
}

class Function {
    String name
    String returnType
    boolean isFunction = false
    Map parameters = [:]
}

class Parameter {
    String name
    String dataType
    String inOut
}

それから私はそれを読んだ

sql.eachRow("""\
    select PACKAGE_NAME, OBJECT_NAME, POSITION, ARGUMENT_NAME, DATA_TYPE, IN_OUT
    from USER_ARGUMENTS
    order by PACKAGE_NAME, OBJECT_NAME, POSITION""")
{
    // create or get package
    def thePackage = packages[it.PACKAGE_NAME ?: '']
    if (thePackage == null) {
        thePackage = new Package(name : it.PACKAGE_NAME ?: '')
        packages[it.PACKAGE_NAME ?: ''] = thePackage
    }

    // create or get function
    def theFunction = thePackage.functions[it.OBJECT_NAME ?: '']
    if (theFunction == null) {
        theFunction = new Function(name: it.OBJECT_NAME ?: '')
        thePackage.functions[it.OBJECT_NAME ?: ''] = theFunction
    }


    // Position 0 is the return value
    if (it.POSITION == 0) {
        theFunction.isFunction = true
        theFunction.returnType = it.DATA_TYPE
    }
    else {
        // create the argument 
        def theParameter = new Parameter(
            name: it.ARGUMENT_NAME, dataType: it.DATA_TYPE, inOut: it.IN_OUT)
        theFunction.parameters[it.ARGUMENT_NAME ?: ''] = theParameter
    }
}
于 2012-12-13T09:00:06.327 に答える