]> git.mxchange.org Git - jbonuscard-lib.git/blob - Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
Rewrite start of storing contacts in database as the previous was just for demo ...
[jbonuscard-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\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 addContact (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.contacts.add(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      */\r
239     @Override\r
240     public void doChangeOtherData (final Contact contact, final Client client) {\r
241         // First display them again\r
242         client.displayOtherDataBox(contact);\r
243 \r
244         // Is this own data?\r
245         if (contact.isOwnContact()) {\r
246             // Re-ask own data\r
247             // Phone number\r
248             String phoneNumber = this.enterOwnPhoneNumber();\r
249 \r
250             // Phone number\r
251             String cellNumber = this.enterOwnCellNumber();\r
252 \r
253             // Fax number\r
254             String faxNumber = this.enterOwnFaxNumber();\r
255 \r
256             // Email address\r
257             String email = this.enterOwnEmailAddress();\r
258 \r
259             // Comment\r
260             String comment = this.enterOwnComment();\r
261 \r
262             // Update contact instance\r
263             contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, comment);\r
264         } else {\r
265             // Then re-ask them ...\r
266             throw new UnsupportedOperationException("Changing contact entries not finished.");\r
267         }\r
268 \r
269         // Flush whole list\r
270         this.flush();\r
271     }\r
272 \r
273     /**\r
274      * Asks user for own data\r
275      */\r
276     @Override\r
277     public void doEnterOwnData () {\r
278         // First ask for gender\r
279         char gender = this.enterOwnGender();\r
280 \r
281         // 2nd for surname\r
282         String surname = this.enterOwnSurname();\r
283         \r
284         // And 3rd for family name\r
285         String familyName = this.enterOwnFamilyName();\r
286 \r
287         // Company name ...\r
288         String companyName = this.enterOwnCompanyName();\r
289 \r
290         // Construct UserContact instance\r
291         Contact contact = new UserContact(gender, surname, familyName, companyName);\r
292 \r
293         // Mark contact as own\r
294         contact.enableFlagOwnContact();\r
295 \r
296         // Add it to contact "book"\r
297         this.addContact(contact);\r
298     }\r
299 \r
300     /**\r
301      * Getter for whole contact list\r
302      * \r
303      * @return List of all contacts\r
304      */\r
305     @Override\r
306     public List<Contact> getList () {\r
307         return Collections.unmodifiableList(this.contacts);\r
308     }\r
309 \r
310     /**\r
311      * Getter for size\r
312      *\r
313      * @return size of contact "book"\r
314      */\r
315     @Override\r
316     public int size () {\r
317         return this.contacts.size();\r
318     }\r
319 \r
320     /**\r
321      * Asks the user for his/her cellphone number\r
322      * \r
323      * @return User's cellphone number\r
324      */\r
325     private String enterOwnCellNumber () {\r
326         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);\r
327     }\r
328 \r
329     /**\r
330      * Asks the user for his/her city's name\r
331      *\r
332      * @return City's name of the user\r
333      */\r
334     private String enterOwnCity () {\r
335         return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);\r
336     }\r
337 \r
338     /**\r
339      * Asks the user for his/her city's name\r
340      *\r
341      * @return City's name of the user\r
342      */\r
343     private String enterOwnComment () {\r
344         return this.getClient().enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);\r
345     }\r
346 \r
347     /**\r
348      * Asks the user for his/her company name\r
349      * \r
350      * @return User's company name\r
351      */\r
352     private String enterOwnCompanyName () {\r
353         return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);\r
354     }\r
355 \r
356     /**\r
357      * Asks user for his/her own country code\r
358      * \r
359      * @return User's own country code\r
360      */\r
361     private String enterOwnCountryCode () {\r
362         return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();\r
363     }\r
364 \r
365     /**\r
366      * Asks user for his/her own country code\r
367      * \r
368      * @return User's own country code\r
369      */\r
370     private String enterOwnEmailAddress () {\r
371         return this.getClient().enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);\r
372     }\r
373 \r
374     /**\r
375      * Asks the user for family name\r
376      * \r
377      * @return Family name of the user\r
378      */\r
379     private String enterOwnFamilyName () {\r
380         return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);\r
381     }\r
382 \r
383     /**\r
384      * Asks the user for family name\r
385      * \r
386      * @return Family name of the user\r
387      */\r
388     private String enterOwnFaxNumber () {\r
389         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);\r
390     }\r
391 \r
392     /**\r
393      * Asks the user for gender, until a valid has been entered\r
394      * \r
395      * @return Gender of the user\r
396      */\r
397     private char enterOwnGender () {\r
398         return this.getClient().enterChar(new char[] {'M', 'F', 'C'}, "Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");\r
399     }\r
400 \r
401     /**\r
402      * Asks the user for phone number\r
403      * \r
404      * @return Phone number of the user\r
405      */\r
406     private String enterOwnPhoneNumber () {\r
407         return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);\r
408     }\r
409 \r
410     /**\r
411      * Asks the user for own street (including number)\r
412      */\r
413     private String enterOwnStreet () {\r
414         return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);\r
415     }\r
416 \r
417     /**\r
418      * Asks the user for surname\r
419      * @return Surname of the user\r
420      */\r
421     private String enterOwnSurname () {\r
422         return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);\r
423     }\r
424 \r
425     /**\r
426      * Asks the user for own ZIP code\r
427      * @return ZIP code\r
428      */\r
429     private int enterOwnZipCode () {\r
430         return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");\r
431     }\r
432 \r
433     /**\r
434      * Flushes all entries by calling database backend\r
435      */\r
436     private void flush () {\r
437         // Flusgh all\r
438         this.getContactDatabase().flushAllContacts(this);\r
439     }\r
440 \r
441     /**\r
442      * A ContactWrapper instance\r
443      *\r
444      * @return the database\r
445      */\r
446     private ContactWrapper getContactDatabase () {\r
447         return this.contactDatabase;\r
448     }\r
449 \r
450     /**\r
451      * "Getter" for own contact instance or null if not found\r
452      *\r
453      * @return Contact instance or null\r
454      */\r
455     private Contact getOwnContact () {\r
456         // Now get it back from address book, first get an iterator\r
457         Iterator<Contact> iterator = this.contacts.iterator();\r
458 \r
459         // Init instance\r
460         Contact contact = null;\r
461 \r
462         // Search all contact\r
463         while (iterator.hasNext()) {\r
464             // Get next instance\r
465             Contact next = iterator.next();\r
466 \r
467             // Is this own contact?\r
468             if (next.isOwnContact()) {\r
469                 // Found it\r
470                 contact = next;\r
471                 break;\r
472                 \r
473             }\r
474         }\r
475 \r
476         // Return instance or null\r
477         return contact;\r
478     }\r
479 \r
480     /**\r
481      * Checks whether given contact was found in "address book"\r
482      *\r
483      * @param checkContact Contact to be checked\r
484      * @return TRUE if found, FALSE if not found\r
485      */\r
486     private boolean isContactAlreadyAdded (final Contact checkContact) throws NullPointerException {\r
487         // Default is not found\r
488         boolean isFound = false;\r
489 \r
490         // Debug message\r
491         //* NOISY-DEBUG: */ this.getLogger().debug("Checking '" +  this.contacts.length + "' entries...");\r
492 \r
493         // Now get it back from address book, first get an iterator\r
494         Iterator<Contact> iterator = this.contacts.iterator();\r
495 \r
496         // Check entries\r
497         while (iterator.hasNext()) {\r
498             // Get next entry\r
499             Contact contact = iterator.next();\r
500 \r
501             // Debug message\r
502             //* NOISY-DEBUG: */ this.getLogger().debug("contact=" + contact + ",checkContent=" + checkContact);\r
503 \r
504             // Is it valid?\r
505             if ((contact instanceof Contact) && ((contact.equals(checkContact)))) {\r
506                 // Found matching entry\r
507                 isFound = true;\r
508                 break;\r
509             }\r
510         }\r
511 \r
512         // Return result\r
513         return isFound;\r
514     }\r
515 \r
516     /**\r
517      * Checks whether own contact is already added by checking all entries for\r
518      * isOwnContact flag\r
519      * \r
520      * @return Whether own contact is already added\r
521      */\r
522     private boolean isOwnContactAdded () {\r
523         // Default is not added\r
524         boolean isAdded = false;\r
525 \r
526         // Now get it back from address book, first get an iterator\r
527         Iterator<Contact> iterator = this.contacts.iterator();\r
528 \r
529         // Check entries\r
530         while (iterator.hasNext()) {\r
531             // Get next entry\r
532             Contact contact = iterator.next();\r
533 \r
534             // Is it valid?\r
535             if (contact instanceof Contact) {\r
536                 // Get flag\r
537                 isAdded = contact.isOwnContact();\r
538 \r
539                 // Is this own contact?\r
540                 if (isAdded) {\r
541                     // Then abort loop\r
542                     break;\r
543                 }\r
544             }\r
545         }\r
546         // Return result\r
547         return isAdded;\r
548     }\r
549 }\r