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