From a754609aa28461bbd8c95337a5260e1ebc5629df Mon Sep 17 00:00:00 2001
From: Roland Haeder <roland@mxchange.org>
Date: Wed, 15 Jul 2015 14:40:14 +0200
Subject: [PATCH] =?utf8?q?Introduced=20updateAddressData()=20+=20changing?=
 =?utf8?q?=20own=20"address=20data"=20is=20basicly=20finished=20Signed-off?=
 =?utf8?q?-by:Roland=20H=C3=A4der=20<roland@mxchange.org>?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 .../mxchange/addressbook/client/Client.java   | 20 +++-
 .../client/console/ConsoleClient.java         | 95 +++++++++++++++----
 .../addressbook/contact/BaseContact.java      | 16 ++++
 .../mxchange/addressbook/contact/Contact.java | 11 +++
 .../manager/contact/ContactManager.java       | 59 +++++++++++-
 5 files changed, 179 insertions(+), 22 deletions(-)

diff --git a/Addressbook/src/org/mxchange/addressbook/client/Client.java b/Addressbook/src/org/mxchange/addressbook/client/Client.java
index eeb66b7..4a48b04 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/Client.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/Client.java
@@ -16,8 +16,8 @@
  */
 package org.mxchange.addressbook.client;
 
-import org.mxchange.addressbook.UnhandledUserChoiceException;
 import org.mxchange.addressbook.FrameworkInterface;
+import org.mxchange.addressbook.UnhandledUserChoiceException;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
 
