Search in sources :

Example 1 with TypeParser

use of com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser in project connect-utils by jcustenborder.

the class Parser method parseJsonNode.

public Object parseJsonNode(Schema schema, JsonNode input) {
    checkSchemaAndInput(schema, input);
    if (null == input || input.isNull()) {
        return null;
    }
    log.trace("parseJsonNode() - schema.type() = {}", schema.type());
    Object result;
    if (Schema.Type.STRUCT == schema.type()) {
        Struct struct = new Struct(schema);
        Preconditions.checkState(input.isObject(), "struct schemas require a ObjectNode to be supplied for input.");
        log.trace("parseJsonNode() - Processing as struct.");
        final Set<String> processedFields = Sets.newHashSetWithExpectedSize(schema.fields().size());
        for (Field field : schema.fields()) {
            log.trace("parseJsonNode() - Processing field '{}:{}'", schema.name(), field.name());
            JsonNode fieldInput = input.findValue(field.name());
            try {
                Object convertedValue = parseJsonNode(field.schema(), fieldInput);
                struct.put(field, convertedValue);
            } catch (Exception ex) {
                throw new DataException(String.format("Exception thrown while processing %s:%s", schema.name(), field.name()), ex);
            }
            processedFields.add(field.name());
        }
        if (log.isTraceEnabled()) {
            final Set<String> jsonFieldNames = Sets.newLinkedHashSet(ImmutableList.copyOf(input.fieldNames()));
            Sets.SetView<String> difference = Sets.difference(jsonFieldNames, processedFields);
            if (!difference.isEmpty()) {
                log.trace("parseJsonNode() - Unprocessed fields for {}:\n{}", schema.name(), Joiner.on('\n').join(difference));
            }
        }
        result = struct;
    } else if (Schema.Type.ARRAY == schema.type()) {
        Preconditions.checkState(input.isArray(), "array schemas require a ArrayNode to be supplied for input.");
        log.trace("parseJsonNode() - Processing as array.");
        List<Object> array = new ArrayList<>();
        Iterator<JsonNode> arrayIterator = input.iterator();
        int index = 0;
        while (arrayIterator.hasNext()) {
            log.trace("parseJsonNode() - Processing index {}", index);
            JsonNode arrayInput = arrayIterator.next();
            try {
                Object arrayResult = parseJsonNode(schema.valueSchema(), arrayInput);
                array.add(arrayResult);
            } catch (Exception ex) {
                throw new DataException(String.format("Exception thrown while processing index %s", index), ex);
            }
            index++;
        }
        result = array;
    } else if (Schema.Type.MAP == schema.type()) {
        Preconditions.checkState(input.isObject(), "map schemas require a ObjectNode to be supplied for input.");
        log.trace("parseJsonNode() - Processing as map.");
        Map<Object, Object> map = new LinkedHashMap<>();
        Iterator<String> fieldNameIterator = input.fieldNames();
        while (fieldNameIterator.hasNext()) {
            final String fieldName = fieldNameIterator.next();
            final JsonNode fieldInput = input.findValue(fieldName);
            log.trace("parseJsonNode() - Processing key. Key='{}'", fieldName);
            final Object mapKey;
            try {
                mapKey = parseString(schema.keySchema(), fieldName);
            } catch (Exception ex) {
                throw new DataException(String.format("Exception thrown while parsing key. Key='%s'", fieldName), ex);
            }
            log.trace("parseJsonNode() - Processing value. Key='{}'", fieldName);
            final Object mapValue;
            try {
                mapValue = parseJsonNode(schema.keySchema(), fieldInput);
            } catch (Exception ex) {
                throw new DataException(String.format("Exception thrown while parsing value. Key='%s'", fieldName), ex);
            }
            map.put(mapKey, mapValue);
        }
        result = map;
    } else {
        TypeParser parser = findParser(schema);
        try {
            result = parser.parseJsonNode(input, schema);
        } catch (Exception ex) {
            String message = String.format("Could not parse '%s' to %s", input, parser.expectedClass().getSimpleName());
            throw new DataException(message, ex);
        }
    }
    return result;
}
Also used : Float32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float32TypeParser) Float64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float64TypeParser) Int64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int64TypeParser) DecimalTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DecimalTypeParser) Int32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int32TypeParser) Int16TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int16TypeParser) Int8TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int8TypeParser) TimestampTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimestampTypeParser) DateTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DateTypeParser) TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser) TimeTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimeTypeParser) StringTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.StringTypeParser) JsonNode(com.fasterxml.jackson.databind.JsonNode) DataException(org.apache.kafka.connect.errors.DataException) Struct(org.apache.kafka.connect.data.Struct) LinkedHashMap(java.util.LinkedHashMap) Field(org.apache.kafka.connect.data.Field) DataException(org.apache.kafka.connect.errors.DataException) Sets(com.google.common.collect.Sets) Iterator(java.util.Iterator) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List)

