private void discoverSchemaField()

in hollow-jsonadapter/src/main/java/com/netflix/hollow/jsonadapter/discover/HollowJsonAdapterSchemaDiscoverer.java [90:153]


    private void discoverSchemaField(JsonParser parser, JsonToken token, String fieldName, HollowDiscoveredSchema schema) throws IOException {

        if(token != JsonToken.FIELD_NAME) {
            switch(token) {
                case START_ARRAY:
                    String listName = schemaNamer.subCollectionName(schema.schemaName, "ArrayOf", fieldName);
                    String elementName = schemaNamer.subObjectName(schema.schemaName, "", fieldName);
                    if (isDebug) System.out.println(String.format("\t ARR[START] token=%s schemaName=%s fieldName=%s listName=%s elementName=%s", token, schema.schemaName, fieldName, listName, elementName));

                    discoveredSchema(listName, DiscoveredSchemaType.LIST, elementName);
                    schema.addField(fieldName, FieldType.REFERENCE, listName);

                    HollowDiscoveredSchema elementSchema = discoveredSchema(elementName, DiscoveredSchemaType.OBJECT, null);
                    discoverSubArraySchemas(parser, elementSchema);
                    if (isDebug) System.out.println(String.format("\t ARR[END] token=%s schemaName=%s fieldName=%s listName=%s elementName=%s elementSchema=%s", token, schema.schemaName, fieldName, listName, elementName, elementSchema));

                    break;
                case START_OBJECT:
                    String subObjectName = schemaNamer.subObjectName(schema.schemaName, "", fieldName);
                    //if (isDebug) System.out.println("\t\t [MAP CHECK] subObjectName=" + subObjectName + "\t" + mapTypes.contains(subObjectName) + "\t" + mapTypes);
                    if(mapTypes.contains(subObjectName)) {
                        String subMapName = schemaNamer.subCollectionName(schema.schemaName, "MapOf", fieldName);
                        if (isDebug) System.out.println(String.format("\t MAP[START] token=%s schemaName=%s fieldName=%s subMapName=%s subObjectName=%s", token, schema.schemaName, fieldName, subMapName, subObjectName));

                        discoveredSchema(subMapName, DiscoveredSchemaType.MAP, subObjectName);
                        schema.addField(fieldName, FieldType.REFERENCE, subMapName);

                        HollowDiscoveredSchema valueSchema = discoveredSchema(subObjectName, DiscoveredSchemaType.OBJECT, null);
                        discoverSubMapSchemas(parser, valueSchema);
                        if (isDebug) System.out.println(String.format("\t MAP[END] token=%s schemaName=%s fieldName=%s subMapName=%s subObjectName=%s valueSchema=%s", token, schema.schemaName, fieldName, subMapName, subObjectName, valueSchema));
                    } else {
                        if (isDebug) System.out.println(String.format("\t OBJ[START] token=%s schemaName=%s fieldName=%s subObjectName=%s", token, schema.schemaName, fieldName, subObjectName));
                        HollowDiscoveredSchema subObjectSchema = discoveredSchema(subObjectName, DiscoveredSchemaType.OBJECT, null);
                        if (fieldName != null) schema.addField(fieldName, FieldType.REFERENCE, subObjectName);

                        discoverSchemas(parser, subObjectSchema);
                        if (isDebug) System.out.println(String.format("\t OBJ[END] token=%s schemaName=%s fieldName=%s subObjectName=%s subObjectSchema=%s", token, schema.schemaName, fieldName, subObjectName, subObjectSchema));
                    }

                    break;
                case VALUE_NUMBER_INT:
                    if (isDebug) System.out.println(String.format("\t FIELD token=%s schemaName=%s fieldName=%s value=%s", token, schema.schemaName, fieldName, parser.getLongValue()));
                    schema.addField(fieldName, FieldType.LONG);
                    break;
                case VALUE_NUMBER_FLOAT:
                    if (isDebug) System.out.println(String.format("\t FIELD token=%s schemaName=%s fieldName=%s value=%s", token, schema.schemaName, fieldName, parser.getDoubleValue()));
                    schema.addField(fieldName, FieldType.DOUBLE);
                    break;
                case VALUE_NULL:
                    if (isDebug) System.out.println(String.format("\t FIELD token=%s schemaName=%s fieldName=%s", token, schema.schemaName, fieldName));
                    break;
                case VALUE_STRING:
                    if (isDebug) System.out.println(String.format("\t FIELD token=%s schemaName=%s fieldName=%s value=%s", token, schema.schemaName, fieldName, parser.getValueAsString()));
                    schema.addField(fieldName, FieldType.STRING);
                    break;
                case VALUE_FALSE:
                case VALUE_TRUE:
                    if (isDebug) System.out.println(String.format("\t FIELD token=%s schemaName=%s fieldName=%s value=%s", token, schema.schemaName, fieldName, parser.getBooleanValue()));
                    schema.addField(fieldName, FieldType.BOOLEAN);
                    break;
                default:
            }
        }
    }