]> git.mxchange.org Git - jjobs-war.git/blob - src/java/org/mxchange/jjobs/beans/phone/JobsPhoneWebApplicationBean.java
Please cherry-pick:
[jjobs-war.git] / src / java / org / mxchange / jjobs / beans / phone / JobsPhoneWebApplicationBean.java
1 /*
2  * Copyright (C) 2016, 2017 Roland Häder
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.jjobs.beans.phone;
18
19 import java.text.MessageFormat;
20 import java.util.LinkedList;
21 import java.util.List;
22 import java.util.Objects;
23 import javax.annotation.PostConstruct;
24 import javax.ejb.EJB;
25 import javax.enterprise.context.ApplicationScoped;
26 import javax.enterprise.event.Observes;
27 import javax.inject.Named;
28 import org.mxchange.jcontacts.contact.Contact;
29 import org.mxchange.jcontacts.events.contact.add.ObservableAdminAddedContactEvent;
30 import org.mxchange.jcontacts.events.contact.update.ObservableAdminUpdatedContactEvent;
31 import org.mxchange.jcontacts.events.fax.linked.ObservableAdminLinkedFaxNumberEvent;
32 import org.mxchange.jcontacts.events.landline.linked.ObservableAdminLinkedLandLineNumberEvent;
33 import org.mxchange.jcontacts.events.mobile.linked.ObservableAdminLinkedMobileNumberEvent;
34 import org.mxchange.jjobs.beans.BaseJobsController;
35 import org.mxchange.jphone.events.fax.deleted.AdminDeletedFaxNumberEvent;
36 import org.mxchange.jphone.events.fax.updated.AdminUpdatedFaxNumberEvent;
37 import org.mxchange.jphone.events.landline.deleted.AdminDeletedLandLineNumberEvent;
38 import org.mxchange.jphone.events.landline.updated.AdminUpdatedLandLineNumberEvent;
39 import org.mxchange.jphone.events.mobile.deleted.AdminDeletedMobileNumberEvent;
40 import org.mxchange.jphone.events.mobile.updated.AdminUpdatedMobileNumberEvent;
41 import org.mxchange.jphone.phonenumbers.fax.DialableFaxNumber;
42 import org.mxchange.jphone.phonenumbers.landline.DialableLandLineNumber;
43 import org.mxchange.jphone.phonenumbers.mobile.DialableMobileNumber;
44 import org.mxchange.jphone.phonenumbers.phone.PhoneSessionBeanRemote;
45 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
46
47 /**
48  * Regular controller (bean) for phone numbers
49  * <p>
50  * @author Roland Häder<roland@mxchange.org>
51  */
52 @Named ("phoneController")
53 @ApplicationScoped
54 public class JobsPhoneWebApplicationBean extends BaseJobsController implements JobsPhoneWebApplicationController {
55
56         /**
57          * Serial number
58          */
59         private static final long serialVersionUID = 491_058_674_675_690_105L;
60
61         /**
62          * All fax numbers
63          */
64         private final List<DialableFaxNumber> faxNumbers;
65
66         /**
67          * All land-line numbers
68          */
69         private final List<DialableLandLineNumber> landLineNumbers;
70
71         /**
72          * All mobile numbers
73          */
74         private final List<DialableMobileNumber> mobileNumbers;
75
76         /**
77          * General EJB for phone numbers
78          */
79         @EJB (lookup = "java:global/jjobs-ejb/phone!org.mxchange.jphone.phonenumbers.phone.PhoneSessionBeanRemote")
80         private PhoneSessionBeanRemote phoneBean;
81
82         /**
83          * Default constructor
84          */
85         public JobsPhoneWebApplicationBean () {
86                 // Call super constructor
87                 super();
88
89                 // Init all lists
90                 this.mobileNumbers = new LinkedList<>();
91                 this.faxNumbers = new LinkedList<>();
92                 this.landLineNumbers = new LinkedList<>();
93         }
94
95         /**
96          * Observes events being fired when an administrator has added a new
97          * contact.
98          * <p>
99          * @param event Event being fired
100          */
101         public void afterAdminAddedContactEvent (@Observes final ObservableAdminAddedContactEvent event) {
102                 // The event must be valid
103                 if (null == event) {
104                         // Throw NPE
105                         throw new NullPointerException("event is null"); //NOI18N
106                 } else if (event.getAddedContact() == null) {
107                         // Throw again ...
108                         throw new NullPointerException("event.addedContact is null"); //NOI18N
109                 } else if (event.getAddedContact().getContactId() == null) {
110                         // ... and again
111                         throw new NullPointerException("event.addedContact.contactId is null"); //NOI18N
112                 } else if (event.getAddedContact().getContactId() < 1) {
113                         // Not valid
114                         throw new IllegalArgumentException(MessageFormat.format("event.addedContact.contactId={0} is not valid", event.getAddedContact().getContactId())); //NOI18N
115                 }
116
117                 // Update contact's mobile, land-line and fax number
118                 this.updateContactPhoneNumbers(event.getAddedContact());
119
120                 // Clear this bean
121                 this.clear();
122         }
123
124         /**
125          * Event observer for newly added users by administrator
126          * <p>
127          * @param event Event being fired
128          */
129         public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
130                 // event should not be null
131                 if (null == event) {
132                         // Throw NPE
133                         throw new NullPointerException("event is null"); //NOI18N
134                 } else if (event.getAddedUser() == null) {
135                         // Throw NPE again
136                         throw new NullPointerException("event.addedUser is null"); //NOI18N
137                 } else if (event.getAddedUser().getUserId() == null) {
138                         // userId is null
139                         throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
140                 } else if (event.getAddedUser().getUserId() < 1) {
141                         // Not avalid id
142                         throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
143                 }
144
145                 // Update contact's mobile, land-line and fax number
146                 this.updateContactPhoneNumbers(event.getAddedUser().getUserContact());
147
148                 // Clear all data
149                 this.clear();
150         }
151
152         /**
153          * Observes events being fired when an administrator has deleted a fax
154          * number
155          * <p>
156          * @param event Event being fired
157          */
158         public void afterAdminDeletedFaxNumberEvent (@Observes final AdminDeletedFaxNumberEvent event) {
159                 // event should not be null
160                 if (null == event) {
161                         // Throw NPE
162                         throw new NullPointerException("event is null"); //NOI18N
163                 } else if (event.getDeletedFaxNumber() == null) {
164                         // Throw NPE again
165                         throw new NullPointerException("event.deletedFaxNumber is null"); //NOI18N
166                 } else if (event.getDeletedFaxNumber().getPhoneId() == null) {
167                         // userId is null
168                         throw new NullPointerException("event.deletedFaxNumber.phoneId is null"); //NOI18N
169                 } else if (event.getDeletedFaxNumber().getPhoneId() < 1) {
170                         // Not avalid id
171                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedFaxNumber(), event.getDeletedFaxNumber().getPhoneId())); //NOI18N
172                 }
173
174                 // Update contact's mobile, land-line and fax number
175                 this.allFaxNumbers().remove(event.getDeletedFaxNumber());
176
177                 // Clear all data
178                 this.clear();
179         }
180
181         /**
182          * Observes events being fired when an administrator has deleted a land-line
183          * number
184          * <p>
185          * @param event Event being fired
186          */
187         public void afterAdminDeletedLandLineNumberEvent (@Observes final AdminDeletedLandLineNumberEvent event) {
188                 // event should not be null
189                 if (null == event) {
190                         // Throw NPE
191                         throw new NullPointerException("event is null"); //NOI18N
192                 } else if (event.getDeletedLandLineNumber() == null) {
193                         // Throw NPE again
194                         throw new NullPointerException("event.deletedLandLineNumber is null"); //NOI18N
195                 } else if (event.getDeletedLandLineNumber().getPhoneId() == null) {
196                         // userId is null
197                         throw new NullPointerException("event.deletedLandLineNumber.phoneId is null"); //NOI18N
198                 } else if (event.getDeletedLandLineNumber().getPhoneId() < 1) {
199                         // Not avalid id
200                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedLandLineNumber(), event.getDeletedLandLineNumber().getPhoneId())); //NOI18N
201                 }
202
203                 // Update contact's mobile, land-line and fax number
204                 this.allLandLineNumbers().remove(event.getDeletedLandLineNumber());
205
206                 // Clear all data
207                 this.clear();
208         }
209
210         /**
211          * Observes events being fired when an administrator has deleted a mobile
212          * number
213          * <p>
214          * @param event Event being fired
215          */
216         public void afterAdminDeletedMobileNumberEvent (@Observes final AdminDeletedMobileNumberEvent event) {
217                 // event should not be null
218                 if (null == event) {
219                         // Throw NPE
220                         throw new NullPointerException("event is null"); //NOI18N
221                 } else if (event.getDeletedMobileNumber() == null) {
222                         // Throw NPE again
223                         throw new NullPointerException("event.deletedMobileNumber is null"); //NOI18N
224                 } else if (event.getDeletedMobileNumber().getPhoneId() == null) {
225                         // userId is null
226                         throw new NullPointerException("event.deletedMobileNumber.phoneId is null"); //NOI18N
227                 } else if (event.getDeletedMobileNumber().getPhoneId() < 1) {
228                         // Not avalid id
229                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedMobileNumber(), event.getDeletedMobileNumber().getPhoneId())); //NOI18N
230                 }
231
232                 // Update contact's mobile, land-line and fax number
233                 this.allMobileNumbers().remove(event.getDeletedMobileNumber());
234
235                 // Clear all data
236                 this.clear();
237         }
238
239         /**
240          * Observes events being fired when an administrator has a linked a fax
241          * number
242          * <p>
243          * @param event Event being fired
244          */
245         public void afterAdminLinkedFaxNumberEvent (@Observes final ObservableAdminLinkedFaxNumberEvent event) {
246                 // Is the event fine?
247                 if (event == null) {
248                         // Throw NPE
249                         throw new NullPointerException("event is null"); //NOI18N
250                 } else if (event.getContact() == null) {
251                         // Throw again ...
252                         throw new NullPointerException("event.contact is null");
253                 } else if (event.getContact().getContactId() == null) {
254                         // Throw again ...
255                         throw new NullPointerException("event.contact.contactId is null");
256                 } else if (event.getContact().getContactId() < 1) {
257                         // Throw again ...
258                         throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
259                 } else if (event.getContact().getContactFaxNumber() == null) {
260                         // Throw again ...
261                         throw new NullPointerException("event.contact.contactFaxNumber is null");
262                 } else if (event.getContact().getContactFaxNumber().getPhoneId() == null) {
263                         // Throw again ...
264                         throw new NullPointerException("event.contact.contactFaxNumber.phoneId is null");
265                 } else if (event.getContact().getContactFaxNumber().getPhoneId() < 1) {
266                         // Throw again ...
267                         throw new NullPointerException("event.contact.contactFaxNumber.phoneId=" + event.getContact().getContactFaxNumber().getPhoneId() + " is invalid");
268                 } else if (event.getLinkedFaxNumber() == null) {
269                         // Throw again ...
270                         throw new NullPointerException("event.linkedFaxNumer is null");
271                 }
272
273                 // Is the id number in linked number not set?
274                 if (event.getLinkedFaxNumber().getPhoneId() == null) {
275                         // Then it is a new number, so add it from contact as there the id number has been set
276                         this.uniqueAddFaxNumber(event.getContact().getContactFaxNumber());
277                 }
278         }
279
280         /**
281          * Observes events being fired when an administrator has a linked a
282          * land-line number
283          * <p>
284          * @param event Event being fired
285          */
286         public void afterAdminLinkedLandLineNumberEvent (@Observes final ObservableAdminLinkedLandLineNumberEvent event) {
287                 // Is the event fine?
288                 if (event == null) {
289                         // Throw NPE
290                         throw new NullPointerException("event is null"); //NOI18N
291                 } else if (event.getContact() == null) {
292                         // Throw again ...
293                         throw new NullPointerException("event.contact is null");
294                 } else if (event.getContact().getContactId() == null) {
295                         // Throw again ...
296                         throw new NullPointerException("event.contact.contactId is null");
297                 } else if (event.getContact().getContactId() < 1) {
298                         // Throw again ...
299                         throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
300                 } else if (event.getContact().getContactLandLineNumber() == null) {
301                         // Throw again ...
302                         throw new NullPointerException("event.contact.contactLandLineNumber is null");
303                 } else if (event.getContact().getContactLandLineNumber().getPhoneId() == null) {
304                         // Throw again ...
305                         throw new NullPointerException("event.contact.contactLandLineNumber.phoneId is null");
306                 } else if (event.getContact().getContactLandLineNumber().getPhoneId() < 1) {
307                         // Throw again ...
308                         throw new NullPointerException("event.contact.contactLandLineNumber.phoneId=" + event.getContact().getContactLandLineNumber().getPhoneId() + " is invalid");
309                 } else if (event.getLinkedLandLineNumber() == null) {
310                         // Throw again ...
311                         throw new NullPointerException("event.linkedLandLineNumer is null");
312                 }
313
314                 // Is the id number in linked number not set?
315                 if (event.getLinkedLandLineNumber().getPhoneId() == null) {
316                         // Then it is a new number, so add it from contact as there the id number has been set
317                         this.uniqueAddLandLineNumber(event.getContact().getContactLandLineNumber());
318                 }
319         }
320
321         /**
322          * Observes events being fired when an administrator has a linked a mobile
323          * number
324          * <p>
325          * @param event Event being fired
326          */
327         public void afterAdminLinkedMobileNumberEvent (@Observes final ObservableAdminLinkedMobileNumberEvent event) {
328                 // Is the event fine?
329                 if (event == null) {
330                         // Throw NPE
331                         throw new NullPointerException("event is null"); //NOI18N
332                 } else if (event.getContact() == null) {
333                         // Throw again ...
334                         throw new NullPointerException("event.contact is null");
335                 } else if (event.getContact().getContactId() == null) {
336                         // Throw again ...
337                         throw new NullPointerException("event.contact.contactId is null");
338                 } else if (event.getContact().getContactId() < 1) {
339                         // Throw again ...
340                         throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
341                 } else if (event.getContact().getContactMobileNumber() == null) {
342                         // Throw again ...
343                         throw new NullPointerException("event.contact.contactMobileNumber is null");
344                 } else if (event.getContact().getContactMobileNumber().getPhoneId() == null) {
345                         // Throw again ...
346                         throw new NullPointerException("event.contact.contactMobileNumber.phoneId is null");
347                 } else if (event.getContact().getContactMobileNumber().getPhoneId() < 1) {
348                         // Throw again ...
349                         throw new NullPointerException("event.contact.contactMobileNumber.phoneId=" + event.getContact().getContactMobileNumber().getPhoneId() + " is invalid");
350                 } else if (event.getLinkedMobileNumber() == null) {
351                         // Throw again ...
352                         throw new NullPointerException("event.linkedMobileNumer is null");
353                 }
354
355                 // Is the id number in linked number not set?
356                 if (event.getLinkedMobileNumber().getPhoneId() == null) {
357                         // Then it is a new number, so add it from contact as there the id number has been set
358                         this.uniqueAddMobileNumber(event.getContact().getContactMobileNumber());
359                 }
360         }
361
362         /**
363          * Observes events being fired when an administrator has updated contact
364          * data.
365          * <p>
366          * @param event Event being fired
367          */
368         public void afterAdminUpdatedContactDataEvent (@Observes final ObservableAdminUpdatedContactEvent event) {
369                 // event should not be null
370                 if (null == event) {
371                         // Throw NPE
372                         throw new NullPointerException("event is null"); //NOI18N
373                 } else if (event.getUpdatedContact() == null) {
374                         // Throw NPE again
375                         throw new NullPointerException("event.updatedContact is null"); //NOI18N
376                 } else if (event.getUpdatedContact().getContactId() == null) {
377                         // userId is null
378                         throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
379                 } else if (event.getUpdatedContact().getContactId() < 1) {
380                         // Not avalid id
381                         throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
382                 }
383
384                 // Update contact's mobile, land-line and fax number
385                 this.updateContactPhoneNumbers(event.getUpdatedContact());
386
387                 // Clear all data
388                 this.clear();
389         }
390
391         /**
392          * Observes events being fired when an administrator has updated a fax
393          * number.
394          * <p>
395          * @param event Event being fired
396          */
397         public void afterAdminUpdatedFaxNumberEvent (@Observes final AdminUpdatedFaxNumberEvent event) {
398                 // event should not be null
399                 if (null == event) {
400                         // Throw NPE
401                         throw new NullPointerException("event is null"); //NOI18N
402                 } else if (event.getUpdatedFaxNumber() == null) {
403                         // Throw NPE again
404                         throw new NullPointerException("event.updatedFaxNumber is null"); //NOI18N
405                 } else if (event.getUpdatedFaxNumber().getPhoneId() == null) {
406                         // userId is null
407                         throw new NullPointerException("event.updatedFaxNumber.phoneId is null"); //NOI18N
408                 } else if (event.getUpdatedFaxNumber().getPhoneId() < 1) {
409                         // Not avalid id
410                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedFaxNumber(), event.getUpdatedFaxNumber().getPhoneId())); //NOI18N
411                 }
412
413                 // Uniquely add it
414                 this.uniqueAddFaxNumber(event.getUpdatedFaxNumber());
415
416                 // Clear it
417                 this.clear();
418         }
419
420         /**
421          * Observes events being fired when an administrator has updated a land-line
422          * number.
423          * <p>
424          * @param event Event being fired
425          */
426         public void afterAdminUpdatedLandLineNumberEvent (@Observes final AdminUpdatedLandLineNumberEvent event) {
427                 // event should not be null
428                 if (null == event) {
429                         // Throw NPE
430                         throw new NullPointerException("event is null"); //NOI18N
431                 } else if (event.getUpdatedLandLineNumber() == null) {
432                         // Throw NPE again
433                         throw new NullPointerException("event.updatedLandLineNumber is null"); //NOI18N
434                 } else if (event.getUpdatedLandLineNumber().getPhoneId() == null) {
435                         // userId is null
436                         throw new NullPointerException("event.updatedLandLineNumber.phoneId is null"); //NOI18N
437                 } else if (event.getUpdatedLandLineNumber().getPhoneId() < 1) {
438                         // Not avalid id
439                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedLandLineNumber(), event.getUpdatedLandLineNumber().getPhoneId())); //NOI18N
440                 }
441
442                 // Uniquely add it
443                 this.uniqueAddLandLineNumber(event.getUpdatedLandLineNumber());
444
445                 // Clear it
446                 this.clear();
447         }
448
449         /**
450          * Observes events being fired when an administrator has updated a mobile
451          * number.
452          * <p>
453          * @param event Event being fired
454          */
455         public void afterAdminUpdatedMobileNumberEvent (@Observes final AdminUpdatedMobileNumberEvent event) {
456                 // event should not be null
457                 if (null == event) {
458                         // Throw NPE
459                         throw new NullPointerException("event is null"); //NOI18N
460                 } else if (event.getUpdatedMobileNumber() == null) {
461                         // Throw NPE again
462                         throw new NullPointerException("event.updatedMobileNumber is null"); //NOI18N
463                 } else if (event.getUpdatedMobileNumber().getPhoneId() == null) {
464                         // userId is null
465                         throw new NullPointerException("event.updatedMobileNumber.phoneId is null"); //NOI18N
466                 } else if (event.getUpdatedMobileNumber().getPhoneId() < 1) {
467                         // Not avalid id
468                         throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedMobileNumber(), event.getUpdatedMobileNumber().getPhoneId())); //NOI18N
469                 }
470
471                 // Uniquely add it
472                 this.uniqueAddMobileNumber(event.getUpdatedMobileNumber());
473
474                 // Clear it
475                 this.clear();
476         }
477
478         @Override
479         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
480         public List<DialableFaxNumber> allFaxNumbers () {
481                 return this.faxNumbers;
482         }
483
484         @Override
485         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
486         public List<DialableLandLineNumber> allLandLineNumbers () {
487                 return this.landLineNumbers;
488         }
489
490         @Override
491         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
492         public List<DialableMobileNumber> allMobileNumbers () {
493                 return this.mobileNumbers;
494         }
495
496         /**
497          * Post-construction method
498          */
499         @PostConstruct
500         public void init () {
501                 // All phone numbers
502                 this.allMobileNumbers().addAll(this.phoneBean.allMobileNumbers());
503                 this.allFaxNumbers().addAll(this.phoneBean.allFaxNumbers());
504                 this.allLandLineNumbers().addAll(this.phoneBean.allLandLineNumbers());
505         }
506
507         /**
508          * Clears this bean
509          */
510         private void clear () {
511                 // Clear all data
512         }
513
514         /**
515          * Uniquely add given fax number to this bean's list. First remove the old
516          * instance (by id number), then re-add it again.
517          * <p>
518          * @param faxNumber number to add
519          */
520         private void uniqueAddFaxNumber (final DialableFaxNumber faxNumber) {
521                 // Make sure the parameter is valid
522                 if (null == faxNumber) {
523                         // Throw NPE
524                         throw new NullPointerException("faxNumber is null");
525                 } else if (faxNumber.getPhoneId() == null) {
526                         // Throw again ...
527                         throw new NullPointerException("faxNumber.phoneId is null");
528                 } else if (faxNumber.getPhoneId() < 1) {
529                         // Not valid
530                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid.", faxNumber.getPhoneId()));
531                 }
532
533                 // First remove it
534                 if (!this.allFaxNumbers().remove(faxNumber)) {
535                         // Did not work, try by id number
536                         for (final DialableFaxNumber fax : this.allFaxNumbers()) {
537                                 // Is id number the same?
538                                 if (Objects.equals(fax.getPhoneId(), faxNumber.getPhoneId())) {
539                                         // Found it
540                                         this.allFaxNumbers().remove(fax);
541                                         break;
542                                 }
543                         }
544                 }
545
546                 // ... then add it
547                 this.allFaxNumbers().add(faxNumber);
548         }
549
550         /**
551          * Uniquely add given land-line number to this bean's list. First remove the
552          * old instance (by id number), then re-add it again.
553          * <p>
554          * @param landLineNumber Land-line number to add
555          */
556         private void uniqueAddLandLineNumber (final DialableLandLineNumber landLineNumber) {
557                 // Make sure the parameter is valid
558                 if (null == landLineNumber) {
559                         // Throw NPE
560                         throw new NullPointerException("landLineNumber is null");
561                 } else if (landLineNumber.getPhoneId() == null) {
562                         // Throw again ...
563                         throw new NullPointerException("landLineNumber.phoneId is null");
564                 } else if (landLineNumber.getPhoneId() < 1) {
565                         // Not valid
566                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid.", landLineNumber.getPhoneId()));
567                 }
568
569                 // First remove it
570                 if (!this.allLandLineNumbers().remove(landLineNumber)) {
571                         // Did not work, try by id number
572                         for (final DialableLandLineNumber landLine : this.allLandLineNumbers()) {
573                                 // Is id number the same?
574                                 if (Objects.equals(landLine.getPhoneId(), landLineNumber.getPhoneId())) {
575                                         // Found it
576                                         this.allLandLineNumbers().remove(landLine);
577                                         break;
578                                 }
579                         }
580                 }
581
582                 // ... then add it
583                 this.allLandLineNumbers().add(landLineNumber);
584         }
585
586         /**
587          * Uniquely add given mobile number to this bean's list. First remove the
588          * old instance (by id number), then re-add it again.
589          * <p>
590          * @param mobileNumber Mobile number to add
591          */
592         private void uniqueAddMobileNumber (final DialableMobileNumber mobileNumber) {
593                 // Make sure the parameter is valid
594                 if (null == mobileNumber) {
595                         // Throw NPE
596                         throw new NullPointerException("mobileNumber is null");
597                 } else if (mobileNumber.getPhoneId() == null) {
598                         // Throw again ...
599                         throw new NullPointerException("mobileNumber.phoneId is null");
600                 } else if (mobileNumber.getPhoneId() < 1) {
601                         // Not valid
602                         throw new IllegalArgumentException(MessageFormat.format("mobileNumber.phoneId={0} is not valid.", mobileNumber.getPhoneId()));
603                 }
604
605                 // First remove it by object
606                 if (!this.allMobileNumbers().remove(mobileNumber)) {
607                         // Did not work, try by id number
608                         for (final DialableMobileNumber cell : this.allMobileNumbers()) {
609                                 // Is id number the same?
610                                 if (Objects.equals(cell.getPhoneId(), mobileNumber.getPhoneId())) {
611                                         // Found it
612                                         this.allMobileNumbers().remove(cell);
613                                         break;
614                                 }
615                         }
616                 }
617
618                 // ... then add it
619                 this.allMobileNumbers().add(mobileNumber);
620         }
621
622         /**
623          * Updates given contact's mobile, land-line and fax number
624          * <p>
625          * @param contact Contact instance
626          */
627         private void updateContactPhoneNumbers (final Contact contact) {
628                 // Parameter must be valid
629                 if (null == contact) {
630                         // Throw NPE
631                         throw new NullPointerException("contact is null");
632                 } else if (contact.getContactId() == null) {
633                         // Throw again
634                         throw new NullPointerException("contact.contactId is null");
635                 } else if (contact.getContactId() < 1) {
636                         // Id number is not valid
637                 }
638
639                 // Is mobile set?
640                 if (contact.getContactMobileNumber() instanceof DialableMobileNumber) {
641                         // Unique-add it
642                         this.uniqueAddMobileNumber(contact.getContactMobileNumber());
643                 }
644
645                 // Is land-line set?
646                 if (contact.getContactLandLineNumber() instanceof DialableLandLineNumber) {
647                         // Unique-add it
648                         this.uniqueAddLandLineNumber(contact.getContactLandLineNumber());
649                 }
650
651                 // Is fax set?
652                 if (contact.getContactFaxNumber() instanceof DialableFaxNumber) {
653                         // Unique-add it
654                         this.uniqueAddFaxNumber(contact.getContactFaxNumber());
655                 }
656         }
657
658 }