use of com.linkedin.avroutil1.model.AvroType in project avro-util by linkedin.
the class AvscFileParseContext method resolveReferences.
private void resolveReferences(AvroSchema schema) {
AvroType type = schema.type();
switch(type) {
case RECORD:
AvroRecordSchema recordSchema = (AvroRecordSchema) schema;
List<AvroSchemaField> fields = recordSchema.getFields();
for (AvroSchemaField field : fields) {
SchemaOrRef fieldSchema = field.getSchemaOrRef();
resolveReferences(fieldSchema);
}
break;
case UNION:
AvroUnionSchema unionSchema = (AvroUnionSchema) schema;
List<SchemaOrRef> types = unionSchema.getTypes();
for (SchemaOrRef unionType : types) {
resolveReferences(unionType);
}
break;
case ARRAY:
AvroArraySchema arraySchema = (AvroArraySchema) schema;
SchemaOrRef arrayValuesType = arraySchema.getValueSchemaOrRef();
resolveReferences(arrayValuesType);
break;
case MAP:
AvroMapSchema mapSchema = (AvroMapSchema) schema;
SchemaOrRef mapValuesType = mapSchema.getValueSchemaOrRef();
resolveReferences(mapValuesType);
break;
default:
break;
}
}
use of com.linkedin.avroutil1.model.AvroType in project avro-util by linkedin.
the class AvscParser method parseLiteral.
private LiteralOrIssue parseLiteral(JsonValueExt literalNode, AvroSchema schema, String fieldName, AvscFileParseContext context) {
AvroType avroType = schema.type();
JsonValue.ValueType jsonType = literalNode.getValueType();
AvscIssue issue;
BigInteger bigIntegerValue;
BigDecimal bigDecimalValue;
byte[] bytes;
switch(avroType) {
case NULL:
if (jsonType != JsonValue.ValueType.NULL) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroNullLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode)));
case BOOLEAN:
if (jsonType != JsonValue.ValueType.FALSE && jsonType != JsonValue.ValueType.TRUE) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
boolean boolValue = jsonType == JsonValue.ValueType.TRUE;
return new LiteralOrIssue(new AvroBooleanLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), boolValue));
case INT:
if (jsonType != JsonValue.ValueType.NUMBER) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonNumberExt intNode = (JsonNumberExt) literalNode;
if (!intNode.isIntegral()) {
// TODO - be more specific about this error (int vs float)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
bigIntegerValue = intNode.bigIntegerValue();
if (bigIntegerValue.compareTo(MAX_INT) > 0 || bigIntegerValue.compareTo(MIN_INT) < 0) {
// TODO - be more specific about this error (out of signed int range)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroIntegerLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), bigIntegerValue.intValueExact()));
case LONG:
if (jsonType != JsonValue.ValueType.NUMBER) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonNumberExt longNode = (JsonNumberExt) literalNode;
if (!longNode.isIntegral()) {
// TODO - be more specific about this error (long vs float)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
bigIntegerValue = longNode.bigIntegerValue();
if (bigIntegerValue.compareTo(MAX_LONG) > 0 || bigIntegerValue.compareTo(MIN_LONG) < 0) {
// TODO - be more specific about this error (out of signed long range)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroLongLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), bigIntegerValue.longValueExact()));
case FLOAT:
if (jsonType != JsonValue.ValueType.NUMBER) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonNumberExt floatNode = (JsonNumberExt) literalNode;
bigDecimalValue = floatNode.bigDecimalValue();
if (bigDecimalValue.compareTo(MAX_FLOAT) > 0) {
// TODO - be more specific about this error (out of float range)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroFloatLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), bigDecimalValue.floatValue()));
case DOUBLE:
if (jsonType != JsonValue.ValueType.NUMBER) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonNumberExt doubleNode = (JsonNumberExt) literalNode;
bigDecimalValue = doubleNode.bigDecimalValue();
if (bigDecimalValue.compareTo(MAX_DOUBLE) > 0) {
// TODO - be more specific about this error (out of double range)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroDoubleLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), bigDecimalValue.doubleValue()));
case BYTES:
if (jsonType != JsonValue.ValueType.STRING) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonStringExt bytesNode = (JsonStringExt) literalNode;
// spec says "strings, where Unicode code points 0-255 are mapped to unsigned 8-bit byte values 0-255"
bytes = bytesNode.getString().getBytes(StandardCharsets.ISO_8859_1);
return new LiteralOrIssue(new AvroBytesLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), bytes));
case FIXED:
if (jsonType != JsonValue.ValueType.STRING) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
AvroFixedSchema fixedSchema = (AvroFixedSchema) schema;
JsonStringExt fixedNode = (JsonStringExt) literalNode;
// spec says "strings, where Unicode code points 0-255 are mapped to unsigned 8-bit byte values 0-255"
bytes = fixedNode.getString().getBytes(StandardCharsets.ISO_8859_1);
if (bytes.length != fixedSchema.getSize()) {
// TODO - be more specific about this error (wrong length)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroFixedLiteral(fixedSchema, locationOf(context.getUri(), literalNode), bytes));
case STRING:
if (jsonType != JsonValue.ValueType.STRING) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
JsonStringExt stringNode = (JsonStringExt) literalNode;
return new LiteralOrIssue(new AvroStringLiteral((AvroPrimitiveSchema) schema, locationOf(context.getUri(), literalNode), stringNode.getString()));
case ENUM:
if (jsonType != JsonValue.ValueType.STRING) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
AvroEnumSchema enumSchema = (AvroEnumSchema) schema;
JsonStringExt enumNode = (JsonStringExt) literalNode;
String enumValue = enumNode.getString();
if (!enumSchema.getSymbols().contains(enumValue)) {
// TODO - be more specific about this error (unknown symbol)
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
return new LiteralOrIssue(new AvroEnumLiteral(enumSchema, locationOf(context.getUri(), literalNode), enumValue));
case ARRAY:
if (jsonType != JsonValue.ValueType.ARRAY) {
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
AvroArraySchema arraySchema = (AvroArraySchema) schema;
AvroSchema valueSchema = arraySchema.getValueSchema();
JsonArrayExt arrayNode = (JsonArrayExt) literalNode;
ArrayList<AvroLiteral> values = new ArrayList<>(arrayNode.size());
for (int i = 0; i < arrayNode.size(); i++) {
JsonValueExt valueNode = (JsonValueExt) arrayNode.get(i);
LiteralOrIssue value = parseLiteral(valueNode, valueSchema, fieldName, context);
// issues parsing any member value mean a failure to parse the array as a whole
if (value.getIssue() != null) {
// TODO - be more specific about this error (unparsable array element i)
// TODO - add "causedBy" to AvscIssue and use it here
issue = AvscIssues.badFieldDefaultValue(locationOf(context.getUri(), literalNode), literalNode.toString(), avroType, fieldName);
context.addIssue(issue);
return new LiteralOrIssue(issue);
}
values.add(value.getLiteral());
}
return new LiteralOrIssue(new AvroArrayLiteral(arraySchema, locationOf(context.getUri(), literalNode), values));
default:
throw new UnsupportedOperationException("dont know how to parse a " + avroType + " at " + literalNode.getStartLocation() + " out of a " + literalNode.getValueType() + " (" + literalNode + ")");
}
}
use of com.linkedin.avroutil1.model.AvroType in project avro-util by linkedin.
the class AvscParser method parseCollectionSchema.
private AvroCollectionSchema parseCollectionSchema(JsonObjectExt objectNode, AvscFileParseContext context, AvroType avroType, CodeLocation codeLocation, JsonPropertiesContainer props) {
switch(avroType) {
case ARRAY:
JsonValueExt arrayItemsNode = getRequiredNode(objectNode, "items", () -> "array declarations must have an items property");
SchemaOrRef arrayItemSchema = parseSchemaDeclOrRef(arrayItemsNode, context, false);
return new AvroArraySchema(codeLocation, arrayItemSchema, props);
case MAP:
JsonValueExt mapValuesNode = getRequiredNode(objectNode, "values", () -> "map declarations must have a values property");
SchemaOrRef mapValueSchema = parseSchemaDeclOrRef(mapValuesNode, context, false);
return new AvroMapSchema(codeLocation, mapValueSchema, props);
default:
throw new IllegalStateException("unhandled: " + avroType + " for object at " + codeLocation.getStart());
}
}
use of com.linkedin.avroutil1.model.AvroType in project avro-util by linkedin.
the class AvscParser method parseStringRepresentation.
private Parsed<AvroJavaStringRepresentation> parseStringRepresentation(// type declaration node
JsonObjectExt objectNode, AvscFileParseContext context, AvroType avroType, CodeLocation codeLocation) {
Parsed<AvroJavaStringRepresentation> result = new Parsed<>();
Located<String> repStr = getOptionalString(objectNode, "avro.java.string");
AvroJavaStringRepresentation representation;
if (repStr != null) {
representation = AvroJavaStringRepresentation.fromJson(repStr.getValue());
if (representation != null) {
result.setData(representation);
} else {
result.recordIssue(AvscIssues.unknownJavaStringRepresentation(locationOf(context.getUri(), repStr), repStr.getValue()));
}
// does string rep even make sense here? is type even a string?
if (!AvroType.STRING.equals(avroType)) {
result.recordIssue(AvscIssues.stringRepresentationOnNonString(locationOf(context.getUri(), repStr), repStr.getValue(), avroType));
}
}
return result;
}
use of com.linkedin.avroutil1.model.AvroType in project avro-util by linkedin.
the class AvscParser method parseAliases.
private List<AvroName> parseAliases(JsonObjectExt objectNode, AvscFileParseContext context, AvroType avroType, AvroName name) {
JsonArrayExt aliasesArray = getOptionalArray(objectNode, "aliases");
if (aliasesArray == null || aliasesArray.isEmpty()) {
return null;
}
List<AvroName> aliases = new ArrayList<>(aliasesArray.size());
for (int i = 0; i < aliasesArray.size(); i++) {
// !=null
JsonValueExt aliasNode = (JsonValueExt) aliasesArray.get(i);
JsonValue.ValueType fieldNodeType = aliasNode.getValueType();
if (fieldNodeType != JsonValue.ValueType.STRING) {
throw new AvroSyntaxException("alias " + i + " for " + name.getSimpleName() + " at " + aliasNode.getStartLocation() + " expected to be a STRING, not a " + JsonPUtil.describe(fieldNodeType) + " (" + aliasNode + ")");
}
String aliasStr = ((JsonStringExt) aliasNode).getString();
AvroName alias;
if (aliasStr.contains(".")) {
int lastDot = aliasStr.lastIndexOf('.');
alias = new AvroName(aliasStr.substring(lastDot + 1), aliasStr.substring(0, lastDot));
} else {
alias = new AvroName(aliasStr, name.getNamespace());
}
if (aliases.contains(alias)) {
TextLocation fieldStartLocation = Util.convertLocation(aliasNode.getStartLocation());
TextLocation fieldEndLocation = Util.convertLocation(aliasNode.getEndLocation());
CodeLocation aliasCodeLocation = new CodeLocation(context.getUri(), fieldStartLocation, fieldEndLocation);
context.addIssue(AvscIssues.duplicateAlias(alias.getFullname(), aliasCodeLocation));
} else {
aliases.add(alias);
}
}
return aliases;
}
Aggregations