1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See README.txt for information and build instructions.
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.example.tutorial.AddressBookProtos.AddressBook;
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.example.tutorial.AddressBookProtos.Person;
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.BufferedReader;
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.FileInputStream;
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.FileNotFoundException;
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.FileOutputStream;
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.InputStreamReader;
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.IOException;
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.PrintStream;
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass AddPerson {
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This function fills in a Person message based on user input.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static Person PromptForAddress(BufferedReader stdin,
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 PrintStream stdout) throws IOException {
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Person.Builder person = Person.newBuilder();
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    stdout.print("Enter person ID: ");
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    person.setId(Integer.valueOf(stdin.readLine()));
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    stdout.print("Enter name: ");
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    person.setName(stdin.readLine());
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    stdout.print("Enter email address (blank for none): ");
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    String email = stdin.readLine();
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (email.length() > 0) {
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      person.setEmail(email);
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    while (true) {
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      stdout.print("Enter a phone number (or leave blank to finish): ");
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      String number = stdin.readLine();
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (number.length() == 0) {
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Person.PhoneNumber.Builder phoneNumber =
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        Person.PhoneNumber.newBuilder().setNumber(number);
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      stdout.print("Is this a mobile, home, or work phone? ");
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      String type = stdin.readLine();
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (type.equals("mobile")) {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        phoneNumber.setType(Person.PhoneType.MOBILE);
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else if (type.equals("home")) {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        phoneNumber.setType(Person.PhoneType.HOME);
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else if (type.equals("work")) {
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        phoneNumber.setType(Person.PhoneType.WORK);
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        stdout.println("Unknown phone type.  Using default.");
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      person.addPhone(phoneNumber);
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return person.build();
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Main function:  Reads the entire address book from a file,
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   adds one person based on user input, then writes it back out to the same
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   file.
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public static void main(String[] args) throws Exception {
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (args.length != 1) {
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      System.err.println("Usage:  AddPerson ADDRESS_BOOK_FILE");
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      System.exit(-1);
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddressBook.Builder addressBook = AddressBook.newBuilder();
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Read the existing address book.
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try {
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FileInputStream input = new FileInputStream(args[0]);
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      try {
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        addressBook.mergeFrom(input);
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      } finally {
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        try { input.close(); } catch (Throwable ignore) {}
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } catch (FileNotFoundException e) {
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      System.out.println(args[0] + ": File not found.  Creating a new file.");
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Add an address.
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    addressBook.addPerson(
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      PromptForAddress(new BufferedReader(new InputStreamReader(System.in)),
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                       System.out));
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Write the new address book back to disk.
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileOutputStream output = new FileOutputStream(args[0]);
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    try {
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      addressBook.build().writeTo(output);
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } finally {
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      output.close();
93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
96