]> git.mxchange.org Git - addressbook-swing.git/blob - src/org/mxchange/addressbook/manager/contact/ContactManager.java
Fixed call + introduced getColumnCount()
[addressbook-swing.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.BaseContact;\r
27 import org.mxchange.addressbook.contact.Contact;\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  */\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      * \r
358      * @return ZIP code\r
359      */\r
360     @Override\r
361     public int enterOwnZipCode () {\r
362         return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");\r
363     }\r
364 \r
365     @Override\r
366     public int getColumnCount () {\r
367         /*\r
368          * Return constant, may look useful. But without this, e.g. the\r
369          * AddressTableModel have a hard-coded value.\r
370          */\r
371         return BaseContact.COLUMN_COUNT;\r
372     }\r
373 \r
374     /**\r
375      * Getter for whole contact list\r
376      *\r
377      * @return List of all contacts\r
378      */\r
379     @Override\r
380     public List<Contact> getList () {\r
381         return Collections.unmodifiableList(this.contacts);\r
382     }\r
383 \r
384     /**\r
385      * Checks whether own contact is already added by checking all entries for\r
386      * isOwnContact flag\r
387      *\r
388      * @return Whether own contact is already added\r
389      */\r
390     @Override\r
391     public boolean isOwnContactAdded () {\r
392         // Default is not added\r
393         boolean isAdded = false;\r
394         \r
395         // Now get it back from address book, first get an iterator\r
396         Iterator<Contact> iterator = this.contacts.iterator();\r
397         \r
398         // Check entries\r
399         while (iterator.hasNext()) {\r
400             // Get next entry\r
401             Contact contact = iterator.next();\r
402             \r
403             // Is it valid?\r
404             if (contact instanceof Contact) {\r
405                 // Get flag\r
406                 isAdded = contact.isOwnContact();\r
407                 \r
408                 // Is this own contact?\r
409                 if (isAdded) {\r
410                     // Then abort loop\r
411                     break;\r
412                 }\r
413             }\r
414         }\r
415         // Return result\r
416         return isAdded;\r
417     }\r
418 \r
419     @Override\r
420     public void listContacts () {\r
421         throw new UnsupportedOperationException("Not supported yet.");\r
422     }\r
423 \r
424     /**\r
425      * Adds given contact to address book and flushes all entries to database\r
426      *\r
427      * @param contact Contact being added\r
428      * @todo Add check for book size\r
429      */\r
430     @Override\r
431     public void registerContact (final Contact contact) {\r
432         // Check if contact is found\r
433         if (this.isContactAlreadyAdded(contact)) {\r
434             // Contact already added\r
435             // @todo Do something here\r
436         } else if ((contact.isOwnContact()) && (this.isOwnContactAdded())) {\r
437             // Own contact already added\r
438             // @todo Do something\r
439         }\r
440         \r
441         // Debug message\r
442         /* NOISY-DEBUG: */ this.getLogger().debug(MessageFormat.format("Adding '{0}' '{1}' at pos '{2}' ...", contact.getSurname(), contact.getFamilyName(), this.size()));\r
443         \r
444         // Add contact to internal list\r
445         this.addContact(contact);\r
446         \r
447         // Flush whole list\r
448         this.flush();\r
449     }\r
450 \r
451     @Override\r
452     public void searchContacts () {\r
453         throw new UnsupportedOperationException("Not supported yet.");\r
454     }\r
455 \r
456     /**\r
457      * Getter for size\r
458      *\r
459      * @return size of contact "book"\r
460      */\r
461     @Override\r
462     public int size () {\r
463         return this.contacts.size();\r
464     }\r
465 \r
466     /**\r
467      * Flushes all entries by calling database backend\r
468      */\r
469     private void flush () {\r
470         // Flusgh all\r
471         this.getContactDatabase().flushAllContacts();\r
472     }\r
473 \r
474     /**\r
475      * A ContactWrapper instance\r
476      *\r
477      * @return the database\r
478      */\r
479     private ContactWrapper getContactDatabase () {\r
480         return this.contactDatabase;\r
481     }\r
482 \r
483     /**\r
484      * "Getter" for own contact instance or null if not found\r
485      *\r
486      * @return Contact instance or null\r
487      */\r
488     private Contact getOwnContact () {\r
489         // Now get it back from address book, first get an iterator\r
490         Iterator<Contact> iterator = this.contacts.iterator();\r
491 \r
492         // Init instance\r
493         Contact contact = null;\r
494 \r
495         // Search all contact\r
496         while (iterator.hasNext()) {\r
497             // Get next instance\r
498             Contact next = iterator.next();\r
499 \r
500             // Is this own contact?\r
501             if (next.isOwnContact()) {\r
502                 // Found it\r
503                 contact = next;\r
504                 break;\r
505                 \r
506             }\r
507         }\r
508 \r
509         // Return instance or null\r
510         return contact;\r
511     }\r
512 \r
513     /**\r
514      * Checks whether given contact was found in "address book"\r
515      *\r
516      * @param checkContact Contact to be checked\r
517      * @return TRUE if found, FALSE if not found\r
518      */\r
519     private boolean isContactAlreadyAdded (final Contact checkContact) throws NullPointerException {\r
520         // Default is not found\r
521         boolean isFound = false;\r
522 \r
523         // Debug message\r
524         //* NOISY-DEBUG: */ this.getLogger().debug("Checking '" +  this.contacts.length + "' entries...");\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             // Debug message\r
535             //* NOISY-DEBUG: */ this.getLogger().debug("contact=" + contact + ",checkContent=" + checkContact);\r
536 \r
537             // Is it valid?\r
538             if ((contact instanceof Contact) && ((contact.equals(checkContact)))) {\r
539                 // Found matching entry\r
540                 isFound = true;\r
541                 break;\r
542             }\r
543         }\r
544 \r
545         // Return result\r
546         return isFound;\r
547     }\r
548 }\r