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.jjobs.beans.mobile.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.contact.update.ObservableUpdatedContactEvent;
35 import org.mxchange.jcontacts.events.mobile.linked.ObservableAdminLinkedMobileNumberEvent;
36 import org.mxchange.jcontacts.model.contact.Contact;
37 import org.mxchange.jjobs.beans.BaseJobsBean;
38 import org.mxchange.jphone.events.mobile.deleted.ObservableAdminMobileNumberDeletedEvent;
39 import org.mxchange.jphone.events.mobile.updated.ObservableAdminMobileNumberUpdatedEvent;
40 import org.mxchange.jphone.exceptions.mobile.MobileEntityNotFoundException;
41 import org.mxchange.jphone.model.phonenumbers.mobile.DialableMobileNumber;
42 import org.mxchange.jphone.model.phonenumbers.mobile.MobileSessionBeanRemote;
43 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
46 * Administrative listing controller (bean) for mobile numbers
48 * @author Roland Häder<roland@mxchange.org>
50 @Named ("mobileListController")
52 public class JobsMobileListWebViewBean extends BaseJobsBean implements JobsMobileListWebViewController {
57 private static final long serialVersionUID = 491_058_674_675_690_106L;
60 * A list of all mobile numbers
62 private final List<DialableMobileNumber> allMobileNumbers;
65 * A list of filtered mobile numbers
67 private List<DialableMobileNumber> filteredMobileNumbers;
70 * General EJB for mobile numbers
72 @EJB (lookup = "java:global/jjobs-ejb/mobile!org.mxchange.jphone.model.phonenumbers.mobile.MobileSessionBeanRemote")
73 private MobileSessionBeanRemote mobileBean;
76 * Cache for mobile numbers
79 @NamedCache (cacheName = "mobileNumberCache")
80 private transient Cache<Long, DialableMobileNumber> mobileNumberCache;
85 public JobsMobileListWebViewBean () {
86 // Call super constructor
90 this.allMobileNumbers = new LinkedList<>();
94 * Observes events being fired when an administrator has added a new
97 * @param event Event being fired
99 public void afterAdminAddedContactEvent (@Observes final ObservableAdminAddedContactEvent event) {
100 // The event must be valid
103 throw new NullPointerException("event is null"); //NOI18N
104 } else if (event.getAddedContact() == null) {
106 throw new NullPointerException("event.addedContact is null"); //NOI18N
107 } else if (event.getAddedContact().getContactId() == null) {
109 throw new NullPointerException("event.addedContact.contactId is null"); //NOI18N
110 } else if (event.getAddedContact().getContactId() < 1) {
112 throw new IllegalArgumentException(MessageFormat.format("event.addedContact.contactId={0} is not valid", event.getAddedContact().getContactId())); //NOI18N
115 // Update contact's mobile, land-line and mobile number
116 this.updateContactMobileNumbers(event.getAddedContact());
123 * Event observer for newly added users by administrator
125 * @param event Event being fired
127 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
128 // Event and contained entity instance should not be null
131 throw new NullPointerException("event is null"); //NOI18N
132 } else if (event.getAddedUser() == null) {
134 throw new NullPointerException("event.addedUser is null"); //NOI18N
135 } else if (event.getAddedUser().getUserId() == null) {
137 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
138 } else if (event.getAddedUser().getUserId() < 1) {
140 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
143 // Update contact's mobile, land-line and mobile number
144 this.updateContactMobileNumbers(event.getAddedUser().getUserContact());
151 * Observes events being fired when an administrator has deleted a land-line
154 * @param event Event being fired
156 public void afterAdminDeletedMobileNumberEvent (@Observes final ObservableAdminMobileNumberDeletedEvent event) {
157 // Event and contained entity instance should not be null
160 throw new NullPointerException("event is null"); //NOI18N
161 } else if (event.getDeletedMobileNumber() == null) {
163 throw new NullPointerException("event.deletedMobileNumber is null"); //NOI18N
164 } else if (event.getDeletedMobileNumber().getMobileId() == null) {
166 throw new NullPointerException("event.deletedMobileNumber.mobileId is null"); //NOI18N
167 } else if (event.getDeletedMobileNumber().getMobileId() < 1) {
169 throw new IllegalArgumentException(MessageFormat.format("mobileId of contact={0} is not valid: {1}", event.getDeletedMobileNumber(), event.getDeletedMobileNumber().getMobileId())); //NOI18N
172 // Update contact's mobile, land-line and mobile number
173 this.getAllMobileNumbers().remove(event.getDeletedMobileNumber());
180 * Observes events being fired when an administrator has a linked a
183 * @param event Event being fired
185 public void afterAdminLinkedMobileNumberEvent (@Observes final ObservableAdminLinkedMobileNumberEvent event) {
186 // Is the event fine?
189 throw new NullPointerException("event is null"); //NOI18N
190 } else if (event.getContact() == null) {
192 throw new NullPointerException("event.contact is null"); //NOI18N
193 } else if (event.getContact().getContactId() == null) {
195 throw new NullPointerException("event.contact.contactId is null"); //NOI18N
196 } else if (event.getContact().getContactId() < 1) {
198 throw new NullPointerException(MessageFormat.format("event.contact.contactId={0} is invalid", event.getContact().getContactId())); //NOI18N
199 } else if (event.getContact().getContactMobileNumber() == null) {
201 throw new NullPointerException("event.contact.contactMobileNumber is null"); //NOI18N
202 } else if (event.getContact().getContactMobileNumber().getMobileId() == null) {
204 throw new NullPointerException("event.contact.contactMobileNumber.mobileId is null"); //NOI18N
205 } else if (event.getContact().getContactMobileNumber().getMobileId() < 1) {
207 throw new NullPointerException(MessageFormat.format("event.contact.contactMobileNumber.mobileId={0} is invalid", event.getContact().getContactMobileNumber().getMobileId())); //NOI18N
208 } else if (event.getLinkedMobileNumber() == null) {
210 throw new NullPointerException("event.linkedMobileNumer is null"); //NOI18N
213 // Is the id number in linked number not set?
214 if (event.getLinkedMobileNumber().getMobileId() == null) {
215 // Then it is a new number, so add it from contact as there the id number has been set
216 this.uniqueAddMobileNumber(event.getContact().getContactMobileNumber());
221 * Observes events being fired when an administrator has updated contact
224 * @param event Event being fired
226 public void afterAdminUpdatedContactDataEvent (@Observes final ObservableAdminUpdatedContactEvent event) {
227 // Event and contained entity instance should not be null
230 throw new NullPointerException("event is null"); //NOI18N
231 } else if (event.getUpdatedContact() == null) {
233 throw new NullPointerException("event.updatedContact is null"); //NOI18N
234 } else if (event.getUpdatedContact().getContactId() == null) {
236 throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
237 } else if (event.getUpdatedContact().getContactId() < 1) {
239 throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
242 // Update contact's mobile, land-line and mobile number
243 this.updateContactMobileNumbers(event.getUpdatedContact());
250 * Observes events being fired when an administrator has updated a land-line
253 * @param event Event being fired
255 public void afterAdminUpdatedMobileNumberEvent (@Observes final ObservableAdminMobileNumberUpdatedEvent event) {
256 // Event and contained entity instance should not be null
259 throw new NullPointerException("event is null"); //NOI18N
260 } else if (event.getUpdatedMobileNumber() == null) {
262 throw new NullPointerException("event.updatedMobileNumber is null"); //NOI18N
263 } else if (event.getUpdatedMobileNumber().getMobileId() == null) {
265 throw new NullPointerException("event.updatedMobileNumber.mobileId is null"); //NOI18N
266 } else if (event.getUpdatedMobileNumber().getMobileId() < 1) {
268 throw new IllegalArgumentException(MessageFormat.format("mobileId of contact={0} is not valid: {1}", event.getUpdatedMobileNumber(), event.getUpdatedMobileNumber().getMobileId())); //NOI18N
272 this.uniqueAddMobileNumber(event.getUpdatedMobileNumber());
279 * Observes events being fired when an user has updated contact data.
281 * @param event Event being fired
283 public void afterUpdatedContactDataEvent (@Observes final ObservableUpdatedContactEvent event) {
284 // Event and contained entity instance should not be null
287 throw new NullPointerException("event is null"); //NOI18N
288 } else if (event.getUpdatedContact() == null) {
290 throw new NullPointerException("event.updatedContact is null"); //NOI18N
291 } else if (event.getUpdatedContact().getContactId() == null) {
293 throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
294 } else if (event.getUpdatedContact().getContactId() < 1) {
296 throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
299 // Update contact's mobile, land-line and mobile number
300 this.updateContactMobileNumbers(event.getUpdatedContact());
307 public DialableMobileNumber findMobileNumberById (final Long mobileNumberId) throws MobileEntityNotFoundException {
309 if (null == mobileNumberId) {
311 throw new NullPointerException("mobileNumberId is null"); //NOI18N
312 } else if (mobileNumberId < 1) {
314 throw new IllegalArgumentException(MessageFormat.format("mobileNumberId={0} is invalid.", mobileNumberId)); //NOI18N
315 } else if (!this.mobileNumberCache.containsKey(mobileNumberId)) {
317 throw new MobileEntityNotFoundException(mobileNumberId);
321 final DialableMobileNumber mobileNumber = this.mobileNumberCache.get(mobileNumberId);
328 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
329 public List<DialableMobileNumber> getAllMobileNumbers () {
330 return this.allMobileNumbers;
334 * Getter for filtered mobile numbers
336 * @return Filtered mobile numbers
338 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
339 public List<DialableMobileNumber> getFilteredMobileNumbers () {
340 return this.filteredMobileNumbers;
344 * Setter for filtered mobile numbers
346 * @param filteredMobileNumbers Filtered mobile numbers
348 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
349 public void setFilteredMobileNumbers (final List<DialableMobileNumber> filteredMobileNumbers) {
350 this.filteredMobileNumbers = filteredMobileNumbers;
354 * Post-construction method
357 public void initializeList () {
359 if (!this.mobileNumberCache.iterator().hasNext()) {
361 for (final DialableMobileNumber currentNumber : this.mobileBean.fetchAllMobileNumbers()) {
363 this.mobileNumberCache.put(currentNumber.getMobileId(), currentNumber);
367 // Is cache filled and list is empty
368 if ((this.mobileNumberCache.iterator().hasNext()) && (this.getAllMobileNumbers().isEmpty())) {
370 for (final Cache.Entry<Long, DialableMobileNumber> currentEntry : this.mobileNumberCache) {
372 this.getAllMobileNumbers().add(currentEntry.getValue());
376 this.getAllMobileNumbers().sort(new Comparator<DialableMobileNumber>() {
378 public int compare (final DialableMobileNumber mobileNumber1, final DialableMobileNumber mobileNumber2) {
379 return mobileNumber1.getMobileId() > mobileNumber2.getMobileId() ? 1 : mobileNumber1.getMobileId() < mobileNumber2.getMobileId() ? -1 : 0;
384 this.setFilteredMobileNumbers(this.getAllMobileNumbers());
391 private void clear () {
396 * Uniquely add given land-line number to this bean's list. First remove the
397 * old instance (by id number), then re-add it again.
399 * @param mobileNumber Land-line number to add
401 private void uniqueAddMobileNumber (final DialableMobileNumber mobileNumber) {
402 // Make sure the parameter is valid
403 if (null == mobileNumber) {
405 throw new NullPointerException("mobileNumber is null"); //NOI18N
406 } else if (mobileNumber.getMobileId() == null) {
408 throw new NullPointerException("mobileNumber.mobileId is null"); //NOI18N
409 } else if (mobileNumber.getMobileId() < 1) {
411 throw new IllegalArgumentException(MessageFormat.format("mobileNumber.mobileId={0} is not valid.", mobileNumber.getMobileId())); //NOI18N
415 if (!this.getAllMobileNumbers().remove(mobileNumber)) {
416 // Did not work, try by id number
417 for (final DialableMobileNumber currentNumber : this.getAllMobileNumbers()) {
418 // Is id number the same?
419 if (Objects.equals(currentNumber.getMobileId(), mobileNumber.getMobileId())) {
421 this.getAllMobileNumbers().remove(currentNumber);
428 this.getAllMobileNumbers().add(mobileNumber);
432 * Updates given contact's mobile number
434 * @param contact Contact instance
436 private void updateContactMobileNumbers (final Contact contact) {
437 // Parameter must be valid
438 if (null == contact) {
440 throw new NullPointerException("contact is null"); //NOI18N
441 } else if (contact.getContactId() == null) {
443 throw new NullPointerException("contact.contactId is null"); //NOI18N
444 } else if (contact.getContactId() < 1) {
445 // Id number is not valid
449 if (contact.getContactMobileNumber() instanceof DialableMobileNumber) {
451 this.uniqueAddMobileNumber(contact.getContactMobileNumber());