On Thu, Mar 10, 2016 at 1:26 AM, tomb50 <[email protected]> wrote:
> Hi,
>
> I have encountered an issue relating to the Swagger component of Camel, I
> believe it is related to the RestModelConvertor that is used when creating
> the Swagger model from the Rest API model from Camel.
>
> When a model that is directly referenced (e.g. an out-type) is added to the
> Swagger.definitions map by that method, it is decorated with the extension
> of "x-className". Any models that are subsequently referenced from the
> original model are also added to the definitions map, undecorated.
>
> Definitions needs to be decorated as such in order to be returned later as
> ReferenceProperties in RestSwaggerReader.modelTypeAsRef(), otherwise they
> are returned as StringProperties.
>
> The issue seems to that there is nothing preventing a decorated element in
> the Swagger.definitions map from being overwritten by an undecorated version
> of the same class, if the REST API Verbs in Camel is ordered in a certain
> way.
>
> E.g.
>
> API 1 returns Model A, which references Model B.
> API 2 returns Model B.
>
> Case 1 (no issue):
>
> API 1 is loaded first.
> Model A is added to Swagger.definition map decorated with "x-className",
> Model B is added to the definition map undecorated.
> API 2 is then loaded.
> Model B is then decorated with "x-classname" and replaces the previous Model
> B element in the definition map.
>

Yeah sounds better to keep existing. You are welcome to work on a PR

> All good
>
> Case 2 (the issue):
>
> Consider that API 2 is loaded before API one, then after both API's are
> loaded the definitions map contains a Decorated Model A but an undecorated
> Model B.
>
> Then when the RestSwaggerReader tries to set the schema on the response
> element of API2 (towards the end of doParseVerbs()), it fails to find Model
> B as a reference Property and adds it as a StringProperty, so the Model does
> not show in Swagger UI and broke our validation tests.
>
> We have many existing APIs and Models, all working perfectly, and I came
> across this specific scenario today. I would appreciate If someone was able
> to verify if this indeed is a defect or I am mistaken in my understanding.
>
> If this is a bug, would a suitable fix to be to check the definition map for
> an existing Model and NOT replace it, if it is decorated with the
> "x-className" extension? Happy to get involved with a Pull request if
> required.
>
> Thanks
> Tom
>
> For ease: below is the code in question
>
> ---------------------------------------------
> RestSwaggerReader.class
>
>   private void appendModels(Class clazz, Swagger swagger) {
>         RestModelConverters converters = new RestModelConverters();
>         final Map<String, Model> models = converters.readClass(clazz);
>         for (Map.Entry<String, Model> entry : models.entrySet()) {
>             swagger.model(entry.getKey(), entry.getValue());
>         }
>     }
>
>
> -----------------------------------------------------------
> RestModelConverters.class
>
>     public Map<String, Model> readClass(Class clazz) {
>         String name = clazz.getName();
>         Map<String, Model> resolved = super.read(clazz);
>         if (resolved != null) {
>             for (Model model : resolved.values()) {
>                 // enrich with the class name of the model
>                 model.getVendorExtensions().put("x-className", new
> StringProperty(name));
>             }
>
>             // read any extra using read-all
>             Map<String, Model> extra = super.readAll(clazz);
>             if (extra != null) {
>                 for (Map.Entry<String, Model> entry : extra.entrySet()) {
>                     if (!resolved.containsKey(entry.getKey())) {
>                         resolved.put(entry.getKey(), entry.getValue());
>                     }
>                 }
>             }
>         }
>         return resolved;
>     }
>
>
>
>
>
>
>
> --
> View this message in context: 
> http://camel.465427.n5.nabble.com/Bug-in-RestSwaggerReader-appendModels-need-confirmation-tp5778821.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to