|
9 | 9 | import com.fasterxml.jackson.core.JsonProcessingException; |
10 | 10 | import com.fasterxml.jackson.databind.JsonNode; |
11 | 11 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 12 | +import com.fasterxml.jackson.databind.node.ArrayNode; |
12 | 13 | import com.fasterxml.jackson.databind.node.JsonNodeFactory; |
13 | 14 | import com.fasterxml.jackson.databind.node.ObjectNode; |
14 | 15 | import com.linkedin.avro2pegasus.events.KafkaAuditHeader; |
|
43 | 44 | import io.datahubproject.openapi.generated.OneOfEnvelopedAspectValue; |
44 | 45 | import io.datahubproject.openapi.generated.OneOfGenericAspectValue; |
45 | 46 | import io.datahubproject.openapi.generated.Status; |
| 47 | +import io.datahubproject.openapi.generated.StructuredProperties; |
46 | 48 | import java.lang.reflect.InvocationTargetException; |
47 | 49 | import java.lang.reflect.Method; |
48 | 50 | import java.util.HashMap; |
@@ -274,8 +276,47 @@ public static OneOfEnvelopedAspectValue mapAspectValue( |
274 | 276 | ENVELOPED_ASPECT_TYPE_MAP.get(aspectName); |
275 | 277 | DataMap wrapper = insertDiscriminator(aspectClass, aspect.data()); |
276 | 278 | try { |
277 | | - String dataMapAsJson = objectMapper.writeValueAsString(wrapper); |
278 | | - return objectMapper.readValue(dataMapAsJson, aspectClass); |
| 279 | + if (aspectClass.equals(StructuredProperties.class)) { |
| 280 | + return mapStructuredPropertyValues(wrapper, objectMapper); |
| 281 | + } else { |
| 282 | + String dataMapAsJson = objectMapper.writeValueAsString(wrapper); |
| 283 | + return objectMapper.readValue(dataMapAsJson, aspectClass); |
| 284 | + } |
| 285 | + } catch (JsonProcessingException e) { |
| 286 | + throw new RuntimeException(e); |
| 287 | + } |
| 288 | + } |
| 289 | + |
| 290 | + public static OneOfEnvelopedAspectValue mapStructuredPropertyValues( |
| 291 | + DataMap dataMap, ObjectMapper objectMapper) { |
| 292 | + try { |
| 293 | + String dataMapAsJson = objectMapper.writeValueAsString(dataMap); |
| 294 | + JsonNode jsonObject = objectMapper.readTree(dataMapAsJson); |
| 295 | + ArrayNode properties = (ArrayNode) jsonObject.get("properties"); |
| 296 | + |
| 297 | + if (properties.isEmpty()) { |
| 298 | + return objectMapper.readValue(dataMapAsJson, StructuredProperties.class); |
| 299 | + } |
| 300 | + |
| 301 | + properties.forEach( |
| 302 | + property -> { |
| 303 | + ArrayNode values = (ArrayNode) property.get("values"); |
| 304 | + ArrayNode newValues = JsonNodeFactory.instance.arrayNode(); |
| 305 | + values.forEach( |
| 306 | + value -> { |
| 307 | + if (value.has("string")) { |
| 308 | + newValues.add(value.get("string").textValue()); |
| 309 | + } else if (value.has("double")) { |
| 310 | + newValues.add(value.get("double").doubleValue()); |
| 311 | + } |
| 312 | + }); |
| 313 | + if (!newValues.isEmpty()) { |
| 314 | + values.removeAll(); |
| 315 | + values.addAll(newValues); |
| 316 | + } |
| 317 | + }); |
| 318 | + return objectMapper.readValue( |
| 319 | + objectMapper.writeValueAsString(jsonObject), StructuredProperties.class); |
279 | 320 | } catch (JsonProcessingException e) { |
280 | 321 | throw new RuntimeException(e); |
281 | 322 | } |
|
0 commit comments