*/\r
package org.mxchange.addressbook.manager.contact;\r
\r
+import java.text.MessageFormat;\r
import java.util.ArrayList;\r
+import java.util.Collections;\r
import java.util.Iterator;\r
import java.util.List;\r
import org.mxchange.addressbook.UnhandledUserChoiceException;\r
import org.mxchange.addressbook.client.Client;\r
import org.mxchange.addressbook.contact.Contact;\r
import org.mxchange.addressbook.contact.user.UserContact;\r
+import org.mxchange.addressbook.database.frontend.contact.ContactDatabaseFrontend;\r
+import org.mxchange.addressbook.database.frontend.contact.ContactWrapper;\r
import org.mxchange.addressbook.manager.BaseManager;\r
\r
/**\r
- * A manager for contacts\r
+ * A manager for contacts, please note that this implementation loads the whole\r
+ * list into RAM.\r
*\r
* @author Roland Haeder\r
* @version 0.0\r
public class ContactManager extends BaseManager implements ManageableContact {\r
\r
/**\r
- * All contacts\r
+ * A ContactWrapper instance\r
+ */\r
+ private final ContactWrapper contactDatabase;\r
+\r
+ /**\r
+ * A list of all contacts\r
*/\r
private final List<Contact> contacts;\r
\r
// Init contacts\r
this.contacts = new ArrayList<>(maxContacts);\r
\r
+ // Init database connection\r
+ this.contactDatabase = new ContactDatabaseFrontend();\r
+\r
+ // Read all entries\r
+ this.contactDatabase.readAllContacts(this);\r
+\r
// Debug message\r
//* NOISY-DEBUG: */ this.getLogger().debug("client=" + client);\r
\r
}\r
\r
/**\r
- * Adds given contact to address book\r
+ * Adds given Contact instance to list\r
*\r
- * @param contact Contact being added\r
- * @todo Add check for book size\r
+ * @param contact Contact instance to add\r
*/\r
@Override\r
public void addContact (final Contact contact) {\r
- // Check if contact is found\r
- if (this.isContactAlreadyAdded(contact)) {\r
- // Contact already added\r
- // @todo Do something here\r
- } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {\r
- // Own contact already added\r
- // @todo Do something\r
- }\r
-\r
- // Debug message\r
- /* NOISY-DEBUG: */ this.getLogger().debug("Adding '" + contact.getSurname() + "' '" + contact.getFamilyName() + "' at pos '" + this.size () + "' ...");\r
-\r
- // Add contact\r
this.contacts.add(contact);\r
}\r
\r
throw new UnsupportedOperationException("Not supported yet.");\r
}\r
\r
+ /**\r
+ * Let the user change other address\r
+ */\r
+ @Override\r
+ public void changeOtherAddress () {\r
+ throw new UnsupportedOperationException("Not supported yet.");\r
+ }\r
+\r
+ /**\r
+ * Allows the user to change his/her own data\r
+ */\r
+ @Override\r
+ public void changeOwnData () {\r
+ /*\r
+ * First check if the user has registered own contact, before that\r
+ * nothing can be changed.\r
+ */\r
+ if (!this.isOwnContactAdded()) {\r
+ // Not added\r
+ this.getClient().outputMessage("Sie haben noch nicht Ihre Daten eingegeben.");\r
+ \r
+ // Skip any below code\r
+ return;\r
+ }\r
+ \r
+ // Instance\r
+ Contact contact = this.getOwnContact();\r
+ \r
+ // It must be found\r
+ assert(contact instanceof Contact);\r
+ \r
+ // Display contact\r
+ contact.show(this.getClient());\r
+ \r
+ try {\r
+ // Ask user what to change\r
+ this.getClient().userChooseChangeContactData(contact);\r
+ } catch (final UnhandledUserChoiceException ex) {\r
+ this.getLogger().catching(ex);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Let the user delete other address\r
+ */\r
+ @Override\r
+ public void deleteOtherAddress () {\r
+ throw new UnsupportedOperationException("Not supported yet.");\r
+ }\r
+\r
/**\r
* Let the user change address data\r
* \r
* @param client Client instance to call back\r
*/\r
@Override\r
- public void changeAddressData (final Contact contact, final Client client) {\r
- throw new UnsupportedOperationException("Not supported yet.");\r
+ public void doChangeAddressData (final Contact contact, final Client client) {\r
+ // First display it again\r
+ client.displayAddressBox(contact);\r
+\r
+ // Is it own data?\r
+ if (contact.isOwnContact()) {\r
+ // Own address data\r
+ String street = this.enterOwnStreet();\r
+\r
+ // Get zip code\r
+ int zipCode = this.enterOwnZipCode();\r
+\r
+ // Get city name\r
+ String city = this.enterOwnCity();\r
+\r
+ // Get country code\r
+ String countryCode = this.enterOwnCountryCode();\r
+\r
+ // Update address data\r
+ contact.updateAddressData(street, zipCode, city, countryCode);\r
+ } else {\r
+ // Other contact's address data to change\r
+ throw new UnsupportedOperationException("Changing contact entries not finished.");\r
+ }\r
+\r
+ // Flush whole list\r
+ this.flush();\r
}\r
\r
/**\r
* @param client Client instance to call back\r
*/\r
@Override\r
- public void changeNameData (final Contact contact, final Client client) {\r
+ public void doChangeNameData (final Contact contact, final Client client) {\r
// First display them again\r
client.displayNameBox(contact);\r
\r
String familyName = this.enterOwnFamilyName();\r
\r
// And company\r
- String companyName = this.enterCompanyName();\r
+ String companyName = this.enterOwnCompanyName();\r
\r
// Update contact instance\r
contact.updateNameData(gender, surname, familyName, companyName);\r
// Then re-ask them ...\r
throw new UnsupportedOperationException("Changing contact entries not finished.");\r
}\r
- }\r
\r
- /**\r
- * Let the user change other address\r
- */\r
- @Override\r
- public void changeOtherAddress () {\r
- throw new UnsupportedOperationException("Not supported yet.");\r
+ // Flush whole list\r
+ this.flush();\r
}\r
\r
/**\r
*\r
* @param contact Instance to change data\r
* @param client Client instance to call back\r
+ * @todo Didn't handle birthday\r
*/\r
@Override\r
- public void changeOtherData (final Contact contact, final Client client) {\r
- throw new UnsupportedOperationException("Not supported yet.");\r
- }\r
+ public void doChangeOtherData (final Contact contact, final Client client) {\r
+ // First display them again\r
+ client.displayOtherDataBox(contact);\r
\r
- /**\r
- * Allows the user to change his/her own data\r
- */\r
- @Override\r
- public void changeOwnData () {\r
- /*\r
- * First check if the user has registered own contact, before that \r
- * nothing can be changed.\r
- */\r
- if (!this.isOwnContactAdded()) {\r
- // Not added\r
- this.getClient().displayMessage("Sie haben noch nicht Ihre Daten eingegeben.");\r
+ // Is this own data?\r
+ if (contact.isOwnContact()) {\r
+ // Re-ask own data\r
+ // Phone number\r
+ String phoneNumber = this.enterOwnPhoneNumber();\r
\r
- // Skip any below code\r
- return;\r
- }\r
+ // Phone number\r
+ String cellNumber = this.enterOwnCellNumber();\r
\r
- // Instance\r
- Contact contact = this.getOwnContact();\r
+ // Fax number\r
+ String faxNumber = this.enterOwnFaxNumber();\r
\r
- // It must be found\r
- assert(contact instanceof Contact);\r
+ // Email address\r
+ String email = this.enterOwnEmailAddress();\r
\r
- // Display contact\r
- contact.show(this.getClient());\r
+ // Comment\r
+ String comment = this.enterOwnComment();\r
\r
- try {\r
- // Ask user what to change\r
- this.getClient().doUserChangeAdressChoice(contact);\r
- } catch (final UnhandledUserChoiceException ex) {\r
- this.getLogger().catching(ex);\r
+ // Update contact instance\r
+ contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);\r
+ } else {\r
+ // Then re-ask them ...\r
+ throw new UnsupportedOperationException("Changing contact entries not finished.");\r
}\r
- }\r
\r
- /**\r
- * Let the user delete other address\r
- */\r
- @Override\r
- public void deleteOtherAddress () {\r
- throw new UnsupportedOperationException("Not supported yet.");\r
+ // Flush whole list\r
+ this.flush();\r
}\r
\r
/**\r
* Asks user for own data\r
*/\r
@Override\r
- public void enterOwnData () {\r
+ public void doEnterOwnData () {\r
// First ask for gender\r
char gender = this.enterOwnGender();\r
\r
String familyName = this.enterOwnFamilyName();\r
\r
// Company name ...\r
- String companyName = this.enterCompanyName();\r
+ String companyName = this.enterOwnCompanyName();\r
\r
// Construct UserContact instance\r
Contact contact = new UserContact(gender, surname, familyName, companyName);\r
\r
- // Mark contact as own\r
- contact.enableFlagOwnContact();\r
-\r
// Add it to contact "book"\r
+ this.registerContact(contact);\r
+ }\r
+\r
+ /**\r
+ * Getter for whole contact list\r
+ * \r
+ * @return List of all contacts\r
+ */\r
+ @Override\r
+ public List<Contact> getList () {\r
+ return Collections.unmodifiableList(this.contacts);\r
+ }\r
+\r
+ @Override\r
+ public void listContacts () {\r
+ throw new UnsupportedOperationException("Not supported yet.");\r
+ }\r
+\r
+ /**\r
+ * Adds given contact to address book and flushes all entries to database\r
+ *\r
+ * @param contact Contact being added\r
+ * @todo Add check for book size\r
+ */\r
+ @Override\r
+ public void registerContact (final Contact contact) {\r
+ // Check if contact is found\r
+ if (this.isContactAlreadyAdded(contact)) {\r
+ // Contact already added\r
+ // @todo Do something here\r
+ } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {\r
+ // Own contact already added\r
+ // @todo Do something\r
+ }\r
+ \r
+ // Debug message\r
+ /* NOISY-DEBUG: */ this.getLogger().debug(MessageFormat.format("Adding '{0}' '{1}' at pos '{2}' ...", contact.getSurname(), contact.getFamilyName(), this.size()));\r
+ \r
+ // Add contact to internal list\r
this.addContact(contact);\r
+ \r
+ // Flush whole list\r
+ this.flush();\r
+ }\r
+\r
+ @Override\r
+ public void searchContacts () {\r
+ throw new UnsupportedOperationException("Not supported yet.");\r
}\r
\r
/**\r
return this.contacts.size();\r
}\r
\r
+ /**\r
+ * Asks the user for his/her cellphone number\r
+ * \r
+ * @return User's cellphone number\r
+ */\r
+ private String enterOwnCellNumber () {\r
+ return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);\r
+ }\r
+\r
+ /**\r
+ * Asks the user for his/her city's name\r
+ *\r
+ * @return City's name of the user\r
+ */\r
+ private String enterOwnCity () {\r
+ return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);\r
+ }\r
+\r
+ /**\r
+ * Asks the user for his/her city's name\r
+ *\r
+ * @return City's name of the user\r
+ */\r
+ private String enterOwnComment () {\r
+ return this.getClient().enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);\r
+ }\r
+\r
/**\r
* Asks the user for his/her company name\r
- * @return \r
+ * \r
+ * @return User's company name\r
*/\r
- private String enterCompanyName () {\r
+ private String enterOwnCompanyName () {\r
return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);\r
}\r
\r
+ /**\r
+ * Asks user for his/her own country code\r
+ * \r
+ * @return User's own country code\r
+ */\r
+ private String enterOwnCountryCode () {\r
+ return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();\r
+ }\r
+\r
+ /**\r
+ * Asks user for his/her own country code\r
+ * \r
+ * @return User's own country code\r
+ */\r
+ private String enterOwnEmailAddress () {\r
+ return this.getClient().enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);\r
+ }\r
+\r
/**\r
* Asks the user for family name\r
+ * \r
* @return Family name of the user\r
*/\r
private String enterOwnFamilyName () {\r
return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);\r
}\r
\r
+ /**\r
+ * Asks the user for family name\r
+ * \r
+ * @return Family name of the user\r
+ */\r
+ private String enterOwnFaxNumber () {\r
+ return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);\r
+ }\r
+\r
/**\r
* Asks the user for gender, until a valid has been entered\r
+ * \r
* @return Gender of the user\r
*/\r
private char enterOwnGender () {\r
return this.getClient().enterChar(new char[] {'M', 'F', 'C'}, "Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");\r
}\r
\r
+ /**\r
+ * Asks the user for phone number\r
+ * \r
+ * @return Phone number of the user\r
+ */\r
+ private String enterOwnPhoneNumber () {\r
+ return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);\r
+ }\r
+\r
+ /**\r
+ * Asks the user for own street (including number)\r
+ */\r
+ private String enterOwnStreet () {\r
+ return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);\r
+ }\r
+\r
/**\r
* Asks the user for surname\r
* @return Surname of the user\r
return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);\r
}\r
\r
+ /**\r
+ * Asks the user for own ZIP code\r
+ * @return ZIP code\r
+ */\r
+ private int enterOwnZipCode () {\r
+ return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");\r
+ }\r
+\r
+ /**\r
+ * Flushes all entries by calling database backend\r
+ */\r
+ private void flush () {\r
+ // Flusgh all\r
+ this.getContactDatabase().flushAllContacts(this);\r
+ }\r
+\r
+ /**\r
+ * A ContactWrapper instance\r
+ *\r
+ * @return the database\r
+ */\r
+ private ContactWrapper getContactDatabase () {\r
+ return this.contactDatabase;\r
+ }\r
+\r
/**\r
* "Getter" for own contact instance or null if not found\r
*\r
}\r
\r
/**\r
- * Checks whether own contact is already added by checking all entries for isOwnContact flag\r
+ * Checks whether own contact is already added by checking all entries for\r
+ * isOwnContact flag\r
+ * \r
* @return Whether own contact is already added\r
*/\r
private boolean isOwnContactAdded () {\r