]> git.mxchange.org Git - addressbook-war.git/blob - src/java/org/mxchange/addressbook/beans/phone/list/AddressbookPhoneListWebViewBean.java
Please cherry-pick:
[addressbook-war.git] / src / java / org / mxchange / addressbook / beans / phone / list / AddressbookPhoneListWebViewBean.java
1 /*
2  * Copyright (C) 2016 - 2022 Free Software Foundation
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License as
6  * published by the Free Software Foundation, either version 3 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Affero General Public License for more details.
13  *
14  * You should have received a copy of the GNU Affero General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.addressbook.beans.phone.list;
18
19 import fish.payara.cdi.jsr107.impl.NamedCache;
20 import java.text.MessageFormat;
21 import java.util.Comparator;
22 import java.util.LinkedList;
23 import java.util.List;
24 import java.util.Objects;
25 import javax.annotation.PostConstruct;
26 import javax.cache.Cache;
27 import javax.ejb.EJB;
28 import javax.enterprise.event.Observes;
29 import javax.faces.view.ViewScoped;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import org.mxchange.addressbook.beans.BaseAddressbookBean;
33 import org.mxchange.jcontacts.events.contact.add.ObservableAdminAddedContactEvent;
34 import org.mxchange.jcontacts.events.contact.update.ObservableAdminUpdatedContactEvent;
35 import org.mxchange.jcontacts.events.contact.update.ObservableUpdatedContactEvent;
36 import org.mxchange.jcontacts.events.fax.linked.ObservableAdminLinkedFaxNumberEvent;
37 import org.mxchange.jcontacts.events.landline.linked.ObservableAdminLinkedLandLineNumberEvent;
38 import org.mxchange.jcontacts.model.contact.Contact;
39 import org.mxchange.jphone.events.fax.deleted.ObservableAdminFaxNumberDeletedEvent;
40 import org.mxchange.jphone.events.fax.updated.ObservableAdminFaxNumberUpdatedEvent;
41 import org.mxchange.jphone.events.landline.deleted.ObservableAdminLandLineNumberDeletedEvent;
42 import org.mxchange.jphone.events.landline.updated.ObservableAdminLandLineNumberUpdatedEvent;
43 import org.mxchange.jphone.exceptions.phone.PhoneEntityNotFoundException;
44 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
45 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
46 import org.mxchange.jphone.model.phonenumbers.phone.PhoneSessionBeanRemote;
47
48 /**
49  * Administrative listing controller (bean) for phone numbers
50  * <p>
51  * @author Roland Häder<roland@mxchange.org>
52  */
53 @Named ("phoneListController")
54 @ViewScoped
55 public class AddressbookPhoneListWebViewBean extends BaseAddressbookBean implements AddressbookPhoneListWebViewController {
56
57         /**
58          * Serial number
59          */
60         private static final long serialVersionUID = 491_058_674_675_690_107L;
61
62         /**
63          * A list of all fax numbers
64          */
65         private final List<DialableFaxNumber> allFaxNumbers;
66
67         /**
68          * A list of all land-line numbers
69          */
70         private final List<DialableLandLineNumber> allLandLineNumbers;
71
72         /**
73          * All fax numbers
74          */
75         @Inject
76         @NamedCache (cacheName = "faxNumberCache")
77         private transient Cache<Long, DialableFaxNumber> faxNumberCache;
78
79         /**
80          * A list of filtered fax numbers
81          */
82         private List<DialableFaxNumber> filteredFaxNumbers;
83
84         /**
85          * A list of filtered land-line numbers
86          */
87         private List<DialableLandLineNumber> filteredLandLineNumbers;
88
89         /**
90          * All land-line numbers
91          */
92         @Inject
93         @NamedCache (cacheName = "landLineNumberCache")
94         private transient Cache<Long, DialableLandLineNumber> landLineNumberCache;
95
96         /**
97          * General EJB for phone numbers
98          */
99         @EJB (lookup = "java:global/addressbook-ejb/phone!org.mxchange.jphone.model.phonenumbers.phone.PhoneSessionBeanRemote")
100         private PhoneSessionBeanRemote phoneBean;
101
102         /**
103          * Default constructor
104          */
105         public AddressbookPhoneListWebViewBean () {
106                 // Call super constructor
107                 super();
108
109                 // Initialize lists
110                 this.allFaxNumbers = new LinkedList<>();
111                 this.allLandLineNumbers = new LinkedList<>();
112         }
113
114         /**
115          * Observes events being fired when an administrator has added a new
116          * contact.
117          * <p>
118          * @param event Event being fired
119          */
120         public void afterAdminAddedContactEvent (@Observes final ObservableAdminAddedContactEvent event) {
121                 // The event must be valid
122                 if (null == event) {
123                         // Throw NPE
124                         throw new NullPointerException("event is null"); //NOI18N
125                 } else if (event.getAddedContact() == null) {
126                         // Throw again ...
127                         throw new NullPointerException("event.addedContact is null"); //NOI18N
128                 } else if (event.getAddedContact().getContactId() == null) {
129                         // ... and again
130                         throw new NullPointerException("event.addedContact.contactId is null"); //NOI18N
131                 } else if (event.getAddedContact().getContactId() < 1) {
132                         // Not valid
133                         throw new IllegalArgumentException(MessageFormat.format("event.addedContact.contactId={0} is not valid", event.getAddedContact().getContactId())); //NOI18N
134                 }
135
136                 // Update contact's mobile, land-line and fax number
137                 this.updateContactPhoneNumbers(event.getAddedContact());
138
139                 // Clear this bean
140                 this.clear();
141         }
142
143         /**
144          * Observes events being fired when an administrator has deleted a fax
145          * number
146          * <p>
147          * @param event Event being fired
148          */
149         public void afterAdminDeletedFaxNumberEvent (@Observes final ObservableAdminFaxNumberDeletedEvent event) {
150                 // Event and contained entity instance should not be null
151                 if (null == event) {
152                         // Throw NPE
153                         throw new NullPointerException("event is null"); //NOI18N
154                 } else if (event.getDeletedFaxNumber() == null) {
155                         // Throw NPE again
156                         throw new NullPointerException("event.deletedFaxNumber is null"); //NOI18N
157                 } else if (event.getDeletedFaxNumber().getPhoneId() == null) {
158                         // phoneId is null
159                         throw new NullPointerException("event.deletedFaxNumber.phoneId is null"); //NOI18N
160                 } else if (event.getDeletedFaxNumber().getPhoneId() < 1) {
161                         // Not avalid id
162                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedFaxNumber(), event.getDeletedFaxNumber().getPhoneId())); //NOI18N
163                 }
164
165                 // Update contact's mobile, land-line and fax number
166                 this.getAllFaxNumbers().remove(event.getDeletedFaxNumber());
167
168                 // Clear all data
169                 this.clear();
170         }
171
172         /**
173          * Observes events being fired when an administrator has deleted a land-line
174          * number
175          * <p>
176          * @param event Event being fired
177          */
178         public void afterAdminDeletedLandLineNumberEvent (@Observes final ObservableAdminLandLineNumberDeletedEvent event) {
179                 // Event and contained entity instance should not be null
180                 if (null == event) {
181                         // Throw NPE
182                         throw new NullPointerException("event is null"); //NOI18N
183                 } else if (event.getDeletedLandLineNumber() == null) {
184                         // Throw NPE again
185                         throw new NullPointerException("event.deletedLandLineNumber is null"); //NOI18N
186                 } else if (event.getDeletedLandLineNumber().getPhoneId() == null) {
187                         // phoneId is null
188                         throw new NullPointerException("event.deletedLandLineNumber.phoneId is null"); //NOI18N
189                 } else if (event.getDeletedLandLineNumber().getPhoneId() < 1) {
190                         // Not avalid id
191                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedLandLineNumber(), event.getDeletedLandLineNumber().getPhoneId())); //NOI18N
192                 }
193
194                 // Update contact's mobile, land-line and fax number
195                 this.getAllLandLineNumbers().remove(event.getDeletedLandLineNumber());
196
197                 // Clear all data
198                 this.clear();
199         }
200
201         /**
202          * Observes events being fired when an administrator has a linked a fax
203          * number
204          * <p>
205          * @param event Event being fired
206          */
207         public void afterAdminLinkedFaxNumberEvent (@Observes final ObservableAdminLinkedFaxNumberEvent event) {
208                 // Is the event fine?
209                 if (event == null) {
210                         // Throw NPE
211                         throw new NullPointerException("event is null"); //NOI18N
212                 } else if (event.getContact() == null) {
213                         // Throw again ...
214                         throw new NullPointerException("event.contact is null"); //NOI18N
215                 } else if (event.getContact().getContactId() == null) {
216                         // Throw again ...
217                         throw new NullPointerException("event.contact.contactId is null"); //NOI18N
218                 } else if (event.getContact().getContactId() < 1) {
219                         // Throw again ...
220                         throw new NullPointerException(MessageFormat.format("event.contact.contactId={0} is invalid", event.getContact().getContactId())); //NOI18N
221                 } else if (event.getContact().getContactFaxNumber() == null) {
222                         // Throw again ...
223                         throw new NullPointerException("event.contact.contactFaxNumber is null"); //NOI18N
224                 } else if (event.getContact().getContactFaxNumber().getPhoneId() == null) {
225                         // Throw again ...
226                         throw new NullPointerException("event.contact.contactFaxNumber.phoneId is null"); //NOI18N
227                 } else if (event.getContact().getContactFaxNumber().getPhoneId() < 1) {
228                         // Throw again ...
229                         throw new NullPointerException(MessageFormat.format("event.contact.contactFaxNumber.phoneId={0} is invalid", event.getContact().getContactFaxNumber().getPhoneId())); //NOI18N
230                 } else if (event.getLinkedFaxNumber() == null) {
231                         // Throw again ...
232                         throw new NullPointerException("event.linkedFaxNumer is null"); //NOI18N
233                 }
234
235                 // Is the id number in linked number not set?
236                 if (event.getLinkedFaxNumber().getPhoneId() == null) {
237                         // Then it is a new number, so add it from contact as there the id number has been set
238                         this.uniqueAddFaxNumber(event.getContact().getContactFaxNumber());
239                 }
240         }
241
242         /**
243          * Observes events being fired when an administrator has a linked a
244          * land-line number
245          * <p>
246          * @param event Event being fired
247          */
248         public void afterAdminLinkedLandLineNumberEvent (@Observes final ObservableAdminLinkedLandLineNumberEvent event) {
249                 // Is the event fine?
250                 if (event == null) {
251                         // Throw NPE
252                         throw new NullPointerException("event is null"); //NOI18N
253                 } else if (event.getContact() == null) {
254                         // Throw again ...
255                         throw new NullPointerException("event.contact is null"); //NOI18N
256                 } else if (event.getContact().getContactId() == null) {
257                         // Throw again ...
258                         throw new NullPointerException("event.contact.contactId is null"); //NOI18N
259                 } else if (event.getContact().getContactId() < 1) {
260                         // Throw again ...
261                         throw new NullPointerException(MessageFormat.format("event.contact.contactId={0} is invalid", event.getContact().getContactId())); //NOI18N
262                 } else if (event.getContact().getContactLandLineNumber() == null) {
263                         // Throw again ...
264                         throw new NullPointerException("event.contact.contactLandLineNumber is null"); //NOI18N
265                 } else if (event.getContact().getContactLandLineNumber().getPhoneId() == null) {
266                         // Throw again ...
267                         throw new NullPointerException("event.contact.contactLandLineNumber.phoneId is null"); //NOI18N
268                 } else if (event.getContact().getContactLandLineNumber().getPhoneId() < 1) {
269                         // Throw again ...
270                         throw new NullPointerException(MessageFormat.format("event.contact.contactLandLineNumber.phoneId={0} is invalid", event.getContact().getContactLandLineNumber().getPhoneId())); //NOI18N
271                 } else if (event.getLinkedLandLineNumber() == null) {
272                         // Throw again ...
273                         throw new NullPointerException("event.linkedLandLineNumer is null"); //NOI18N
274                 }
275
276                 // Is the id number in linked number not set?
277                 if (event.getLinkedLandLineNumber().getPhoneId() == null) {
278                         // Then it is a new number, so add it from contact as there the id number has been set
279                         this.uniqueAddLandLineNumber(event.getContact().getContactLandLineNumber());
280                 }
281         }
282
283         /**
284          * Observes events being fired when an administrator has updated contact
285          * data.
286          * <p>
287          * @param event Event being fired
288          */
289         public void afterAdminUpdatedContactDataEvent (@Observes final ObservableAdminUpdatedContactEvent event) {
290                 // Event and contained entity instance should not be null
291                 if (null == event) {
292                         // Throw NPE
293                         throw new NullPointerException("event is null"); //NOI18N
294                 } else if (event.getUpdatedContact() == null) {
295                         // Throw NPE again
296                         throw new NullPointerException("event.updatedContact is null"); //NOI18N
297                 } else if (event.getUpdatedContact().getContactId() == null) {
298                         // phoneId is null
299                         throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
300                 } else if (event.getUpdatedContact().getContactId() < 1) {
301                         // Not avalid id
302                         throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
303                 }
304
305                 // Update contact's mobile, land-line and fax number
306                 this.updateContactPhoneNumbers(event.getUpdatedContact());
307
308                 // Clear all data
309                 this.clear();
310         }
311
312         /**
313          * Observes events being fired when an administrator has updated a fax
314          * number.
315          * <p>
316          * @param event Event being fired
317          */
318         public void afterAdminUpdatedFaxNumberEvent (@Observes final ObservableAdminFaxNumberUpdatedEvent event) {
319                 // Event and contained entity instance should not be null
320                 if (null == event) {
321                         // Throw NPE
322                         throw new NullPointerException("event is null"); //NOI18N
323                 } else if (event.getUpdatedFaxNumber() == null) {
324                         // Throw NPE again
325                         throw new NullPointerException("event.updatedFaxNumber is null"); //NOI18N
326                 } else if (event.getUpdatedFaxNumber().getPhoneId() == null) {
327                         // phoneId is null
328                         throw new NullPointerException("event.updatedFaxNumber.phoneId is null"); //NOI18N
329                 } else if (event.getUpdatedFaxNumber().getPhoneId() < 1) {
330                         // Not avalid id
331                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedFaxNumber(), event.getUpdatedFaxNumber().getPhoneId())); //NOI18N
332                 }
333
334                 // Uniquely add it
335                 this.uniqueAddFaxNumber(event.getUpdatedFaxNumber());
336
337                 // Clear it
338                 this.clear();
339         }
340
341         /**
342          * Observes events being fired when an administrator has updated a land-line
343          * number.
344          * <p>
345          * @param event Event being fired
346          */
347         public void afterAdminUpdatedLandLineNumberEvent (@Observes final ObservableAdminLandLineNumberUpdatedEvent event) {
348                 // Event and contained entity instance should not be null
349                 if (null == event) {
350                         // Throw NPE
351                         throw new NullPointerException("event is null"); //NOI18N
352                 } else if (event.getUpdatedLandLineNumber() == null) {
353                         // Throw NPE again
354                         throw new NullPointerException("event.updatedLandLineNumber is null"); //NOI18N
355                 } else if (event.getUpdatedLandLineNumber().getPhoneId() == null) {
356                         // phoneId is null
357                         throw new NullPointerException("event.updatedLandLineNumber.phoneId is null"); //NOI18N
358                 } else if (event.getUpdatedLandLineNumber().getPhoneId() < 1) {
359                         // Not avalid id
360                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedLandLineNumber(), event.getUpdatedLandLineNumber().getPhoneId())); //NOI18N
361                 }
362
363                 // Uniquely add it
364                 this.uniqueAddLandLineNumber(event.getUpdatedLandLineNumber());
365
366                 // Clear it
367                 this.clear();
368         }
369
370         /**
371          * Observes events being fired when an user has updated contact data.
372          * <p>
373          * @param event Event being fired
374          */
375         public void afterUpdatedContactDataEvent (@Observes final ObservableUpdatedContactEvent event) {
376                 // Event and contained entity instance should not be null
377                 if (null == event) {
378                         // Throw NPE
379                         throw new NullPointerException("event is null"); //NOI18N
380                 } else if (event.getUpdatedContact() == null) {
381                         // Throw NPE again
382                         throw new NullPointerException("event.updatedContact is null"); //NOI18N
383                 } else if (event.getUpdatedContact().getContactId() == null) {
384                         // phoneId is null
385                         throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
386                 } else if (event.getUpdatedContact().getContactId() < 1) {
387                         // Not avalid id
388                         throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
389                 }
390
391                 // Update contact's mobile, land-line and fax number
392                 this.updateContactPhoneNumbers(event.getUpdatedContact());
393
394                 // Clear all data
395                 this.clear();
396         }
397
398         @Override
399         public DialableFaxNumber findFaxNumberById (final Long phoneId) throws PhoneEntityNotFoundException {
400                 // Validate paramter
401                 if (null == phoneId) {
402                         // Throw NPE
403                         throw new NullPointerException("phoneId is null"); //NOI18N
404                 } else if (phoneId < 1) {
405                         // Throw IAE
406                         throw new IllegalArgumentException("phoneId=" + phoneId + " is invalid."); //NOI18N
407                 } else if (!this.faxNumberCache.containsKey(phoneId)) {
408                         // Not found
409                         throw new PhoneEntityNotFoundException(phoneId);
410                 }
411
412                 // Get it from cache
413                 final DialableFaxNumber faxNumber = this.faxNumberCache.get(phoneId);
414
415                 // Return it
416                 return faxNumber;
417         }
418
419         @Override
420         public DialableLandLineNumber findLandLineNumberById (final Long landLineNumberId) throws PhoneEntityNotFoundException {
421                 // Validate paramter
422                 if (null == landLineNumberId) {
423                         // Throw NPE
424                         throw new NullPointerException("landLineNumberId is null"); //NOI18N
425                 } else if (landLineNumberId < 1) {
426                         // Throw IAE
427                         throw new IllegalArgumentException(MessageFormat.format("landLineNumberId={0} is invalid.", landLineNumberId)); //NOI18N
428                 } else if (!this.landLineNumberCache.containsKey(landLineNumberId)) {
429                         // Not found
430                         throw new PhoneEntityNotFoundException(landLineNumberId);
431                 }
432
433                 // Get it from cache
434                 final DialableLandLineNumber landLineNumber = this.landLineNumberCache.get(landLineNumberId);
435
436                 // Return it
437                 return landLineNumber;
438         }
439
440         @Override
441         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
442         public List<DialableFaxNumber> getAllFaxNumbers () {
443                 return this.allFaxNumbers;
444         }
445
446         @Override
447         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
448         public List<DialableLandLineNumber> getAllLandLineNumbers () {
449                 return this.allLandLineNumbers;
450         }
451
452         /**
453          * Getter for filtered fax number list
454          * <p>
455          * @return Filtered fax number list
456          */
457         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
458         public List<DialableFaxNumber> getFilteredFaxNumbers () {
459                 return this.filteredFaxNumbers;
460         }
461
462         /**
463          * Setter for filtered fax number list
464          *
465          * @param filteredFaxNumbers Filtered fax number list
466          */
467         @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
468         public void setFilteredFaxNumbers (final List<DialableFaxNumber> filteredFaxNumbers) {
469                 this.filteredFaxNumbers = filteredFaxNumbers;
470         }
471
472         /**
473          * Getter for filtered land-line number list
474          * <p>
475          * @return Filtered land-line number list
476          */
477         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
478         public List<DialableLandLineNumber> getFilteredLandLineNumbers () {
479                 return this.filteredLandLineNumbers;
480         }
481
482         /**
483          * Setter for filtered land-line number list
484          *
485          * @param filteredLandLineNumbers Filtered land-line number list
486          */
487         @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
488         public void setFilteredLandLineNumbers (final List<DialableLandLineNumber> filteredLandLineNumbers) {
489                 this.filteredLandLineNumbers = filteredLandLineNumbers;
490         }
491
492         /**
493          * Post-construction method
494          */
495         @PostConstruct
496         public void initializeList () {
497                 // Is cache there?
498                 if (!this.faxNumberCache.iterator().hasNext()) {
499                         // Add all
500                         for (final DialableFaxNumber currentNumber : this.phoneBean.fetchAllFaxNumbers()) {
501                                 // Add it to cache
502                                 this.faxNumberCache.put(currentNumber.getPhoneId(), currentNumber);
503                         }
504                 }
505
506                 // Is cache there?
507                 if (!this.landLineNumberCache.iterator().hasNext()) {
508                         // Add all
509                         for (final DialableLandLineNumber currentNumber : this.phoneBean.fetchAllLandLineNumbers()) {
510                                 // Add it to cache
511                                 this.landLineNumberCache.put(currentNumber.getPhoneId(), currentNumber);
512                         }
513                 }
514
515                 // Is cache filled and list is empty
516                 if ((this.faxNumberCache.iterator().hasNext()) && (this.getAllFaxNumbers().isEmpty())) {
517                         // Build up list
518                         for (final Cache.Entry<Long, DialableFaxNumber> currentEntry : this.faxNumberCache) {
519                                 // Add to list
520                                 this.getAllFaxNumbers().add(currentEntry.getValue());
521                         }
522
523                         // Sort list
524                         this.getAllFaxNumbers().sort(new Comparator<DialableFaxNumber>() {
525                                 @Override
526                                 public int compare (final DialableFaxNumber faxNumber1, final DialableFaxNumber faxNumber2) {
527                                         return faxNumber1.getPhoneId() > faxNumber2.getPhoneId() ? 1 : faxNumber1.getPhoneId() < faxNumber2.getPhoneId() ? -1 : 0;
528                                 }
529                         });
530
531                         // Set full list
532                         this.setFilteredFaxNumbers(this.getAllFaxNumbers());
533                 }
534
535                 // Is cache filled and list is empty
536                 if ((this.landLineNumberCache.iterator().hasNext()) && (this.getAllLandLineNumbers().isEmpty())) {
537                         // Build up list
538                         for (final Cache.Entry<Long, DialableLandLineNumber> currentEntry : this.landLineNumberCache) {
539                                 // Add to list
540                                 this.getAllLandLineNumbers().add(currentEntry.getValue());
541                         }
542
543                         // Sort list
544                         this.getAllLandLineNumbers().sort(new Comparator<DialableLandLineNumber>() {
545                                 @Override
546                                 public int compare (final DialableLandLineNumber landLineNumber1, final DialableLandLineNumber landLineNumber2) {
547                                         return landLineNumber1.getPhoneId() > landLineNumber2.getPhoneId() ? 1 : landLineNumber1.getPhoneId() < landLineNumber2.getPhoneId() ? -1 : 0;
548                                 }
549                         });
550
551                         // Set full list
552                         this.setFilteredLandLineNumbers(this.getAllLandLineNumbers());
553                 }
554         }
555
556         /**
557          * Clears this bean
558          */
559         private void clear () {
560                 // Clear all data
561         }
562
563         /**
564          * Uniquely add given fax number to this bean's list. First remove the old
565          * instance (by id number), then re-add it again.
566          * <p>
567          * @param faxNumber number to add
568          */
569         private void uniqueAddFaxNumber (final DialableFaxNumber faxNumber) {
570                 // Make sure the parameter is valid
571                 if (null == faxNumber) {
572                         // Throw NPE
573                         throw new NullPointerException("faxNumber is null"); //NOI18N
574                 } else if (faxNumber.getPhoneId() == null) {
575                         // Throw again ...
576                         throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
577                 } else if (faxNumber.getPhoneId() < 1) {
578                         // Not valid
579                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid.", faxNumber.getPhoneId())); //NOI18N
580                 }
581
582                 // First remove it
583                 if (!this.getAllFaxNumbers().remove(faxNumber)) {
584                         // Did not work, try by id number
585                         for (final DialableFaxNumber currentNumber : this.getAllFaxNumbers()) {
586                                 // Is id number the same?
587                                 if (Objects.equals(currentNumber.getPhoneId(), faxNumber.getPhoneId())) {
588                                         // Found it
589                                         this.getAllFaxNumbers().remove(currentNumber);
590                                         break;
591                                 }
592                         }
593                 }
594
595                 // ... then add it
596                 this.getAllFaxNumbers().add(faxNumber);
597         }
598
599         /**
600          * Uniquely add given land-line number to this bean's list. First remove the
601          * old instance (by id number), then re-add it again.
602          * <p>
603          * @param landLineNumber Land-line number to add
604          */
605         private void uniqueAddLandLineNumber (final DialableLandLineNumber landLineNumber) {
606                 // Make sure the parameter is valid
607                 if (null == landLineNumber) {
608                         // Throw NPE
609                         throw new NullPointerException("landLineNumber is null"); //NOI18N
610                 } else if (landLineNumber.getPhoneId() == null) {
611                         // Throw again ...
612                         throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
613                 } else if (landLineNumber.getPhoneId() < 1) {
614                         // Not valid
615                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid.", landLineNumber.getPhoneId())); //NOI18N
616                 }
617
618                 // First remove it
619                 if (!this.getAllLandLineNumbers().remove(landLineNumber)) {
620                         // Did not work, try by id number
621                         for (final DialableLandLineNumber currentNumber : this.getAllLandLineNumbers()) {
622                                 // Is id number the same?
623                                 if (Objects.equals(currentNumber.getPhoneId(), landLineNumber.getPhoneId())) {
624                                         // Found it
625                                         this.getAllLandLineNumbers().remove(currentNumber);
626                                         break;
627                                 }
628                         }
629                 }
630
631                 // ... then add it
632                 this.getAllLandLineNumbers().add(landLineNumber);
633         }
634
635         /**
636          * Updates given contact's mobile, land-line and fax number
637          * <p>
638          * @param contact Contact instance
639          */
640         private void updateContactPhoneNumbers (final Contact contact) {
641                 // Parameter must be valid
642                 if (null == contact) {
643                         // Throw NPE
644                         throw new NullPointerException("contact is null"); //NOI18N
645                 } else if (contact.getContactId() == null) {
646                         // Throw again
647                         throw new NullPointerException("contact.contactId is null"); //NOI18N
648                 } else if (contact.getContactId() < 1) {
649                         // Id number is not valid
650                 }
651
652                 // Is land-line set?
653                 if (contact.getContactLandLineNumber() instanceof DialableLandLineNumber) {
654                         // Unique-add it
655                         this.uniqueAddLandLineNumber(contact.getContactLandLineNumber());
656                 }
657
658                 // Is fax set?
659                 if (contact.getContactFaxNumber() instanceof DialableFaxNumber) {
660                         // Unique-add it
661                         this.uniqueAddFaxNumber(contact.getContactFaxNumber());
662                 }
663         }
664
665 }