openapi-generatorは、javaのmavenプロジェクトなのですが、
どういうわけか、そのままではコンパイルができなかったので、
その時のコンパイルできるようにするまでのコツをメモしておきます。
mavenがインストールされていること
java11あたりがインストールされていること、おそらくopenapi-generatorはJava8が想定されている感じがします、理由はビルドの制限がjava11とかになると、ルールが厳しくなってエラー扱いになるのが、ビルドの処理に含まれているからです。
Javaのパスを環境変数のJAVA_HOMEに通しておきましょう。
pom.xmlの
failOnWarnings
をfalseにします。
つぎの指定をいれたほうがいいかもしれません
MAVEN_OPTS=--illegal-access=permit
ソースコードで標準出力とかにダンプしたりすると、解析が楽になったりするじゃないですか、
ところが、そういうコードがあると、ジェネレータのビルドのチェックに引っかかってコンパイルエラーになるようにしくまれているのです。
誰得?な感じですね。
たったの1行でも、
System.out.println("hoge");
とでも書こうものなら
ArchUnitRulesTest?に記載されたルールのテストにて、以下のビルドエラーメッセージがでます。
Rule 'no classes should access standard streams' was violated
リリース時にはありがたいのだが、解析するには邪魔なライブラリという感想です。
https://www.freecodecamp.org/news/java-archunit-testing-the-architecture-a09f089585be/
なので、ArchUnitRulesTest?のテストはDisabledにしておいたほうがいいかもしれないですね。
改造する箇所は、モデルクラスについてであれば、
postProcessAllModels(Map<String, Object> objs)
です。
objsにはyaml定義直下の要素の配列が格納されているので、以下のfor文で要素を変数に入れてあげます。
for (Map.Entry<String, Object> entry: objs.entrySet()
さらに、ここにはmodelが複数格納されているので、以下のようにして、modelを1つづつ取り扱えるようにします。
Map<String, Object> inner = (Map<String, Object>) entry.getValue(); List<Map<String, Object>> models = (List<Map<String, Object<<) inner.get("models"); for(Map<String, Object> mo: models)
これを1つのモデルごとの処理単位だったら、もう少し扱いやすくなるので、ここで次のメソッドを入れてあげましょう。
ここまで、汎用的なMapでしたが、ここまでくると、次のようにしてCodeGenerator?独自のクラスのインスタンスとして取得できます。
CodegenModel cm = (CodegenModel) mo.get("model");
上記の変数moは、Mapでして、ここに独自の変数をkey,Valueで登録することによって、テンプレートのmustacheで変数名として値を取得したり、boolean型であれば、テンプレートの制御ができるよになるのです。
ちなみにboolean型ではダメで、Boolean型で登録する必要があります。
model内の変数について扱いたい場合は、上記のCodegenModel?の.varsをつかいます。
for (CodegenProperty cp : cm.vars)
とします、注意点としては、ジェネリック型の場合は以下のパラメータをみて判定処理を入れるとよいでしょう。
とくにcp.complexTypeが指定されていない場合は、Object型として見てあげたほうがいい場合があります。