]> git.mxchange.org Git - jaddressbook-lib.git/blob - Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
0b31e2f63d556037ae2e4438452737dce0d57946
[jaddressbook-lib.git] / Addressbook / src / org / mxchange / addressbook / manager / contact / ContactManager.java
1 /*\r
2  * Copyright (C) 2015 Roland Haeder\r
3  *\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
8  *\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
13  *\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
16  */\r
17 package org.mxchange.addressbook.manager.contact;\r
18 \r
19 import java.util.ArrayList;\r
20 import java.util.Collections;\r
21 import java.util.Iterator;\r
22 import java.util.List;\r
23 import org.mxchange.addressbook.UnhandledUserChoiceException;\r
24 import org.mxchange.addressbook.client.Client;\r
25 import org.mxchange.addressbook.contact.Contact;\r
26 import org.mxchange.addressbook.contact.user.UserContact;\r
27 import org.mxchange.addressbook.database.frontend.contact.ContactDatabaseFrontend;\r
28 import org.mxchange.addressbook.database.frontend.contact.ContactWrapper;\r
29 import org.mxchange.addressbook.manager.BaseManager;\r
30 \r
31 /**\r
32  * A manager for contacts, please note that this implementation loads the whole\r
33  * list into RAM.\r
34  *\r
35  * @author Roland Haeder\r
36  * @version 0.0\r
37  * @since 0.0\r
38  */\r
39 public class ContactManager extends BaseManager implements ManageableContact {\r
40 \r
41     /**\r
42      * A ContactWrapper instance\r
43      */\r
44     private final ContactWrapper contactDatabase;\r
45 \r
46     /**\r
47      * A list of all contacts\r
48      */\r
49     private final List<Contact> contacts;\r
50 \r
51     /**\r
52      * @param maxContacts Maximum allowed contacts\r
53      * @param client Client instance to use\r
54      */\r
55     public ContactManager (final int maxContacts, final Client client) {\r
56         // Always call super constructor first\r
57         super();\r
58 \r
59         // Init contacts\r
60         this.contacts = new ArrayList<>(maxContacts);\r
61 \r
62         // Init database connection\r
63         this.contactDatabase = new ContactDatabaseFrontend();\r
64 \r
65         // Read all entries\r
66         this.contactDatabase.readAllContacts(this);\r
67 \r
68         // Debug message\r
69         //* NOISY-DEBUG: */ this.getLogger().debug("client=" + client);\r
70 \r
71         // Init client\r
72         this.setClient(client);\r
73     }\r
74 \r
75     /**\r
76      * Adds given contact to address book and flushes all entries to database\r
77      *\r
78      * @param contact Contact being added\r
79      * @todo Add check for book size\r
80      */\r
81     @Override\r
82     public void registerContact (final Contact contact) {\r
83         // Check if contact is found\r
84         if (this.isContactAlreadyAdded(contact)) {\r
85             // Contact already added\r
86             // @todo Do something here\r
87         } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {\r
88             // Own contact already added\r
89             // @todo Do something\r
90         }\r
91 \r
92         // Debug message\r
93         /* NOISY-DEBUG: */ this.getLogger().debug("Adding '" + contact.getSurname() + "' '" + contact.getFamilyName() + "' at pos '" + this.size () + "' ...");\r
94 \r
95         // Add contact to internal list\r
96         this.addContact(contact);\r
97 \r
98         // Flush whole list\r
99         this.flush();\r
100     }\r
101 \r
102     /**\r
103      * Let the user add a new other address\r
104      */\r
105     @Override\r
106     public void addOtherAddress () {\r
107         throw new UnsupportedOperationException("Not supported yet.");\r
108     }\r
109 \r
110     /**\r
111      * Let the user change other address\r
112      */\r
113     @Override\r
114     public void changeOtherAddress () {\r
115         throw new UnsupportedOperationException("Not supported yet.");\r
116     }\r
117 \r
118     /**\r
119      * Allows the user to change his/her own data\r
120      */\r
121     @Override\r
122     public void changeOwnData () {\r
123         /*\r
124          * First check if the user has registered own contact, before that\r
125          * nothing can be changed.\r
126          */\r
127         if (!this.isOwnContactAdded()) {\r
128             // Not added\r
129             this.getClient().outputMessage("Sie haben noch nicht Ihre Daten eingegeben.");\r
130             \r
131             // Skip any below code\r
132             return;\r
133         }\r
134         \r
135         // Instance\r
136         Contact contact = this.getOwnContact();\r
137         \r
138         // It must be found\r
139         assert(contact instanceof Contact);\r
140         \r
141         // Display contact\r
142         contact.show(this.getClient());\r
143         \r
144         try {\r
145             // Ask user what to change\r
146             this.getClient().userChooseChangeContactData(contact);\r
147         } catch (final UnhandledUserChoiceException ex) {\r
148             this.getLogger().catching(ex);\r
149         }\r
150     }\r
151 \r
152     /**\r
153      * Let the user delete other address\r
154      */\r
155     @Override\r
156     public void deleteOtherAddress () {\r
157         throw new UnsupportedOperationException("Not supported yet.");\r
158     }\r
159 \r
160     /**\r
161      * Let the user change address data\r
162      * \r
163      * @param contact Instance to change data\r
164      * @param client Client instance to call back\r
165      */\r
166     @Override\r
167     public void doChangeAddressData (final Contact contact, final Client client) {\r
168         // First display it again\r
169         client.displayAddressBox(contact);\r
170 \r
171         // Is it own data?\r
172         if (contact.isOwnContact()) {\r
173             // Own address data\r
174             String street = this.enterOwnStreet();\r
175 \r
176             // Get zip code\r
177             int zipCode = this.enterOwnZipCode();\r
178 \r
179             // Get city name\r
180             String city = this.enterOwnCity();\r
181 \r
182             // Get country code\r
183             String countryCode = this.enterOwnCountryCode();\r
184 \r
185             // Update address data\r
186             contact.updateAddressData(street, zipCode, city, countryCode);\r
187         } else {\r
188             // Other contact's address data to change\r
189             throw new UnsupportedOperationException("Changing contact entries not finished.");\r
190         }\r
191 \r
192         // Flush whole list\r
193         this.flush();\r
194     }\r
195 \r
196     /**\r
197      * Let the user change "name data"\r
198      * \r
199      * @param contact Instance to change data\r
200      * @param client Client instance to call back\r
201      */\r
202     @Override\r
203     public void doChangeNameData (final Contact contact, final Client client) {\r
204         // First display them again\r
205         client.displayNameBox(contact);\r
206 \r
207         // Is this own data?\r
208         if (contact.isOwnContact()) {\r
209             // Re-ask own data\r
210             // Gender:\r
211             char gender = this.enterOwnGender();\r
212 \r
213             // Surname\r
214             String surname = this.enterOwnSurname();\r
215 \r
216             // Family name\r
217             String familyName = this.enterOwnFamilyName();\r
218 \r
219             // And company\r
220             String companyName = this.enterOwnCompanyName();\r
221 \r
222             // Update contact instance\r
223             contact.updateNameData(gender, surname, familyName, companyName);\r
224         } else {\r
225             // Then re-ask them ...\r
226             throw new UnsupportedOperationException("Changing contact entries not finished.");\r
227         }\r
228 \r
229         // Flush whole list\r
230         this.flush();\r
231     }\r
232 \r
233     /**\r
234      * Let the user change other data\r
235      *\r
236      * @param contact Instance to change data\r
237      * @param client Client instance to call back\r
238      * @todo Didn't handle birthday\r
239      */\r
240     @Override\r
241     public void doChangeOtherData (final Contact contact, final Client client) {\r
242         // First display them again\r
243         client.displayOtherDataBox(contact);\r
244 \r
245         // Is this own data?\r
246         if (contact.isOwnContact()) {\r
247             // Re-ask own data\r
248             // Phone number\r
249             String phoneNumber = this.enterOwnPhoneNumber();\r
250 \r
251             // Phone number\r
252             String cellNumber = this.enterOwnCellNumber();\r
253 \r
254             // Fax number\r
255             String faxNumber = this.enterOwnFaxNumber();\r
256 \r
257             // Email address\r
258             String email = this.enterOwnEmailAddress();\r
259 \r
260             // Comment\r
261             String comment = this.enterOwnComment();\r
262 \r
263             // Update contact instance\r
264             contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);\r
265         } else {\r
266             // Then re-ask them ...\r
267             throw new UnsupportedOperationException("Changing contact entries not finished.");\r
268         }\r
269 \r
270         // Flush whole list\r
271         this.flush();\r
272     }\r
273 \r
274     /**\r
275      * Asks user for own data\r
276      */\r
277     @Override\r
278     public void doEnterOwnData () {\r
279         // First ask for gender\r
280         char gender = this.enterOwnGender();\r
281 \r
282         // 2nd for surname\r
283         String surname = this.enterOwnSurname();\r
284         \r
285         // And 3rd for family name\r
286         String familyName = this.enterOwnFamilyName();\r
287 \r
288         // Company name ...\r
289         String companyName = this.enterOwnCompanyName();\r
290 \r
291         // Construct UserContact instance\r
292         Contact contact = new UserContact(gender, surname, familyName, companyName);\r
293 \r
294         // Add it to contact "book"\r
295         this.registerContact(contact);\r
296     }\r
297 \r
298     /**\r
299      * Getter for whole contact list\r
300      * \r
301      * @return List of all contacts\r
302      */\r
303     @Override\r
304     public List<Contact> getList () {\r
305         return Collections.unmodifiableList(this.contacts);\r
306     }\r
307 \r
308     /**\r
309      * Getter for size\r
310      *\r
311      * @return size of contact "book"\r
312      */\r
313     @Override\r
314     public int size () {\r
315         return this.contacts.size();\r
316     }\r
317 \r
318     /**\r
319      * Adds given Contact instance to list\r
320      * \r
321      * @param contact Contact instance to add\r
322      */\r
323     @Override\r
324     public void addContact (final Contact contact) {\r
325         this.contacts.add(contact);\r
326     }\r
327 \r
328     /**\r
329      * Asks the user for his/her cellphone number\r
330      * \r
331      * @return User's cellphone number\r
332      */\r
333     private String enterOwnCellNumber () {\r
334         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);\r
335     }\r
336 \r
337     /**\r
338      * Asks the user for his/her city's name\r
339      *\r
340      * @return City's name of the user\r
341      */\r
342     private String enterOwnCity () {\r
343         return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);\r
344     }\r
345 \r
346     /**\r
347      * Asks the user for his/her city's name\r
348      *\r
349      * @return City's name of the user\r
350      */\r
351     private String enterOwnComment () {\r
352         return this.getClient().enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);\r
353     }\r
354 \r
355     /**\r
356      * Asks the user for his/her company name\r
357      * \r
358      * @return User's company name\r
359      */\r
360     private String enterOwnCompanyName () {\r
361         return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);\r
362     }\r
363 \r
364     /**\r
365      * Asks user for his/her own country code\r
366      * \r
367      * @return User's own country code\r
368      */\r
369     private String enterOwnCountryCode () {\r
370         return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();\r
371     }\r
372 \r
373     /**\r
374      * Asks user for his/her own country code\r
375      * \r
376      * @return User's own country code\r
377      */\r
378     private String enterOwnEmailAddress () {\r
379         return this.getClient().enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);\r
380     }\r
381 \r
382     /**\r
383      * Asks the user for family name\r
384      * \r
385      * @return Family name of the user\r
386      */\r
387     private String enterOwnFamilyName () {\r
388         return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);\r
389     }\r
390 \r
391     /**\r
392      * Asks the user for family name\r
393      * \r
394      * @return Family name of the user\r
395      */\r
396     private String enterOwnFaxNumber () {\r
397         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);\r
398     }\r
399 \r
400     /**\r
401      * Asks the user for gender, until a valid has been entered\r
402      * \r
403      * @return Gender of the user\r
404      */\r
405     private char enterOwnGender () {\r
406         return this.getClient().enterChar(new char[] {'M', 'F', 'C'}, "Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");\r
407     }\r
408 \r
409     /**\r
410      * Asks the user for phone number\r
411      * \r
412      * @return Phone number of the user\r
413      */\r
414     private String enterOwnPhoneNumber () {\r
415         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);\r
416     }\r
417 \r
418     /**\r
419      * Asks the user for own street (including number)\r
420      */\r
421     private String enterOwnStreet () {\r
422         return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);\r
423     }\r
424 \r
425     /**\r
426      * Asks the user for surname\r
427      * @return Surname of the user\r
428      */\r
429     private String enterOwnSurname () {\r
430         return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);\r
431     }\r
432 \r
433     /**\r
434      * Asks the user for own ZIP code\r
435      * @return ZIP code\r
436      */\r
437     private int enterOwnZipCode () {\r
438         return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");\r
439     }\r
440 \r
441     /**\r
442      * Flushes all entries by calling database backend\r
443      */\r
444     private void flush () {\r
445         // Flusgh all\r
446         this.getContactDatabase().flushAllContacts(this);\r
447     }\r
448 \r
449     /**\r
450      * A ContactWrapper instance\r
451      *\r
452      * @return the database\r
453      */\r
454     private ContactWrapper getContactDatabase () {\r
455         return this.contactDatabase;\r
456     }\r
457 \r
458     /**\r
459      * "Getter" for own contact instance or null if not found\r
460      *\r
461      * @return Contact instance or null\r
462      */\r
463     private Contact getOwnContact () {\r
464         // Now get it back from address book, first get an iterator\r
465         Iterator<Contact> iterator = this.contacts.iterator();\r
466 \r
467         // Init instance\r
468         Contact contact = null;\r
469 \r
470         // Search all contact\r
471         while (iterator.hasNext()) {\r
472             // Get next instance\r
473             Contact next = iterator.next();\r
474 \r
475             // Is this own contact?\r
476             if (next.isOwnContact()) {\r
477                 // Found it\r
478                 contact = next;\r
479                 break;\r
480                 \r
481             }\r
482         }\r
483 \r
484         // Return instance or null\r
485         return contact;\r
486     }\r
487 \r
488     /**\r
489      * Checks whether given contact was found in "address book"\r
490      *\r
491      * @param checkContact Contact to be checked\r
492      * @return TRUE if found, FALSE if not found\r
493      */\r
494     private boolean isContactAlreadyAdded (final Contact checkContact) throws NullPointerException {\r
495         // Default is not found\r
496         boolean isFound = false;\r
497 \r
498         // Debug message\r
499         //* NOISY-DEBUG: */ this.getLogger().debug("Checking '" +  this.contacts.length + "' entries...");\r
500 \r
501         // Now get it back from address book, first get an iterator\r
502         Iterator<Contact> iterator = this.contacts.iterator();\r
503 \r
504         // Check entries\r
505         while (iterator.hasNext()) {\r
506             // Get next entry\r
507             Contact contact = iterator.next();\r
508 \r
509             // Debug message\r
510             //* NOISY-DEBUG: */ this.getLogger().debug("contact=" + contact + ",checkContent=" + checkContact);\r
511 \r
512             // Is it valid?\r
513             if ((contact instanceof Contact) && ((contact.equals(checkContact)))) {\r
514                 // Found matching entry\r
515                 isFound = true;\r
516                 break;\r
517             }\r
518         }\r
519 \r
520         // Return result\r
521         return isFound;\r
522     }\r
523 \r
524     /**\r
525      * Checks whether own contact is already added by checking all entries for\r
526      * isOwnContact flag\r
527      * \r
528      * @return Whether own contact is already added\r
529      */\r
530     private boolean isOwnContactAdded () {\r
531         // Default is not added\r
532         boolean isAdded = false;\r
533 \r
534         // Now get it back from address book, first get an iterator\r
535         Iterator<Contact> iterator = this.contacts.iterator();\r
536 \r
537         // Check entries\r
538         while (iterator.hasNext()) {\r
539             // Get next entry\r
540             Contact contact = iterator.next();\r
541 \r
542             // Is it valid?\r
543             if (contact instanceof Contact) {\r
544                 // Get flag\r
545                 isAdded = contact.isOwnContact();\r
546 \r
547                 // Is this own contact?\r
548                 if (isAdded) {\r
549                     // Then abort loop\r
550                     break;\r
551                 }\r
552             }\r
553         }\r
554         // Return result\r
555         return isAdded;\r
556     }\r
557 }\r