Example 2 with TypeParser

use of com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser in project connect-utils by jcustenborder.

the class Parser method findParser.

TypeParser findParser(Schema schema) {
    ParserKey parserKey = new ParserKey(schema);
    TypeParser parser = this.typeParsers.get(parserKey);
    if (null == parser) {
        throw new UnsupportedOperationException(String.format("Schema %s(%s) is not supported", schema.type(), schema.name()));
    }
    return parser;
}
Also used : Float32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float32TypeParser) Float64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float64TypeParser) Int64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int64TypeParser) DecimalTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DecimalTypeParser) Int32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int32TypeParser) Int16TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int16TypeParser) Int8TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int8TypeParser) TimestampTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimestampTypeParser) DateTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DateTypeParser) TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser) TimeTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimeTypeParser) StringTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.StringTypeParser)

Example 3 with TypeParser

use of com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser in project connect-utils by jcustenborder.

the class Parser method parseString.

/**
 * Method is used to parse String data to the proper Java types.
 *
 * @param schema Input schema to parse the String data by.
 * @param input  Java type specific to the schema supplied.
 * @return Java type for the
 * @throws DataException                 Exception is thrown when there is an exception thrown while parsing the input string.
 * @throws UnsupportedOperationException Exception is thrown if there is no type parser registered for the schema.
 * @throws NullPointerException          Exception is thrown if the schema passed is not optional and a null input value is passed.
 */
public Object parseString(Schema schema, String input) {
    checkSchemaAndInput(schema, input);
    if (null == input) {
        return null;
    }
    TypeParser parser = findParser(schema);
    try {
        Object result = parser.parseString(input, schema);
        return result;
    } catch (Exception ex) {
        String message = String.format("Could not parse '%s' to '%s'", input, parser.expectedClass().getSimpleName());
        throw new DataException(message, ex);
    }
}
Also used : DataException(org.apache.kafka.connect.errors.DataException) Float32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float32TypeParser) Float64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Float64TypeParser) Int64TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int64TypeParser) DecimalTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DecimalTypeParser) Int32TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int32TypeParser) Int16TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int16TypeParser) Int8TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.Int8TypeParser) TimestampTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimestampTypeParser) DateTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.DateTypeParser) TypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser) TimeTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.TimeTypeParser) StringTypeParser(com.github.jcustenborder.kafka.connect.utils.data.type.StringTypeParser) DataException(org.apache.kafka.connect.errors.DataException)

Aggregations

DateTypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.DateTypeParser)3 DecimalTypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.DecimalTypeParser)3 Float32TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Float32TypeParser)3 Float64TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Float64TypeParser)3 Int16TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Int16TypeParser)3 Int32TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Int32TypeParser)3 Int64TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Int64TypeParser)3 Int8TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.Int8TypeParser)3 StringTypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.StringTypeParser)3 TimeTypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.TimeTypeParser)3 TimestampTypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.TimestampTypeParser)3 TypeParser (com.github.jcustenborder.kafka.connect.utils.data.type.TypeParser)3 DataException (org.apache.kafka.connect.errors.DataException)2 JsonNode (com.fasterxml.jackson.databind.JsonNode)1 ImmutableList (com.google.common.collect.ImmutableList)1 Sets (com.google.common.collect.Sets)1 ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1