#contents

* 趣旨 [#e2d3c692]

openapi-generatorは、javaのmavenプロジェクトなのですが、

どういうわけか、そのままではコンパイルができなかったので、

その時のコンパイルできるようにするまでのコツをメモしておきます。


* 前提条件 [#eec91e01]
mavenがインストールされていること

java11あたりがインストールされていること、おそらくopenapi-generatorはJava8が想定されている感じがします、理由はビルドの制限がjava11とかになると、ルールが厳しくなってエラー扱いになるのが、ビルドの処理に含まれているからです。

Javaのパスを環境変数のJAVA_HOMEに通しておきましょう。


* コツ [#k5255406]
pom.xmlの
 failOnWarnings
をfalseにします。

つぎの指定をいれたほうがいいかもしれません
 MAVEN_OPTS=--illegal-access=permit


** Openapi-generatorを解析しづらくしている技術 [#cebc400b]
ソースコードで標準出力とかにダンプしたりすると、解析が楽になったりするじゃないですか、

ところが、そういうコードがあると、ジェネレータのビルドのチェックに引っかかってコンパイルエラーになるようにしくまれているのです。

誰得?な感じですね。

*** どんなエラーがでるのか? [#x2cf06c1]

たったの1行でも、
 System.out.println("hoge");
とでも書こうものなら

ArchUnitRulesTestに記載されたルールのテストにて、以下のビルドエラーメッセージがでます。

 Rule 'no classes should access standard streams' was violated

*** 小さな親切大きなお世話なテストライブラリ [#gd7b9950]

リリース時にはありがたいのだが、解析するには邪魔なライブラリという感想です。

https://www.freecodecamp.org/news/java-archunit-testing-the-architecture-a09f089585be/

なので、ArchUnitRulesTestのテストはDisabledにしておいたほうがいいかもしれないですね。

* 改造ポイント [#jd1e206b]

改造する箇所は、モデルクラスについてであれば、
 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内の変数についても扱う [#ddc6c6d5]
model内の変数について扱いたい場合は、上記のCodegenModelの.varsをつかいます。
 for (CodegenProperty cp : cm.vars)

とします、注意点としては、ジェネリック型の場合は以下のパラメータをみて判定処理を入れるとよいでしょう。

- cp.baseName
- cp.complexType

とくにcp.complexTypeが指定されていない場合は、Object型として見てあげたほうがいい場合があります。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS