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