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