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