From 596ad96c7c2085adda9f6560093412745794ce02 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Sat, 9 Sep 2017 14:18:10 +0200 Subject: [PATCH] Please cherry-pick: - introduced isSameCompanyNameAdded() which encapsulates checking for if a company name has already been used. This is, together with the thrown checked exception a last effort to prevent bad bad SqlException or any other "low-level" exception as they are more severage than this. - thumb of a rule: always pre-validate if all conditions are met (return "okay") prior doing risky things where uncontrolled exceptions may be thrown. - make company-owner (User), founder (Employee) and contact person (dito) managed before persisting the whole BasicData instance as this makes sure that no duplicates will end up in database MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- ...inancialsAdminBusinessDataSessionBean.java | 72 +++++++++++++++---- ...inancialsAdminBranchOfficeSessionBean.java | 6 +- .../database/BaseFinancialsDatabaseBean.java | 68 ++++++++++++++---- .../user/FinancialsAdminUserSessionBean.java | 2 +- .../FinancialsUserActivityLogMessageBean.java | 2 +- 5 files changed, 116 insertions(+), 34 deletions(-) diff --git a/src/java/org/mxchange/jcontactsbusiness/basicdata/FinancialsAdminBusinessDataSessionBean.java b/src/java/org/mxchange/jcontactsbusiness/basicdata/FinancialsAdminBusinessDataSessionBean.java index c00b268..c786968 100644 --- a/src/java/org/mxchange/jcontactsbusiness/basicdata/FinancialsAdminBusinessDataSessionBean.java +++ b/src/java/org/mxchange/jcontactsbusiness/basicdata/FinancialsAdminBusinessDataSessionBean.java @@ -22,8 +22,10 @@ import java.util.List; import java.util.Objects; import javax.ejb.EJB; import javax.ejb.Stateless; +import org.mxchange.jcontactsbusiness.employee.Employee; import org.mxchange.jcontactsbusiness.exceptions.basicdata.BusinessDataAlreadyAddedException; import org.mxchange.jfinancials.database.BaseFinancialsDatabaseBean; +import org.mxchange.jusercore.model.user.User; /** * An administrative stateless session bean for business data @@ -64,25 +66,40 @@ public class FinancialsAdminBusinessDataSessionBean extends BaseFinancialsDataba } else if (basicData.getBasicDataId() != null) { // Should be null throw new IllegalArgumentException(MessageFormat.format("basicData.basicDataId={0} - is not null", basicData.getBasicDataId())); //NOI18N + } else if (this.isSameCompanyNameAdded(basicData)) { + // Throw exception + throw new BusinessDataAlreadyAddedException(basicData); } - // Get all available entries - final List list = this.businessDataBean.allCompanyBasicData(); + // Now add current date + basicData.setCompanyCreated(new GregorianCalendar()); - // Is the list filled? - if (!list.isEmpty()) { - // Then check each entry - for (final BusinessBasicData entry : list) { - // Is the company name matching? - if (Objects.equals(entry.getCompanyName(), basicData.getCompanyName())) { - // Found match - throw new BusinessDataAlreadyAddedException(basicData); - } - } + // Is there a owner set? + if (basicData.getCompanyUserOwner() instanceof User) { + // Get managed instance + final User managedUser = this.createManaged(basicData.getCompanyUserOwner()); + + // Set it back + basicData.setCompanyUserOwner(managedUser); } - // Now add current date - basicData.setCompanyCreated(new GregorianCalendar()); + // Is a founder set? + if (basicData.getCompanyFounder() instanceof Employee) { + // Get managed instance + final Employee managedEmployee = this.createManaged(basicData.getCompanyFounder()); + + // Set it back + basicData.setCompanyFounder(managedEmployee); + } + + // Is a contact person set? + if (basicData.getCompanyContactEmployee() instanceof Employee) { + // Get managed instance + final Employee managedEmployee = this.createManaged(basicData.getCompanyContactEmployee()); + + // Set it back + basicData.setCompanyContactEmployee(managedEmployee); + } // Persist it this.getEntityManager().persist(basicData); @@ -94,4 +111,31 @@ public class FinancialsAdminBusinessDataSessionBean extends BaseFinancialsDataba return basicData; } + /** + * Checks if given basic data is already added by it's company name + *

+ * @param basicData Basic data to be checked + * + * @return Whether same company name has been used + */ + private boolean isSameCompanyNameAdded (final BusinessBasicData basicData) { + // Get all available entries + final List list = this.businessDataBean.allCompanyBasicData(); + + // Default is not found + boolean isFound = false; + + // Then check each entry + for (final BusinessBasicData entry : list) { + // Is the company name matching? + if (Objects.equals(entry.getCompanyName(), basicData.getCompanyName())) { + // Found match + isFound = true; + } + } + + // Return flag + return isFound; + } + } diff --git a/src/java/org/mxchange/jcontactsbusiness/branchoffice/FinancialsAdminBranchOfficeSessionBean.java b/src/java/org/mxchange/jcontactsbusiness/branchoffice/FinancialsAdminBranchOfficeSessionBean.java index c15a831..3b3b213 100644 --- a/src/java/org/mxchange/jcontactsbusiness/branchoffice/FinancialsAdminBranchOfficeSessionBean.java +++ b/src/java/org/mxchange/jcontactsbusiness/branchoffice/FinancialsAdminBranchOfficeSessionBean.java @@ -77,7 +77,7 @@ public class FinancialsAdminBranchOfficeSessionBean extends BaseFinancialsDataba // Is user instance set? if (branchOffice.getBranchCompany() instanceof BusinessBasicData) { // Get managed instance back - final BusinessBasicData managedBasicData = this.getManaged(branchOffice.getBranchCompany()); + final BusinessBasicData managedBasicData = this.createManaged(branchOffice.getBranchCompany()); // Set it back in branch office branchOffice.setBranchCompany(managedBasicData); @@ -86,7 +86,7 @@ public class FinancialsAdminBranchOfficeSessionBean extends BaseFinancialsDataba // Is user instance set? if (branchOffice.getBranchUserOwner() instanceof User) { // Get managed instance back - final User managedUser = this.getManaged(branchOffice.getBranchUserOwner()); + final User managedUser = this.createManaged(branchOffice.getBranchUserOwner()); // Set it back in branch office branchOffice.setBranchUserOwner(managedUser); @@ -95,7 +95,7 @@ public class FinancialsAdminBranchOfficeSessionBean extends BaseFinancialsDataba // Is user instance set? if (branchOffice.getBranchCountry() instanceof Country) { // Get managed instance back - final Country managedCountry = this.getManaged(branchOffice.getBranchCountry()); + final Country managedCountry = this.createManaged(branchOffice.getBranchCountry()); // Set it back in branch office branchOffice.setBranchCountry(managedCountry); diff --git a/src/java/org/mxchange/jfinancials/database/BaseFinancialsDatabaseBean.java b/src/java/org/mxchange/jfinancials/database/BaseFinancialsDatabaseBean.java index 6ecf898..42255e5 100644 --- a/src/java/org/mxchange/jfinancials/database/BaseFinancialsDatabaseBean.java +++ b/src/java/org/mxchange/jfinancials/database/BaseFinancialsDatabaseBean.java @@ -31,6 +31,8 @@ import org.mxchange.jcontacts.contact.ContactUtils; import org.mxchange.jcontacts.contact.UserContact; import org.mxchange.jcontactsbusiness.basicdata.BusinessBasicData; import org.mxchange.jcontactsbusiness.basicdata.CompanyBasicData; +import org.mxchange.jcontactsbusiness.employee.CompanyEmployee; +import org.mxchange.jcontactsbusiness.employee.Employee; import org.mxchange.jcoreee.database.BaseDatabaseBean; import org.mxchange.jcountry.data.Country; import org.mxchange.jcountry.data.CountryData; @@ -283,9 +285,9 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { *

* @return Managed contact instance */ - protected Contact getManaged (final Contact contact) { + protected Contact createManaged (final Contact contact) { // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: contact={1} - CALLED!", this.getClass().getSimpleName(), contact)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: contact={1} - CALLED!", this.getClass().getSimpleName(), contact)); //NOI18N // user should not be null if (null == contact) { @@ -306,7 +308,7 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { assert (managedContact instanceof Contact) : "managedContact is null"; //NOI18N // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: managedContact={1} - EXIT!", this.getClass().getSimpleName(), managedContact)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedContact={1} - EXIT!", this.getClass().getSimpleName(), managedContact)); //NOI18N // Return it return managedContact; @@ -319,9 +321,9 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { *

* @return Managed country instance */ - protected Country getManaged (final Country country) { + protected Country createManaged (final Country country) { // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: country={1} - CALLED!", this.getClass().getSimpleName(), country)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: country={1} - CALLED!", this.getClass().getSimpleName(), country)); //NOI18N // user should not be null if (null == country) { @@ -342,22 +344,22 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { assert (managedCountry instanceof Country) : "managedCountry is null"; //NOI18N // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: managedCountry={1} - EXIT!", this.getClass().getSimpleName(), managedCountry)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedCountry={1} - EXIT!", this.getClass().getSimpleName(), managedCountry)); //NOI18N // Return it return managedCountry; } /** - * Get back a managed instance from given contact + * Get back a managed instance from given basic data *

- * @param basicData Unmanaged/detached contact instance + * @param basicData Unmanaged/detached basic data instance *

- * @return Managed contact instance + * @return Managed basic data instance */ - protected BusinessBasicData getManaged (final BusinessBasicData basicData) { + protected BusinessBasicData createManaged (final BusinessBasicData basicData) { // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: basicData={1} - CALLED!", this.getClass().getSimpleName(), basicData)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: basicData={1} - CALLED!", this.getClass().getSimpleName(), basicData)); //NOI18N // user should not be null if (null == basicData) { @@ -378,12 +380,48 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { assert (managedBasicData instanceof BusinessBasicData) : "managedBasicData is null"; //NOI18N // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: managedBasicData={1} - EXIT!", this.getClass().getSimpleName(), managedBasicData)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedBasicData={1} - EXIT!", this.getClass().getSimpleName(), managedBasicData)); //NOI18N // Return it return managedBasicData; } + /** + * Get back a managed instance from given employee + *

+ * @param employee Unmanaged/detached employee instance + *

+ * @return Managed employee instance + */ + protected Employee createManaged (final Employee employee) { + // Trace message + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: employee={1} - CALLED!", this.getClass().getSimpleName(), employee)); //NOI18N + + // user should not be null + if (null == employee) { + // Abort here + throw new NullPointerException("employee is null"); //NOI18N + } else if (employee.getEmployeeId() == null) { + // Id is set + throw new NullPointerException("employee.employeeId is null"); //NOI18N + } else if (employee.getEmployeeId() < 1) { + // Id is set + throw new IllegalArgumentException(MessageFormat.format("employee.employeeId={0} is null", employee.getEmployeeId())); //NOI18N + } + + // Try to find it (should be there) + final Employee managedEmployee = this.getEntityManager().find(CompanyEmployee.class, employee.getEmployeeId()); + + // Should be there + assert (managedEmployee instanceof Employee) : "managedEmployee is null"; //NOI18N + + // Trace message + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedEmployee={1} - EXIT!", this.getClass().getSimpleName(), managedEmployee)); //NOI18N + + // Return it + return managedEmployee; + } + /** * Get back a managed instance from given user *

@@ -391,9 +429,9 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { *

* @return Managed user instance */ - protected User getManaged (final User user) { + protected User createManaged (final User user) { // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: user={1} - CALLED!", this.getClass().getSimpleName(), user)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: user={1} - CALLED!", this.getClass().getSimpleName(), user)); //NOI18N // user should not be null if (null == user) { @@ -423,7 +461,7 @@ public abstract class BaseFinancialsDatabaseBean extends BaseDatabaseBean { assert (managedUser instanceof User) : "managedUser is null"; //NOI18N // Trace message - this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.getManaged: managedUser={1} - EXIT!", this.getClass().getSimpleName(), managedUser)); //NOI18N + this.getLoggerBeanLocal().logTrace(MessageFormat.format("{0}.createManaged: managedUser={1} - EXIT!", this.getClass().getSimpleName(), managedUser)); //NOI18N // Return it return managedUser; diff --git a/src/java/org/mxchange/jusercore/model/user/FinancialsAdminUserSessionBean.java b/src/java/org/mxchange/jusercore/model/user/FinancialsAdminUserSessionBean.java index f6e2d1b..21bdfec 100644 --- a/src/java/org/mxchange/jusercore/model/user/FinancialsAdminUserSessionBean.java +++ b/src/java/org/mxchange/jusercore/model/user/FinancialsAdminUserSessionBean.java @@ -137,7 +137,7 @@ public class FinancialsAdminUserSessionBean extends BaseFinancialsDatabaseBean i } // Get a managed instance - final User managedUser = this.getManaged(user); + final User managedUser = this.createManaged(user); // Should be found! assert (managedUser instanceof User) : MessageFormat.format("User with id {0} not found, but should be.", user.getUserId()); //NOI18N diff --git a/src/java/org/mxchange/jusercore/model/user/activity/FinancialsUserActivityLogMessageBean.java b/src/java/org/mxchange/jusercore/model/user/activity/FinancialsUserActivityLogMessageBean.java index 7b2753d..dcbf1d8 100644 --- a/src/java/org/mxchange/jusercore/model/user/activity/FinancialsUserActivityLogMessageBean.java +++ b/src/java/org/mxchange/jusercore/model/user/activity/FinancialsUserActivityLogMessageBean.java @@ -136,7 +136,7 @@ public class FinancialsUserActivityLogMessageBean extends BaseFinancialsDatabase } // Make user instance managed - final User managedUser = this.getManaged(userActivity.getActivityUser()); + final User managedUser = this.createManaged(userActivity.getActivityUser()); // Set it back userActivity.setActivityUser(managedUser); -- 2.39.5