]> git.mxchange.org Git - jjobs-war.git/blob - src/java/org/mxchange/jjobs/beans/phone/JobsAdminPhoneWebRequestBean.java
Please cherry-pick:
[jjobs-war.git] / src / java / org / mxchange / jjobs / beans / phone / JobsAdminPhoneWebRequestBean.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.List;
21 import java.util.Locale;
22 import java.util.MissingResourceException;
23 import java.util.Objects;
24 import java.util.ResourceBundle;
25 import javax.annotation.PostConstruct;
26 import javax.enterprise.context.RequestScoped;
27 import javax.enterprise.event.Event;
28 import javax.enterprise.inject.Any;
29 import javax.faces.application.FacesMessage;
30 import javax.faces.context.FacesContext;
31 import javax.faces.view.facelets.FaceletException;
32 import javax.inject.Inject;
33 import javax.inject.Named;
34 import javax.naming.Context;
35 import javax.naming.InitialContext;
36 import javax.naming.NamingException;
37 import org.mxchange.jcountry.data.Country;
38 import org.mxchange.jjobs.beans.BaseJobsController;
39 import org.mxchange.jjobs.beans.helper.JobsWebRequestHelperController;
40 import org.mxchange.jphone.events.fax.deleted.AdminDeletedFaxNumberEvent;
41 import org.mxchange.jphone.events.fax.deleted.AdminFaxNumberDeletedEvent;
42 import org.mxchange.jphone.events.fax.removed.AdminFaxNumberRemovedFromListEvent;
43 import org.mxchange.jphone.events.fax.removed.AdminRemoveFaxNumberFromListEvent;
44 import org.mxchange.jphone.events.fax.updated.AdminFaxNumberUpdatedEvent;
45 import org.mxchange.jphone.events.fax.updated.AdminUpdatedFaxNumberEvent;
46 import org.mxchange.jphone.events.landline.deleted.AdminDeletedLandLineNumberEvent;
47 import org.mxchange.jphone.events.landline.deleted.AdminLandLineNumberDeletedEvent;
48 import org.mxchange.jphone.events.landline.removed.AdminLandLineNumberRemovedFromListEvent;
49 import org.mxchange.jphone.events.landline.removed.AdminRemoveLandLineNumberFromListEvent;
50 import org.mxchange.jphone.events.landline.updated.AdminLandLineNumberUpdatedEvent;
51 import org.mxchange.jphone.events.landline.updated.AdminUpdatedLandLineNumberEvent;
52 import org.mxchange.jphone.events.mobile.deleted.AdminDeletedMobileNumberEvent;
53 import org.mxchange.jphone.events.mobile.deleted.AdminMobileNumberDeletedEvent;
54 import org.mxchange.jphone.events.mobile.remove.AdminMobileNumberRemovedFromListEvent;
55 import org.mxchange.jphone.events.mobile.remove.AdminRemoveMobileNumberFromListEvent;
56 import org.mxchange.jphone.events.mobile.updated.AdminMobileNumberUpdatedEvent;
57 import org.mxchange.jphone.events.mobile.updated.AdminUpdatedMobileNumberEvent;
58 import org.mxchange.jphone.phonenumbers.fax.DialableFaxNumber;
59 import org.mxchange.jphone.phonenumbers.landline.DialableLandLineNumber;
60 import org.mxchange.jphone.phonenumbers.mobile.DialableMobileNumber;
61 import org.mxchange.jphone.phonenumbers.mobileprovider.MobileProvider;
62 import org.mxchange.jphone.phonenumbers.phone.AdminPhoneSessionBeanRemote;
63
64 /**
65  * Administrative controller (bean) for phone numbers
66  * <p>
67  * @author Roland Häder<roland@mxchange.org>
68  */
69 @Named ("adminPhoneController")
70 @RequestScoped
71 public abstract class JobsAdminPhoneWebRequestBean extends BaseJobsController implements JobsAdminPhoneWebRequestController {
72
73         /**
74          * Call-stack position
75          */
76         private static final short THREAD_STACK = 5;
77
78         /**
79          * Serial number
80          */
81         private static final long serialVersionUID = 184_598_175_371_269_016L;
82
83         /**
84          * Remote EJB for phone number (administrative)
85          */
86         private AdminPhoneSessionBeanRemote adminPhoneBean;
87
88         /**
89          * Bean helper
90          */
91         @Inject
92         private JobsWebRequestHelperController beanHelper;
93
94         /**
95          * fax number
96          */
97         private DialableFaxNumber faxNumber;
98
99         /**
100          * Event being fired when an administrator has deleted fax number
101          */
102         @Inject
103         @Any
104         private Event<AdminDeletedFaxNumberEvent> faxNumberDeletedEvent;
105
106         /**
107          * Event being fired when an administrator has updated fax number
108          */
109         @Inject
110         @Any
111         private Event<AdminUpdatedFaxNumberEvent> faxNumberUpdatedEvent;
112
113         /**
114          * land-line number
115          */
116         private DialableLandLineNumber landLineNumber;
117
118         /**
119          * Event being fired when an administrator has deleted land-line number
120          */
121         @Inject
122         @Any
123         private Event<AdminDeletedLandLineNumberEvent> landLineNumberDeletedEvent;
124
125         /**
126          * Event being fired when an administrator has updated fax number
127          */
128         @Inject
129         @Any
130         private Event<AdminUpdatedLandLineNumberEvent> landLineNumberUpdatedEvent;
131
132         /**
133          * Chosen mobile number
134          */
135         private DialableMobileNumber mobileNumber;
136
137         /**
138          * Event being fired when an administrator has deleted mobile number
139          */
140         @Inject
141         @Any
142         private Event<AdminDeletedMobileNumberEvent> mobileNumberDeletedEvent;
143
144         /**
145          * Event being fired when an administrator has updated land-line number
146          */
147         @Inject
148         @Any
149         private Event<AdminUpdatedMobileNumberEvent> mobileNumberUpdatedEvent;
150
151         /**
152          * Mobile provider
153          */
154         private MobileProvider mobileProvider;
155
156         /**
157          * Area code (city dial prefix)
158          */
159         private Integer phoneAreaCode;
160
161         /**
162          * Generic hone controller
163          */
164         @Inject
165         private JobsPhoneWebApplicationController phoneController;
166
167         /**
168          * Country (for dial prefix)
169          */
170         private Country phoneCountry;
171
172         /**
173          * Phone number
174          */
175         private Long phoneNumber;
176
177         /**
178          * Event being fired when a list of all unsed fax numbers is being created.
179          */
180         @Inject
181         @Any
182         private Event<AdminRemoveFaxNumberFromListEvent> removeLinkedFaxNumbersEvent;
183
184         /**
185          * Event being fired when a list of all unsed land-line numbers is being
186          * created.
187          */
188         @Inject
189         @Any
190         private Event<AdminRemoveLandLineNumberFromListEvent> removeLinkedLandLineNumbersEvent;
191
192         /**
193          * Event being fired when a list of all unsed mobile numbers is being
194          * created.
195          */
196         @Inject
197         @Any
198         private Event<AdminRemoveMobileNumberFromListEvent> removeLinkedMobileNumbersEvent;
199
200         /**
201          * Default constructor
202          */
203         public JobsAdminPhoneWebRequestBean () {
204                 // Call super constructor
205                 super();
206
207                 // String caller = MessageFormat.format("{0}.{1}", Thread.currentThread().getStackTrace()[3].getClassName(), Thread.currentThread().getStackTrace()[3].getMethodName());
208                 // System.out.println(MessageFormat.format("{0}: Constructed, caller: {1}", this.getClass().getSimpleName(), caller));
209         }
210
211         /**
212          * Returns a list of all unused ("non-linked") land-line numbers
213          * <p>
214          * @return List with all unused land-line numbers
215          */
216         public List<DialableFaxNumber> allNonLinkedFaxNumbers () {
217                 // Get list of all mobile numbers
218                 List<DialableFaxNumber> list = this.phoneController.allFaxNumbers();
219
220                 // Visit all controllers to reduce the list
221                 this.removeLinkedFaxNumbersEvent.fire(new AdminFaxNumberRemovedFromListEvent(list));
222
223                 // Return it
224                 return list;
225         }
226
227         /**
228          * Returns a list of all unused ("non-linked") land-line numbers
229          * <p>
230          * @return List with all unused land-line numbers
231          */
232         public List<DialableLandLineNumber> allNonLinkedLandLineNumbers () {
233                 // Get list of all mobile numbers
234                 List<DialableLandLineNumber> list = this.phoneController.allLandLineNumbers();
235
236                 // Visit all controllers to reduce the list
237                 this.removeLinkedLandLineNumbersEvent.fire(new AdminLandLineNumberRemovedFromListEvent(list));
238
239                 // Return it
240                 return list;
241         }
242
243         /**
244          * Returns a list of all unused ("non-linked") mobile numbers
245          * <p>
246          * @return List with all unused mobile numbers
247          */
248         public List<DialableMobileNumber> allNonLinkedMobileNumbers () {
249                 // Get list of all mobile numbers
250                 List<DialableMobileNumber> list = this.phoneController.allMobileNumbers();
251
252                 // Visit all controllers to reduce the list
253                 this.removeLinkedMobileNumbersEvent.fire(new AdminMobileNumberRemovedFromListEvent(list));
254
255                 // Return it
256                 return list;
257         }
258
259         /**
260          * Deletes given fax entry data
261          * <p>
262          * @return Redirect outcome
263          */
264         public String deleteFaxData () {
265                 // Get fax number from bean helper
266                 DialableFaxNumber number = this.beanHelper.getFaxNumber();
267
268                 // Is all data set
269                 if (number == null) {
270                         // Not set, throw NPE
271                         throw new NullPointerException("faxNumber is null"); //NOI18N
272                 } else if (number.getPhoneId() == null) {
273                         // Throw NPE again
274                         throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
275                 } else if (number.getPhoneId() < 1) {
276                         // Invalid number
277                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
278                 } else if (number.getPhoneCountry() == null) {
279                         // Throw NPE
280                         throw new NullPointerException("faxNumber.phoneCountry is null"); //NOI18N
281                 } else if (number.getPhoneCountry().getCountryId() == null) {
282                         // Throw NPE
283                         throw new NullPointerException("faxNumber.phoneCountry.countryId is null"); //NOI18N
284                 } else if (number.getPhoneCountry().getCountryId() < 1) {
285                         // Throw NPE
286                         throw new NullPointerException(MessageFormat.format("faxNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
287                 } else if (number.getPhoneAreaCode() == null) {
288                         // ... throw again
289                         throw new NullPointerException("faxNumber.phoneAreaCode is null"); //NOI18N
290                 } else if (number.getPhoneAreaCode() < 1) {
291                         // Id not valid
292                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
293                 } else if (number.getPhoneNumber() == null) {
294                         // Throw NPE again
295                         throw new NullPointerException("faxNumber.phoneNumber is null"); //NOI18N
296                 } else if (number.getPhoneNumber() < 1) {
297                         // Throw NPE again
298                         throw new NullPointerException(MessageFormat.format("faxNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
299                 }
300
301                 // Call EJB
302                 this.adminPhoneBean.deleteFaxData(number);
303
304                 // Fire event
305                 this.faxNumberDeletedEvent.fire(new AdminFaxNumberDeletedEvent(number));
306
307                 // All fine, redirect
308                 return "admin_list_fax"; //NOI18N
309         }
310
311         /**
312          * Deletes given land-line entry data
313          * <p>
314          * @return Redirect outcome
315          */
316         public String deleteLandLineData () {
317                 // Get land-line number from helper
318                 DialableLandLineNumber number = this.beanHelper.getLandLineNumber();
319
320                 // Is all data set
321                 if (number == null) {
322                         // Not set, throw NPE
323                         throw new NullPointerException("landLineNumber is null"); //NOI18N
324                 } else if (number.getPhoneId() == null) {
325                         // Throw NPE again
326                         throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
327                 } else if (number.getPhoneId() < 1) {
328                         // Invalid number
329                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
330                 } else if (number.getPhoneCountry() == null) {
331                         // Throw NPE
332                         throw new NullPointerException("landLineNumber.phoneCountry is null"); //NOI18N
333                 } else if (number.getPhoneCountry().getCountryId() == null) {
334                         // Throw NPE
335                         throw new NullPointerException("landLineNumber.phoneCountry.countryId is null"); //NOI18N
336                 } else if (number.getPhoneCountry().getCountryId() < 1) {
337                         // Throw NPE
338                         throw new NullPointerException(MessageFormat.format("landLineNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
339                 } else if (number.getPhoneAreaCode() == null) {
340                         // ... throw again
341                         throw new NullPointerException("landLineNumber.phoneAreaCode is null"); //NOI18N
342                 } else if (number.getPhoneAreaCode() < 1) {
343                         // Id not valid
344                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
345                 } else if (number.getPhoneNumber() == null) {
346                         // Throw NPE again
347                         throw new NullPointerException("landLineNumber.phoneNumber is null"); //NOI18N
348                 } else if (number.getPhoneNumber() < 1) {
349                         // Throw NPE again
350                         throw new NullPointerException(MessageFormat.format("landLineNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
351                 }
352
353                 // Call EJB
354                 this.adminPhoneBean.deleteLandLineData(number);
355
356                 // Fire event
357                 this.landLineNumberDeletedEvent.fire(new AdminLandLineNumberDeletedEvent(number));
358
359                 // All fine, redirect
360                 return "admin_list_landline"; //NOI18N
361         }
362
363         /**
364          * Deletes given mobile entry data
365          * <p>
366          * @return Redirect outcome
367          */
368         public String deleteMobileData () {
369                 // Get mobile number from helper
370                 DialableMobileNumber number = this.beanHelper.getMobileNumber();
371
372                 // Is all data set
373                 if (number == null) {
374                         // Not set, throw NPE
375                         throw new NullPointerException("mobileNumber is null"); //NOI18N
376                 } else if (number.getPhoneId() == null) {
377                         // Throw NPE again
378                         throw new NullPointerException("mobileNumber.phoneId is null"); //NOI18N
379                 } else if (number.getPhoneId() < 1) {
380                         // Invalid number
381                         throw new IllegalArgumentException(MessageFormat.format("mobileNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
382                 } else if (number.getMobileProvider() == null) {
383                         // Throw NPE
384                         throw new NullPointerException("mobileNumber.mobileProvider is null"); //NOI18N
385                 } else if (number.getMobileProvider().getProviderId() == null) {
386                         // ... throw again
387                         throw new NullPointerException("mobileNumber.mobileProvider.providerId is null"); //NOI18N
388                 } else if (number.getMobileProvider().getProviderId() < 1) {
389                         // Id not valid
390                         throw new IllegalArgumentException(MessageFormat.format("mobileNumber.mobileProvider.providerId={0} is not valid.", number.getMobileProvider().getProviderId())); //NOI18N
391                 } else if (number.getPhoneNumber() == null) {
392                         // Throw NPE again
393                         throw new NullPointerException("mobileNumber.phoneNumber is null"); //NOI18N
394                 } else if (number.getPhoneNumber() < 1) {
395                         // Throw NPE again
396                         throw new NullPointerException(MessageFormat.format("mobileNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
397                 }
398
399                 // Call EJB
400                 this.adminPhoneBean.deleteMobileData(number);
401
402                 // Fire event
403                 this.mobileNumberDeletedEvent.fire(new AdminMobileNumberDeletedEvent(number));
404
405                 // All fine, redirect
406                 return "admin_list_mobile"; //NOI18N
407         }
408
409         /**
410          * Changes fax entry data
411          * <p>
412          * @return Redirect outcome
413          */
414         public String doChangeFaxNumber () {
415                 // Get fax number from bean helper
416                 DialableFaxNumber number = this.beanHelper.getFaxNumber();
417
418                 // Is all data set
419                 if (number == null) {
420                         // Not set, throw NPE
421                         throw new NullPointerException("faxNumber is null"); //NOI18N
422                 } else if (number.getPhoneId() == null) {
423                         // Throw NPE again
424                         throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
425                 } else if (number.getPhoneId() < 1) {
426                         // Invalid number
427                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
428                 } else if (number.getPhoneCountry() == null) {
429                         // Throw NPE
430                         throw new NullPointerException("faxNumber.phoneCountry is null"); //NOI18N
431                 } else if (number.getPhoneCountry().getCountryId() == null) {
432                         // Throw NPE
433                         throw new NullPointerException("faxNumber.phoneCountry.countryId is null"); //NOI18N
434                 } else if (number.getPhoneCountry().getCountryId() < 1) {
435                         // Throw NPE
436                         throw new NullPointerException(MessageFormat.format("faxNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
437                 } else if (number.getPhoneAreaCode() == null) {
438                         // ... throw again
439                         throw new NullPointerException("faxNumber.phoneAreaCode is null"); //NOI18N
440                 } else if (number.getPhoneAreaCode() < 1) {
441                         // Id not valid
442                         throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
443                 } else if (number.getPhoneNumber() == null) {
444                         // Throw NPE again
445                         throw new NullPointerException("faxNumber.phoneNumber is null"); //NOI18N
446                 } else if (number.getPhoneNumber() < 1) {
447                         // Throw NPE again
448                         throw new NullPointerException(MessageFormat.format("faxNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
449                 }
450
451                 // Is the mobile provider and number the same?
452                 if ((Objects.equals(this.getPhoneCountry(), number.getPhoneCountry())) && (Objects.equals(this.getPhoneAreaCode(), number.getPhoneAreaCode())) && (Objects.equals(this.getPhoneNumber(), number.getPhoneNumber()))) {
453                         // Show message
454                         this.showFacesMessage("form_edit_fax:faxNumber", "ERROR_ADMIN_NO_CHANGE_ENTERED"); //NOI18N
455
456                         // No difference in both together, no need to edit
457                         return ""; //NOI18N
458                 }
459
460                 // Set all data
461                 number.setPhoneCountry(this.getPhoneCountry());
462                 number.setPhoneAreaCode(this.getPhoneAreaCode());
463                 number.setPhoneNumber(this.getPhoneNumber());
464
465                 // Send to bean
466                 DialableFaxNumber updatedNumber = this.adminPhoneBean.updateFaxData(number);
467
468                 // Fire event
469                 this.faxNumberUpdatedEvent.fire(new AdminFaxNumberUpdatedEvent(updatedNumber));
470
471                 // All fine, redirect
472                 return "admin_show_fax"; //NOI18N
473         }
474
475         /**
476          * Changes land-line entry data
477          * <p>
478          * @return Redirect outcome
479          */
480         public String doChangeLandLineNumber () {
481                 // Get land-line number from helper
482                 DialableLandLineNumber number = this.beanHelper.getLandLineNumber();
483
484                 // Is all data set
485                 if (number == null) {
486                         // Not set, throw NPE
487                         throw new NullPointerException("landLineNumber is null"); //NOI18N
488                 } else if (number.getPhoneId() == null) {
489                         // Throw NPE again
490                         throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
491                 } else if (number.getPhoneId() < 1) {
492                         // Invalid number
493                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
494                 } else if (number.getPhoneCountry() == null) {
495                         // Throw NPE
496                         throw new NullPointerException("landLineNumber.phoneCountry is null"); //NOI18N
497                 } else if (number.getPhoneCountry().getCountryId() == null) {
498                         // Throw NPE
499                         throw new NullPointerException("landLineNumber.phoneCountry.countryId is null"); //NOI18N
500                 } else if (number.getPhoneCountry().getCountryId() < 1) {
501                         // Throw NPE
502                         throw new NullPointerException(MessageFormat.format("landLineNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
503                 } else if (number.getPhoneAreaCode() == null) {
504                         // ... throw again
505                         throw new NullPointerException("landLineNumber.phoneAreaCode is null"); //NOI18N
506                 } else if (number.getPhoneAreaCode() < 1) {
507                         // Id not valid
508                         throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
509                 } else if (number.getPhoneNumber() == null) {
510                         // Throw NPE again
511                         throw new NullPointerException("landLineNumber.phoneNumber is null"); //NOI18N
512                 } else if (number.getPhoneNumber() < 1) {
513                         // Throw NPE again
514                         throw new NullPointerException(MessageFormat.format("landLineNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
515                 }
516
517                 // Is the mobile provider and number the same?
518                 if ((Objects.equals(this.getPhoneCountry(), number.getPhoneCountry())) && (Objects.equals(this.getPhoneAreaCode(), number.getPhoneAreaCode())) && (Objects.equals(this.getPhoneNumber(), number.getPhoneNumber()))) {
519                         // Show message
520                         this.showFacesMessage("form_edit_landline:landLineNumber", "ERROR_ADMIN_NO_CHANGE_ENTERED"); //NOI18N
521
522                         // No difference in both together, no need to edit
523                         return ""; //NOI18N
524                 }
525
526                 // Set all data
527                 number.setPhoneCountry(this.getPhoneCountry());
528                 number.setPhoneAreaCode(this.getPhoneAreaCode());
529                 number.setPhoneNumber(this.getPhoneNumber());
530
531                 // Send to bean
532                 DialableLandLineNumber updatedNumber = this.adminPhoneBean.updateLandLineData(number);
533
534                 // Fire event
535                 this.landLineNumberUpdatedEvent.fire(new AdminLandLineNumberUpdatedEvent(updatedNumber));
536
537                 // All fine, redirect
538                 return "admin_show_landline"; //NOI18N
539         }
540
541         /**
542          * Changes mobile entry data
543          * <p>
544          * @return Redirect outcome
545          */
546         public String doUpdateMobileNumber () {
547                 // Get mobile number from helper
548                 DialableMobileNumber number = this.beanHelper.getMobileNumber();
549
550                 // Is all data set
551                 if (number == null) {
552                         // Not set, throw NPE
553                         throw new NullPointerException("mobileNumber is null"); //NOI18N
554                 } else if (number.getPhoneId() == null) {
555                         // Throw NPE again
556                         throw new NullPointerException("mobileNumber.phoneId is null"); //NOI18N
557                 } else if (number.getPhoneId() < 1) {
558                         // Invalid number
559                         throw new IllegalArgumentException(MessageFormat.format("mobileNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
560                 } else if (number.getMobileProvider() == null) {
561                         // Throw NPE
562                         throw new NullPointerException("mobileNumber.mobileProvider is null"); //NOI18N
563                 } else if (number.getMobileProvider().getProviderId() == null) {
564                         // ... throw again
565                         throw new NullPointerException("mobileNumber.mobileProvider.providerId is null"); //NOI18N
566                 } else if (number.getMobileProvider().getProviderId() < 1) {
567                         // Id not valid
568                         throw new IllegalArgumentException(MessageFormat.format("mobileNumber.mobileProvider.providerId={0} is not valid.", number.getMobileProvider().getProviderId())); //NOI18N
569                 } else if (number.getPhoneNumber() == null) {
570                         // Throw NPE again
571                         throw new NullPointerException("mobileNumber.phoneNumber is null"); //NOI18N
572                 } else if (number.getPhoneNumber() < 1) {
573                         // Throw NPE again
574                         throw new NullPointerException(MessageFormat.format("mobileNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
575                 } else if (this.getMobileProvider() == null) {
576                         // Not provided
577                         this.showFacesMessage("form_edit_mobile:mobileProvider", "ERROR_ADMIN_NO_MOBILE_PROVIDER_SELECTED"); //NOI18N
578                         return ""; //NOI18N
579                 } else if (this.getMobileProvider().getProviderId() == null) {
580                         // Throw NPE again ...
581                         throw new NullPointerException("this.mobileProvider.providerId is null"); //NOI18N
582                 } else if (this.getMobileProvider().getProviderId() < 0) {
583                         // Invalid id number
584                         throw new IllegalArgumentException(MessageFormat.format("this.mobileProvider.providerId={0} is not valid.", this.getMobileProvider().getProviderId())); //NOI18N
585                 } else if (this.getPhoneNumber() == null) {
586                         // Not provided
587                         this.showFacesMessage("form_edit_mobile:mobileNumber", "ERROR_ADMIN_EMPTY_MOBILE_NUMBER"); //NOI18N
588                         return ""; //NOI18N
589                 }
590
591                 // Is the mobile provider and number the same?
592                 if ((Objects.equals(this.getMobileProvider(), number.getMobileProvider())) && (Objects.equals(this.getPhoneNumber(), number.getPhoneNumber()))) {
593                         // Show message
594                         this.showFacesMessage("form_edit_mobile:mobileNumber", "ERROR_ADMIN_NO_CHANGE_ENTERED"); //NOI18N
595
596                         // No difference in both together, no need to edit
597                         return ""; //NOI18N
598                 }
599
600                 // Set all data
601                 number.setMobileProvider(this.getMobileProvider());
602                 number.setPhoneNumber(this.getPhoneNumber());
603
604                 // Send to bean
605                 DialableMobileNumber updatedNumber = this.adminPhoneBean.updateMobileData(number);
606
607                 // Fire event
608                 this.mobileNumberUpdatedEvent.fire(new AdminMobileNumberUpdatedEvent(updatedNumber));
609
610                 // All fine, redirect
611                 return "admin_show_mobile"; //NOI18N
612         }
613
614         /**
615          * Getter for chosen fax number
616          * <p>
617          * @return fax number
618          */
619         public DialableFaxNumber getFaxNumber () {
620                 return this.faxNumber;
621         }
622
623         /**
624          * Setter for chosen fax number
625          * <p>
626          * @param faxNumber fax number
627          */
628         public void setFaxNumber (final DialableFaxNumber faxNumber) {
629                 this.faxNumber = faxNumber;
630         }
631
632         /**
633          * Getter for chosen land-line number
634          * <p>
635          * @return land-line number
636          */
637         public DialableLandLineNumber getLandLineNumber () {
638                 return this.landLineNumber;
639         }
640
641         /**
642          * Setter for chosen land-line number
643          * <p>
644          * @param landLineNumber land-line number
645          */
646         public void setLandLineNumber (final DialableLandLineNumber landLineNumber) {
647                 this.landLineNumber = landLineNumber;
648         }
649
650         /**
651          * Getter for chosen mobile number
652          * <p>
653          * @return mobile number
654          */
655         public DialableMobileNumber getMobileNumber () {
656                 return this.mobileNumber;
657         }
658
659         /**
660          * Setter for chosen mobile number
661          * <p>
662          * @param mobileNumber mobile number
663          */
664         public void setMobileNumber (final DialableMobileNumber mobileNumber) {
665                 this.mobileNumber = mobileNumber;
666         }
667
668         /**
669          * Getter for mobile provider
670          * <p>
671          * @return Mobile provider
672          */
673         public MobileProvider getMobileProvider () {
674                 return this.mobileProvider;
675         }
676
677         /**
678          * Setter for mobile provider
679          * <p>
680          * @param mobileProvider Mobile provider
681          */
682         public void setMobileProvider (final MobileProvider mobileProvider) {
683                 this.mobileProvider = mobileProvider;
684         }
685
686         /**
687          * Getter for phone area code
688          * <p>
689          * @return Phone area code
690          */
691         public Integer getPhoneAreaCode () {
692                 return this.phoneAreaCode;
693         }
694
695         /**
696          * Setter for phone area code
697          * <p>
698          * @param phoneAreaCode Phone area code
699          */
700         public void setPhoneAreaCode (final Integer phoneAreaCode) {
701                 this.phoneAreaCode = phoneAreaCode;
702         }
703
704         /**
705          * Getter for phone country (for dial prefix)
706          * <p>
707          * @return Phone country
708          */
709         public Country getPhoneCountry () {
710                 return this.phoneCountry;
711         }
712
713         /**
714          * Setter for phone country (for dial prefix)
715          * <p>
716          * @param phoneCountry Phone country
717          */
718         public void setPhoneCountry (final Country phoneCountry) {
719                 this.phoneCountry = phoneCountry;
720         }
721
722         /**
723          * Getter for dial number without prefix
724          * <p>
725          * @return Dial number without prefix
726          */
727         public Long getPhoneNumber () {
728                 return this.phoneNumber;
729         }
730
731         /**
732          * Setter for dial number without prefix
733          * <p>
734          * @param phoneNumber Dial number without prefix
735          */
736         public void setPhoneNumber (final Long phoneNumber) {
737                 this.phoneNumber = phoneNumber;
738         }
739
740         /**
741          * Post-construction method
742          */
743         @PostConstruct
744         public void init () {
745                 // Try it
746                 try {
747                         // Get initial context
748                         Context context = new InitialContext();
749
750                         // Try to lookup the beans
751                         this.adminPhoneBean = (AdminPhoneSessionBeanRemote) context.lookup("java:global/jjobs-ejb/adminPhone!org.mxchange.jphone.phonenumbers.phone.AdminPhoneSessionBeanRemote"); //NOI18N
752                 } catch (final NamingException e) {
753                         // Throw it again
754                         throw new FaceletException(e);
755                 }
756         }
757
758         /**
759          * Returns given property key or throws an exception if not found.
760          * <p>
761          * @param parameterKey Property key
762          * <p>
763          * @return Property value
764          * <p>
765          * @throws NullPointerException If given key is not found
766          * @throws NumberFormatException If no number is given in context parameter
767          */
768         protected int getIntegerContextParameter (final String parameterKey) throws NullPointerException, NumberFormatException {
769                 // Get context parameter
770                 Integer contextValue = Integer.parseInt(this.getStringContextParameter(parameterKey));
771                 // Return it
772                 return contextValue;
773         }
774
775         /**
776          * Returns given property key or throws an exception if not found.
777          * <p>
778          * @param parameterKey Property key
779          * <p>
780          * @return Property value
781          * <p>
782          * @throws NullPointerException If given key is not found
783          */
784         protected String getStringContextParameter (final String parameterKey) throws NullPointerException {
785                 // Get context parameter
786                 String contextValue = FacesContext.getCurrentInstance().getExternalContext().getInitParameter(parameterKey);
787                 // Is it null?
788                 if (null == contextValue) {
789                         // Throw NPE
790                         throw new NullPointerException(MessageFormat.format("parameterKey={0} is not set.", parameterKey)); //NOI18N
791                 }
792                 // Return it
793                 return contextValue;
794         }
795
796         /**
797          * Checks whether debug mode is enabled for given controller
798          * <p>
799          * @param controllerName Name of controller
800          * <p>
801          * @return Whether debug mode is enabled
802          */
803         protected boolean isDebugModeEnabled (final String controllerName) {
804                 // Parameters should be valid
805                 if (null == controllerName) {
806                         // Throw NPE
807                         throw new NullPointerException("controllerName is null"); //NOI18N
808                 } else if (controllerName.isEmpty()) {
809                         // Is empty
810                         throw new IllegalArgumentException("controllerName is empty"); //NOI18N
811                 }
812                 // Try to get context parameter
813                 String contextParameter = this.getStringContextParameter(String.format("is_debug_%s_enabled", controllerName)); //NOI18N
814                 // Is it set and true?
815                 boolean isEnabled = Boolean.parseBoolean(contextParameter) == Boolean.TRUE;
816                 // Return it
817                 return isEnabled;
818         }
819
820         /**
821          * Loads resource bundle for given locale. This must be implemented per
822          * project so all projects can still customize their methods. Calling
823          * ResourceBundleloadBundle() in this class means that also the bundle files
824          * must be present here.
825          * <p>
826          * @param locale Locale from e.g. FacesContext
827          * <p>
828          * @return Initialized and loaded resource bundle
829          */
830         protected abstract ResourceBundle loadResourceBundle (final Locale locale);
831
832         /**
833          * Shows a faces message for given causing exception. The message from the
834          * exception is being inserted into the message.
835          * <p>
836          * @param clientId Client id to send message to
837          * @param cause    Causing exception
838          */
839         protected void showFacesMessage (final String clientId, final Throwable cause) {
840                 // Get context and add message
841                 this.showFacesMessage(clientId, cause.getMessage());
842         }
843
844         /**
845          * Shows a faces message with given message (i18n) key.
846          * <p>
847          * @param clientId Client id to send message to
848          * @param i18nKey  Message key
849          * <p>
850          * @throws NullPointerException If clientId or i18nKey is null
851          * @throws IllegalArgumentException If clientId or i18nKey is empty
852          */
853         protected void showFacesMessage (final String clientId, final String i18nKey) throws NullPointerException, IllegalArgumentException {
854                 // Both parameter must be valid
855                 if (null == clientId) {
856                         // Throw NPE
857                         throw new NullPointerException("clientId is null"); //NOI18N
858                 } else if (clientId.isEmpty()) {
859                         // Is empty
860                         throw new IllegalArgumentException("clientId is null"); //NOI18N
861                 } else if (null == i18nKey) {
862                         // Throw NPE
863                         throw new NullPointerException("i18nKey is null"); //NOI18N
864                 } else if (i18nKey.isEmpty()) {
865                         // Is empty
866                         throw new IllegalArgumentException("i18nKey is null"); //NOI18N
867                 }
868                 // Get current locale
869                 Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
870                 // Get bundle bundle
871                 ResourceBundle bundle = this.loadResourceBundle(locale);
872                 // Default is i18nKey
873                 String message = MessageFormat.format("!{0}!", i18nKey); //NOI18N
874                 // Try it
875                 try {
876                         // Get message
877                         message = bundle.getString(i18nKey);
878                 } catch (final MissingResourceException ex) {
879                         // Did not find it, ignored
880                 }
881                 // Get context and add message
882                 FacesContext.getCurrentInstance().addMessage(clientId, new FacesMessage(message));
883         }
884
885 }