/home/wpollock1/public_html/AJava/AvroDemo/AvroDemo.java

// Simple Avro binary format example.  Taken from their Quick Start guide at
// <https://avro.apache.org/docs/current/gettingstartedjava.html>.
// In this code, we first build a schema in the file "user.avsc" that looks
// like this:
//      {"namespace": "example.avro",
//       "type": "record",
//       "name": "User",
//       "fields": [
//           {"name": "name", "type": "string"},
//           {"name": "favorite_number",  "type": ["int", "null"]},
//           {"name": "favorite_color", "type": ["string", "null"]}
//       ]
//      }
//
// And compile that to the class "example.avro.User" via the command:
//     java -jar avro-tools-1.8.2.jar compile schema user.avsc .
//
// To avoid unnecessary logging messages, place all four jar files
// (two avro ones, two jackson JSON ones) in the current folder and compile:
//    C:\Temp\AvroDemo>javac -Xlint:all -cp .;./* AvroDemo.java
// Then run:
//    C:\Temp\AvroDemo>java -cp .;./* AvroDemo
//
// Written 6/2017 by Wayne Pollock, Tampa Florida USA

import java.io.*;
import example.avro.User;  // The generated class
import org.apache.avro.io.*;
import org.apache.avro.file.*;
import org.apache.avro.specific.*;

public class AvroDemo {
    private static String AVRO_DATA = "users.avro";

    public static void main ( String[] args ) throws Exception {

        // Create objects from user schema three ways:
        // Simple constructor:
        User user1 = new User();
        user1.setName("Alyssa");
        user1.setFavoriteNumber(256);
        // Leave favorite color null

        // Alternate constructor:
        User user2 = new User("Ben", 7, "red");

        // Construct via builder
        User user3 = User.newBuilder()
             .setName("Charlie")
             .setFavoriteColor("blue")
             .setFavoriteNumber(null)
             .build();

        // Serialize user1, user2 and user3 to file "users.avro":
        DatumWriter<User> userDatumWriter
            = new SpecificDatumWriter<User>(User.class);
        DataFileWriter<User> dataFileWriter
            = new DataFileWriter<User>(userDatumWriter);
        dataFileWriter.create(user1.getSchema(), new File(AVRO_DATA));
        dataFileWriter.append(user1);
        dataFileWriter.append(user2);
        dataFileWriter.append(user3);
        dataFileWriter.close();

        // Read serialized data:
        // Deserialize Users from disk
        DatumReader<User> userDatumReader
            = new SpecificDatumReader<User>(User.class);
        DataFileReader<User> dataFileReader
            = new DataFileReader<User>(new File(AVRO_DATA), userDatumReader);

        User user = null;
        System.out.println("\n\tUsers from file \"" + AVRO_DATA + "\":");
        while ( dataFileReader.hasNext() ) {
            user = dataFileReader.next(user);
            System.out.println(user);  // The generated class includes toString.
        }
    }
}