2 * Copyright (C) 2015 Roland Haeder
\r
4 * This program is free software: you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation, either version 3 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License
\r
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
17 package org.mxchange.addressbook.manager.contact;
\r
19 import java.text.MessageFormat;
\r
20 import java.util.ArrayList;
\r
21 import java.util.Collections;
\r
22 import java.util.Iterator;
\r
23 import java.util.List;
\r
24 import org.mxchange.addressbook.UnhandledUserChoiceException;
\r
25 import org.mxchange.addressbook.client.Client;
\r
26 import org.mxchange.addressbook.contact.Contact;
\r
27 import org.mxchange.addressbook.contact.user.UserContact;
\r
28 import org.mxchange.addressbook.database.frontend.contact.ContactDatabaseFrontend;
\r
29 import org.mxchange.addressbook.database.frontend.contact.ContactWrapper;
\r
30 import org.mxchange.addressbook.manager.BaseManager;
\r
33 * A manager for contacts, please note that this implementation loads the whole
\r
36 * @author Roland Haeder
\r
40 public class ContactManager extends BaseManager implements ManageableContact {
\r
43 * A ContactWrapper instance
\r
45 private final ContactWrapper contactDatabase;
\r
48 * A list of all contacts
\r
50 private final List<Contact> contacts;
\r
53 * @param maxContacts Maximum allowed contacts
\r
54 * @param client Client instance to use
\r
56 public ContactManager (final int maxContacts, final Client client) {
\r
57 // Always call super constructor first
\r
61 this.contacts = new ArrayList<>(maxContacts);
\r
63 // Init database connection
\r
64 this.contactDatabase = new ContactDatabaseFrontend();
\r
67 this.contactDatabase.readAllContacts(this);
\r
70 //* NOISY-DEBUG: */ this.getLogger().debug("client=" + client);
\r
73 this.setClient(client);
\r
77 * Adds given Contact instance to list
\r
79 * @param contact Contact instance to add
\r
82 public void addContact (final Contact contact) {
\r
83 this.contacts.add(contact);
\r
87 * Let the user add a new other address
\r
90 public void addOtherAddress () {
\r
91 throw new UnsupportedOperationException("Not supported yet.");
\r
95 * Let the user change other address
\r
98 public void changeOtherAddress () {
\r
99 throw new UnsupportedOperationException("Not supported yet.");
\r
103 * Allows the user to change his/her own data
\r
106 public void changeOwnData () {
\r
108 * First check if the user has registered own contact, before that
\r
109 * nothing can be changed.
\r
111 if (!this.isOwnContactAdded()) {
\r
113 this.getClient().outputMessage("Sie haben noch nicht Ihre Daten eingegeben.");
\r
115 // Skip any below code
\r
120 Contact contact = this.getOwnContact();
\r
122 // It must be found
\r
123 assert(contact instanceof Contact);
\r
126 contact.show(this.getClient());
\r
129 // Ask user what to change
\r
130 this.getClient().userChooseChangeContactData(contact);
\r
131 } catch (final UnhandledUserChoiceException ex) {
\r
132 this.getLogger().catching(ex);
\r
137 * Let the user delete other address
\r
140 public void deleteOtherAddress () {
\r
141 throw new UnsupportedOperationException("Not supported yet.");
\r
145 * Let the user change address data
\r
147 * @param contact Instance to change data
\r
148 * @param client Client instance to call back
\r
151 public void doChangeAddressData (final Contact contact, final Client client) {
\r
152 // First display it again
\r
153 client.displayAddressBox(contact);
\r
156 if (contact.isOwnContact()) {
\r
157 // Own address data
\r
158 String street = this.enterOwnStreet();
\r
161 int zipCode = this.enterOwnZipCode();
\r
164 String city = this.enterOwnCity();
\r
166 // Get country code
\r
167 String countryCode = this.enterOwnCountryCode();
\r
169 // Update address data
\r
170 contact.updateAddressData(street, zipCode, city, countryCode);
\r
172 // Other contact's address data to change
\r
173 throw new UnsupportedOperationException("Changing contact entries not finished.");
\r
176 // Flush whole list
\r
181 * Let the user change "name data"
\r
183 * @param contact Instance to change data
\r
184 * @param client Client instance to call back
\r
187 public void doChangeNameData (final Contact contact, final Client client) {
\r
188 // First display them again
\r
189 client.displayNameBox(contact);
\r
191 // Is this own data?
\r
192 if (contact.isOwnContact()) {
\r
195 char gender = this.enterOwnGender();
\r
198 String surname = this.enterOwnSurname();
\r
201 String familyName = this.enterOwnFamilyName();
\r
204 String companyName = this.enterOwnCompanyName();
\r
206 // Update contact instance
\r
207 contact.updateNameData(gender, surname, familyName, companyName);
\r
209 // Then re-ask them ...
\r
210 throw new UnsupportedOperationException("Changing contact entries not finished.");
\r
213 // Flush whole list
\r
218 * Let the user change other data
\r
220 * @param contact Instance to change data
\r
221 * @param client Client instance to call back
\r
222 * @todo Didn't handle birthday
\r
225 public void doChangeOtherData (final Contact contact, final Client client) {
\r
226 // First display them again
\r
227 client.displayOtherDataBox(contact);
\r
229 // Is this own data?
\r
230 if (contact.isOwnContact()) {
\r
233 String phoneNumber = this.enterOwnPhoneNumber();
\r
236 String cellNumber = this.enterOwnCellNumber();
\r
239 String faxNumber = this.enterOwnFaxNumber();
\r
242 String email = this.enterOwnEmailAddress();
\r
245 String comment = this.enterOwnComment();
\r
247 // Update contact instance
\r
248 contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);
\r
250 // Then re-ask them ...
\r
251 throw new UnsupportedOperationException("Changing contact entries not finished.");
\r
254 // Flush whole list
\r
259 * Asks user for own data
\r
262 public void doEnterOwnData () {
\r
263 // First ask for gender
\r
264 char gender = this.enterOwnGender();
\r
267 String surname = this.enterOwnSurname();
\r
269 // And 3rd for family name
\r
270 String familyName = this.enterOwnFamilyName();
\r
272 // Company name ...
\r
273 String companyName = this.enterOwnCompanyName();
\r
275 // Construct UserContact instance
\r
276 Contact contact = new UserContact(gender, surname, familyName, companyName);
\r
278 // Add it to contact "book"
\r
279 this.registerContact(contact);
\r
283 * Shuts down this contact manager
\r
286 public void doShutdown () {
\r
287 // Shut down the database layer
\r
288 this.contactDatabase.doShutdown();
\r
292 * Getter for whole contact list
\r
294 * @return List of all contacts
\r
297 public List<Contact> getList () {
\r
298 return Collections.unmodifiableList(this.contacts);
\r
302 public void listContacts () {
\r
303 throw new UnsupportedOperationException("Not supported yet.");
\r
307 * Adds given contact to address book and flushes all entries to database
\r
309 * @param contact Contact being added
\r
310 * @todo Add check for book size
\r
313 public void registerContact (final Contact contact) {
\r
314 // Check if contact is found
\r
315 if (this.isContactAlreadyAdded(contact)) {
\r
316 // Contact already added
\r
317 // @todo Do something here
\r
318 } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {
\r
319 // Own contact already added
\r
320 // @todo Do something
\r
324 /* NOISY-DEBUG: */ this.getLogger().debug(MessageFormat.format("Adding '{0}' '{1}' at pos '{2}' ...", contact.getSurname(), contact.getFamilyName(), this.size()));
\r
326 // Add contact to internal list
\r
327 this.addContact(contact);
\r
329 // Flush whole list
\r
334 public void searchContacts () {
\r
335 throw new UnsupportedOperationException("Not supported yet.");
\r
341 * @return size of contact "book"
\r
344 public int size () {
\r
345 return this.contacts.size();
\r
349 * Asks the user for his/her cellphone number
\r
351 * @return User's cellphone number
\r
353 private String enterOwnCellNumber () {
\r
354 return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);
\r
358 * Asks the user for his/her city's name
\r
360 * @return City's name of the user
\r
362 private String enterOwnCity () {
\r
363 return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);
\r
367 * Asks the user for his/her city's name
\r
369 * @return City's name of the user
\r
371 private String enterOwnComment () {
\r
372 return this.getClient().enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);
\r
376 * Asks the user for his/her company name
\r
378 * @return User's company name
\r
380 private String enterOwnCompanyName () {
\r
381 return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);
\r
385 * Asks user for his/her own country code
\r
387 * @return User's own country code
\r
389 private String enterOwnCountryCode () {
\r
390 return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();
\r
394 * Asks user for his/her own country code
\r
396 * @return User's own country code
\r
398 private String enterOwnEmailAddress () {
\r
399 return this.getClient().enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);
\r
403 * Asks the user for family name
\r
405 * @return Family name of the user
\r
407 private String enterOwnFamilyName () {
\r
408 return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);
\r
412 * Asks the user for family name
\r
414 * @return Family name of the user
\r
416 private String enterOwnFaxNumber () {
\r
417 return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);
\r
421 * Asks the user for gender, until a valid has been entered
\r
423 * @return Gender of the user
\r
425 private char enterOwnGender () {
\r
426 return this.getClient().enterChar(new char[] {'M', 'F', 'C'}, "Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");
\r
430 * Asks the user for phone number
\r
432 * @return Phone number of the user
\r
434 private String enterOwnPhoneNumber () {
\r
435 return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);
\r
439 * Asks the user for own street (including number)
\r
441 private String enterOwnStreet () {
\r
442 return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);
\r
446 * Asks the user for surname
\r
447 * @return Surname of the user
\r
449 private String enterOwnSurname () {
\r
450 return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);
\r
454 * Asks the user for own ZIP code
\r
457 private int enterOwnZipCode () {
\r
458 return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
\r
462 * Flushes all entries by calling database backend
\r
464 private void flush () {
\r
466 this.getContactDatabase().flushAllContacts(this);
\r
470 * A ContactWrapper instance
\r
472 * @return the database
\r
474 private ContactWrapper getContactDatabase () {
\r
475 return this.contactDatabase;
\r
479 * "Getter" for own contact instance or null if not found
\r
481 * @return Contact instance or null
\r
483 private Contact getOwnContact () {
\r
484 // Now get it back from address book, first get an iterator
\r
485 Iterator<Contact> iterator = this.contacts.iterator();
\r
488 Contact contact = null;
\r
490 // Search all contact
\r
491 while (iterator.hasNext()) {
\r
492 // Get next instance
\r
493 Contact next = iterator.next();
\r
495 // Is this own contact?
\r
496 if (next.isOwnContact()) {
\r
504 // Return instance or null
\r
509 * Checks whether given contact was found in "address book"
\r
511 * @param checkContact Contact to be checked
\r
512 * @return TRUE if found, FALSE if not found
\r
514 private boolean isContactAlreadyAdded (final Contact checkContact) throws NullPointerException {
\r
515 // Default is not found
\r
516 boolean isFound = false;
\r
519 //* NOISY-DEBUG: */ this.getLogger().debug("Checking '" + this.contacts.length + "' entries...");
\r
521 // Now get it back from address book, first get an iterator
\r
522 Iterator<Contact> iterator = this.contacts.iterator();
\r
525 while (iterator.hasNext()) {
\r
527 Contact contact = iterator.next();
\r
530 //* NOISY-DEBUG: */ this.getLogger().debug("contact=" + contact + ",checkContent=" + checkContact);
\r
533 if ((contact instanceof Contact) && ((contact.equals(checkContact)))) {
\r
534 // Found matching entry
\r
545 * Checks whether own contact is already added by checking all entries for
\r
546 * isOwnContact flag
\r
548 * @return Whether own contact is already added
\r
550 private boolean isOwnContactAdded () {
\r
551 // Default is not added
\r
552 boolean isAdded = false;
\r
554 // Now get it back from address book, first get an iterator
\r
555 Iterator<Contact> iterator = this.contacts.iterator();
\r
558 while (iterator.hasNext()) {
\r
560 Contact contact = iterator.next();
\r
563 if (contact instanceof Contact) {
\r
565 isAdded = contact.isOwnContact();
\r
567 // Is this own contact?
\r