in gobblin-utility/src/main/java/org/apache/gobblin/util/AvroUtils.java [748:820]
public static Schema switchNamespace(Schema schema, Map<String, String> namespaceOverride) {
Schema newSchema;
String newNamespace = StringUtils.EMPTY;
// Process all Schema Types
// (Primitives are simply cloned)
switch (schema.getType()) {
case ENUM:
newNamespace = namespaceOverride.containsKey(schema.getNamespace()) ? namespaceOverride.get(schema.getNamespace())
: schema.getNamespace();
newSchema =
Schema.createEnum(schema.getName(), schema.getDoc(), newNamespace, schema.getEnumSymbols());
break;
case FIXED:
newNamespace = namespaceOverride.containsKey(schema.getNamespace()) ? namespaceOverride.get(schema.getNamespace())
: schema.getNamespace();
newSchema =
Schema.createFixed(schema.getName(), schema.getDoc(), newNamespace, schema.getFixedSize());
break;
case MAP:
newSchema = Schema.createMap(switchNamespace(schema.getValueType(), namespaceOverride));
break;
case RECORD:
newNamespace = namespaceOverride.containsKey(schema.getNamespace()) ? namespaceOverride.get(schema.getNamespace())
: schema.getNamespace();
List<Schema.Field> newFields = new ArrayList<>();
if (schema.getFields().size() > 0) {
for (Schema.Field oldField : schema.getFields()) {
Field newField = AvroCompatibilityHelper.createSchemaField(oldField.name(), switchNamespace(oldField.schema(),
namespaceOverride), oldField.doc(), getCompatibleDefaultValue(oldField), oldField.order());
// Copy field level properties
copyFieldProperties(oldField, newField);
newFields.add(newField);
}
}
newSchema = Schema.createRecord(schema.getName(), schema.getDoc(), newNamespace,
schema.isError());
newSchema.setFields(newFields);
break;
case UNION:
List<Schema> newUnionMembers = new ArrayList<>();
if (null != schema.getTypes() && schema.getTypes().size() > 0) {
for (Schema oldUnionMember : schema.getTypes()) {
newUnionMembers.add(switchNamespace(oldUnionMember, namespaceOverride));
}
}
newSchema = Schema.createUnion(newUnionMembers);
break;
case ARRAY:
newSchema = Schema.createArray(switchNamespace(schema.getElementType(), namespaceOverride));
break;
case BOOLEAN:
case BYTES:
case DOUBLE:
case FLOAT:
case INT:
case LONG:
case NULL:
case STRING:
newSchema = Schema.create(schema.getType());
break;
default:
String exceptionMessage = String.format("Schema namespace replacement failed for \"%s\" ", schema);
LOG.error(exceptionMessage);
throw new AvroRuntimeException(exceptionMessage);
}
// Copy schema metadata
copyProperties(schema, newSchema);
return newSchema;
}