]> git.mxchange.org Git - addressbook-lib.git/blobdiff - Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
Cleaned up logger XML + renamed interface fixed
[addressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / client / console / ConsoleClient.java
index 94818f13d145b60ef3f2520a3a0d2e68fe0f85c8..6ed15fb2a04a79feee994d412fdfc53bbc388a1c 100644 (file)
  */
 package org.mxchange.addressbook.client.console;
 
+import java.io.IOException;
+import java.sql.SQLException;
 import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Scanner;
 import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.client.BaseClient;
-import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.addressbook.client.BaseAddressbookClient;
 import org.mxchange.addressbook.contact.user.UserContact;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
+import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
+import org.mxchange.addressbook.manager.contact.ManageableAddressbookContact;
 import org.mxchange.addressbook.menu.Menu;
 import org.mxchange.addressbook.menu.MenuTools;
 import org.mxchange.addressbook.menu.console.ConsoleMenu;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
 import org.mxchange.addressbook.menu.item.console.ConsoleMenuItem;
+import org.mxchange.jcore.application.Application;
+import org.mxchange.jcore.contact.Contact;
+import org.mxchange.jcore.contact.Gender;
+import org.mxchange.jcore.exceptions.BadTokenException;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException;
 
 /**
  * A client for the console
  *
  * @author Roland Haeder
  */
-public class ConsoleClient extends BaseClient implements Client {
+public class ConsoleClient extends BaseAddressbookClient implements AddressbookClient {
 
        /**
         * Scanner instance for reading data from console input
@@ -50,13 +57,17 @@ public class ConsoleClient extends BaseClient implements Client {
         * @param application An instance of an Application class
         */
        public ConsoleClient (final Application application) {
-               super();
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("application={0} - CALLED!", application)); //NOI18N
 
                // Set application instance
                this.setApplication(application);
 
                // Init scanner instance
-               this.scanner = new Scanner(System.in);
+               this.scanner = new Scanner(System.in, "UTF-8"); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -66,8 +77,20 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public void displayAddressBox (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Simple display ...
                this.outputMessage(MessageFormat.format("Strasse, PLZ Ort, Land: {0}\n{1} {2}\n{3}", contact.getStreet(), contact.getZipCode(), contact.getCity(), contact.getCountryCode()));
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -77,6 +100,15 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public void displayNameBox (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Get translated gender as the user may want to see "Mr.", "Mrs."
                String gender = contact.getTranslatedGender();
 
@@ -92,6 +124,9 @@ public class ConsoleClient extends BaseClient implements Client {
                        // Company contact
                        this.outputMessage(MessageFormat.format("Firma: {0}\nAnsprechpartner: {1} {2} {3}", companyName, gender, contact.getSurname(), contact.getFamilyName()));
                }
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -101,102 +136,178 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public void displayOtherDataBox (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Cellphone and such ...
                this.outputMessage(MessageFormat.format("Telefonnumer: {0}\nFaxnummer: {1}\nHandy: {2}\nKommentar:\n{3}", contact.getPhoneNumber(), contact.getFaxNumber(), contact.getCellphoneNumber(), contact.getComment()));
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        @Override
        public void doChangeOwnAddressData (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Make sure it is own contact
                if (!contact.isOwnContact()) {
                        // Not own contact
-                       throw new IllegalArgumentException("Contact is not own data.");
+                       throw new IllegalArgumentException("Contact is not own data."); //NOI18N
                }
 
-               // Own address data
-               String street = this.getContactManager().enterOwnStreet();
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
+
+               // Own street and number
+               String streetNumber = manager.enterOwnStreet();
 
                // Get zip code
-               int zipCode = this.getContactManager().enterOwnZipCode();
+               Long zipCode = (long) manager.enterOwnZipCode();
 
                // Get city name
-               String city = this.getContactManager().enterOwnCity();
+               String city = manager.enterOwnCity();
 
                // Get country code
-               String countryCode = this.getContactManager().enterOwnCountryCode();
+               String countryCode = manager.enterOwnCountryCode();
 
                // Update address data
-               contact.updateAddressData(street, zipCode, city, countryCode);
+               contact.setStreet(streetNumber);
+               contact.setZipCode(zipCode);
+               contact.setCity(city);
+               contact.setCountryCode(countryCode);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        @Override
        public void doChangeOwnNameData (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Make sure it is own contact
                if (!contact.isOwnContact()) {
                        // Not own contact
-                       throw new IllegalArgumentException("Contact is not own data.");
+                       throw new IllegalArgumentException("Contact is not own data."); //NOI18N
                }
 
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
+
                // Gender:
-               char gender = this.getContactManager().enterOwnGender();
+               Gender gender = manager.enterOwnGender();
 
                // Surname
-               String surname = this.getContactManager().enterOwnSurname();
+               String surname = manager.enterOwnSurname();
 
                // Family name
-               String familyName = this.getContactManager().enterOwnFamilyName();
+               String familyName = manager.enterOwnFamilyName();
 
                // And company
-               String companyName = this.getContactManager().enterOwnCompanyName();
+               String companyName = manager.enterOwnCompanyName();
 
                // Update contact instance
-               contact.updateNameData(gender, surname, familyName, companyName);
+               contact.setGender(gender);
+               contact.setSurname(surname);
+               contact.setFamilyName(familyName);
+               contact.setCompanyName(companyName);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        @Override
        public void doChangeOwnOtherData (final Contact contact) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
+
+               // Is it null?
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Make sure it is own contact
                if (!contact.isOwnContact()) {
                        // Not own contact
-                       throw new IllegalArgumentException("Contact is not own data.");
+                       throw new IllegalArgumentException("Contact is not own data."); //NOI18N
                }
 
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
+
                // Phone number
-               String phoneNumber = this.getContactManager().enterOwnPhoneNumber();
+               String phoneNumber = manager.enterOwnPhoneNumber();
 
                // Phone number
-               String cellNumber = this.getContactManager().enterOwnCellNumber();
+               String cellphonePhoneNumber = manager.enterOwnCellNumber();
 
                // Fax number
-               String faxNumber = this.getContactManager().enterOwnFaxNumber();
+               String faxNumber = manager.enterOwnFaxNumber();
 
                // Email address
-               String email = this.getContactManager().enterOwnEmailAddress();
+               String email = manager.enterOwnEmailAddress();
 
                // Comment
-               String comment = this.getContactManager().enterOwnComment();
+               String comment = manager.enterOwnComment();
 
                // Update contact instance
-               contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);
+               contact.setPhoneNumber(phoneNumber);
+               contact.setCellphoneNumber(cellphonePhoneNumber);
+               contact.setFaxNumber(faxNumber);
+               contact.setEmailAddress(email);
+               contact.setComment(comment);
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        @Override
        public Contact doEnterOwnData () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
+
                // First ask for gender
-               char gender = this.getContactManager().enterOwnGender();
+               Gender gender = manager.enterOwnGender();
 
                // 2nd for surname
-               String surname = this.getContactManager().enterOwnSurname();
+               String surname = manager.enterOwnSurname();
 
                // And 3rd for family name
-               String familyName = this.getContactManager().enterOwnFamilyName();
+               String familyName = manager.enterOwnFamilyName();
 
                // Company name ...
-               String companyName = this.getContactManager().enterOwnCompanyName();
+               String companyName = manager.enterOwnCompanyName();
 
                // Construct UserContact instance
                Contact contact = new UserContact(gender, surname, familyName, companyName);
 
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N
+
                // And return object
                return contact;
        }
@@ -205,59 +316,92 @@ public class ConsoleClient extends BaseClient implements Client {
         * Shutdown this client
         */
        @Override
-       public void doShutdown () {
+       public void doShutdown () throws SQLException, IOException {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Parent call
                super.doShutdown();
 
                // @TODO Add other shutdown stuff
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        @Override
        public void doUserMenuChoice () throws UnhandledUserChoiceException {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Get all access keys from menu
                char[] accessKeys = MenuTools.getAccessKeysFromMenuMap(this.getMenus(), this.getCurrentMenu());
 
                // Output textural message and ask for a char as input
                char choice = this.enterChar(accessKeys, "Bitte Auswahl eingeben (0=Programm beenden): ");
 
-               // @TODO Rewrite this ugly switch() block
-               switch (choice) {
-                       case '1': // Enter/add own data
-                               this.getContactManager().doEnterOwnData();
-                               break;
-
-                       case '2': // Change own data
-                               this.getContactManager().doChangeOwnData();
-                               break;
-
-                       case '3': // Add new addess
-                               this.getContactManager().doAddOtherAddress();
-                               break;
-
-                       case '4': // List contacts
-                               this.getContactManager().doListContacts();
-                               break;
-
-                       case '5': // Search addresses
-                               this.getContactManager().doSearchContacts();
-                               break;
-
-                       case '6': // Change other addess
-                               this.getContactManager().doChangeOtherAddress();
-                               break;
-
-                       case '7': // Delete other address
-                               this.getContactManager().doDeleteOtherAddress();
-                               break;
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
 
-                       case '0': // Program exit
+               // Try it!
+               try {
+                       // @TODO Rewrite this ugly switch() block
+                       switch (choice) {
+                               case '1':
+                                       try {
+                                               // Enter/add own data
+                                               manager.doEnterOwnData();
+                                       } catch (final ContactAlreadyAddedException ex) {
+                                               // Already added
+                                               this.outputMessage("Sie haben bereits Ihre eigenen Daten eingegeben.");
+                                       }
+                                       break;
+
+                               case '2': // Change own data
+                                       manager.doChangeOwnData();
+                                       break;
+
+                               case '3': // Add new addess
+                                       manager.doAddOtherAddress();
+                                       break;
+
+                               case '4': // List contacts
+                                       manager.doListContacts();
+                                       break;
+
+                               case '5': // Search addresses
+                                       manager.doSearchContacts();
+                                       break;
+
+                               case '6': // Change other addess
+                                       manager.doChangeOtherAddress();
+                                       break;
+
+                               case '7': // Delete other address
+                                       manager.doDeleteOtherAddress();
+                                       break;
+
+                       case '0': {
+                       try {
+                               // Program exit
                                this.getApplication().doShutdown();
+                       } catch (final SQLException | IOException ex) {
+                               this.abortProgramWithException(ex);
+                       }
+               }
                                break;
 
-                       default:
-                               // @TODO throw own exception
-                               throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));
+                               default:
+                                       // @TODO throw own exception
+                                       throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice)); //NOI18N
+                       }
+               } catch (final IOException | BadTokenException ex) {
+                       // Something bad happened
+                       this.abortProgramWithException(ex);
                }
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -269,6 +413,18 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public char enterChar (final char[] validChars, final String message) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("validChars={0},message={1} - CALLED!", Arrays.toString(validChars), message)); //NOI18N
+
+               // The validChars must not null be null and filled with at least one char
+               if (validChars == null) {
+                       // Is null
+                       throw new NullPointerException("validChars is null"); //NOI18N
+               } else if (validChars.length == 0) {
+                       // Is not filled
+                       throw new IllegalArgumentException("validChars is not filled."); //NOI18N
+               }
+
                char input = 0;
 
                // Sort array, else binarySearch() won't work
@@ -283,10 +439,45 @@ public class ConsoleClient extends BaseClient implements Client {
                        input = this.readChar();
                }
 
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
+
                // Return read char
                return input;
        }
 
+       /**
+        * Asks the user to enter his/her gender
+        *
+        * @param message Message to the user
+        * @return Gender enum
+        */
+       @Override
+       public Gender enterGender (final String message) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("message={0} - CALLED!", message)); //NOI18N
+
+               // Get valid chars
+               char[] validChars = Gender.validChars();
+
+               // Debug message
+               //* NOISY-DEBUG: */ System.out.println(validChars);
+               // Call inner method
+               char gender = this.enterChar(validChars, message);
+
+               // Now get a Gender instance back
+               Gender g = Gender.fromChar(gender);
+
+               // g must not be null
+               assert(g instanceof Gender) : "g is not set."; //NOI18N
+
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("g={0} - EXIT!", g)); //NOI18N
+
+               // Return it
+               return g;
+       }
+
        /**
         * Reads an integer (int) with a textural message from the user
         *
@@ -297,6 +488,9 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public int enterInt (final int minimum, final int maximum, final String message) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("minimum={0},maximum={1},message={2} - CALLED!", minimum, maximum, message)); //NOI18N
+
                // Minimum should not be below zero
                assert (minimum >= 0);
                assert (maximum > minimum);
@@ -312,6 +506,9 @@ public class ConsoleClient extends BaseClient implements Client {
                        input = this.readInt();
                }
 
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
+
                // Return it
                return input;
        }
@@ -327,6 +524,9 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("minLength={0},maxLength={1},message={2}allowEmpty={3} - CALLED!", minLength, maxLength, message, allowEmpty)); //NOI18N
+
                // Check on length, e.g. country codes are excactly 2 chars long
                assert (maxLength >= minLength);
 
@@ -342,6 +542,9 @@ public class ConsoleClient extends BaseClient implements Client {
                        input = this.readString();
                }
 
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
+
                // Return it
                return input;
        }
@@ -361,15 +564,26 @@ public class ConsoleClient extends BaseClient implements Client {
        }
 
        /**
-        * Inizializes this client
+        * Initializes this client
         */
        @Override
        public void init () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Init contact manager here
-               this.initContactManager();
+               try {
+                       this.initContactManager();
+               } catch (final UnsupportedDatabaseBackendException | SQLException ex) {
+                       // End here
+                       this.abortProgramWithException(ex);
+               }
 
                // Fill menu map
                this.fillMenuMap();
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -398,7 +612,7 @@ public class ConsoleClient extends BaseClient implements Client {
        @Override
        public void showEntry (final SelectableMenuItem item) {
                // Access key then text
-               this.outputMessage("[" + item.getAccessKey() + "] " + item.getText());
+               this.outputMessage(MessageFormat.format("[{0}] {1}", item.getAccessKey(), item.getText()));
        }
 
        /**
@@ -411,26 +625,38 @@ public class ConsoleClient extends BaseClient implements Client {
                this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software");
 
                // Debug message
-               this.getLogger().debug("Intro shown to user");
+               this.getLogger().debug("Intro shown to user"); //NOI18N
        }
 
        @Override
        public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException {
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
+
+               // Contact must not be null
+               if (contact == null) {
+                       // Abort here
+                       throw new NullPointerException("contact is null"); //NOI18N
+               }
+
                // Ask the user for editing [name], [a]ddress or [other] data
                char choice = this.enterChar(new char[] {'n', 'a', 'o', 'x'}, "Welchen Daten möchten Sie ändern? (n=Namensdaten, a=Anschriftsdaten, o=Andere, x=Zurück zur Hauptauswahl) ");
 
+               // Get manager and cast it
+               ManageableAddressbookContact manager = (ManageableAddressbookContact) this.getManager();
+
                // @TODO Get rid of this ugly switch block, too
                switch (choice) {
                        case 'n': // Name data
-                               this.getContactManager().doChangeNameData(contact, this);
+                               manager.doChangeNameData(contact);
                                break;
 
                        case 'a': // Address data
-                               this.getContactManager().doChangeAddressData(contact, this);
+                               manager.doChangeAddressData(contact);
                                break;
 
                        case 'o': // Other data
-                               this.getContactManager().doChangeOtherData(contact, this);
+                               manager.doChangeOtherData(contact);
                                break;
 
                        case 'x': // Exit this menu
@@ -439,8 +665,11 @@ public class ConsoleClient extends BaseClient implements Client {
 
                        default:
                                // @TODO throw own exception
-                               throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));
+                               throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice)); //NOI18N
                }
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 
        /**
@@ -450,7 +679,10 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        private char readChar () {
                // Read line
-               String input = this.scanner.nextLine();
+               String input = this.readString();
+
+               // Debug message
+               this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N
 
                // This must be only one character
                if (input.length() != 1) {
@@ -471,6 +703,9 @@ public class ConsoleClient extends BaseClient implements Client {
                // First read a string
                String input = this.readString();
 
+               // Debug message
+               this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N
+
                // Init number with invalid value
                int num = -1;
 
@@ -479,9 +714,12 @@ public class ConsoleClient extends BaseClient implements Client {
                        num = Integer.parseInt(input);
                } catch (final NumberFormatException e) {
                        this.outputMessage("Bitte geben Sie nur Zahlen ein!");
-                       this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage()));
+                       this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage())); //NOI18N
                }
 
+               // Trace message
+               this.getLogger().trace(MessageFormat.format("num={0} - EXIT!", num)); //NOI18N
+
                // Return read number
                return num;
        }
@@ -500,10 +738,16 @@ public class ConsoleClient extends BaseClient implements Client {
         */
        @Override
        protected final void fillMenuMap () {
+               // Trace message
+               this.getLogger().trace("CALLED!"); //NOI18N
+
                // Initialize first (main) menu
-               Menu menu = new ConsoleMenu("main", this);
+               Menu menu = new ConsoleMenu("main", this); //NOI18N
 
                // Add it
-               this.getMenus().put("main", menu);
+               this.getMenus().put("main", menu); //NOI18N
+
+               // Trace message
+               this.getLogger().trace("EXIT!"); //NOI18N
        }
 }