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.DeserializationFeature;
7 import com.fasterxml.jackson.databind.JsonDeserializer;
8 import com.fasterxml.jackson.databind.JsonNode;
9 import com.fasterxml.jackson.databind.ObjectReader;
10 import io.swagger.v3.oas.models.parameters.CookieParameter;
11 import io.swagger.v3.oas.models.parameters.HeaderParameter;
12 import io.swagger.v3.oas.models.parameters.Parameter;
13 import io.swagger.v3.oas.models.parameters.PathParameter;
14 import io.swagger.v3.oas.models.parameters.QueryParameter;
15
16 import java.io.IOException;
17
18 public class ParameterDeserializer extends JsonDeserializer<Parameter> {
19     @Override
20     public Parameter deserialize(JsonParser jp, DeserializationContext ctxt)
21             throws IOException, JsonProcessingException {
22         Parameter result = null;
23
24         JsonNode node = jp.getCodec().readTree(jp);
25         JsonNode sub = node.get("$ref");
26         JsonNode inNode = node.get("in");
27
28         if (sub != null) {
29             result = new Parameter().$ref(sub.asText());
30         } else if (inNode != null) {
31             String in = inNode.asText();
32
33             ObjectReader reader = null;
34
35             if ("query".equals(in)) {
36                 reader = Json.mapper().readerFor(QueryParameter.class);
37             } else if ("header".equals(in)) {
38                 reader = Json.mapper().readerFor(HeaderParameter.class);
39             } else if ("path".equals(in)) {
40                 reader = Json.mapper().readerFor(PathParameter.class);
41             } else if ("cookie".equals(in)) {
42                 reader = Json.mapper().readerFor(CookieParameter.class);
43             }
44             if (reader != null) {
45                 result = reader.with(DeserializationFeature.READ_ENUMS_USING_TO_STRING).readValue(node);
46             }
47         }
48
49         return result;
50     }
51 }
52