private void addObjectField()

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);
            }
        }
    }