2 * Copyright (C) 2016 - 2022 Free Software Foundation
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.
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.
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/>.
17 package org.mxchange.addressbook.beans.phone;
19 import java.text.MessageFormat;
20 import java.util.Date;
21 import java.util.List;
22 import java.util.Objects;
24 import javax.enterprise.context.RequestScoped;
25 import javax.enterprise.event.Event;
26 import javax.enterprise.event.Observes;
27 import javax.enterprise.inject.Any;
28 import javax.faces.application.FacesMessage;
29 import javax.inject.Inject;
30 import javax.inject.Named;
31 import org.mxchange.addressbook.beans.BaseAddressbookBean;
32 import org.mxchange.addressbook.beans.phone.list.AddressbookPhoneListWebViewController;
33 import org.mxchange.jcountry.model.data.Country;
34 import org.mxchange.jphone.events.fax.created.ObservableCreatedFaxNumberEvent;
35 import org.mxchange.jphone.events.fax.deleted.AdminDeletedFaxNumberEvent;
36 import org.mxchange.jphone.events.fax.deleted.AdminFaxNumberDeletedEvent;
37 import org.mxchange.jphone.events.fax.removed.AdminFaxNumberRemovedFromListEvent;
38 import org.mxchange.jphone.events.fax.removed.AdminRemoveFaxNumberFromListEvent;
39 import org.mxchange.jphone.events.fax.updated.AdminFaxNumberUpdatedEvent;
40 import org.mxchange.jphone.events.fax.updated.AdminUpdatedFaxNumberEvent;
41 import org.mxchange.jphone.events.landline.created.ObservableCreatedLandLineNumberEvent;
42 import org.mxchange.jphone.events.landline.deleted.AdminDeletedLandLineNumberEvent;
43 import org.mxchange.jphone.events.landline.deleted.AdminLandLineNumberDeletedEvent;
44 import org.mxchange.jphone.events.landline.removed.AdminLandLineNumberRemovedFromListEvent;
45 import org.mxchange.jphone.events.landline.removed.AdminRemoveLandLineNumberFromListEvent;
46 import org.mxchange.jphone.events.landline.updated.AdminLandLineNumberUpdatedEvent;
47 import org.mxchange.jphone.events.landline.updated.AdminUpdatedLandLineNumberEvent;
48 import org.mxchange.jphone.events.mobile.remove.AdminRemoveMobileNumberFromListEvent;
49 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
50 import org.mxchange.jphone.model.phonenumbers.fax.FaxNumber;
51 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
52 import org.mxchange.jphone.model.phonenumbers.landline.LandLineNumber;
53 import org.mxchange.jphone.model.phonenumbers.mobileprovider.MobileProvider;
54 import org.mxchange.jphone.model.phonenumbers.phone.AdminPhoneSessionBeanRemote;
57 * Administrative bean (controller) for phone numbers
59 * @author Roland Häder<roland@mxchange.org>
61 @Named ("adminPhoneController")
63 public class AddressbookAdminPhoneWebRequestBean extends BaseAddressbookBean implements AddressbookAdminPhoneWebRequestController {
68 private static final short THREAD_STACK = 5;
73 private static final long serialVersionUID = 184_598_175_371_269_016L;
76 * Remote EJB for phone number (administrative)
78 @EJB (lookup = "java:global/addressbook-ejb/adminPhone!org.mxchange.jphone.model.phonenumbers.phone.AdminPhoneSessionBeanRemote")
79 private AdminPhoneSessionBeanRemote adminPhoneBean;
84 private DialableFaxNumber faxNumber;
87 * Event being fired when an administrator has deleted fax number
91 private Event<AdminDeletedFaxNumberEvent> faxNumberDeletedEvent;
94 * Event being fired when an administrator has updated fax number
98 private Event<AdminUpdatedFaxNumberEvent> faxNumberUpdatedEvent;
103 private DialableLandLineNumber landLineNumber;
106 * Event being fired when an administrator has deleted land-line number
110 private Event<AdminDeletedLandLineNumberEvent> landLineNumberDeletedEvent;
113 * Event being fired when an administrator has updated fax number
117 private Event<AdminUpdatedLandLineNumberEvent> landLineNumberUpdatedEvent;
120 * Mobile provider instance
122 private MobileProvider mobileProvider;
125 * Area code (city dial prefix)
127 private Integer phoneAreaCode;
130 * Country (for dial prefix)
132 private Country phoneCountry;
135 * When the phone entry has been created (persisted)
137 private Date phoneEntryCreated;
140 * When the phone entry has been updated
142 private Date phoneEntryUpdated;
145 * Phone id (aka primary key)
147 private Long phoneId;
150 * Generic hone controller
153 private AddressbookPhoneListWebViewController phoneListController;
158 private Long phoneNumber;
161 * Event being fired when a list of all unsed fax numbers is being created.
165 private Event<AdminRemoveFaxNumberFromListEvent> removeLinkedFaxNumbersEvent;
168 * Event being fired when a list of all unsed land-line numbers is being
173 private Event<AdminRemoveLandLineNumberFromListEvent> removeLinkedLandLineNumbersEvent;
176 * Event being fired when a list of all unsed mobile numbers is being
181 private Event<AdminRemoveMobileNumberFromListEvent> removeLinkedMobileNumbersEvent;
184 * Default constructor
186 public AddressbookAdminPhoneWebRequestBean () {
187 // Call super constructor
192 * Observes events being fired when a bean helper has successfully created a
193 * land-line number instance.
195 * @param event Event being fired
197 public void afterCreatedFaxNumberEvent (@Observes final ObservableCreatedFaxNumberEvent event) {
198 // The event instance must be valid
201 throw new NullPointerException("event is null"); //NOI18N
202 } else if (event.getFaxNumber() == null) {
204 throw new NullPointerException("event.landLineNumber is null"); //NOI18N
205 } else if (event.getFaxNumber().getPhoneId() == null) {
206 // Throw NPE yet again
207 throw new NullPointerException("event.landLineNumber.phoneId is null"); //NOI18N
208 } else if (event.getFaxNumber().getPhoneId() < 1) {
209 // Throw NPE yet again
210 throw new NullPointerException(MessageFormat.format("event.landLineNumber.phoneId={0} is invalid", event.getFaxNumber().getPhoneId())); //NOI18N
213 // Get fax number from event
214 final DialableFaxNumber number = event.getFaxNumber();
216 // Copy all data to this bean
217 this.setPhoneId(number.getPhoneId());
218 this.setPhoneCountry(number.getPhoneCountry());
219 this.setPhoneAreaCode(number.getPhoneAreaCode());
220 this.setPhoneNumber(number.getPhoneNumber());
221 this.setPhoneEntryCreated(number.getPhoneEntryCreated());
222 this.setPhoneEntryUpdated(number.getPhoneEntryUpdated());
226 * Observes events being fired when a bean helper has successfully created a
227 * land-line number instance.
229 * @param event Event being fired
231 public void afterCreatedLandLineNumberEvent (@Observes final ObservableCreatedLandLineNumberEvent event) {
232 // The event instance must be valid
235 throw new NullPointerException("event is null"); //NOI18N
236 } else if (event.getLandLineNumber() == null) {
238 throw new NullPointerException("event.landLineNumber is null"); //NOI18N
239 } else if (event.getLandLineNumber().getPhoneId() == null) {
240 // Throw NPE yet again
241 throw new NullPointerException("event.landLineNumber.phoneId is null"); //NOI18N
242 } else if (event.getLandLineNumber().getPhoneId() < 1) {
243 // Throw NPE yet again
244 throw new NullPointerException(MessageFormat.format("event.landLineNumber.phoneId={0} is invalid", event.getLandLineNumber().getPhoneId())); //NOI18N
247 // Get fax number from event
248 final DialableLandLineNumber number = event.getLandLineNumber();
250 // Copy all data to this bean
251 this.setPhoneId(number.getPhoneId());
252 this.setPhoneCountry(number.getPhoneCountry());
253 this.setPhoneAreaCode(number.getPhoneAreaCode());
254 this.setPhoneNumber(number.getPhoneNumber());
255 this.setPhoneEntryCreated(number.getPhoneEntryCreated());
256 this.setPhoneEntryUpdated(number.getPhoneEntryUpdated());
260 * Returns a list of all unused ("non-linked") land-line numbers
262 * @return List with all unused land-line numbers
264 public List<DialableFaxNumber> allNonLinkedFaxNumbers () {
265 // Get list of all mobile numbers
266 final List<DialableFaxNumber> numbers = this.phoneListController.getAllFaxNumbers();
268 // Visit all controllers to reduce the list
269 this.removeLinkedFaxNumbersEvent.fire(new AdminFaxNumberRemovedFromListEvent(numbers));
276 * Returns a list of all unused ("non-linked") land-line numbers
278 * @return List with all unused land-line numbers
280 public List<DialableLandLineNumber> allNonLinkedLandLineNumbers () {
281 // Get list of all mobile numbers
282 final List<DialableLandLineNumber> numbers = this.phoneListController.getAllLandLineNumbers();
284 // Visit all controllers to reduce the list
285 this.removeLinkedLandLineNumbersEvent.fire(new AdminLandLineNumberRemovedFromListEvent(numbers));
292 * Deletes given fax entry data
295 public void deleteFaxData () {
296 // Get fax number from bean helper
297 final DialableFaxNumber number = this.createFaxNumber();
300 if (number == null) {
301 // Not set, throw NPE
302 throw new NullPointerException("faxNumber is null"); //NOI18N
303 } else if (number.getPhoneId() == null) {
305 throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
306 } else if (number.getPhoneId() < 1) {
308 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
309 } else if (number.getPhoneCountry() == null) {
311 throw new NullPointerException("faxNumber.phoneCountry is null"); //NOI18N
312 } else if (number.getPhoneCountry().getCountryId() == null) {
314 throw new NullPointerException("faxNumber.phoneCountry.countryId is null"); //NOI18N
315 } else if (number.getPhoneCountry().getCountryId() < 1) {
317 throw new NullPointerException(MessageFormat.format("faxNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
318 } else if (number.getPhoneAreaCode() == null) {
320 throw new NullPointerException("faxNumber.phoneAreaCode is null"); //NOI18N
321 } else if (number.getPhoneAreaCode() < 1) {
323 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
324 } else if (number.getPhoneNumber() == null) {
326 throw new NullPointerException("faxNumber.phoneNumber is null"); //NOI18N
327 } else if (number.getPhoneNumber() < 1) {
329 throw new NullPointerException(MessageFormat.format("faxNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
333 this.adminPhoneBean.deleteFaxData(number);
336 this.faxNumberDeletedEvent.fire(new AdminFaxNumberDeletedEvent(number));
340 * Deletes given land-line entry data
342 public void deleteLandLineData () {
343 // Get land-line number from helper
344 final DialableLandLineNumber number = this.createLandLineNumber();
347 if (number == null) {
348 // Not set, throw NPE
349 throw new NullPointerException("landLineNumber is null"); //NOI18N
350 } else if (number.getPhoneId() == null) {
352 throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
353 } else if (number.getPhoneId() < 1) {
355 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
356 } else if (number.getPhoneCountry() == null) {
358 throw new NullPointerException("landLineNumber.phoneCountry is null"); //NOI18N
359 } else if (number.getPhoneCountry().getCountryId() == null) {
361 throw new NullPointerException("landLineNumber.phoneCountry.countryId is null"); //NOI18N
362 } else if (number.getPhoneCountry().getCountryId() < 1) {
364 throw new NullPointerException(MessageFormat.format("landLineNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
365 } else if (number.getPhoneAreaCode() == null) {
367 throw new NullPointerException("landLineNumber.phoneAreaCode is null"); //NOI18N
368 } else if (number.getPhoneAreaCode() < 1) {
370 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
371 } else if (number.getPhoneNumber() == null) {
373 throw new NullPointerException("landLineNumber.phoneNumber is null"); //NOI18N
374 } else if (number.getPhoneNumber() < 1) {
376 throw new NullPointerException(MessageFormat.format("landLineNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
380 this.adminPhoneBean.deleteLandLineData(number);
383 this.landLineNumberDeletedEvent.fire(new AdminLandLineNumberDeletedEvent(number));
387 * Changes fax entry data
389 * @return Redirect outcome
391 public String doChangeFaxNumber () {
392 // Get fax number from bean helper
393 final DialableFaxNumber number = this.createFaxNumber();
396 if (number == null) {
397 // Not set, throw NPE
398 throw new NullPointerException("faxNumber is null"); //NOI18N
399 } else if (number.getPhoneId() == null) {
401 throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
402 } else if (number.getPhoneId() < 1) {
404 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
405 } else if (number.getPhoneCountry() == null) {
407 throw new NullPointerException("faxNumber.phoneCountry is null"); //NOI18N
408 } else if (number.getPhoneCountry().getCountryId() == null) {
410 throw new NullPointerException("faxNumber.phoneCountry.countryId is null"); //NOI18N
411 } else if (number.getPhoneCountry().getCountryId() < 1) {
413 throw new NullPointerException(MessageFormat.format("faxNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
414 } else if (number.getPhoneAreaCode() == null) {
416 throw new NullPointerException("faxNumber.phoneAreaCode is null"); //NOI18N
417 } else if (number.getPhoneAreaCode() < 1) {
419 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
420 } else if (number.getPhoneNumber() == null) {
422 throw new NullPointerException("faxNumber.phoneNumber is null"); //NOI18N
423 } else if (number.getPhoneNumber() < 1) {
425 throw new NullPointerException(MessageFormat.format("faxNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
428 // Is the mobile provider and number the same?
429 if ((Objects.equals(this.getPhoneCountry(), number.getPhoneCountry())) && (Objects.equals(this.getPhoneAreaCode(), number.getPhoneAreaCode())) && (Objects.equals(this.getPhoneNumber(), number.getPhoneNumber()))) {
431 this.showFacesMessage("form_edit_fax:faxNumber", "ERROR_ADMIN_NO_CHANGE_ENTERED", FacesMessage.SEVERITY_WARN); //NOI18N
433 // No difference in both together, no need to edit
438 number.setPhoneCountry(this.getPhoneCountry());
439 number.setPhoneAreaCode(this.getPhoneAreaCode());
440 number.setPhoneNumber(this.getPhoneNumber());
443 final DialableFaxNumber updatedNumber = this.adminPhoneBean.updateFaxData(number);
446 this.faxNumberUpdatedEvent.fire(new AdminFaxNumberUpdatedEvent(updatedNumber));
448 // All fine, redirect
449 return "admin_show_fax"; //NOI18N
453 * Changes land-line entry data
455 * @return Redirect outcome
457 public String doChangeLandLineNumber () {
458 // Get land-line number from helper
459 final DialableLandLineNumber number = this.createLandLineNumber();
462 if (number == null) {
463 // Not set, throw NPE
464 throw new NullPointerException("landLineNumber is null"); //NOI18N
465 } else if (number.getPhoneId() == null) {
467 throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
468 } else if (number.getPhoneId() < 1) {
470 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid", number.getPhoneId())); //NOI18N
471 } else if (number.getPhoneCountry() == null) {
473 throw new NullPointerException("landLineNumber.phoneCountry is null"); //NOI18N
474 } else if (number.getPhoneCountry().getCountryId() == null) {
476 throw new NullPointerException("landLineNumber.phoneCountry.countryId is null"); //NOI18N
477 } else if (number.getPhoneCountry().getCountryId() < 1) {
479 throw new NullPointerException(MessageFormat.format("landLineNumber.phoneCountry.countryId={0} is not valid", number.getPhoneCountry().getCountryId())); //NOI18N
480 } else if (number.getPhoneAreaCode() == null) {
482 throw new NullPointerException("landLineNumber.phoneAreaCode is null"); //NOI18N
483 } else if (number.getPhoneAreaCode() < 1) {
485 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneAreaCode={0} is not valid.", number.getPhoneAreaCode())); //NOI18N
486 } else if (number.getPhoneNumber() == null) {
488 throw new NullPointerException("landLineNumber.phoneNumber is null"); //NOI18N
489 } else if (number.getPhoneNumber() < 1) {
491 throw new NullPointerException(MessageFormat.format("landLineNumber.phoneNumber={0} is not valid.", number.getPhoneNumber())); //NOI18N
494 // Is the mobile provider and number the same?
495 if ((Objects.equals(this.getPhoneCountry(), number.getPhoneCountry())) && (Objects.equals(this.getPhoneAreaCode(), number.getPhoneAreaCode())) && (Objects.equals(this.getPhoneNumber(), number.getPhoneNumber()))) {
497 this.showFacesMessage("form_edit_landline:landLineNumber", "ERROR_ADMIN_NO_CHANGE_ENTERED", FacesMessage.SEVERITY_WARN); //NOI18N
499 // No difference in both together, no need to edit
504 number.setPhoneCountry(this.getPhoneCountry());
505 number.setPhoneAreaCode(this.getPhoneAreaCode());
506 number.setPhoneNumber(this.getPhoneNumber());
509 final DialableLandLineNumber updatedNumber = this.adminPhoneBean.updateLandLineData(number);
512 this.landLineNumberUpdatedEvent.fire(new AdminLandLineNumberUpdatedEvent(updatedNumber));
514 // All fine, redirect
515 return "admin_show_landline"; //NOI18N
519 * Getter for chosen fax number
523 public DialableFaxNumber getFaxNumber () {
524 return this.faxNumber;
528 * Setter for chosen fax number
530 * @param faxNumber fax number
532 public void setFaxNumber (final DialableFaxNumber faxNumber) {
533 this.faxNumber = faxNumber;
537 * Getter for chosen land-line number
539 * @return land-line number
541 public DialableLandLineNumber getLandLineNumber () {
542 return this.landLineNumber;
546 * Setter for chosen land-line number
548 * @param landLineNumber land-line number
550 public void setLandLineNumber (final DialableLandLineNumber landLineNumber) {
551 this.landLineNumber = landLineNumber;
555 * Getter for mobile provider
557 * @return An instance of a MobileProvider class
559 public MobileProvider getMobileProvider () {
560 return this.mobileProvider;
564 * Setter for mobile provider
566 * @param mobileProvider An instance of a MobileProvider class
568 public void setMobileProvider (final MobileProvider mobileProvider) {
569 this.mobileProvider = mobileProvider;
573 * Getter for phone area code
575 * @return Phone area code
577 public Integer getPhoneAreaCode () {
578 return this.phoneAreaCode;
582 * Setter for phone area code
584 * @param phoneAreaCode Phone area code
586 public void setPhoneAreaCode (final Integer phoneAreaCode) {
587 this.phoneAreaCode = phoneAreaCode;
591 * Getter for phone country (for dial prefix)
593 * @return Phone country
595 public Country getPhoneCountry () {
596 return this.phoneCountry;
600 * Setter for phone country (for dial prefix)
602 * @param phoneCountry Phone country
604 public void setPhoneCountry (final Country phoneCountry) {
605 this.phoneCountry = phoneCountry;
609 * Getter for phone entry created timestamp
611 * @return Phone entry created timestamp
613 @SuppressWarnings ("ReturnOfDateField")
614 public Date getPhoneEntryCreated () {
615 return this.phoneEntryCreated;
619 * Setter for phone entry created timestamp
621 * @param phoneEntryCreated Phone entry created timestamp
623 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
624 public void setPhoneEntryCreated (final Date phoneEntryCreated) {
625 this.phoneEntryCreated = phoneEntryCreated;
629 * Getter for phone entry updated timestamp
631 * @return Phone entry updated timestamp
633 @SuppressWarnings ("ReturnOfDateField")
634 public Date getPhoneEntryUpdated () {
635 return this.phoneEntryUpdated;
639 * Setter for phone entry updated timestamp
641 * @param phoneEntryUpdated Phone entry updated timestamp
643 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
644 public void setPhoneEntryUpdated (final Date phoneEntryUpdated) {
645 this.phoneEntryUpdated = phoneEntryUpdated;
649 * Getter for phone id
653 public Long getPhoneId () {
658 * Setter for phone id
660 * @param phoneId Phone id
662 public void setPhoneId (final Long phoneId) {
663 this.phoneId = phoneId;
667 * Getter for dial number without prefix
669 * @return Dial number without prefix
671 public Long getPhoneNumber () {
672 return this.phoneNumber;
676 * Setter for dial number without prefix
678 * @param phoneNumber Dial number without prefix
680 public void setPhoneNumber (final Long phoneNumber) {
681 this.phoneNumber = phoneNumber;
685 * Returns an instance of a DialableFaxNumber from all fields stored in this
688 * @return An instance of a DialableFaxNumber class
690 private DialableFaxNumber createFaxNumber () {
692 final DialableFaxNumber number = new FaxNumber(
693 this.getPhoneCountry(),
694 this.getPhoneAreaCode(),
695 this.getPhoneNumber()
698 // Add all other data
699 number.setPhoneEntryCreated(this.getPhoneEntryCreated());
700 number.setPhoneEntryUpdated(this.getPhoneEntryUpdated());
703 if (this.getPhoneId() instanceof Long) {
705 number.setPhoneId(this.getPhoneId());
713 * Returns an instance of a DialableLandLineNumber from all fields stored in
716 * @return An instance of a DialableLandLineNumber class
718 private DialableLandLineNumber createLandLineNumber () {
720 final DialableLandLineNumber number = new LandLineNumber(
721 this.getPhoneCountry(),
722 this.getPhoneAreaCode(),
723 this.getPhoneNumber()
726 // Add all other data
727 number.setPhoneEntryCreated(this.getPhoneEntryCreated());
728 number.setPhoneEntryUpdated(this.getPhoneEntryUpdated());
731 if (this.getPhoneId() instanceof Long) {
733 number.setPhoneId(this.getPhoneId());