in hollow-jsonadapter/src/main/java/com/netflix/hollow/jsonadapter/HollowJsonAdapterPrimaryKeyFinder.java [86:192]
private void addObjectField(JsonParser parser, JsonToken token, HollowObjectSchema schema, String fieldName, StringBuilder currentFieldPath) throws IOException {
if(token != JsonToken.FIELD_NAME) {
int fieldPosition = schema.getPosition(fieldName);
if(fieldPosition == -1) {
skipObjectField(parser, token);
} else {
int parentFieldPathLength = currentFieldPath.length();
if(parentFieldPathLength > 0)
currentFieldPath.append(".");
currentFieldPath.append(fieldName);
Integer keyFieldPosition = keyFieldPathPositions.get(currentFieldPath.toString());
switch(token) {
case START_ARRAY:
skipSubArray(parser);
break;
case START_OBJECT:
String referencedType = schema.getReferencedType(fieldName);
HollowSchema referencedSchema = hollowSchemas.get(referencedType);
if(referencedSchema.getSchemaType() == SchemaType.OBJECT)
addObject(parser, (HollowObjectSchema)referencedSchema, currentFieldPath);
else
skipObject(parser);
break;
case VALUE_FALSE:
case VALUE_TRUE:
case VALUE_NUMBER_INT:
case VALUE_NUMBER_FLOAT:
case VALUE_STRING:
switch(schema.getFieldType(fieldPosition)) {
case BOOLEAN:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Boolean.valueOf(parser.getBooleanValue());
break;
case INT:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Integer.valueOf(parser.getIntValue());
break;
case LONG:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Long.valueOf(parser.getLongValue());
break;
case DOUBLE:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Double.valueOf(parser.getDoubleValue());
break;
case FLOAT:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Float.valueOf(parser.getFloatValue());
break;
case STRING:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = parser.getValueAsString();
break;
case REFERENCE:
if(keyFieldPosition != null)
throw new IllegalStateException("Key elements must not be REFERENCE");
HollowObjectSchema subSchema = (HollowObjectSchema) hollowSchemas.get(schema.getReferencedType(fieldPosition));
currentFieldPath.append(".").append(subSchema.getFieldName(0));
keyFieldPosition = keyFieldPathPositions.get(currentFieldPath.toString());
if(keyFieldPosition != null) {
switch(subSchema.getFieldType(0)) {
case BOOLEAN:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Boolean.valueOf(parser.getBooleanValue());
break;
case INT:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Integer.valueOf(parser.getIntValue());
break;
case LONG:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Long.valueOf(parser.getLongValue());
break;
case DOUBLE:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Double.valueOf(parser.getDoubleValue());
break;
case FLOAT:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = Float.valueOf(parser.getFloatValue());
break;
case STRING:
if(keyFieldPosition != null)
keyElementArray[keyFieldPosition.intValue()] = parser.getValueAsString();
break;
case REFERENCE:
throw new IllegalStateException("Key elements must not be REFERENCE");
default:
}
}
default:
}
case VALUE_NULL:
break;
default:
}
currentFieldPath.setLength(parentFieldPathLength);
}
}
}