1 package io.swagger.v3.core.util;
2
3 import com.fasterxml.jackson.core.JsonParser;
4 import com.fasterxml.jackson.core.JsonProcessingException;
5 import com.fasterxml.jackson.databind.DeserializationContext;
6 import com.fasterxml.jackson.databind.JsonDeserializer;
7 import com.fasterxml.jackson.databind.JsonNode;
8 import com.fasterxml.jackson.databind.node.ObjectNode;
9 import io.swagger.v3.oas.models.PathItem;
10 import io.swagger.v3.oas.models.callbacks.Callback;
11
12 import java.io.IOException;
13 import java.util.Iterator;
14 import java.util.LinkedHashMap;
15 import java.util.Map;
16
17 public class CallbackDeserializer extends JsonDeserializer<Callback> {
18     @Override
19     public Callback deserialize(JsonParser jp, DeserializationContext ctxt)
20             throws IOException, JsonProcessingException {
21         Callback result = new Callback();
22         JsonNode node = jp.getCodec().readTree(jp);
23         ObjectNode objectNode = (ObjectNode)node;
24         Map<String, Object> extensions = new LinkedHashMap<>();
25         for (Iterator<String> it = objectNode.fieldNames(); it.hasNext(); ) {
26             String childName = it.next();
27             JsonNode child = objectNode.get(childName);
28             // if name start with `x-` consider it an extesion
29             if (childName.startsWith("x-")) {
30                 extensions.put(childName, Json.mapper().convertValue(child, Object.class));
31             } else if (childName.equals("$ref")) {
32                 result.$ref(child.asText());
33             } else {
34                 result.put(childName, Json.mapper().convertValue(child, PathItem.class));
35             }
36         }
37         if (!extensions.isEmpty()) {
38             result.setExtensions(extensions);
39         }
40         return result;
41     }
42 }
43