public File writeFile(File outdirFile, String fileName) throws IOException { fileName += RestConstants.SNAPSHOT_FILENAME_EXTENTION; final File file = new File(outdirFile, fileName); FileOutputStream fileOutputStream = new FileOutputStream(file); JsonBuilder jsonBuilder = new JsonBuilder(JsonBuilder.Pretty.INDENTED); SchemaToJsonEncoder encoder = new SchemaToJsonEncoder(jsonBuilder); jsonBuilder.writeStartObject(); jsonBuilder.writeFieldName(Snapshot.MODELS_KEY); jsonBuilder.writeStartArray(); List<NamedDataSchema> models = generateModelList(); models.sort(Comparator.comparing(NamedDataSchema::getFullName)); for(DataSchema model : models){ encoder.encode(model); } jsonBuilder.writeEndArray(); jsonBuilder.writeFieldName(Snapshot.SCHEMA_KEY); jsonBuilder.writeDataTemplate(_topLevelSchema, true); jsonBuilder.writeEndObject(); try { fileOutputStream.write(jsonBuilder.result().getBytes()); } finally { fileOutputStream.close(); jsonBuilder.close(); } return file; }
/** * Encode a field's default value. * * @param field providing the default value to encode. * @throws IOException if there is an error while encoding. */ protected void encodeFieldDefault(RecordDataSchema.Field field) throws IOException { if (field.getDefault() != null) { _builder.writeFieldName(DEFAULT_KEY); _builder.writeData(field.getDefault()); } }
/** * Write a map with string keys and values. * * @param value provides the map to write. */ public void writeMap(Map<String, ?> value) throws IOException { writeStartObject(); writeProperties(value); writeEndObject(); }
/** * Write an array of strings. * * @param value provides the strings to write. */ public void writeStringArray(List<String> value) throws IOException { writeStartArray(); for (String s : value) { writeString(s); } writeEndArray(); }
/** * Write a field whose value is a string array. * * The field will be written if required is true or the string array value is non-empty. * * @param fieldName is the name of the field. * @param value of the field. * @param required indicates whether this field will always be written * @throws IOException if there is an error writing. */ public void writeStringArrayField(String fieldName, List<String> value, boolean required) throws IOException { if (required || value.isEmpty() == false) { writeFieldName(fieldName); writeStringArray(value); } }
/** * Encode a {@link DataSchema} to a JSON encoded string. * * @param schema is the {@link DataSchema} to build a JSON encoded output for. * @param pretty is the pretty printing mode. * @return the JSON encoded string representing the {@link DataSchema}. */ public static String schemaToJson(DataSchema schema, JsonBuilder.Pretty pretty) { JsonBuilder builder = null; try { builder = new JsonBuilder(pretty); final SchemaToJsonEncoder encoder = new SchemaToJsonEncoder(builder); encoder.encode(schema); return builder.result(); } catch (IOException exc) { return exc.getMessage(); } finally { if (builder != null) { builder.closeQuietly(); } } }
_builder.writeStartObject(); _builder.writeStringField(TYPE_KEY, ARRAY_TYPE, true); _builder.writeFieldName(ITEMS_KEY); ArrayDataSchema arrayDataSchema = (ArrayDataSchema) schema; encode(arrayDataSchema.getItems(), arrayDataSchema.isItemsDeclaredInline()); encodeProperties(schema); _builder.writeEndObject(); break; case MAP: _builder.writeStartObject(); _builder.writeStringField(TYPE_KEY, MAP_TYPE, true); _builder.writeFieldName(VALUES_KEY); MapDataSchema mapDataSchema = (MapDataSchema) schema; encode(mapDataSchema.getValues(), mapDataSchema.isValuesDeclaredInline()); encodeProperties(schema); _builder.writeEndObject(); break; case UNION:
_builder.writeFieldName(key); _builder.writeData(value); _builder.writeFieldName(SchemaTranslator.DATA_PROPERTY); _builder.writeStartObject(); _builder.writeFieldName(SchemaTranslator.SCHEMA_PROPERTY); SchemaToJsonEncoder schemaToJsonEncoder = new SchemaToJsonEncoder(_builder); schemaToJsonEncoder.encode(schema); _builder.writeFieldName(SchemaTranslator.OPTIONAL_DEFAULT_MODE_PROPERTY); _builder.writeString(_options.getOptionalDefaultMode().toString()); if (RESERVED_DATA_PROPERTIES.contains(key) == false) _builder.writeFieldName(pegasusEntry.getKey()); _builder.writeData(pegasusEntry.getValue()); _builder.writeEndObject();
_builder.writeStartObject(); _builder.writeStringField(TYPE_KEY, schema.getType().toString().toLowerCase(), true); encodeName(schema); final String packageName = schema.getPackage(); if (packageName != null && !_currentPackage.equals(packageName)) _builder.writeStringField(PACKAGE_KEY, packageName, false); _currentPackage = packageName; _builder.writeStringField(DOC_KEY, schema.getDoc(), false); _builder.writeFieldName(REF_KEY); TyperefDataSchema typerefDataSchema = (TyperefDataSchema) schema; encode(typerefDataSchema.getRef(), typerefDataSchema.isRefDeclaredInline()); break; case ENUM: _builder.writeStringArrayField(SYMBOLS_KEY, ((EnumDataSchema) schema).getSymbols(), true); _builder.writeMapField(SYMBOL_DOCS_KEY, ((EnumDataSchema) schema).getSymbolDocs(), false); break; case FIXED: _builder.writeIntField(SIZE_KEY, ((FixedDataSchema) schema).getSize()); break; case RECORD: _builder.writeFieldName(FIELDS_KEY); encodeFields(recordDataSchema); if (hasIncludes && fieldsBeforeIncludes) _builder.writeStringArrayField(ALIASES_KEY, aliases, false);
(UnionDataSchema) fieldSchema.getDereferencedDataSchema() : null); _builder.writeFieldName(TYPE_KEY); _builder.writeStartArray(); _builder.writeString(DataSchemaConstants.NULL_TYPE); emittedNull = true; _builder.writeEndArray();
private void writeIncludes(RecordDataSchema recordDataSchema) throws IOException { _builder.writeFieldName(INCLUDE_KEY); _builder.writeStartArray(); for (NamedDataSchema includedSchema : recordDataSchema.getInclude()) { encode(includedSchema); } _builder.writeEndArray(); }
_builder.writeStartObject(); _builder.writeStringField(NAME_KEY, field.getName(), true); _builder.writeStringField(DOC_KEY, field.getDoc(), false); if (order != RecordDataSchema.Field.Order.ASCENDING) _builder.writeStringField(ORDER_KEY, order.toString().toLowerCase(), true); _builder.writeStringArrayField(ALIASES_KEY, field.getAliases(), false); _builder.writeEndObject();
/** * Encode the members of an {@link UnionDataSchema}. * * @param unionDataSchema The union schema whose members needs to be encoded. * @throws IOException if there is an error while encoding. */ protected void encodeUnion(UnionDataSchema unionDataSchema) throws IOException { List<UnionDataSchema.Member> members = unionDataSchema.getMembers(); _builder.writeStartArray(); for (UnionDataSchema.Member member: members) { encodeUnionMember(member); } _builder.writeEndArray(); }
/** * Write a field whose value is a map with string keys and values. * * The field will be written if required is true or the map value is non-empty. * * @param fieldName is the name of the field. * @param value of the field. * @param required indicates whether this field will always be written * @throws IOException if there is an error writing. */ public void writeMapField(String fieldName, Map<String, ?> value, boolean required) throws IOException { if (required || value.isEmpty() == false) { writeFieldName(fieldName); writeMap(value); } }
/** * Encode custom Avro schema. * * @param schema the {@link DataSchema} to encode. * @return true if there is a custom Avro schema. */ protected boolean encodeCustomAvroSchema(DataSchema schema) throws IOException { boolean encodedCustomAvroSchema = false; AvroOverride avroOverride = _avroOverrideMap.getAvroOverride(schema); _avroOverrideFactory.emitExceptionIfThereAreErrors(); if (avroOverride != null) { if (avroOverride.getAccessCount() == 1) { _builder.writeData(avroOverride.getAvroSchemaDataMap()); encodedCustomAvroSchema = true; } else { _builder.writeString(avroOverride.getAvroSchemaFullName()); encodedCustomAvroSchema = true; } } return encodedCustomAvroSchema; }
/** * Encode a field's type (i.e. {@link DataSchema}. * * @param field providing the type to encode. * @throws IOException if there is an error while encoding. */ protected void encodeFieldType(RecordDataSchema.Field field) throws IOException { _builder.writeFieldName(TYPE_KEY); DataSchema fieldSchema = field.getType(); encode(fieldSchema, field.isDeclaredInline()); }
/** * Close underlying objects and release their resources. * This method will log the {@link java.io.IOException} instead of throwing it. */ public void closeQuietly() { try { close(); } catch (IOException e) { // TODO: use Java 7 try-with-resources statement and Throwable.getSuppressed() } }
/** * Write properties by adding each property as a field to current JSON object. * * @param value provides the properties to be written. * @throws IOException if there is an error writing. */ public void writeProperties(Map<String, ?> value) throws IOException { if (value.isEmpty() == false) { for (Map.Entry<String, ?> entry : value.entrySet()) { _jsonGenerator.writeFieldName(entry.getKey()); writeData(entry.getValue()); } } }
try builder = new JsonBuilder(pretty); final SchemaToJsonEncoder encoder = new SchemaToJsonEncoder(builder); for (DataSchema schema : schemas) return builder.result(); builder.closeQuietly();
/** * Encode a specific {@link com.linkedin.data.schema.UnionDataSchema.Member} of a union. * * @param member The specific union member that needs to be encoded. * @throws IOException if there is an error while encoding. */ protected void encodeUnionMember(UnionDataSchema.Member member) throws IOException { if (member.hasAlias()) { _builder.writeStartObject(); // alias _builder.writeStringField(ALIAS_KEY, member.getAlias(), true); // type _builder.writeFieldName(TYPE_KEY); encode(member.getType(), member.isDeclaredInline()); // doc _builder.writeStringField(DOC_KEY, member.getDoc(), false); // properties _builder.writeProperties(member.getProperties()); _builder.writeEndObject(); } else { // for member without aliases, encode the type encode(member.getType(), member.isDeclaredInline()); } }