@@ -39,7 +39,7 @@ public interface Client extends FrameworkInterface {
      *
      * @param message Message to show to the user
      */
-    public void displayMessage (final String message);
+    public void outputMessage (final String message);
 
     /**
      * Displays a "box" for the name
@@ -58,6 +58,7 @@ public interface Client extends FrameworkInterface {
     /**
      * Let the user choose what to change on the address: [n]ame, [a]ddress,
      * [o]ther
+     * 
      * @param contact Contact instance to let the user change data
      * @throws UnhandledUserChoiceException If choice is not supported
      */
@@ -65,6 +66,7 @@ public interface Client extends FrameworkInterface {
 
     /**
      * Asks the user for a choice and proceeds accordingly
+     * 
      * @throws UnhandledUserChoiceException If choice is not supported
      */
     public void doUserMenuChoice () throws UnhandledUserChoiceException ;
@@ -76,6 +78,7 @@ public interface Client extends FrameworkInterface {
 
     /**
      * Asks the the user to enter a single character which must match validChars
+     * 
      * @param	validChars  Valid chars that are accepted
      * @param	message	    Message to user
      * @return	Allowed character
@@ -84,6 +87,7 @@ public interface Client extends FrameworkInterface {
 
     /**
      * Reads a string of minimum and maximum length from the user
+     * 
      * @param minLength	Minimum length of the string to read
      * @param maxLength	Maximum length of the string to read
      * @param message	Message to user
@@ -92,14 +96,26 @@ public interface Client extends FrameworkInterface {
      */
     public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty);
 
+    /**
+     * Reads an integer (int) from the user
+     * 
+     * @param minimum Minimum allowed number
+     * @param maximum Maximum allowed number
+     * @param message	Message to user
+     * @return Entered string by user or null if empty string is allowed
+     */
+    public int enterInt (final int minimum, final int maximum, final String message);
+
     /**
      * Setter for current menu choice
+     * 
      * @param currentMenu Current menu choice
      */
     public void setCurrentMenu (final String currentMenu);
 
     /**
      * Some "Getter" for menu item
+     * 
      * @param accessKey Key to press to access this menu
      * @param text Text to show to user
      * @return 
diff --git a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
index a67de85..532ba61 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
@@ -16,6 +16,7 @@
  */
 package org.mxchange.addressbook.client.console;
 
+import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
@@ -81,16 +82,7 @@ public class ConsoleClient extends BaseClient implements Client {
     public void displayAddressBox (final Contact contact) {
 	// Simple display ...
         // @todo Use mask
-	this.displayMessage("Strasse, PLZ Ort, Land: " + contact.getStreet() + "\n" + contact.getZipCode() + " " + contact.getCity() +  "\n" + contact.getCountryCode());
-    }
-
-    /**
-     * Displays textural message to the user
-     * @param message 
-     */
-    @Override
-    public void displayMessage (final String message) {
-	System.out.println(message);
+	this.outputMessage("Strasse, PLZ Ort, Land: " + contact.getStreet() + "\n" + contact.getZipCode() + " " + contact.getCity() +  "\n" + contact.getCountryCode());
     }
 
     /**
@@ -110,10 +102,10 @@ public class ConsoleClient extends BaseClient implements Client {
 	if ((companyName == null) || (companyName.isEmpty())) {
 	    // Now put all together: gender, surname, family name
 	    // @todo Use mask
-	    this.displayMessage("Anrede, Vorname, Name: " + gender + " " + contact.getSurname() + " " + contact.getFamilyName());
+	    this.outputMessage("Anrede, Vorname, Name: " + gender + " " + contact.getSurname() + " " + contact.getFamilyName());
 	} else {
 	    // Company contact
-	    this.displayMessage("Firma: " + companyName + "\nAnsprechpartner: " + gender + " " + contact.getSurname() + " " + contact.getFamilyName());
+	    this.outputMessage("Firma: " + companyName + "\nAnsprechpartner: " + gender + " " + contact.getSurname() + " " + contact.getFamilyName());
 	}
     }
 
@@ -125,7 +117,7 @@ public class ConsoleClient extends BaseClient implements Client {
     @Override
     public void displayOtherDataBox (final Contact contact) {
 	// Cellphone and such ...
-	this.displayMessage("Telefonnumer: " + contact.getPhoneNumber() + "\nFaxnummer: " + contact.getFaxNumber() + "\nHandy: " + contact.getCellphoneNumber() + "\nKommentar:\n" + contact.getComment());
+	this.outputMessage("Telefonnumer: " + contact.getPhoneNumber() + "\nFaxnummer: " + contact.getFaxNumber() + "\nHandy: " + contact.getCellphoneNumber() + "\nKommentar:\n" + contact.getComment());
     }
 
     @Override
@@ -223,8 +215,38 @@ public class ConsoleClient extends BaseClient implements Client {
 	return input;
     }
 
+    /**
+     * Reads an integer (int) with a textural message from the user
+     * 
+     * @param minimum Minimum allowed number
+     * @param maximum Maximum allowed number
+     * @param message Messager to display in console
+     * @return 
+     */
+    @Override
+    public int enterInt (final int minimum, final int maximum, final String message) {
+	// Minimum should not be below zero
+	assert(minimum >= 0);
+	assert(maximum > minimum);
+
+	// Init input
+	int input = -1;
+
+	while ((input < minimum) || (input > maximum)) {
+	    // Output message
+	    System.out.print(message);
+
+	    // Read integer from user
+	    input = this.readInt();
+	}
+
+	// Return it
+	return input;
+    }
+
     /**
      * Reads a string of minimum and maximum length from the user
+     * 
      * @param minLength	Minimum length of the string to read
      * @param maxLength	Maximum length of the string to read
      * @param message	Message to user
@@ -233,6 +255,9 @@ public class ConsoleClient extends BaseClient implements Client {
      */
     @Override
     public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {
+	// Check on length, e.g. country codes are excactly 2 chars long
+	assert(maxLength >= minLength);
+
 	// Init input
 	String input = null;
 
@@ -263,6 +288,15 @@ public class ConsoleClient extends BaseClient implements Client {
 	return new ConsoleMenuItem(accessKey,text);
     }
 
+    /**
+     * Displays textural message to the user
+     * @param message
+     */
+    @Override
+    public void outputMessage (final String message) {
+	System.out.println(message);
+    }
+
     /**
      * Shows textural menu on console
      */
@@ -274,7 +308,7 @@ public class ConsoleClient extends BaseClient implements Client {
     @Override
     public void showEntry (final SelectableMenuItem item) {
 	// Access key then text
-	this.displayMessage("[" + item.getAccessKey() + "] " + item.getText());
+	this.outputMessage("[" + item.getAccessKey() + "] " + item.getText());
     }
 
     /**
@@ -282,9 +316,9 @@ public class ConsoleClient extends BaseClient implements Client {
      */
     @Override
     public void showWelcome () {
-	 this.displayMessage("Welcome to " + AddressbookApplication.APP_TITLE + " v" + AddressbookApplication.APP_VERSION);
-	 this.displayMessage("");
-	 this.displayMessage("Copyright(c) 2015 by Roland Haeder, this is free software");
+	 this.outputMessage("Welcome to " + AddressbookApplication.APP_TITLE + " v" + AddressbookApplication.APP_VERSION);
+	 this.outputMessage("");
+	 this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software");
 	 
 	 // Debug message
 	 this.getLogger().debug("Intro shown to user");
@@ -323,7 +357,8 @@ public class ConsoleClient extends BaseClient implements Client {
 
     /**
      * Reads one character
-     * @return 
+     * 
+     * @return A single character
      */
     private char readChar () {
 	// Read line
@@ -339,6 +374,30 @@ public class ConsoleClient extends BaseClient implements Client {
 	return input.charAt(0);
     }
 
+    /**
+     * Reads an integer (int) from user
+     * 
+     * @return An integer number
+     */
+    private int readInt () {
+	// First read a string
+	String input = this.readString();
+
+	// Init number with invalid value
+	int num = -1;
+
+	// Parse number, this can be risky
+	try {
+	    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()));
+	}
+
+	// Return read number
+	return num;
+    }
+
     /**
      * Reads a string from a scanner until RETURN is pressed
      * 
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
index 7bf18b0..da93b3d 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
@@ -468,6 +468,22 @@ public class BaseContact extends BaseFrameworkSystem {
 	client.displayOtherDataBox((Contact) this);
     }
 
+    /**
+     * Updates address data in this Contact instance
+     *
+     * @param street Street
+     * @param zipCode ZIP code
+     * @param city City
+     * @param countryCode Country code
+     */
+    public void updateAddressData (final String street, final int zipCode, final String city, final String countryCode) {
+	// Set all
+	this.setStreet(street);
+	this.setZipCode(zipCode);
+	this.setCity(city);
+	this.setCountryCode(countryCode);
+    }
+
     /**
      * Updates name data in this Contact instance
      * @param gender Gender (M, F, C)
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/Contact.java b/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
index ee52c3c..b027237 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
@@ -156,8 +156,19 @@ public interface Contact extends FrameworkInterface {
      */
     public void show (final Client client);
 
+    /**
+     * Updates address data in this Contact instance
+     * 
+     * @param street Street
+     * @param zipCode ZIP code
+     * @param city City
+     * @param countryCode Country code
+     */
+    public void updateAddressData (final String street, final int zipCode, final String city, final String countryCode);
+
     /**
      * Updates name data in this Contact instance
+     * 
      * @param gender Gender (M, F, C)
      * @param surname Surname
      * @param familyName Family name
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
index 7dca9da..0b4b47b 100644
--- a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
+++ b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
@@ -97,7 +97,29 @@ public class ContactManager extends BaseManager implements ManageableContact {
      */
     @Override
     public void changeAddressData (final Contact contact, final Client client) {
-	throw new UnsupportedOperationException("Not supported yet.");
+	// First display it again
+	client.displayAddressBox(contact);
+
+	// Is it own data?
+	if (contact.isOwnContact()) {
+	    // Own address data
+	    String street = this.enterOwnStreet();
+
+	    // Get zip code
+	    int zipCode = this.enterOwnZipCode();
+
+	    // Get city name
+	    String city = this.enterOwnCity();
+
+	    // Get country code
+	    String countryCode = this.enterOwnCountryCode();
+
+	    // Update address data
+	    contact.updateAddressData(street, zipCode, city, countryCode);
+	} else {
+	    // Other contact's address data to change
+	    throw new UnsupportedOperationException("Changing contact entries not finished.");
+	}
     }
 
     /**
@@ -164,7 +186,7 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	 */
 	if (!this.isOwnContactAdded()) {
 	    // Not added
-	    this.getClient().displayMessage("Sie haben noch nicht Ihre Daten eingegeben.");
+	    this.getClient().outputMessage("Sie haben noch nicht Ihre Daten eingegeben.");
 
 	    // Skip any below code
 	    return;
@@ -240,6 +262,24 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);
     }
 
+    /**
+     * Asks the user for his/her city's name
+     * 
+     * @return City's name of the user
+     */
+    private String enterOwnCity () {
+	return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);
+    }
+
+    /**
+     * Asks user for his/her own country code
+     * 
+     * @return User's own country code
+     */
+    private String enterOwnCountryCode () {
+	return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false);
+    }
+
     /**
      * Asks the user for family name
      * @return Family name of the user
@@ -256,6 +296,13 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	return this.getClient().enterChar(new char[] {'M', 'F', 'C'}, "Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");
     }
 
+    /**
+     * Asks the user for own street (including number)
+     */
+    private String enterOwnStreet () {
+	return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);
+    }
+
     /**
      * Asks the user for surname
      * @return Surname of the user
@@ -264,6 +311,14 @@ public class ContactManager extends BaseManager implements ManageableContact {
 	return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);
     }
 
+    /**
+     * Asks the user for own ZIP code
+     * @return ZIP code
+     */
+    private int enterOwnZipCode () {
+	return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
+    }
+
     /**
      * "Getter" for own contact instance or null if not found
      *
-- 
2.39.5