2 * Copyright (C) 2016 - 2020 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.jjobs.beans.phone.list;
19 import fish.payara.cdi.jsr107.impl.NamedCache;
20 import java.text.MessageFormat;
21 import java.util.Comparator;
22 import java.util.LinkedList;
23 import java.util.List;
24 import java.util.Objects;
25 import javax.annotation.PostConstruct;
26 import javax.cache.Cache;
28 import javax.enterprise.event.Observes;
29 import javax.faces.view.ViewScoped;
30 import javax.inject.Inject;
31 import javax.inject.Named;
32 import org.mxchange.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.model.contact.Contact;
37 import org.mxchange.jjobs.beans.BaseJobsBean;
38 import org.mxchange.jphone.events.fax.deleted.AdminDeletedFaxNumberEvent;
39 import org.mxchange.jphone.events.fax.updated.AdminUpdatedFaxNumberEvent;
40 import org.mxchange.jphone.events.landline.deleted.AdminDeletedLandLineNumberEvent;
41 import org.mxchange.jphone.events.landline.updated.AdminUpdatedLandLineNumberEvent;
42 import org.mxchange.jphone.exceptions.phone.PhoneEntityNotFoundException;
43 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
44 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
45 import org.mxchange.jphone.model.phonenumbers.phone.PhoneSessionBeanRemote;
48 * Administrative listing controller (bean) for phone numbers
50 * @author Roland Häder<roland@mxchange.org>
52 @Named ("phoneListController")
54 public class JobsPhoneListWebViewBean extends BaseJobsBean implements JobsPhoneListWebViewController {
59 private static final long serialVersionUID = 491_058_674_675_690_107L;
62 * A list of all fax numbers
64 private final List<DialableFaxNumber> allFaxNumbers;
67 * A list of all land-line numbers
69 private final List<DialableLandLineNumber> allLandLineNumbers;
75 @NamedCache (cacheName = "faxNumberCache")
76 private transient Cache<Long, DialableFaxNumber> faxNumberCache;
79 * A list of filtered fax numbers
81 private List<DialableFaxNumber> filteredFaxNumbers;
84 * A list of filtered land-line numbers
86 private List<DialableLandLineNumber> filteredLandLineNumbers;
89 * All land-line numbers
92 @NamedCache (cacheName = "landLineNumberCache")
93 private transient Cache<Long, DialableLandLineNumber> landLineNumberCache;
96 * General EJB for phone numbers
98 @EJB (lookup = "java:global/jjobs-ejb/phone!org.mxchange.jphone.model.phonenumbers.phone.PhoneSessionBeanRemote")
99 private PhoneSessionBeanRemote phoneBean;
102 * Default constructor
104 public JobsPhoneListWebViewBean () {
105 // Call super constructor
109 this.allFaxNumbers = new LinkedList<>();
110 this.allLandLineNumbers = new LinkedList<>();
114 * Observes events being fired when an administrator has added a new
117 * @param event Event being fired
119 public void afterAdminAddedContactEvent (@Observes final ObservableAdminAddedContactEvent event) {
120 // The event must be valid
123 throw new NullPointerException("event is null"); //NOI18N
124 } else if (event.getAddedContact() == null) {
126 throw new NullPointerException("event.addedContact is null"); //NOI18N
127 } else if (event.getAddedContact().getContactId() == null) {
129 throw new NullPointerException("event.addedContact.contactId is null"); //NOI18N
130 } else if (event.getAddedContact().getContactId() < 1) {
132 throw new IllegalArgumentException(MessageFormat.format("event.addedContact.contactId={0} is not valid", event.getAddedContact().getContactId())); //NOI18N
135 // Update contact's mobile, land-line and fax number
136 this.updateContactPhoneNumbers(event.getAddedContact());
143 * Observes events being fired when an administrator has deleted a fax
146 * @param event Event being fired
148 public void afterAdminDeletedFaxNumberEvent (@Observes final AdminDeletedFaxNumberEvent event) {
149 // Event and contained entity instance should not be null
152 throw new NullPointerException("event is null"); //NOI18N
153 } else if (event.getDeletedFaxNumber() == null) {
155 throw new NullPointerException("event.deletedFaxNumber is null"); //NOI18N
156 } else if (event.getDeletedFaxNumber().getPhoneId() == null) {
158 throw new NullPointerException("event.deletedFaxNumber.phoneId is null"); //NOI18N
159 } else if (event.getDeletedFaxNumber().getPhoneId() < 1) {
161 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedFaxNumber(), event.getDeletedFaxNumber().getPhoneId())); //NOI18N
164 // Update contact's mobile, land-line and fax number
165 this.getAllFaxNumbers().remove(event.getDeletedFaxNumber());
172 * Observes events being fired when an administrator has deleted a land-line
175 * @param event Event being fired
177 public void afterAdminDeletedLandLineNumberEvent (@Observes final AdminDeletedLandLineNumberEvent event) {
178 // Event and contained entity instance should not be null
181 throw new NullPointerException("event is null"); //NOI18N
182 } else if (event.getDeletedLandLineNumber() == null) {
184 throw new NullPointerException("event.deletedLandLineNumber is null"); //NOI18N
185 } else if (event.getDeletedLandLineNumber().getPhoneId() == null) {
187 throw new NullPointerException("event.deletedLandLineNumber.phoneId is null"); //NOI18N
188 } else if (event.getDeletedLandLineNumber().getPhoneId() < 1) {
190 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedLandLineNumber(), event.getDeletedLandLineNumber().getPhoneId())); //NOI18N
193 // Update contact's mobile, land-line and fax number
194 this.getAllLandLineNumbers().remove(event.getDeletedLandLineNumber());
201 * Observes events being fired when an administrator has a linked a fax
204 * @param event Event being fired
206 public void afterAdminLinkedFaxNumberEvent (@Observes final ObservableAdminLinkedFaxNumberEvent event) {
207 // Is the event fine?
210 throw new NullPointerException("event is null"); //NOI18N
211 } else if (event.getContact() == null) {
213 throw new NullPointerException("event.contact is null"); //NOI18N
214 } else if (event.getContact().getContactId() == null) {
216 throw new NullPointerException("event.contact.contactId is null"); //NOI18N
217 } else if (event.getContact().getContactId() < 1) {
219 throw new NullPointerException(MessageFormat.format("event.contact.contactId={0} is invalid", event.getContact().getContactId())); //NOI18N
220 } else if (event.getContact().getContactFaxNumber() == null) {
222 throw new NullPointerException("event.contact.contactFaxNumber is null"); //NOI18N
223 } else if (event.getContact().getContactFaxNumber().getPhoneId() == null) {
225 throw new NullPointerException("event.contact.contactFaxNumber.phoneId is null"); //NOI18N
226 } else if (event.getContact().getContactFaxNumber().getPhoneId() < 1) {
228 throw new NullPointerException(MessageFormat.format("event.contact.contactFaxNumber.phoneId={0} is invalid", event.getContact().getContactFaxNumber().getPhoneId())); //NOI18N
229 } else if (event.getLinkedFaxNumber() == null) {
231 throw new NullPointerException("event.linkedFaxNumer is null"); //NOI18N
234 // Is the id number in linked number not set?
235 if (event.getLinkedFaxNumber().getPhoneId() == null) {
236 // Then it is a new number, so add it from contact as there the id number has been set
237 this.uniqueAddFaxNumber(event.getContact().getContactFaxNumber());
242 * Observes events being fired when an administrator has a linked a
245 * @param event Event being fired
247 public void afterAdminLinkedLandLineNumberEvent (@Observes final ObservableAdminLinkedLandLineNumberEvent event) {
248 // Is the event fine?
251 throw new NullPointerException("event is null"); //NOI18N
252 } else if (event.getContact() == null) {
254 throw new NullPointerException("event.contact is null"); //NOI18N
255 } else if (event.getContact().getContactId() == null) {
257 throw new NullPointerException("event.contact.contactId is null"); //NOI18N
258 } else if (event.getContact().getContactId() < 1) {
260 throw new NullPointerException(MessageFormat.format("event.contact.contactId={0} is invalid", event.getContact().getContactId())); //NOI18N
261 } else if (event.getContact().getContactLandLineNumber() == null) {
263 throw new NullPointerException("event.contact.contactLandLineNumber is null"); //NOI18N
264 } else if (event.getContact().getContactLandLineNumber().getPhoneId() == null) {
266 throw new NullPointerException("event.contact.contactLandLineNumber.phoneId is null"); //NOI18N
267 } else if (event.getContact().getContactLandLineNumber().getPhoneId() < 1) {
269 throw new NullPointerException(MessageFormat.format("event.contact.contactLandLineNumber.phoneId={0} is invalid", event.getContact().getContactLandLineNumber().getPhoneId())); //NOI18N
270 } else if (event.getLinkedLandLineNumber() == null) {
272 throw new NullPointerException("event.linkedLandLineNumer is null"); //NOI18N
275 // Is the id number in linked number not set?
276 if (event.getLinkedLandLineNumber().getPhoneId() == null) {
277 // Then it is a new number, so add it from contact as there the id number has been set
278 this.uniqueAddLandLineNumber(event.getContact().getContactLandLineNumber());
283 * Observes events being fired when an administrator has updated contact
286 * @param event Event being fired
288 public void afterAdminUpdatedContactDataEvent (@Observes final ObservableAdminUpdatedContactEvent event) {
289 // Event and contained entity instance should not be null
292 throw new NullPointerException("event is null"); //NOI18N
293 } else if (event.getUpdatedContact() == null) {
295 throw new NullPointerException("event.updatedContact is null"); //NOI18N
296 } else if (event.getUpdatedContact().getContactId() == null) {
298 throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
299 } else if (event.getUpdatedContact().getContactId() < 1) {
301 throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
304 // Update contact's mobile, land-line and fax number
305 this.updateContactPhoneNumbers(event.getUpdatedContact());
312 * Observes events being fired when an administrator has updated a fax
315 * @param event Event being fired
317 public void afterAdminUpdatedFaxNumberEvent (@Observes final AdminUpdatedFaxNumberEvent event) {
318 // Event and contained entity instance should not be null
321 throw new NullPointerException("event is null"); //NOI18N
322 } else if (event.getUpdatedFaxNumber() == null) {
324 throw new NullPointerException("event.updatedFaxNumber is null"); //NOI18N
325 } else if (event.getUpdatedFaxNumber().getPhoneId() == null) {
327 throw new NullPointerException("event.updatedFaxNumber.phoneId is null"); //NOI18N
328 } else if (event.getUpdatedFaxNumber().getPhoneId() < 1) {
330 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedFaxNumber(), event.getUpdatedFaxNumber().getPhoneId())); //NOI18N
334 this.uniqueAddFaxNumber(event.getUpdatedFaxNumber());
341 * Observes events being fired when an administrator has updated a land-line
344 * @param event Event being fired
346 public void afterAdminUpdatedLandLineNumberEvent (@Observes final AdminUpdatedLandLineNumberEvent event) {
347 // Event and contained entity instance should not be null
350 throw new NullPointerException("event is null"); //NOI18N
351 } else if (event.getUpdatedLandLineNumber() == null) {
353 throw new NullPointerException("event.updatedLandLineNumber is null"); //NOI18N
354 } else if (event.getUpdatedLandLineNumber().getPhoneId() == null) {
356 throw new NullPointerException("event.updatedLandLineNumber.phoneId is null"); //NOI18N
357 } else if (event.getUpdatedLandLineNumber().getPhoneId() < 1) {
359 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedLandLineNumber(), event.getUpdatedLandLineNumber().getPhoneId())); //NOI18N
363 this.uniqueAddLandLineNumber(event.getUpdatedLandLineNumber());
370 public DialableFaxNumber findFaxNumberById (final Long phoneId) throws PhoneEntityNotFoundException {
372 if (null == phoneId) {
374 throw new NullPointerException("phoneId is null"); //NOI18N
375 } else if (phoneId < 1) {
377 throw new IllegalArgumentException("phoneId=" + phoneId + " is invalid."); //NOI18N
378 } else if (!this.faxNumberCache.containsKey(phoneId)) {
380 throw new PhoneEntityNotFoundException(phoneId);
384 final DialableFaxNumber faxNumber = this.faxNumberCache.get(phoneId);
391 public DialableLandLineNumber findLandLineNumberById (final Long landLineNumberId) throws PhoneEntityNotFoundException {
393 if (null == landLineNumberId) {
395 throw new NullPointerException("landLineNumberId is null"); //NOI18N
396 } else if (landLineNumberId < 1) {
398 throw new IllegalArgumentException(MessageFormat.format("landLineNumberId={0} is invalid.", landLineNumberId)); //NOI18N
399 } else if (!this.landLineNumberCache.containsKey(landLineNumberId)) {
401 throw new PhoneEntityNotFoundException(landLineNumberId);
405 final DialableLandLineNumber landLineNumber = this.landLineNumberCache.get(landLineNumberId);
408 return landLineNumber;
412 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
413 public List<DialableFaxNumber> getAllFaxNumbers () {
414 return this.allFaxNumbers;
418 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
419 public List<DialableLandLineNumber> getAllLandLineNumbers () {
420 return this.allLandLineNumbers;
424 * Getter for filtered fax number list
426 * @return Filtered fax number list
428 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
429 public List<DialableFaxNumber> getFilteredFaxNumbers () {
430 return this.filteredFaxNumbers;
434 * Setter for filtered fax number list
436 * @param filteredFaxNumbers Filtered fax number list
438 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
439 public void setFilteredFaxNumbers (final List<DialableFaxNumber> filteredFaxNumbers) {
440 this.filteredFaxNumbers = filteredFaxNumbers;
444 * Getter for filtered land-line number list
446 * @return Filtered land-line number list
448 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
449 public List<DialableLandLineNumber> getFilteredLandLineNumbers () {
450 return this.filteredLandLineNumbers;
454 * Setter for filtered land-line number list
456 * @param filteredLandLineNumbers Filtered land-line number list
458 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
459 public void setFilteredLandLineNumbers (final List<DialableLandLineNumber> filteredLandLineNumbers) {
460 this.filteredLandLineNumbers = filteredLandLineNumbers;
464 * Post-construction method
467 public void initializeList () {
469 if (!this.faxNumberCache.iterator().hasNext()) {
471 for (final DialableFaxNumber currentNumber : this.phoneBean.fetchAllFaxNumbers()) {
473 this.faxNumberCache.put(currentNumber.getPhoneId(), currentNumber);
478 if (!this.landLineNumberCache.iterator().hasNext()) {
480 for (final DialableLandLineNumber currentNumber : this.phoneBean.fetchAllLandLineNumbers()) {
482 this.landLineNumberCache.put(currentNumber.getPhoneId(), currentNumber);
486 // Is cache filled and list is empty
487 if ((this.faxNumberCache.iterator().hasNext()) && (this.getAllFaxNumbers().isEmpty())) {
489 for (final Cache.Entry<Long, DialableFaxNumber> currentEntry : this.faxNumberCache) {
491 this.getAllFaxNumbers().add(currentEntry.getValue());
495 this.getAllFaxNumbers().sort(new Comparator<DialableFaxNumber>() {
497 public int compare (final DialableFaxNumber faxNumber1, final DialableFaxNumber faxNumber2) {
498 return faxNumber1.getPhoneId() > faxNumber2.getPhoneId() ? 1 : faxNumber1.getPhoneId() < faxNumber2.getPhoneId() ? -1 : 0;
503 this.setFilteredFaxNumbers(this.getAllFaxNumbers());
506 // Is cache filled and list is empty
507 if ((this.landLineNumberCache.iterator().hasNext()) && (this.getAllLandLineNumbers().isEmpty())) {
509 for (final Cache.Entry<Long, DialableLandLineNumber> currentEntry : this.landLineNumberCache) {
511 this.getAllLandLineNumbers().add(currentEntry.getValue());
515 this.getAllLandLineNumbers().sort(new Comparator<DialableLandLineNumber>() {
517 public int compare (final DialableLandLineNumber landLineNumber1, final DialableLandLineNumber landLineNumber2) {
518 return landLineNumber1.getPhoneId() > landLineNumber2.getPhoneId() ? 1 : landLineNumber1.getPhoneId() < landLineNumber2.getPhoneId() ? -1 : 0;
523 this.setFilteredLandLineNumbers(this.getAllLandLineNumbers());
530 private void clear () {
535 * Uniquely add given fax number to this bean's list. First remove the old
536 * instance (by id number), then re-add it again.
538 * @param faxNumber number to add
540 private void uniqueAddFaxNumber (final DialableFaxNumber faxNumber) {
541 // Make sure the parameter is valid
542 if (null == faxNumber) {
544 throw new NullPointerException("faxNumber is null"); //NOI18N
545 } else if (faxNumber.getPhoneId() == null) {
547 throw new NullPointerException("faxNumber.phoneId is null"); //NOI18N
548 } else if (faxNumber.getPhoneId() < 1) {
550 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid.", faxNumber.getPhoneId())); //NOI18N
554 if (!this.getAllFaxNumbers().remove(faxNumber)) {
555 // Did not work, try by id number
556 for (final DialableFaxNumber currentNumber : this.getAllFaxNumbers()) {
557 // Is id number the same?
558 if (Objects.equals(currentNumber.getPhoneId(), faxNumber.getPhoneId())) {
560 this.getAllFaxNumbers().remove(currentNumber);
567 this.getAllFaxNumbers().add(faxNumber);
571 * Uniquely add given land-line number to this bean's list. First remove the
572 * old instance (by id number), then re-add it again.
574 * @param landLineNumber Land-line number to add
576 private void uniqueAddLandLineNumber (final DialableLandLineNumber landLineNumber) {
577 // Make sure the parameter is valid
578 if (null == landLineNumber) {
580 throw new NullPointerException("landLineNumber is null"); //NOI18N
581 } else if (landLineNumber.getPhoneId() == null) {
583 throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
584 } else if (landLineNumber.getPhoneId() < 1) {
586 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid.", landLineNumber.getPhoneId())); //NOI18N
590 if (!this.getAllLandLineNumbers().remove(landLineNumber)) {
591 // Did not work, try by id number
592 for (final DialableLandLineNumber currentNumber : this.getAllLandLineNumbers()) {
593 // Is id number the same?
594 if (Objects.equals(currentNumber.getPhoneId(), landLineNumber.getPhoneId())) {
596 this.getAllLandLineNumbers().remove(currentNumber);
603 this.getAllLandLineNumbers().add(landLineNumber);
607 * Updates given contact's mobile, land-line and fax number
609 * @param contact Contact instance
611 private void updateContactPhoneNumbers (final Contact contact) {
612 // Parameter must be valid
613 if (null == contact) {
615 throw new NullPointerException("contact is null"); //NOI18N
616 } else if (contact.getContactId() == null) {
618 throw new NullPointerException("contact.contactId is null"); //NOI18N
619 } else if (contact.getContactId() < 1) {
620 // Id number is not valid
624 if (contact.getContactLandLineNumber() instanceof DialableLandLineNumber) {
626 this.uniqueAddLandLineNumber(contact.getContactLandLineNumber());
630 if (contact.getContactFaxNumber() instanceof DialableFaxNumber) {
632 this.uniqueAddFaxNumber(contact.getContactFaxNumber());