2 * Copyright (C) 2016, 2017 Roland Häder
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;
19 import java.text.MessageFormat;
20 import java.util.LinkedList;
21 import java.util.List;
22 import java.util.Locale;
23 import java.util.MissingResourceException;
24 import java.util.Objects;
25 import java.util.ResourceBundle;
26 import javax.annotation.PostConstruct;
27 import javax.enterprise.context.ApplicationScoped;
28 import javax.enterprise.event.Observes;
29 import javax.faces.application.FacesMessage;
30 import javax.faces.context.FacesContext;
31 import javax.faces.view.facelets.FaceletException;
32 import javax.inject.Named;
33 import javax.naming.Context;
34 import javax.naming.InitialContext;
35 import javax.naming.NamingException;
36 import org.mxchange.jcontacts.contact.Contact;
37 import org.mxchange.jcontacts.events.contact.add.ObservableAdminAddedContactEvent;
38 import org.mxchange.jcontacts.events.contact.update.ObservableAdminUpdatedContactEvent;
39 import org.mxchange.jcontacts.events.fax.linked.ObservableAdminLinkedFaxNumberEvent;
40 import org.mxchange.jcontacts.events.landline.linked.ObservableAdminLinkedLandLineNumberEvent;
41 import org.mxchange.jcontacts.events.mobile.linked.ObservableAdminLinkedMobileNumberEvent;
42 import org.mxchange.jjobs.beans.BaseJobsController;
43 import org.mxchange.jphone.events.fax.deleted.AdminDeletedFaxNumberEvent;
44 import org.mxchange.jphone.events.fax.updated.AdminUpdatedFaxNumberEvent;
45 import org.mxchange.jphone.events.landline.deleted.AdminDeletedLandLineNumberEvent;
46 import org.mxchange.jphone.events.landline.updated.AdminUpdatedLandLineNumberEvent;
47 import org.mxchange.jphone.events.mobile.deleted.AdminDeletedMobileNumberEvent;
48 import org.mxchange.jphone.events.mobile.updated.AdminUpdatedMobileNumberEvent;
49 import org.mxchange.jphone.phonenumbers.fax.DialableFaxNumber;
50 import org.mxchange.jphone.phonenumbers.landline.DialableLandLineNumber;
51 import org.mxchange.jphone.phonenumbers.mobile.DialableMobileNumber;
52 import org.mxchange.jphone.phonenumbers.phone.PhoneSessionBeanRemote;
53 import org.mxchange.jusercore.events.user.add.ObservableAdminAddedUserEvent;
56 * Regular controller (bean) for phone numbers
58 * @author Roland Häder<roland@mxchange.org>
60 @Named ("phoneController")
62 public abstract class JobsPhoneWebApplicationBean extends BaseJobsController implements JobsPhoneWebApplicationController {
67 private static final long serialVersionUID = 491_058_674_675_690_105L;
72 private final List<DialableFaxNumber> faxNumbers;
75 * All land-line numbers
77 private final List<DialableLandLineNumber> landLineNumbers;
82 private final List<DialableMobileNumber> mobileNumbers;
85 * General EJB for phone numbers
87 private PhoneSessionBeanRemote phoneBean;
92 public JobsPhoneWebApplicationBean () {
93 // Call super constructor
97 this.mobileNumbers = new LinkedList<>();
98 this.faxNumbers = new LinkedList<>();
99 this.landLineNumbers = new LinkedList<>();
103 * Observes events being fired when an administrator has added a new
106 * @param event Event being fired
108 public void afterAdminAddedContactEvent (@Observes final ObservableAdminAddedContactEvent event) {
109 // The event must be valid
112 throw new NullPointerException("event is null"); //NOI18N
113 } else if (event.getAddedContact() == null) {
115 throw new NullPointerException("event.addedContact is null"); //NOI18N
116 } else if (event.getAddedContact().getContactId() == null) {
118 throw new NullPointerException("event.addedContact.contactId is null"); //NOI18N
119 } else if (event.getAddedContact().getContactId() < 1) {
121 throw new IllegalArgumentException(MessageFormat.format("event.addedContact.contactId={0} is not valid", event.getAddedContact().getContactId())); //NOI18N
124 // Update contact's mobile, land-line and fax number
125 this.updateContactPhoneNumbers(event.getAddedContact());
132 * Event observer for newly added users by administrator
134 * @param event Event being fired
136 public void afterAdminAddedUserEvent (@Observes final ObservableAdminAddedUserEvent event) {
137 // event should not be null
140 throw new NullPointerException("event is null"); //NOI18N
141 } else if (event.getAddedUser() == null) {
143 throw new NullPointerException("event.addedUser is null"); //NOI18N
144 } else if (event.getAddedUser().getUserId() == null) {
146 throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
147 } else if (event.getAddedUser().getUserId() < 1) {
149 throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
152 // Update contact's mobile, land-line and fax number
153 this.updateContactPhoneNumbers(event.getAddedUser().getUserContact());
160 * Observes events being fired when an administrator has deleted a fax
163 * @param event Event being fired
165 public void afterAdminDeletedFaxNumberEvent (@Observes final AdminDeletedFaxNumberEvent event) {
166 // event should not be null
169 throw new NullPointerException("event is null"); //NOI18N
170 } else if (event.getDeletedFaxNumber() == null) {
172 throw new NullPointerException("event.deletedFaxNumber is null"); //NOI18N
173 } else if (event.getDeletedFaxNumber().getPhoneId() == null) {
175 throw new NullPointerException("event.deletedFaxNumber.phoneId is null"); //NOI18N
176 } else if (event.getDeletedFaxNumber().getPhoneId() < 1) {
178 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedFaxNumber(), event.getDeletedFaxNumber().getPhoneId())); //NOI18N
181 // Update contact's mobile, land-line and fax number
182 this.allFaxNumbers().remove(event.getDeletedFaxNumber());
189 * Observes events being fired when an administrator has deleted a land-line
192 * @param event Event being fired
194 public void afterAdminDeletedLandLineNumberEvent (@Observes final AdminDeletedLandLineNumberEvent event) {
195 // event should not be null
198 throw new NullPointerException("event is null"); //NOI18N
199 } else if (event.getDeletedLandLineNumber() == null) {
201 throw new NullPointerException("event.deletedLandLineNumber is null"); //NOI18N
202 } else if (event.getDeletedLandLineNumber().getPhoneId() == null) {
204 throw new NullPointerException("event.deletedLandLineNumber.phoneId is null"); //NOI18N
205 } else if (event.getDeletedLandLineNumber().getPhoneId() < 1) {
207 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedLandLineNumber(), event.getDeletedLandLineNumber().getPhoneId())); //NOI18N
210 // Update contact's mobile, land-line and fax number
211 this.allLandLineNumbers().remove(event.getDeletedLandLineNumber());
218 * Observes events being fired when an administrator has deleted a mobile
221 * @param event Event being fired
223 public void afterAdminDeletedMobileNumberEvent (@Observes final AdminDeletedMobileNumberEvent event) {
224 // event should not be null
227 throw new NullPointerException("event is null"); //NOI18N
228 } else if (event.getDeletedMobileNumber() == null) {
230 throw new NullPointerException("event.deletedMobileNumber is null"); //NOI18N
231 } else if (event.getDeletedMobileNumber().getPhoneId() == null) {
233 throw new NullPointerException("event.deletedMobileNumber.phoneId is null"); //NOI18N
234 } else if (event.getDeletedMobileNumber().getPhoneId() < 1) {
236 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getDeletedMobileNumber(), event.getDeletedMobileNumber().getPhoneId())); //NOI18N
239 // Update contact's mobile, land-line and fax number
240 this.allMobileNumbers().remove(event.getDeletedMobileNumber());
247 * Observes events being fired when an administrator has a linked a fax
250 * @param event Event being fired
252 public void afterAdminLinkedFaxNumberEvent (@Observes final ObservableAdminLinkedFaxNumberEvent event) {
253 // Is the event fine?
256 throw new NullPointerException("event is null"); //NOI18N
257 } else if (event.getContact() == null) {
259 throw new NullPointerException("event.contact is null");
260 } else if (event.getContact().getContactId() == null) {
262 throw new NullPointerException("event.contact.contactId is null");
263 } else if (event.getContact().getContactId() < 1) {
265 throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
266 } else if (event.getContact().getContactFaxNumber() == null) {
268 throw new NullPointerException("event.contact.contactFaxNumber is null");
269 } else if (event.getContact().getContactFaxNumber().getPhoneId() == null) {
271 throw new NullPointerException("event.contact.contactFaxNumber.phoneId is null");
272 } else if (event.getContact().getContactFaxNumber().getPhoneId() < 1) {
274 throw new NullPointerException("event.contact.contactFaxNumber.phoneId=" + event.getContact().getContactFaxNumber().getPhoneId() + " is invalid");
275 } else if (event.getLinkedFaxNumber() == null) {
277 throw new NullPointerException("event.linkedFaxNumer is null");
280 // Is the id number in linked number not set?
281 if (event.getLinkedFaxNumber().getPhoneId() == null) {
282 // Then it is a new number, so add it from contact as there the id number has been set
283 this.uniqueAddFaxNumber(event.getContact().getContactFaxNumber());
288 * Observes events being fired when an administrator has a linked a
291 * @param event Event being fired
293 public void afterAdminLinkedLandLineNumberEvent (@Observes final ObservableAdminLinkedLandLineNumberEvent event) {
294 // Is the event fine?
297 throw new NullPointerException("event is null"); //NOI18N
298 } else if (event.getContact() == null) {
300 throw new NullPointerException("event.contact is null");
301 } else if (event.getContact().getContactId() == null) {
303 throw new NullPointerException("event.contact.contactId is null");
304 } else if (event.getContact().getContactId() < 1) {
306 throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
307 } else if (event.getContact().getContactLandLineNumber() == null) {
309 throw new NullPointerException("event.contact.contactLandLineNumber is null");
310 } else if (event.getContact().getContactLandLineNumber().getPhoneId() == null) {
312 throw new NullPointerException("event.contact.contactLandLineNumber.phoneId is null");
313 } else if (event.getContact().getContactLandLineNumber().getPhoneId() < 1) {
315 throw new NullPointerException("event.contact.contactLandLineNumber.phoneId=" + event.getContact().getContactLandLineNumber().getPhoneId() + " is invalid");
316 } else if (event.getLinkedLandLineNumber() == null) {
318 throw new NullPointerException("event.linkedLandLineNumer is null");
321 // Is the id number in linked number not set?
322 if (event.getLinkedLandLineNumber().getPhoneId() == null) {
323 // Then it is a new number, so add it from contact as there the id number has been set
324 this.uniqueAddLandLineNumber(event.getContact().getContactLandLineNumber());
329 * Observes events being fired when an administrator has a linked a mobile
332 * @param event Event being fired
334 public void afterAdminLinkedMobileNumberEvent (@Observes final ObservableAdminLinkedMobileNumberEvent event) {
335 // Is the event fine?
338 throw new NullPointerException("event is null"); //NOI18N
339 } else if (event.getContact() == null) {
341 throw new NullPointerException("event.contact is null");
342 } else if (event.getContact().getContactId() == null) {
344 throw new NullPointerException("event.contact.contactId is null");
345 } else if (event.getContact().getContactId() < 1) {
347 throw new NullPointerException("event.contact.contactId=" + event.getContact().getContactId() + " is invalid");
348 } else if (event.getContact().getContactMobileNumber() == null) {
350 throw new NullPointerException("event.contact.contactMobileNumber is null");
351 } else if (event.getContact().getContactMobileNumber().getPhoneId() == null) {
353 throw new NullPointerException("event.contact.contactMobileNumber.phoneId is null");
354 } else if (event.getContact().getContactMobileNumber().getPhoneId() < 1) {
356 throw new NullPointerException("event.contact.contactMobileNumber.phoneId=" + event.getContact().getContactMobileNumber().getPhoneId() + " is invalid");
357 } else if (event.getLinkedMobileNumber() == null) {
359 throw new NullPointerException("event.linkedMobileNumer is null");
362 // Is the id number in linked number not set?
363 if (event.getLinkedMobileNumber().getPhoneId() == null) {
364 // Then it is a new number, so add it from contact as there the id number has been set
365 this.uniqueAddMobileNumber(event.getContact().getContactMobileNumber());
370 * Observes events being fired when an administrator has updated contact
373 * @param event Event being fired
375 public void afterAdminUpdatedContactDataEvent (@Observes final ObservableAdminUpdatedContactEvent event) {
376 // event should not be null
379 throw new NullPointerException("event is null"); //NOI18N
380 } else if (event.getUpdatedContact() == null) {
382 throw new NullPointerException("event.updatedContact is null"); //NOI18N
383 } else if (event.getUpdatedContact().getContactId() == null) {
385 throw new NullPointerException("event.updatedContact.contactId is null"); //NOI18N
386 } else if (event.getUpdatedContact().getContactId() < 1) {
388 throw new IllegalArgumentException(MessageFormat.format("contactId of contact={0} is not valid: {1}", event.getUpdatedContact(), event.getUpdatedContact().getContactId())); //NOI18N
391 // Update contact's mobile, land-line and fax number
392 this.updateContactPhoneNumbers(event.getUpdatedContact());
399 * Observes events being fired when an administrator has updated a fax
402 * @param event Event being fired
404 public void afterAdminUpdatedFaxNumberEvent (@Observes final AdminUpdatedFaxNumberEvent event) {
405 // event should not be null
408 throw new NullPointerException("event is null"); //NOI18N
409 } else if (event.getUpdatedFaxNumber() == null) {
411 throw new NullPointerException("event.updatedFaxNumber is null"); //NOI18N
412 } else if (event.getUpdatedFaxNumber().getPhoneId() == null) {
414 throw new NullPointerException("event.updatedFaxNumber.phoneId is null"); //NOI18N
415 } else if (event.getUpdatedFaxNumber().getPhoneId() < 1) {
417 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedFaxNumber(), event.getUpdatedFaxNumber().getPhoneId())); //NOI18N
421 this.uniqueAddFaxNumber(event.getUpdatedFaxNumber());
428 * Observes events being fired when an administrator has updated a land-line
431 * @param event Event being fired
433 public void afterAdminUpdatedLandLineNumberEvent (@Observes final AdminUpdatedLandLineNumberEvent event) {
434 // event should not be null
437 throw new NullPointerException("event is null"); //NOI18N
438 } else if (event.getUpdatedLandLineNumber() == null) {
440 throw new NullPointerException("event.updatedLandLineNumber is null"); //NOI18N
441 } else if (event.getUpdatedLandLineNumber().getPhoneId() == null) {
443 throw new NullPointerException("event.updatedLandLineNumber.phoneId is null"); //NOI18N
444 } else if (event.getUpdatedLandLineNumber().getPhoneId() < 1) {
446 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedLandLineNumber(), event.getUpdatedLandLineNumber().getPhoneId())); //NOI18N
450 this.uniqueAddLandLineNumber(event.getUpdatedLandLineNumber());
457 * Observes events being fired when an administrator has updated a mobile
460 * @param event Event being fired
462 public void afterAdminUpdatedMobileNumberEvent (@Observes final AdminUpdatedMobileNumberEvent event) {
463 // event should not be null
466 throw new NullPointerException("event is null"); //NOI18N
467 } else if (event.getUpdatedMobileNumber() == null) {
469 throw new NullPointerException("event.updatedMobileNumber is null"); //NOI18N
470 } else if (event.getUpdatedMobileNumber().getPhoneId() == null) {
472 throw new NullPointerException("event.updatedMobileNumber.phoneId is null"); //NOI18N
473 } else if (event.getUpdatedMobileNumber().getPhoneId() < 1) {
475 throw new IllegalArgumentException(MessageFormat.format("phoneId of contact={0} is not valid: {1}", event.getUpdatedMobileNumber(), event.getUpdatedMobileNumber().getPhoneId())); //NOI18N
479 this.uniqueAddMobileNumber(event.getUpdatedMobileNumber());
486 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
487 public List<DialableFaxNumber> allFaxNumbers () {
488 return this.faxNumbers;
492 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
493 public List<DialableLandLineNumber> allLandLineNumbers () {
494 return this.landLineNumbers;
498 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
499 public List<DialableMobileNumber> allMobileNumbers () {
500 return this.mobileNumbers;
504 * Post-construction method
507 public void init () {
510 // Get initial context
511 Context context = new InitialContext();
513 // Try to lookup the beans
514 this.phoneBean = (PhoneSessionBeanRemote) context.lookup("java:global/jjobs-ejb/phone!org.mxchange.jphone.phonenumbers.phone.PhoneSessionBeanRemote"); //NOI18N
515 } catch (final NamingException e) {
517 throw new FaceletException(e);
521 this.allMobileNumbers().addAll(this.phoneBean.allMobileNumbers());
522 this.allFaxNumbers().addAll(this.phoneBean.allFaxNumbers());
523 this.allLandLineNumbers().addAll(this.phoneBean.allLandLineNumbers());
529 private void clear () {
534 * Uniquely add given fax number to this bean's list. First remove the old
535 * instance (by id number), then re-add it again.
537 * @param faxNumber number to add
539 private void uniqueAddFaxNumber (final DialableFaxNumber faxNumber) {
540 // Make sure the parameter is valid
541 if (null == faxNumber) {
543 throw new NullPointerException("faxNumber is null");
544 } else if (faxNumber.getPhoneId() == null) {
546 throw new NullPointerException("faxNumber.phoneId is null");
547 } else if (faxNumber.getPhoneId() < 1) {
549 throw new IllegalArgumentException(MessageFormat.format("faxNumber.phoneId={0} is not valid.", faxNumber.getPhoneId()));
553 if (!this.allFaxNumbers().remove(faxNumber)) {
554 // Did not work, try by id number
555 for (final DialableFaxNumber fax : this.allFaxNumbers()) {
556 // Is id number the same?
557 if (Objects.equals(fax.getPhoneId(), faxNumber.getPhoneId())) {
559 this.allFaxNumbers().remove(fax);
566 this.allFaxNumbers().add(faxNumber);
570 * Uniquely add given land-line number to this bean's list. First remove the
571 * old instance (by id number), then re-add it again.
573 * @param landLineNumber Land-line number to add
575 private void uniqueAddLandLineNumber (final DialableLandLineNumber landLineNumber) {
576 // Make sure the parameter is valid
577 if (null == landLineNumber) {
579 throw new NullPointerException("landLineNumber is null");
580 } else if (landLineNumber.getPhoneId() == null) {
582 throw new NullPointerException("landLineNumber.phoneId is null");
583 } else if (landLineNumber.getPhoneId() < 1) {
585 throw new IllegalArgumentException(MessageFormat.format("landLineNumber.phoneId={0} is not valid.", landLineNumber.getPhoneId()));
589 if (!this.allLandLineNumbers().remove(landLineNumber)) {
590 // Did not work, try by id number
591 for (final DialableLandLineNumber landLine : this.allLandLineNumbers()) {
592 // Is id number the same?
593 if (Objects.equals(landLine.getPhoneId(), landLineNumber.getPhoneId())) {
595 this.allLandLineNumbers().remove(landLine);
602 this.allLandLineNumbers().add(landLineNumber);
606 * Uniquely add given mobile number to this bean's list. First remove the
607 * old instance (by id number), then re-add it again.
609 * @param mobileNumber Mobile number to add
611 private void uniqueAddMobileNumber (final DialableMobileNumber mobileNumber) {
612 // Make sure the parameter is valid
613 if (null == mobileNumber) {
615 throw new NullPointerException("mobileNumber is null");
616 } else if (mobileNumber.getPhoneId() == null) {
618 throw new NullPointerException("mobileNumber.phoneId is null");
619 } else if (mobileNumber.getPhoneId() < 1) {
621 throw new IllegalArgumentException(MessageFormat.format("mobileNumber.phoneId={0} is not valid.", mobileNumber.getPhoneId()));
624 // First remove it by object
625 if (!this.allMobileNumbers().remove(mobileNumber)) {
626 // Did not work, try by id number
627 for (final DialableMobileNumber cell : this.allMobileNumbers()) {
628 // Is id number the same?
629 if (Objects.equals(cell.getPhoneId(), mobileNumber.getPhoneId())) {
631 this.allMobileNumbers().remove(cell);
638 this.allMobileNumbers().add(mobileNumber);
642 * Updates given contact's mobile, land-line and fax number
644 * @param contact Contact instance
646 private void updateContactPhoneNumbers (final Contact contact) {
647 // Parameter must be valid
648 if (null == contact) {
650 throw new NullPointerException("contact is null");
651 } else if (contact.getContactId() == null) {
653 throw new NullPointerException("contact.contactId is null");
654 } else if (contact.getContactId() < 1) {
655 // Id number is not valid
659 if (contact.getContactMobileNumber() instanceof DialableMobileNumber) {
661 this.uniqueAddMobileNumber(contact.getContactMobileNumber());
665 if (contact.getContactLandLineNumber() instanceof DialableLandLineNumber) {
667 this.uniqueAddLandLineNumber(contact.getContactLandLineNumber());
671 if (contact.getContactFaxNumber() instanceof DialableFaxNumber) {
673 this.uniqueAddFaxNumber(contact.getContactFaxNumber());
678 * Returns given property key or throws an exception if not found.
680 * @param parameterKey Property key
682 * @return Property value
684 * @throws NullPointerException If given key is not found
685 * @throws NumberFormatException If no number is given in context parameter
687 protected int getIntegerContextParameter (final String parameterKey) throws NullPointerException, NumberFormatException {
688 // Get context parameter
689 Integer contextValue = Integer.parseInt(this.getStringContextParameter(parameterKey));
695 * Returns given property key or throws an exception if not found.
697 * @param parameterKey Property key
699 * @return Property value
701 * @throws NullPointerException If given key is not found
703 protected String getStringContextParameter (final String parameterKey) throws NullPointerException {
704 // Get context parameter
705 String contextValue = FacesContext.getCurrentInstance().getExternalContext().getInitParameter(parameterKey);
707 if (null == contextValue) {
709 throw new NullPointerException(MessageFormat.format("parameterKey={0} is not set.", parameterKey)); //NOI18N
716 * Checks whether debug mode is enabled for given controller
718 * @param controllerName Name of controller
720 * @return Whether debug mode is enabled
722 protected boolean isDebugModeEnabled (final String controllerName) {
723 // Parameters should be valid
724 if (null == controllerName) {
726 throw new NullPointerException("controllerName is null"); //NOI18N
727 } else if (controllerName.isEmpty()) {
729 throw new IllegalArgumentException("controllerName is empty"); //NOI18N
731 // Try to get context parameter
732 String contextParameter = this.getStringContextParameter(String.format("is_debug_%s_enabled", controllerName)); //NOI18N
733 // Is it set and true?
734 boolean isEnabled = Boolean.parseBoolean(contextParameter) == Boolean.TRUE;
740 * Loads resource bundle for given locale. This must be implemented per
741 * project so all projects can still customize their methods. Calling
742 * ResourceBundleloadBundle() in this class means that also the bundle files
743 * must be present here.
745 * @param locale Locale from e.g. FacesContext
747 * @return Initialized and loaded resource bundle
749 protected abstract ResourceBundle loadResourceBundle (final Locale locale);
752 * Shows a faces message for given causing exception. The message from the
753 * exception is being inserted into the message.
755 * @param clientId Client id to send message to
756 * @param cause Causing exception
758 protected void showFacesMessage (final String clientId, final Throwable cause) {
759 // Get context and add message
760 this.showFacesMessage(clientId, cause.getMessage());
764 * Shows a faces message with given message (i18n) key.
766 * @param clientId Client id to send message to
767 * @param i18nKey Message key
769 * @throws NullPointerException If clientId or i18nKey is null
770 * @throws IllegalArgumentException If clientId or i18nKey is empty
772 protected void showFacesMessage (final String clientId, final String i18nKey) throws NullPointerException, IllegalArgumentException {
773 // Both parameter must be valid
774 if (null == clientId) {
776 throw new NullPointerException("clientId is null"); //NOI18N
777 } else if (clientId.isEmpty()) {
779 throw new IllegalArgumentException("clientId is null"); //NOI18N
780 } else if (null == i18nKey) {
782 throw new NullPointerException("i18nKey is null"); //NOI18N
783 } else if (i18nKey.isEmpty()) {
785 throw new IllegalArgumentException("i18nKey is null"); //NOI18N
787 // Get current locale
788 Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
790 ResourceBundle bundle = this.loadResourceBundle(locale);
791 // Default is i18nKey
792 String message = MessageFormat.format("!{0}!", i18nKey); //NOI18N
796 message = bundle.getString(i18nKey);
797 } catch (final MissingResourceException ex) {
798 // Did not find it, ignored
800 // Get context and add message
801 FacesContext.getCurrentInstance().addMessage(clientId, new FacesMessage(message));