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 General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (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 General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package org.mxchange.addressbook.database;
19 import java.text.MessageFormat;
20 import java.util.Date;
21 import java.util.Objects;
22 import java.util.Properties;
23 import javax.ejb.EJBException;
24 import javax.jms.JMSException;
25 import javax.jms.ObjectMessage;
26 import javax.mail.Address;
27 import javax.mail.internet.AddressException;
28 import javax.mail.internet.InternetAddress;
29 import org.mxchange.jcontacts.model.contact.Contact;
30 import org.mxchange.jcontacts.model.contact.ContactUtils;
31 import org.mxchange.jcontacts.model.contact.UserContact;
32 import org.mxchange.jcontactsbusiness.model.basicdata.BusinessBasicData;
33 import org.mxchange.jcontactsbusiness.model.basicdata.CompanyBasicData;
34 import org.mxchange.jcontactsbusiness.model.branchoffice.BranchOffice;
35 import org.mxchange.jcontactsbusiness.model.employee.CompanyEmployee;
36 import org.mxchange.jcontactsbusiness.model.employee.Employee;
37 import org.mxchange.jcoreee.database.BaseDatabaseBean;
38 import org.mxchange.jcountry.model.data.Country;
39 import org.mxchange.jcountry.model.data.CountryData;
40 import org.mxchange.jmailee.model.delivery.wrapper.EmailDeliveryWrapper;
41 import org.mxchange.jmailee.model.delivery.wrapper.WrapableEmailDelivery;
42 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
43 import org.mxchange.jphone.model.phonenumbers.fax.FaxNumbers;
44 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
45 import org.mxchange.jphone.model.phonenumbers.landline.LandLineNumbers;
46 import org.mxchange.jphone.model.phonenumbers.mobile.DialableMobileNumber;
47 import org.mxchange.jphone.model.phonenumbers.mobile.MobileNumbers;
48 import org.mxchange.jphone.utils.PhoneUtils;
49 import org.mxchange.jusercore.model.user.LoginUser;
50 import org.mxchange.jusercore.model.user.User;
51 import org.mxchange.jusercore.model.user.UserUtils;
54 * A helper class for beans that access the database.
56 * @author Roland Häder<roland@mxchange.org>
58 public abstract class BaseAddressbookDatabaseBean extends BaseDatabaseBean {
63 private static final long serialVersionUID = 12_895_410_275_811_963L;
66 * Protected constructor
68 protected BaseAddressbookDatabaseBean () {
69 // Call super constructor
74 * Constructor with queue factory JNDI and queue JNDI names
76 * @param factoryJndi JNDI name for queue factory
77 * @param queueJndi JNDI name for email queue
79 protected BaseAddressbookDatabaseBean (final String factoryJndi, final String queueJndi) {
80 // Call super constructor
81 super(factoryJndi, queueJndi);
85 * Updates all contact's phone entry's created timestamps
87 * @param contact Contact instance to update
89 protected void setAllContactPhoneEntriesCreated (final Contact contact) {
91 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: contact={1} - CALLED!", this.getClass().getSimpleName(), contact)); //NOI18N
93 // The contact instance must be valid
94 if (null == contact) {
96 throw new NullPointerException("contact is null"); //NOI18N
99 // Get all phone instances
100 final DialableLandLineNumber landLineNumber = contact.getContactLandLineNumber();
101 final DialableFaxNumber faxNumber = contact.getContactFaxNumber();
102 final DialableMobileNumber mobileNumber = contact.getContactMobileNumber();
105 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: landLineNumber={1},faxNumber={2},mobileNumber={3}", this.getClass().getSimpleName(), landLineNumber, faxNumber, mobileNumber)); //NOI18N
107 // Is a phone number instance set?
108 if ((landLineNumber instanceof DialableLandLineNumber) && (landLineNumber.getPhoneId() == null)) {
110 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: Setting created timestamp for land-line number ...", this.getClass().getSimpleName())); //NOI18N
112 // Set updated timestamp
113 landLineNumber.setPhoneEntryCreated(new Date());
116 // Is a fax number instance set?
117 if ((faxNumber instanceof DialableFaxNumber) && (faxNumber.getPhoneId() == null)) {
119 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: Setting created timestamp for fax number ...", this.getClass().getSimpleName())); //NOI18N
121 // Set updated timestamp
122 faxNumber.setPhoneEntryCreated(new Date());
125 // Is a mobile number instance set?
126 if ((mobileNumber instanceof DialableMobileNumber) && (mobileNumber.getPhoneId() == null)) {
128 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: Setting created timestamp for mobile number ...", this.getClass().getSimpleName())); //NOI18N
130 // Set updated timestamp
131 mobileNumber.setPhoneEntryCreated(new Date());
135 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntriesCreated: EXIT!", this.getClass().getSimpleName())); //NOI18N
139 * Returns a managed instance from given mobile number
141 * @param mobileNumber Mobile instance
142 * @param fetchedNumber Found mobile number in database
144 * @return Managed instance
146 protected DialableMobileNumber getManaged (final DialableMobileNumber mobileNumber, final DialableMobileNumber fetchedNumber) {
148 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: mobileNumber={1},fetchedNumber={2} - CALLED!", this.getClass().getSimpleName(), mobileNumber, fetchedNumber)); //NOI18N
151 if (null == mobileNumber) {
153 throw new NullPointerException("mobileNumber is null"); //NOI18N
154 } else if (null == fetchedNumber) {
156 throw new NullPointerException("fetchedNumber is null"); //NOI18N
157 } else if (fetchedNumber.getPhoneId() == null) {
159 throw new NullPointerException("fetchedNumber.phoneId is null"); //NOI18N
163 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
165 // Init query instance
166 final DialableMobileNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
169 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
172 DialableMobileNumber managedNumber = null;
174 // Is there a difference?
175 if (!PhoneUtils.isSameMobileNumber(mobileNumber, fetchedNumber)) {
177 managedNumber = this.getEntityManager().merge(foundNumber);
183 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: managedNumber={1} - EXIT!", this.getClass().getSimpleName(), managedNumber)); //NOI18N
186 return managedNumber;
190 * Returns a managed instance from given land-line number
192 * @param landLineNumber Land-line instance
193 * @param fetchedNumber Found land-line number in database
195 * @return Managed instance
197 protected DialableLandLineNumber getManaged (final DialableLandLineNumber landLineNumber, final DialableLandLineNumber fetchedNumber) {
199 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: landLineNumber={1},fetchedNumber={2} - CALLED!", this.getClass().getSimpleName(), landLineNumber, fetchedNumber)); //NOI18N
202 if (null == landLineNumber) {
204 throw new NullPointerException("landLineNumber is null"); //NOI18N
205 } else if (null == fetchedNumber) {
207 throw new NullPointerException("fetchedNumber is null"); //NOI18N
208 } else if (fetchedNumber.getPhoneId() == null) {
210 throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
214 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
216 // Init query instance
217 final DialableLandLineNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
220 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
223 DialableLandLineNumber managedNumber = null;
225 // Is there a difference?
226 if (!PhoneUtils.isSameLandLineNumber(landLineNumber, fetchedNumber)) {
228 managedNumber = this.getEntityManager().merge(foundNumber);
234 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: managedNumber={1} - EXIT!", this.getClass().getSimpleName(), managedNumber)); //NOI18N
237 return managedNumber;
241 * Returns a managed instance from given fax number
243 * @param faxNumber Fax instance
244 * @param fetchedNumber Found fax number in database
246 * @return Managed instance
248 protected DialableFaxNumber getManaged (final DialableFaxNumber faxNumber, final DialableFaxNumber fetchedNumber) {
250 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: faxNumber={1},fetchedNumber={2} - CALLED!", this.getClass().getSimpleName(), faxNumber, fetchedNumber)); //NOI18N
253 if (null == faxNumber) {
255 throw new NullPointerException("faxNumber is null"); //NOI18N
256 } else if (null == fetchedNumber) {
258 throw new NullPointerException("fetchedNumber is null"); //NOI18N
259 } else if (fetchedNumber.getPhoneId() == null) {
261 throw new NullPointerException("fetchedNumber.phoneId is null"); //NOI18N
265 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
267 // Init query instance
268 final DialableFaxNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
271 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
274 DialableFaxNumber managedNumber = null;
276 // Is there a difference?
277 if (!PhoneUtils.isSameFaxNumber(faxNumber, fetchedNumber)) {
279 managedNumber = this.getEntityManager().merge(foundNumber);
285 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getDetached: managedNumber={1} - EXIT!", this.getClass().getSimpleName(), managedNumber)); //NOI18N
288 return managedNumber;
292 * Get back a managed instance from given contact
294 * @param contact Unmanaged/detached contact instance
296 * @return Managed contact instance
298 protected Contact createManaged (final Contact contact) {
300 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: contact={1} - CALLED!", this.getClass().getSimpleName(), contact)); //NOI18N
302 // user should not be null
303 if (null == contact) {
305 throw new NullPointerException("contact is null"); //NOI18N
306 } else if (contact.getContactId() == null) {
308 throw new NullPointerException("contact.contactId is null"); //NOI18N
309 } else if (contact.getContactId() < 1) {
311 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is null", contact.getContactId())); //NOI18N
314 // Try to find it (should be there)
315 final Contact managedContact = this.getEntityManager().find(UserContact.class, contact.getContactId());
318 assert (managedContact instanceof Contact) : "managedContact is null"; //NOI18N
321 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedContact={1} - EXIT!", this.getClass().getSimpleName(), managedContact)); //NOI18N
324 return managedContact;
328 * Get back a managed instance from given country
330 * @param country Unmanaged/detached country instance
332 * @return Managed country instance
334 protected Country createManaged (final Country country) {
336 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: country={1} - CALLED!", this.getClass().getSimpleName(), country)); //NOI18N
338 // user should not be null
339 if (null == country) {
341 throw new NullPointerException("country is null"); //NOI18N
342 } else if (country.getCountryId() == null) {
344 throw new NullPointerException("country.countryId is null"); //NOI18N
345 } else if (country.getCountryId() < 1) {
347 throw new IllegalArgumentException(MessageFormat.format("country.countryId={0} is null", country.getCountryId())); //NOI18N
350 // Try to find it (should be there)
351 final Country managedCountry = this.getEntityManager().find(CountryData.class, country.getCountryId());
354 assert (managedCountry instanceof Country) : "managedCountry is null"; //NOI18N
357 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedCountry={1} - EXIT!", this.getClass().getSimpleName(), managedCountry)); //NOI18N
360 return managedCountry;
364 * Get back a managed instance from given basic data
366 * @param basicData Unmanaged/detached basic data instance
368 * @return Managed basic data instance
370 protected BusinessBasicData createManaged (final BusinessBasicData basicData) {
372 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: basicData={1} - CALLED!", this.getClass().getSimpleName(), basicData)); //NOI18N
374 // user should not be null
375 if (null == basicData) {
377 throw new NullPointerException("basicData is null"); //NOI18N
378 } else if (basicData.getBasicDataId() == null) {
380 throw new NullPointerException("basicData.basicDataId is null"); //NOI18N
381 } else if (basicData.getBasicDataId() < 1) {
383 throw new IllegalArgumentException(MessageFormat.format("basicData.basicDataId={0} is null", basicData.getBasicDataId())); //NOI18N
386 // Try to find it (should be there)
387 final BusinessBasicData managedBasicData = this.getEntityManager().find(CompanyBasicData.class, basicData.getBasicDataId());
390 assert (managedBasicData instanceof BusinessBasicData) : "managedBasicData is null"; //NOI18N
393 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedBasicData={1} - EXIT!", this.getClass().getSimpleName(), managedBasicData)); //NOI18N
396 return managedBasicData;
400 * Get back a managed instance from given employee
402 * @param employee Unmanaged/detached employee instance
404 * @return Managed employee instance
406 protected Employee createManaged (final Employee employee) {
408 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: employee={1} - CALLED!", this.getClass().getSimpleName(), employee)); //NOI18N
410 // user should not be null
411 if (null == employee) {
413 throw new NullPointerException("employee is null"); //NOI18N
414 } else if (employee.getEmployeeId() == null) {
416 throw new NullPointerException("employee.employeeId is null"); //NOI18N
417 } else if (employee.getEmployeeId() < 1) {
419 throw new IllegalArgumentException(MessageFormat.format("employee.employeeId={0} is null", employee.getEmployeeId())); //NOI18N
422 // Try to find it (should be there)
423 final Employee managedEmployee = this.getEntityManager().find(CompanyEmployee.class, employee.getEmployeeId());
426 assert (managedEmployee instanceof Employee) : "managedEmployee is null"; //NOI18N
429 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedEmployee={1} - EXIT!", this.getClass().getSimpleName(), managedEmployee)); //NOI18N
432 return managedEmployee;
436 * Get back a managed instance from given user
438 * @param user Unmanaged/detached user instance
440 * @return Managed user instance
442 protected User createManaged (final User user) {
444 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: user={1} - CALLED!", this.getClass().getSimpleName(), user)); //NOI18N
446 // user should not be null
449 throw new NullPointerException("user is null"); //NOI18N
450 } else if (user.getUserId() == null) {
452 throw new NullPointerException("user.userId is null"); //NOI18N
453 } else if (user.getUserId() < 1) {
455 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is null", user.getUserId())); //NOI18N
456 } else if (user.getUserContact() == null) {
458 throw new NullPointerException("user.userContact is null"); //NOI18N
459 } else if (user.getUserContact().getContactId() == null) {
461 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
462 } else if (user.getUserContact().getContactId() < 1) {
463 // Not valid id number
464 throw new IllegalArgumentException(MessageFormat.format("user.userContact.contactId={0} is not valid", user.getUserContact().getContactId())); //NOI18N#
467 // Try to find it (should be there)
468 final User managedUser = this.getEntityManager().find(LoginUser.class, user.getUserId());
471 assert (managedUser instanceof User) : "managedUser is null"; //NOI18N
474 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedUser={1} - EXIT!", this.getClass().getSimpleName(), managedUser)); //NOI18N
481 * Updates all contact's phone entry's created timestamps
483 * @param contact Contact instance to update
485 protected void setAllPhoneEntriesCreated (final Contact contact) {
487 this.getLoggerBeanLocal().logTrace(MessageFormat.format("setAllPhoneEntriesCreated: contact={0} - CALLED!", contact)); //NOI18N
489 // The contact instance must be valid
490 if (null == contact) {
492 throw new NullPointerException("contact is null"); //NOI18N
493 } else if (contact.getContactId() != null) {
495 throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is unexpected.", contact.getContactId()));
498 // Get all phone instances
499 final DialableLandLineNumber landLineNumber = contact.getContactLandLineNumber();
500 final DialableFaxNumber faxNumber = contact.getContactFaxNumber();
501 final DialableMobileNumber mobileNumber = contact.getContactMobileNumber();
504 this.getLoggerBeanLocal().logDebug(MessageFormat.format("setAllPhoneEntriesCreated: landLineNumber={0},faxNumber={1},mobileNumber={2}", landLineNumber, faxNumber, mobileNumber)); //NOI18N
506 // Is a phone number instance set?
507 if ((landLineNumber instanceof DialableLandLineNumber) && (landLineNumber.getPhoneId() == null)) {
509 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for land-line number ..."); //NOI18N
511 // Set updated timestamp
512 landLineNumber.setPhoneEntryCreated(new Date());
515 // Is a fax number instance set?
516 if ((faxNumber instanceof DialableFaxNumber) && (faxNumber.getPhoneId() == null)) {
518 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for fax number ..."); //NOI18N
520 // Set updated timestamp
521 faxNumber.setPhoneEntryCreated(new Date());
524 // Is a mobile number instance set?
525 if ((mobileNumber instanceof DialableMobileNumber) && (mobileNumber.getPhoneId() == null)) {
527 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for mobile number ..."); //NOI18N
529 // Set updated timestamp
530 mobileNumber.setPhoneEntryCreated(new Date());
534 this.getLoggerBeanLocal().logTrace("setAllPhoneEntriesCreated: EXIT!"); //NOI18N
538 * Updates all branch office's phone entry's created timestamps
540 * @param branchOffice Branch office instance to update
542 protected void setAllPhoneEntriesCreated (final BranchOffice branchOffice) {
544 this.getLoggerBeanLocal().logTrace(MessageFormat.format("setAllPhoneEntriesCreated: branchOffice={0} - CALLED!", branchOffice)); //NOI18N
546 // The contact instance must be valid
547 if (null == branchOffice) {
549 throw new NullPointerException("branchOffice is null"); //NOI18N
550 } else if (branchOffice.getBranchId() != null) {
552 throw new IllegalArgumentException(MessageFormat.format("branchOffice.branchId={0} is unexpected.", branchOffice.getBranchId()));
555 // Get all phone instances
556 final DialableLandLineNumber landLineNumber = branchOffice.getBranchLandLineNumber();
557 final DialableFaxNumber faxNumber = branchOffice.getBranchFaxNumber();
560 this.getLoggerBeanLocal().logDebug(MessageFormat.format("setAllPhoneEntriesCreated: landLineNumber={0},faxNumber={1}", landLineNumber, faxNumber)); //NOI18N
562 // Is a phone number instance set?
563 if ((landLineNumber instanceof DialableLandLineNumber) && (landLineNumber.getPhoneId() == null)) {
565 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for land-line number ..."); //NOI18N
567 // Set updated timestamp
568 landLineNumber.setPhoneEntryCreated(new Date());
571 // Is a fax number instance set?
572 if ((faxNumber instanceof DialableFaxNumber) && (faxNumber.getPhoneId() == null)) {
574 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for fax number ..."); //NOI18N
576 // Set updated timestamp
577 faxNumber.setPhoneEntryCreated(new Date());
581 this.getLoggerBeanLocal().logTrace("setAllPhoneEntriesCreated: EXIT!"); //NOI18N
585 * Updates all company's phone entry's created timestamps
587 * @param basicData Company basic data instance to update
589 protected void setAllPhoneEntriesCreated (final BusinessBasicData basicData) {
591 this.getLoggerBeanLocal().logTrace(MessageFormat.format("setAllPhoneEntriesCreated: basicData={0} - CALLED!", basicData)); //NOI18N
593 // The contact instance must be valid
594 if (null == basicData) {
596 throw new NullPointerException("basicData is null"); //NOI18N
597 } else if (basicData.getBasicDataId() != null) {
599 throw new IllegalArgumentException(MessageFormat.format("basicData.basicDataId={0} is unexpected.", basicData.getBasicDataId()));
602 // Get all phone instances
603 final DialableLandLineNumber landLineNumber = basicData.getCompanyLandLineNumber();
604 final DialableFaxNumber faxNumber = basicData.getCompanyFaxNumber();
607 this.getLoggerBeanLocal().logDebug(MessageFormat.format("setAllPhoneEntriesCreated: landLineNumber={0},faxNumber={1}", landLineNumber, faxNumber)); //NOI18N
609 // Is a phone number instance set?
610 if ((landLineNumber instanceof DialableLandLineNumber) && (landLineNumber.getPhoneId() == null)) {
612 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for land-line number ..."); //NOI18N
614 // Set updated timestamp
615 landLineNumber.setPhoneEntryCreated(new Date());
617 // Set it back in basic data
618 basicData.setCompanyLandLineNumber(landLineNumber);
621 // Is a fax number instance set?
622 if ((faxNumber instanceof DialableFaxNumber) && (faxNumber.getPhoneId() == null)) {
624 this.getLoggerBeanLocal().logDebug("setAllPhoneEntriesCreated: Setting created timestamp for fax number ..."); //NOI18N
626 // Set updated timestamp
627 faxNumber.setPhoneEntryCreated(new Date());
629 // Set it back in basic data
630 basicData.setCompanyFaxNumber(faxNumber);
634 this.getLoggerBeanLocal().logTrace("setAllPhoneEntriesCreated: EXIT!"); //NOI18N
638 * Returns a detached instance from given mobile instance
640 * @param mobileNumber Mobile instance
641 * @param fetchedNumber Found mobile number in database
643 * @return Detached instance
645 protected DialableMobileNumber getDetached (final DialableMobileNumber mobileNumber, final DialableMobileNumber fetchedNumber) {
647 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: mobileNumber={0},fetchedNumber={1} - CALLED!", mobileNumber, fetchedNumber)); //NOI18N
650 if (null == mobileNumber) {
652 throw new NullPointerException("mobileNumber is null"); //NOI18N
653 } else if (fetchedNumber.getPhoneId() == null) {
655 throw new NullPointerException("fetchedNumber.phoneId is null"); //NOI18N
659 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
661 // Init query instance
662 final DialableMobileNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
665 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
668 DialableMobileNumber detachedNumber = null;
670 // Is there a difference?
671 if (!PhoneUtils.isSameMobileNumber(mobileNumber, fetchedNumber)) {
673 detachedNumber = this.getEntityManager().merge(foundNumber);
679 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: detachedNumber={0} - EXIT!", detachedNumber)); //NOI18N
682 return detachedNumber;
686 * Returns a detached instance from given land-line instance
688 * @param landLineNumber Land-line instance
689 * @param fetchedNumber Found land-line number in database
691 * @return Detached instance
693 protected DialableLandLineNumber getDetached (final DialableLandLineNumber landLineNumber, final DialableLandLineNumber fetchedNumber) {
695 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: landLineNumber={0},fetchedNumber={1} - CALLED!", landLineNumber, fetchedNumber)); //NOI18N
698 if (null == landLineNumber) {
700 throw new NullPointerException("landLineNumber is null"); //NOI18N
701 } else if (fetchedNumber.getPhoneId() == null) {
703 throw new NullPointerException("landLineNumber.phoneId is null"); //NOI18N
707 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
709 // Init query instance
710 final DialableLandLineNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
713 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
716 DialableLandLineNumber detachedNumber = null;
718 // Is there a difference?
719 if (!PhoneUtils.isSameLandLineNumber(landLineNumber, fetchedNumber)) {
721 detachedNumber = this.getEntityManager().merge(foundNumber);
727 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: detachedNumber={0} - EXIT!", detachedNumber)); //NOI18N
730 return detachedNumber;
734 * Returns a detached instance from given fax instance
736 * @param faxNumber Fax instance
737 * @param fetchedNumber Found fax number in database
739 * @return Detached instance
741 protected DialableFaxNumber getDetached (final DialableFaxNumber faxNumber, final DialableFaxNumber fetchedNumber) {
743 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: faxNumber={0},fetchedNumber={1} - CALLED!", faxNumber, fetchedNumber)); //NOI18N
746 if (null == faxNumber) {
748 throw new NullPointerException("faxNumber is null"); //NOI18N
749 } else if (fetchedNumber.getPhoneId() == null) {
751 throw new NullPointerException("fetchedNumber.phoneId is null"); //NOI18N
755 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: fetchedNumber.phoneId={0}", fetchedNumber.getPhoneId())); //NOI18N
757 // Init query instance
758 final DialableFaxNumber foundNumber = this.getEntityManager().find(fetchedNumber.getClass(), fetchedNumber.getPhoneId());
761 this.getLoggerBeanLocal().logDebug(MessageFormat.format("getDetached: foundNumber={0}", foundNumber)); //NOI18N
764 DialableFaxNumber detachedNumber = null;
766 // Is there a difference?
767 if (!PhoneUtils.isSameFaxNumber(faxNumber, fetchedNumber)) {
769 detachedNumber = this.getEntityManager().merge(foundNumber);
775 this.getLoggerBeanLocal().logTrace(MessageFormat.format("getDetached: detachedNumber={0} - EXIT!", detachedNumber)); //NOI18N
778 return detachedNumber;
782 * Merges given contact's data
784 * @param detachedContact Contact instance to merge
786 * @return Detached contact instance
788 protected Contact mergeContactData (final Contact detachedContact) {
790 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.mergeContactData: detachedContact={1} - CALLED!", this.getClass().getSimpleName(), detachedContact)); //NOI18N
792 // The contact instance must be valid
793 if (null == detachedContact) {
795 throw new NullPointerException("detachedContact is null"); //NOI18N
796 } else if (detachedContact.getContactId() == null) {
798 throw new NullPointerException("detachedContact.contactId is null"); //NOI18N //NOI18N
799 } else if (detachedContact.getContactId() < 1) {
801 throw new IllegalStateException(MessageFormat.format("{0}.detachedContact.contactId={1} is not valid.", this.getClass().getSimpleName(), detachedContact.getContactId())); //NOI18N
804 // Set updated timestamp
805 detachedContact.setContactUpdated(new Date());
807 // Get contact from it and find it
808 final Contact foundContact = this.getEntityManager().find(detachedContact.getClass(), detachedContact.getContactId());
811 assert (foundContact instanceof Contact) : MessageFormat.format("Contact with id {0} not found, but should be.", detachedContact.getContactId()); //NOI18N
814 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.updateUserPersonalData: foundContact.contactId={1}", this.getClass().getSimpleName(), foundContact.getContactId())); //NOI18N
816 // Is a fax number set?
817 if (detachedContact.getContactFaxNumber() instanceof DialableFaxNumber) {
818 // Make fax numbers managed
819 foundContact.setContactFaxNumber(this.getManaged(detachedContact.getContactFaxNumber(), detachedContact.getContactFaxNumber()));
822 // Is a land-line number set?
823 if (detachedContact.getContactLandLineNumber() instanceof DialableLandLineNumber) {
824 // Make land-line numbers managed
825 foundContact.setContactLandLineNumber(this.getManaged(detachedContact.getContactLandLineNumber(), detachedContact.getContactLandLineNumber()));
828 // Is a mobile number set?
829 if (detachedContact.getContactMobileNumber() instanceof DialableMobileNumber) {
830 // Make mobile numbers managed
831 foundContact.setContactMobileNumber(this.getManaged(detachedContact.getContactMobileNumber(), detachedContact.getContactMobileNumber()));
834 // Merge contact instance
835 final Contact managedContact = this.getEntityManager().merge(foundContact);
838 ContactUtils.copyAll(detachedContact, managedContact);
841 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.mergeContactData: managedContact={1} - EXIT!", this.getClass().getSimpleName(), managedContact)); //NOI18N
843 // Return detached contact
844 return managedContact;
848 * Merges given (detached) contact's mobile, land-line and fax numbers
850 * @param detachedContact Detached contact instance
852 protected void mergeContactsMobileLandLineFaxNumbers (final Contact detachedContact) {
854 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.mergeContactsMobileLandLineFaxNumbers: detachedContact={1} - CALLED!", this.getClass().getSimpleName(), detachedContact)); //NOI18N
856 // The contact instance must be valid
857 if (null == detachedContact) {
859 throw new NullPointerException("detachedContact is null"); //NOI18N
860 } else if (detachedContact.getContactId() == null) {
862 throw new NullPointerException("detachedContact.contactId is null"); //NOI18N //NOI18N
863 } else if (detachedContact.getContactId() < 1) {
865 throw new IllegalStateException(MessageFormat.format("{0}.detachedContact.contactId={1} is not valid.", this.getClass().getSimpleName(), detachedContact.getContactId())); //NOI18N
869 final DialableMobileNumber mobile = detachedContact.getContactMobileNumber();
870 final DialableLandLineNumber landLine = detachedContact.getContactLandLineNumber();
871 final DialableFaxNumber fax = detachedContact.getContactFaxNumber();
873 // Is there a mobile instance set?
874 if (mobile instanceof DialableMobileNumber) {
876 this.getLoggerBeanLocal().logDebug(MessageFormat.format("updateUserPersonalData: mobile.phoneId={0} is being updated ...", mobile.getPhoneId())); //NOI18N
879 final DialableMobileNumber foundMobile = this.getEntityManager().find(mobile.getClass(), mobile.getPhoneId());
882 assert (foundMobile instanceof DialableMobileNumber) : MessageFormat.format("Mobile number with id {0} not found but should be.", foundMobile.getPhoneId()); //NOI18N
884 // Then merge it, too
885 final DialableMobileNumber managedMobile = this.getEntityManager().merge(foundMobile);
888 assert (managedMobile instanceof DialableMobileNumber) : MessageFormat.format("Mobile number with id {0} not found but should be.", managedMobile.getPhoneId()); //NOI18N
891 MobileNumbers.copyAll(detachedContact.getContactMobileNumber(), managedMobile);
894 detachedContact.setContactMobileNumber(managedMobile);
897 // Is there a fax instance set?
898 if (fax instanceof DialableFaxNumber) {
900 this.getLoggerBeanLocal().logDebug(MessageFormat.format("updateUserPersonalData: fax.phoneId={0} is being updated ...", fax.getPhoneId())); //NOI18N
903 final DialableFaxNumber foundFax = this.getEntityManager().find(fax.getClass(), fax.getPhoneId());
906 assert (foundFax instanceof DialableFaxNumber) : MessageFormat.format("Fax number with id {0} not found but should be.", foundFax.getPhoneId()); //NOI18N
908 // Then merge it, too
909 final DialableFaxNumber managedFax = this.getEntityManager().merge(foundFax);
912 assert (managedFax instanceof DialableFaxNumber) : MessageFormat.format("Fax number with id {0} not found but should be.", managedFax.getPhoneId()); //NOI18N
915 FaxNumbers.copyAll(detachedContact.getContactFaxNumber(), managedFax);
918 detachedContact.setContactFaxNumber(managedFax);
921 // Is there a fax instance set?
922 if (landLine instanceof DialableLandLineNumber) {
924 this.getLoggerBeanLocal().logDebug(MessageFormat.format("updateUserPersonalData: landLine.phoneId={0} is being updated ...", landLine.getPhoneId())); //NOI18N
927 final DialableLandLineNumber foundLandLine = this.getEntityManager().find(landLine.getClass(), landLine.getPhoneId());
930 assert (foundLandLine instanceof DialableLandLineNumber) : MessageFormat.format("Land line number with id {0} not found but should be.", foundLandLine.getPhoneId()); //NOI18N
932 // Then merge it, too
933 final DialableLandLineNumber managedLandLine = this.getEntityManager().merge(foundLandLine);
936 assert (managedLandLine instanceof DialableLandLineNumber) : MessageFormat.format("Land line number with id {0} not found but should be.", managedLandLine.getPhoneId()); //NOI18N
939 LandLineNumbers.copyAll(detachedContact.getContactLandLineNumber(), managedLandLine);
942 detachedContact.setContactLandLineNumber(managedLandLine);
946 this.getLoggerBeanLocal().logTrace("mergeContactsMobileLandLineFaxNumbers: EXIT!"); //NOI18N
950 * Sends an email with given subject line, template name to given recipient
953 * @param subjectLine Subject line
954 * @param templateName Template name
955 * @param user User instance
956 * @param baseUrl Base URL
957 * @param randomPassword A randomly-generated password or NULL if user had
960 protected void sendEmail (final String subjectLine, final String templateName, final User user, final String baseUrl, final String randomPassword) {
962 this.getLoggerBeanLocal().logTrace(MessageFormat.format("sendEmail: subjectLine={0},templateName={1},user={2},baseUrl={3} - CALLED!", subjectLine, templateName, user, baseUrl)); //NOI18N
965 if (null == subjectLine) {
967 throw new NullPointerException("subjectLine is null"); //NOI18N
968 } else if (subjectLine.isEmpty()) {
970 throw new IllegalArgumentException("subjectLine is empty"); //NOI18N
971 } else if (null == templateName) {
973 throw new NullPointerException("templateName is null"); //NOI18N
974 } else if (templateName.isEmpty()) {
976 throw new IllegalArgumentException("templateName is empty"); //NOI18N
977 } else if (null == user) {
979 throw new NullPointerException("user is null"); //NOI18N
980 } else if (user.getUserId() == null) {
982 throw new NullPointerException("user.userId is null"); //NOI18N
983 } else if (user.getUserId() < 1) {
985 throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is not valid.", user.getUserId())); //NOI18N
986 } else if (user.getUserName() == null) {
988 throw new NullPointerException("user.userName is null"); //NOI18N
989 } else if (user.getUserName().isEmpty()) {
991 throw new IllegalArgumentException("user.userName is empty"); //NOI18N
992 } else if (user.getUserAccountStatus() == null) {
994 throw new NullPointerException("user.userAccountStatus is null"); //NOI18N
995 } else if (user.getUserContact() == null) {
997 throw new NullPointerException("user.userContact is null"); //NOI18N
998 } else if (user.getUserContact().getContactId() == null) {
1000 throw new NullPointerException("user.userContact.contactId is null"); //NOI18N
1001 } else if (user.getUserContact().getContactId() < 1) {
1003 throw new IllegalArgumentException(MessageFormat.format("user.userContact.contactId={0} is invalid", user.getUserContact().getContactId())); //NOI18N
1004 } else if (user.getUserContact().getContactPersonalTitle() == null) {
1006 throw new NullPointerException("user.userContact.contactPersonalTitle is null"); //NOI18N
1007 } else if (user.getUserLocale() == null) {
1009 throw new NullPointerException("user.userLocale is null"); //NOI18N
1010 } else if (this.getSession() == null) {
1012 throw new NullPointerException("this.session is not set. Have you forgotten to call super(String, String) and called only super() ?"); //NOI18N
1016 final Properties variables = UserUtils.getAllUserFields(user);
1018 // Set base URL and random password
1019 variables.put("baseUrl", baseUrl); //NOI18N
1020 variables.put("randomPassword", ""); //NOI18N
1022 // Is the random password set?
1023 if ((randomPassword instanceof String) && (!randomPassword.isEmpty())) {
1024 variables.put("randomPassword", randomPassword); //NOI18N
1028 final Address recipientAddress;
1031 // Create email address and set
1032 recipientAddress = new InternetAddress(user.getUserContact().getContactEmailAddress());
1033 } catch (final AddressException ex) {
1035 throw new EJBException(ex);
1038 // Prepare mail wrapper
1039 // @TODO Language from message bundle
1040 final WrapableEmailDelivery emailWrapper = new EmailDeliveryWrapper(recipientAddress, subjectLine, templateName, variables, user.getUserLocale());
1043 // Send out email change
1044 final ObjectMessage message = this.getSession().createObjectMessage();
1045 message.setObject(emailWrapper);
1048 this.sendMessage(message);
1049 } catch (final JMSException ex) {
1051 throw new EJBException(ex);
1055 this.getLoggerBeanLocal().logTrace("sendEmail: EXIT!"); //NOI18N
1059 * Updates all contact's phone instances from other contact, both contacts
1060 * should be the same.
1062 * @param contact Contact to set instances
1063 * @param other Other contact to get instances from
1065 protected void setAllContactPhoneEntries (final Contact contact, final Contact other) {
1067 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntries: contact={1},other={2} - CALLED!", this.getClass().getSimpleName(), contact, other)); //NOI18N
1069 // Both must be the same and not null
1070 if (null == contact) {
1072 throw new NullPointerException("contact is null"); //NOI18N
1073 } else if (null == other) {
1075 throw new NullPointerException("other is null"); //NOI18N
1076 } else if (!Objects.equals(contact, other)) {
1077 // Not same instances
1078 throw new IllegalArgumentException(MessageFormat.format("{0}.setAllContactPhoneEntries: contact={1} and other={2} are not equal!", this.getClass().getSimpleName(), contact, other)); //NOI18N
1082 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: other.contactMobileNumber={0}", other.getContactMobileNumber())); //NOI18N
1084 // Is other mobile not set?
1085 if ((other.getContactMobileNumber() == null) || (PhoneUtils.isSameMobileNumber(contact.getContactMobileNumber(), other.getContactMobileNumber()))) {
1087 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: Copying mobile entry ...", this.getClass().getSimpleName())); //NOI18N
1089 // Is the fax number set?
1090 if (other.getContactMobileNumber() instanceof DialableMobileNumber) {
1091 // Copy mobile number
1092 contact.setContactMobileNumber(this.getManaged(other.getContactMobileNumber(), contact.getContactMobileNumber()));
1095 contact.setContactMobileNumber(null);
1100 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: other.contactLandLineNumber={0}", other.getContactLandLineNumber())); //NOI18N
1102 // Is other mobile not set?
1103 if ((other.getContactLandLineNumber() == null) || (PhoneUtils.isSameLandLineNumber(contact.getContactLandLineNumber(), other.getContactLandLineNumber()))) {
1105 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: Copying land-line entry ...", this.getClass().getSimpleName())); //NOI18N
1107 // Is the land-line number set?
1108 if (other.getContactLandLineNumber() instanceof DialableLandLineNumber) {
1109 // Copy land-line number
1110 contact.setContactLandLineNumber(this.getManaged(other.getContactLandLineNumber(), contact.getContactLandLineNumber()));
1113 contact.setContactLandLineNumber(null);
1118 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: other.contactFaxNumber={1}", this.getClass().getSimpleName(), other.getContactFaxNumber())); //NOI18N
1120 // Is other mobile not set?
1121 if ((other.getContactFaxNumber() == null) || (PhoneUtils.isSameFaxNumber(contact.getContactFaxNumber(), other.getContactFaxNumber()))) {
1123 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntries: Copying fax entry ...", this.getClass().getSimpleName())); //NOI18N
1125 // Is the fax number set?
1126 if (other.getContactFaxNumber() instanceof DialableFaxNumber) {
1128 contact.setContactFaxNumber(this.getManaged(other.getContactFaxNumber(), contact.getContactFaxNumber()));
1131 contact.setContactFaxNumber(null);
1136 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntries: EXIT!", this.getClass().getSimpleName())); //NOI18N
1140 * Updates all contact's phone entry's updated timestamps
1142 * @param contact Contact instance to update
1143 * @param isMobileUnlinked Whether a mobile entry has been unlinked in
1145 * @param isLandlineUnlinked Whether a land-line entry has been unlinked in
1147 * @param isFaxUnlinked Whether a fax entry has been unlinked in
1150 protected void setAllContactPhoneEntriesUpdated (final Contact contact, final boolean isMobileUnlinked, final boolean isLandlineUnlinked, final boolean isFaxUnlinked) {
1152 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntriesUpdated: contact={1},isMobileUnlinked={2},isLandlineUnlinked={3},isFaxUnlinked={4} - CALLED", this.getClass().getSimpleName(), contact, isMobileUnlinked, isLandlineUnlinked, isFaxUnlinked)); //NOI18N
1154 // The contact instance must be valid
1155 if (null == contact) {
1157 throw new NullPointerException("contact is null"); //NOI18N
1158 } else if (contact.getContactId() == null) {
1160 throw new NullPointerException("contact.contactId is null"); //NOI18N //NOI18N
1161 } else if (contact.getContactId() < 1) {
1163 throw new IllegalStateException(MessageFormat.format("contact.contactId={0} is not valid.", contact.getContactId())); //NOI18N
1166 // Get all phone instances
1167 final DialableLandLineNumber landLineNumber = contact.getContactLandLineNumber();
1168 final DialableFaxNumber faxNumber = contact.getContactFaxNumber();
1169 final DialableMobileNumber mobileNumber = contact.getContactMobileNumber();
1171 // Flags and instances must be constistent
1172 if (isMobileUnlinked && mobileNumber instanceof DialableMobileNumber) {
1174 throw new IllegalStateException("isCellPhoneUnlinked is TRUE, but mobileNumber is set."); //NOI18N
1175 } else if (isLandlineUnlinked && landLineNumber instanceof DialableLandLineNumber) {
1177 throw new IllegalStateException("isLandlineUnlinked is TRUE, but landLineNumber is set."); //NOI18N
1178 } else if (isFaxUnlinked && faxNumber instanceof DialableFaxNumber) {
1180 throw new IllegalStateException("isFaxUnlinked is TRUE, but faxNumber is set."); //NOI18N
1183 // Is a phone number instance set?
1184 if ((landLineNumber instanceof DialableLandLineNumber) && (landLineNumber.getPhoneId() instanceof Long) && (landLineNumber.getPhoneId() > 0)) {
1186 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesUpdated: Setting updated timestamp for land-line number ...", this.getClass().getSimpleName())); //NOI18N
1188 // Set updated timestamp
1189 landLineNumber.setPhoneEntryUpdated(new Date());
1192 // Is a fax number instance set?
1193 if ((faxNumber instanceof DialableFaxNumber) && (faxNumber.getPhoneId() instanceof Long) && (faxNumber.getPhoneId() > 0)) {
1195 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesUpdated: Setting updated timestamp for fax number ...", this.getClass().getSimpleName())); //NOI18N
1197 // Set updated timestamp
1198 faxNumber.setPhoneEntryUpdated(new Date());
1201 // Is a mobile number instance set?
1202 if ((mobileNumber instanceof DialableMobileNumber) && (mobileNumber.getPhoneId() instanceof Long) && (mobileNumber.getPhoneId() > 0)) {
1204 this.getLoggerBeanLocal().logDebug(MessageFormat.format("{0}.setAllContactPhoneEntriesUpdated: Setting updated timestamp for mobile number ...", this.getClass().getSimpleName())); //NOI18N
1206 // Set updated timestamp
1207 mobileNumber.setPhoneEntryUpdated(new Date());
1211 this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.setAllContactPhoneEntriesUpdated: EXIT!", this.getClass().getSimpleName())); //NOI18N