X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=Addressbook%2Fsrc%2Forg%2Fmxchange%2Faddressbook%2Fclient%2Fconsole%2FConsoleClient.java;h=6ed15fb2a04a79feee994d412fdfc53bbc388a1c;hb=a67280d037eb9f783695157780cbbc676e84b26f;hp=94818f13d145b60ef3f2520a3a0d2e68fe0f85c8;hpb=ea30fd0dc674dcd10c3aead1acd47000a99d7334;p=addressbook-lib.git diff --git a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java index 94818f1..6ed15fb 100644 --- a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java +++ b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java @@ -16,28 +16,35 @@ */ 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 } }