for (EmbedSchemaMode embedSchemaMode : EmbedSchemaMode.values())
{
for (OptionalDefaultMode optionalDefaultMode : optionalDefaultModes)
{
DataSchema schema = TestUtil.dataSchemaFromString(schemaText);
String preTranslateSchemaText = schema.toString();
Exception exc = null;
String avroTextFromSchema = null;
try
{
avroTextFromSchema = SchemaTranslator.dataToAvroSchemaJson(
schema,
new DataToAvroSchemaTranslationOptions(optionalDefaultMode, JsonBuilder.Pretty.SPACES, embedSchemaMode)
);
if (debug)
{
System.out.println("EmbeddedSchema: " + embedSchemaMode +
", OptionalDefaultMode: " + optionalDefaultMode +
", Avro Schema: " + avroTextFromSchema);
}
}
catch (Exception e)
{
exc = e;
if (debug) { e.printStackTrace(); }
}
if (expected instanceof String)
{
assertNull(exc);
String expectedAvroText = (String) expected;
if (embedSchemaMode == EmbedSchemaMode.ROOT_ONLY && hasEmbeddedSchema(schema))
{
// when embeddedSchema is enabled
// for map, array, enums. and records, we embed the original Pegasus schema
DataMap expectedAvroDataMap = TestUtil.dataMapFromString(expectedAvroText);
DataMap resultAvroDataMap = TestUtil.dataMapFromString(avroTextFromSchema);
Object dataProperty = resultAvroDataMap.remove(SchemaTranslator.DATA_PROPERTY);
assertEquals(resultAvroDataMap, expectedAvroDataMap);
// look for embedded schema
assertNotNull(dataProperty);
assertTrue(dataProperty instanceof DataMap);
Object schemaProperty = ((DataMap) dataProperty).get(SchemaTranslator.SCHEMA_PROPERTY);
assertNotNull(schemaProperty);
assertTrue(schemaProperty instanceof DataMap);
// make sure embedded schema is same as the original schema
SchemaParser schemaParser = TestUtil.schemaParserFromObjects(Arrays.asList(schemaProperty));
DataSchema embeddedSchema = schemaParser.topLevelDataSchemas().get(0);
assertEquals(embeddedSchema, schema.getDereferencedDataSchema());
// look for optional default mode
Object optionalDefaultModeProperty = ((DataMap) dataProperty).get(SchemaTranslator.OPTIONAL_DEFAULT_MODE_PROPERTY);
assertNotNull(optionalDefaultMode);
assertEquals(optionalDefaultModeProperty, optionalDefaultMode.toString());
}
else
{
// embeddedSchema is not enabled or
// for unions and primitives, we never embed the pegasus schema
if (embedSchemaMode == EmbedSchemaMode.NONE && hasEmbeddedSchema(schema))
{
// make sure no embedded schema when
DataMap resultAvroDataMap = TestUtil.dataMapFromString(avroTextFromSchema);
assertFalse(resultAvroDataMap.containsKey(SchemaTranslator.DATA_PROPERTY));
}
assertEquals(avroTextFromSchema, expectedAvroText);
}
String postTranslateSchemaText = schema.toString();
assertEquals(preTranslateSchemaText, postTranslateSchemaText);
// make sure Avro accepts it
Schema avroSchema = Schema.parse(avroTextFromSchema);
if (debug) System.out.println("AvroSchema: " + avroSchema);
SchemaParser parser = new SchemaParser();
ValidationOptions options = new ValidationOptions();
options.setAvroUnionMode(true);
parser.setValidationOptions(options);
parser.parse(avroTextFromSchema);
assertFalse(parser.hasError(), parser.errorMessage());
if (optionalDefaultMode == DataToAvroSchemaTranslationOptions.DEFAULT_OPTIONAL_DEFAULT_MODE)
{
// use other dataToAvroSchemaJson
String avroSchema2Json = SchemaTranslator.dataToAvroSchemaJson(
TestUtil.dataSchemaFromString(schemaText)
);
@SuppressWarnings("deprecation")
String avroSchema2JsonCompact = SchemaTranslator.dataToAvroSchemaJson(
TestUtil.dataSchemaFromString(schemaText),
JsonBuilder.Pretty.COMPACT
);
assertEquals(avroSchema2Json, avroSchema2JsonCompact);
Schema avroSchema2 = Schema.parse(avroSchema2Json);
assertEquals(avroSchema2, avroSchema);
// use dataToAvroSchema
Schema avroSchema3 = SchemaTranslator.dataToAvroSchema(TestUtil.dataSchemaFromString(schemaText));
assertEquals(avroSchema3, avroSchema2);
}
if (modeInputs.length >= 4)
{
// check if the translated default value is good by using it.
// writer schema and Avro JSON value should not include fields with default values.
String writerSchemaText = (String) modeInputs[2];
String avroValueJson = (String) modeInputs[3];
Schema writerSchema = Schema.parse(writerSchemaText);
GenericRecord genericRecord = genericRecordFromString(avroValueJson, writerSchema, avroSchema);
if (modeInputs.length >= 5)
{
String genericRecordJson = (String) modeInputs[4];
String genericRecordAsString = genericRecord.toString();
DataMap expectedGenericRecord = TestUtil.dataMapFromString(genericRecordJson);
DataMap resultGenericRecord = TestUtil.dataMapFromString(genericRecordAsString);
assertEquals(resultGenericRecord, expectedGenericRecord);
}
}
if (embedSchemaMode == EmbedSchemaMode.ROOT_ONLY && hasEmbeddedSchema(schema))
{
// if embedded schema is enabled, translate Avro back to Pegasus schema.
// the output Pegasus schema should be exactly same the input schema
// taking into account typeref.
AvroToDataSchemaTranslationOptions avroToDataSchemaMode = new AvroToDataSchemaTranslationOptions(AvroToDataSchemaTranslationMode.VERIFY_EMBEDDED_SCHEMA);
DataSchema embeddedSchema = SchemaTranslator.avroToDataSchema(avroTextFromSchema, avroToDataSchemaMode);
assertEquals(embeddedSchema, schema.getDereferencedDataSchema());
}
}
else
{