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