Swagger Code Generator (swagger-codegen) の server stub の レスポンスが empty object になるのなんで？

## 概要

[swagger-codegen の server stub](https://github.com/swagger-api/swagger-codegen#to-build-a-server-stub) を使ってるんだけど、
ちょっと複雑な定義をすると、どうもレスポンスが empty object `{}` になってしまう。

下記の記事もあるので、自分だけの問題ではない様子。
[swagger スタブのresponseが空になる問題調査メモ - Qiita](https://qiita.com/snymtmk0318/items/1ffccff9a072751de5b9) 

これはいったいなんなんだという調査メモ。
間違ってたらツッコミお願いします。

## 調査結果まとめ

* `$ref` の参照先が下記だとダメ
    * `"type": "array"`
    * `$ref`
    * `allOf`

## 調査メモ

### ExampleGenerator

[swagger-codegen/ExampleGenerator.java](https://github.com/swagger-api/swagger-codegen/blob/v2.2.3/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/ExampleGenerator.java)

こやつが example の値を生成しているようなので、こやつを見ていく。

自分の場合は、 `$ref` を多用していたので下記の箇所に処理が走っていた。

>
```java
        } else if (property instanceof RefProperty) {
            String simpleName = ((RefProperty) property).getSimpleRef();
            logger.debug("Ref property, simple name: {}", simpleName);
            Model model = examples.get(simpleName);
            if (model != null) {
                return resolveModelToExample(simpleName, mediaType, model, processedModels);
            }
            logger.warn("Ref property with empty model.");
```
> https://github.com/swagger-api/swagger-codegen/blob/049b1b2bcc904e1179a0e9b11124ed8fa0e3be2e/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/ExampleGenerator.java#L176-L183

で下記の `model instanceof ModelImpl` この条件に当てはまらず、空になっていた模様。

> ```java
    private Object resolveModelToExample(String name, String mediaType, Model model, Set<String> processedModels) {
        if (processedModels.contains(name)) {
            return "";
        }
        if (model instanceof ModelImpl) {
            processedModels.add(name);
            ModelImpl impl = (ModelImpl) model;
            Map<String, Object> values = new HashMap<>();
            logger.debug("Resolving model '{}' to example", name);
            if (impl.getExample() != null) {
                logger.debug("Using example from spec: {}", impl.getExample());
                return impl.getExample();
            } else if (impl.getProperties() != null) {
                logger.debug("Creating example from model values");
                for (String propertyName : impl.getProperties().keySet()) {
                    Property property = impl.getProperties().get(propertyName);
                    values.put(propertyName, resolvePropertyToExample(mediaType, property, processedModels));
                }
            }
            return values;
        }
        return "";
```
> https://github.com/swagger-api/swagger-codegen/blob/049b1b2bcc904e1179a0e9b11124ed8fa0e3be2e/modules/swagger-codegen/src/main/java/io/swagger/codegen/examples/ExampleGenerator.java#L204-L228

じゃあこの時の model は何のインスタンスになってたか調べたら `io.swagger.models.ComposedModel` になっていた。

まぁだから `$ref` の参照先が `ComposedModel` だとダメらしい。

### `ComposedModel` はなんじゃらほい

https://github.com/swagger-api/swagger-parser/blob/f9c9498fddafb18dcfc42d373a158ae8caf095a7/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java#L881 を見る限り、 `allOf` を使ったやつだと思う。

あとさきのソースコードを見ると、
`ModelImpl` 以外に `RefModel`, `ArrayModel` も返すので、ココらへんのやつだとやっぱり empty object になってしまうっぽい。