*/
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
* @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
}
/**
*/
@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
}
/**
*/
@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();
// 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
}
/**
*/
@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;
}
* 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
}
/**
*/
@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
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
*
*/
@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);
input = this.readInt();
}
+ // Trace message
+ this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
+
// Return it
return input;
}
*/
@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);
input = this.readString();
}
+ // Trace message
+ this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
+
// Return it
return input;
}
}
/**
- * 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
}
/**
@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()));
}
/**
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
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
}
/**
*/
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) {
// 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;
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;
}
*/
@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
}
}