Java tutorial
/** * The software subject to this notice and license includes both human readable * source code form and machine readable, binary, object code form. The NCI OCR * Software was developed in conjunction with the National Cancer Institute * (NCI) by NCI employees and 5AM Solutions, Inc. (5AM). To the extent * government employees are authors, any rights in such works shall be subject * to Title 17 of the United States Code, section 105. * * This NCI OCR Software License (the License) is between NCI and You. You (or * Your) shall mean a person or an entity, and all other entities that control, * are controlled by, or are under common control with the entity. Control for * purposes of this definition means (i) the direct or indirect power to cause * the direction or management of such entity, whether by contract or otherwise, * or (ii) ownership of fifty percent (50%) or more of the outstanding shares, * or (iii) beneficial ownership of such entity. * * This License is granted provided that You agree to the conditions described * below. NCI grants You a non-exclusive, worldwide, perpetual, fully-paid-up, * no-charge, irrevocable, transferable and royalty-free right and license in * its rights in the NCI OCR Software to (i) use, install, access, operate, * execute, copy, modify, translate, market, publicly display, publicly perform, * and prepare derivative works of the NCI OCR Software; (ii) distribute and * have distributed to and by third parties the NCI OCR Software and any * modifications and derivative works thereof; and (iii) sublicense the * foregoing rights set out in (i) and (ii) to third parties, including the * right to license such rights to further third parties. For sake of clarity, * and not by way of limitation, NCI shall have no right of accounting or right * of payment from You or Your sub-licensees for the rights granted under this * License. This License is granted at no charge to You. * * Your redistributions of the source code for the Software must retain the * above copyright notice, this list of conditions and the disclaimer and * limitation of liability of Article 6, below. Your redistributions in object * code form must reproduce the above copyright notice, this list of conditions * and the disclaimer of Article 6 in the documentation and/or other materials * provided with the distribution, if any. * * Your end-user documentation included with the redistribution, if any, must * include the following acknowledgment: This product includes software * developed by 5AM and the National Cancer Institute. If You do not include * such end-user documentation, You shall include this acknowledgment in the * Software itself, wherever such third-party acknowledgments normally appear. * * You may not use the names "The National Cancer Institute", "NCI", or "5AM" * to endorse or promote products derived from this Software. This License does * not authorize You to use any trademarks, service marks, trade names, logos or * product names of either NCI or 5AM, except as required to comply with the * terms of this License. * * For sake of clarity, and not by way of limitation, You may incorporate this * Software into Your proprietary programs and into any third party proprietary * programs. However, if You incorporate the Software into third party * proprietary programs, You agree that You are solely responsible for obtaining * any permission from such third parties required to incorporate the Software * into such third party proprietary programs and for informing Your * sub-licensees, including without limitation Your end-users, of their * obligation to secure any required permissions from such third parties before * incorporating the Software into such third party proprietary software * programs. In the event that You fail to obtain such permissions, You agree * to indemnify NCI for any claims against NCI by such third parties, except to * the extent prohibited by law, resulting from Your failure to obtain such * permissions. * * For sake of clarity, and not by way of limitation, You may add Your own * copyright statement to Your modifications and to the derivative works, and * You may provide additional or different license terms and conditions in Your * sublicenses of modifications of the Software, or any derivative works of the * Software as a whole, provided Your use, reproduction, and distribution of the * Work otherwise complies with the conditions stated in this License. * * THIS SOFTWARE IS PROVIDED "AS IS," AND ANY EXPRESSED OR IMPLIED WARRANTIES, * (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, * NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. IN NO * EVENT SHALL THE NATIONAL CANCER INSTITUTE, 5AM SOLUTIONS, INC. OR THEIR * AFFILIATES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package gov.nih.nci.firebird.service.account; import static gov.nih.nci.firebird.data.user.UserRoleType.*; import static org.apache.commons.lang3.StringUtils.*; import gov.nih.nci.firebird.cagrid.GridGrouperService; import gov.nih.nci.firebird.cagrid.GridInvocationException; import gov.nih.nci.firebird.common.ValidationFailure; import gov.nih.nci.firebird.data.InvestigatorProfile; import gov.nih.nci.firebird.data.Organization; import gov.nih.nci.firebird.data.Person; import gov.nih.nci.firebird.data.user.FirebirdUser; import gov.nih.nci.firebird.data.user.ManagedInvestigator; import gov.nih.nci.firebird.data.user.SponsorRole; import gov.nih.nci.firebird.data.user.UserRoleType; import gov.nih.nci.firebird.exception.ValidationException; import gov.nih.nci.firebird.service.investigatorprofile.InvestigatorProfileService; import gov.nih.nci.firebird.service.messages.FirebirdMessage; import gov.nih.nci.firebird.service.messages.FirebirdMessageTemplate; import gov.nih.nci.firebird.service.messages.FirebirdTemplateParameter; import gov.nih.nci.firebird.service.messages.TemplateService; import gov.nih.nci.firebird.service.messages.email.EmailService; import gov.nih.nci.firebird.service.organization.InvalidatedOrganizationException; import gov.nih.nci.firebird.service.organization.OrganizationAssociationService; import gov.nih.nci.firebird.service.organization.OrganizationService; import gov.nih.nci.firebird.service.person.PersonService; import gov.nih.nci.firebird.service.person.external.InvalidatedPersonException; import gov.nih.nci.firebird.service.user.FirebirdUserService; import java.util.EnumMap; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.name.Named; /** * Helper class used during initial account registration and addition and removal of roles later. */ @SuppressWarnings("PMD.TooManyMethods") // contains many private helper methods class AccountConfigurationHelper { private static final String PERSON_ALREADY_ASSOCIATED_ERROR_KEY = "investigator.profile.alreadyAssociated"; private static final Set<UserRoleType> ROLES_REQUIRING_NOTIFICATION = EnumSet.of(INVESTIGATOR, SPONSOR, SPONSOR_DELEGATE); private InvestigatorProfileService profileService; private PersonService personService; private OrganizationService organizationService; private FirebirdUserService userService; private ResourceBundle resources; private EmailService emailService; private TemplateService templateService; private GridGrouperService gridGrouperService; private String supportEmailAddress; private OrganizationAssociationService organizationAssociationService; @Inject void setProfileService(InvestigatorProfileService profileService) { this.profileService = profileService; } @Inject void setPersonService(PersonService personService) { this.personService = personService; } @Inject void setOrganizationService(OrganizationService organizationService) { this.organizationService = organizationService; } @Inject void setUserService(FirebirdUserService userService) { this.userService = userService; } @Inject void setResources(ResourceBundle resources) { this.resources = resources; } @Inject void setEmailService(@Named("jmsEmailService") EmailService emailService) { this.emailService = emailService; } @Inject void setTemplateService(TemplateService templateService) { this.templateService = templateService; } @Inject void setSupportEmailAddress(@Named("firebird.email.support.address") String supportEmailAddress) { this.supportEmailAddress = supportEmailAddress; } @Inject void setOrganizationAssociationService(OrganizationAssociationService organizationAssociationService) { this.organizationAssociationService = organizationAssociationService; } @Inject void setGridGrouperService(GridGrouperService gridGrouperService) { this.gridGrouperService = gridGrouperService; } FirebirdUser createUser(AccountConfigurationData configurationData) throws ValidationException { try { refreshConfigurationEntities(configurationData); FirebirdUser user = new FirebirdUser(); user.setUsername(configurationData.getUsername()); user.setEulaAccepted(true); user.setPerson(configurationData.getPerson()); handlePerson(user); handleRoles(user, configurationData, false); userService.save(user); return user; } catch (GridInvocationException e) { throw new IllegalStateException("No grid functionality should have been invoked", e); } } private void handlePerson(FirebirdUser user) throws ValidationException { if (!user.getPerson().hasExternalRecord()) { personService.save(user.getPerson()); } else { checkPersonFreeForSelection(user.getPerson()); } } private void checkPersonFreeForSelection(Person person) throws ValidationException { boolean isFreeForSelection = !userService.checkPersonAssociated(person); if (!isFreeForSelection) { String message = resources.getString(PERSON_ALREADY_ASSOCIATED_ERROR_KEY); ValidationFailure failure = new ValidationFailure(message); throw new ValidationException(failure); } } private void handleRoles(FirebirdUser user, AccountConfigurationData configurationData, boolean addGroupMemberships) throws ValidationException, GridInvocationException { if (configurationData.getRoles().contains(UserRoleType.INVESTIGATOR)) { addInvestigatorRole(user, configurationData, addGroupMemberships); } if (configurationData.getRoles().contains(UserRoleType.REGISTRATION_COORDINATOR)) { addRegistrationCoordinatorRole(user, configurationData, addGroupMemberships); } if (configurationData.getRoles().contains(UserRoleType.SPONSOR)) { addSponsorRoles(user, configurationData, addGroupMemberships); } if (configurationData.getRoles().contains(UserRoleType.SPONSOR_DELEGATE)) { addSponsorDelegateRoles(user, configurationData, addGroupMemberships); } } private void addInvestigatorRole(FirebirdUser user, AccountConfigurationData configurationData, boolean addGroupMemberships) throws ValidationException, GridInvocationException { InvestigatorProfile profile = profileService.getByPerson(configurationData.getPerson()); if (profile == null) { profile = new InvestigatorProfile(); profile.setPerson(configurationData.getPerson()); } profile.setPrimaryOrganization(configurationData.getPrimaryOrganization()); user.createInvestigatorRole(profile); if (!configurationData.getPrimaryOrganization().getOrganization().hasExternalRecord()) { organizationAssociationService.createNewPrimaryOrganization(configurationData.getPrimaryOrganization()); } profileService.setPrimaryOrganization(profile, configurationData.getPrimaryOrganization()); if (addGroupMemberships) { gridGrouperService.addGridUserToGroup(user.getUsername(), INVESTIGATOR.getGroupName()); } } private void addRegistrationCoordinatorRole(FirebirdUser user, AccountConfigurationData configurationData, boolean addGroupMemberships) throws GridInvocationException { user.createRegistrationCoordinatorRole(); for (InvestigatorProfile profile : configurationData.getSelectedInvestigators()) { ManagedInvestigator managedInvestigator = user.getRegistrationCoordinatorRole() .addManagedInvestigator(profile); notifyOfRegistrationCoordinatorRequest(managedInvestigator); } if (addGroupMemberships) { gridGrouperService.addGridUserToGroup(user.getUsername(), REGISTRATION_COORDINATOR.getGroupName()); } } private void addSponsorRoles(FirebirdUser user, AccountConfigurationData configurationData, boolean addGroupMemberships) throws GridInvocationException { for (Organization sponsor : configurationData.getSponsorOrganizations()) { SponsorRole role = user.addSponsorRepresentativeRole(sponsor); if (addGroupMemberships) { gridGrouperService.addGridUserToGroup(user.getUsername(), role.getSponsorOrganizationGroupName()); } } } private void addSponsorDelegateRoles(FirebirdUser user, AccountConfigurationData configurationData, boolean addGroupMemberships) throws GridInvocationException { for (Organization sponsor : configurationData.getDelegateOrganizations()) { SponsorRole role = user.addSponsorDelegateRole(sponsor); if (addGroupMemberships) { gridGrouperService.addGridUserToGroup(user.getUsername(), role.getSponsorOrganizationGroupName()); } } } void addRoles(FirebirdUser user, AccountConfigurationData configurationData) throws ValidationException, GridInvocationException { refreshConfigurationEntities(configurationData); handleRoles(user, configurationData, true); if (isSupportEmailRequired(configurationData)) { sendAddedRolesSupportEmail(user, configurationData); } userService.save(user); } private boolean isSupportEmailRequired(AccountConfigurationData configurationData) { return !Sets.intersection(configurationData.getRoles(), ROLES_REQUIRING_NOTIFICATION).isEmpty(); } private void sendAddedRolesSupportEmail(FirebirdUser user, AccountConfigurationData configurationData) { Map<FirebirdTemplateParameter, Object> parameterValues = new HashMap<FirebirdTemplateParameter, Object>(); parameterValues.put(FirebirdTemplateParameter.ACCOUNT_DATA, configurationData); parameterValues.put(FirebirdTemplateParameter.FIREBIRD_USER, user); FirebirdMessage message = templateService .generateMessage(FirebirdMessageTemplate.ADDED_ROLES_SUPPORT_NOTIFICATION_EMAIL, parameterValues); emailService.sendMessage(supportEmailAddress, null, null, message); } private void refreshConfigurationEntities(AccountConfigurationData configurationData) { configurationData.setPerson(getRefreshedPerson(configurationData.getPerson())); if (configurationData.hasPrimaryOrganization()) { configurationData.getPrimaryOrganization().setOrganization( getRefreshedOrganization(configurationData.getPrimaryOrganization().getOrganization())); } refreshOrganizations(configurationData.getDelegateOrganizations()); refreshOrganizations(configurationData.getSponsorOrganizations()); refreshProfiles(configurationData.getSelectedInvestigators()); } private void refreshOrganizations(Set<Organization> organizations) { Set<Organization> organizationsToRefresh = Sets.newHashSet(organizations); organizations.clear(); for (Organization organization : organizationsToRefresh) { organizations.add(getRefreshedOrganization(organization)); } } private void refreshProfiles(Set<InvestigatorProfile> profiles) { Set<InvestigatorProfile> profilesToRefresh = Sets.newHashSet(profiles); profiles.clear(); for (InvestigatorProfile profile : profilesToRefresh) { profiles.add(getRefreshedProfile(profile)); } } private InvestigatorProfile getRefreshedProfile(InvestigatorProfile profile) { if (profile.getId() != null) { return profileService.getById(profile.getId()); } else { return profile; } } private Person getRefreshedPerson(Person person) { if (person != null && person.getId() != null) { return retrievePerson(person); } else { return person; } } private Person retrievePerson(Person person) { try { return personService.getByExternalId(person.getExternalId()); } catch (InvalidatedPersonException e) { throw new IllegalStateException("Unexpected failure for person external id: " + person.getExternalId(), e); } } private Organization getRefreshedOrganization(Organization organization) { if (organization != null && !isEmpty(organization.getExternalId())) { return getOrganization(organization); } else { return organization; } } private Organization getOrganization(Organization organization) { try { return organizationService.getByExternalId(organization.getExternalId()); } catch (InvalidatedOrganizationException e) { throw new IllegalStateException( "Unexpected failure for organization external id: " + organization.getExternalId(), e); } } void notifyOfRegistrationCoordinatorRequest(ManagedInvestigator managedInvestigator) { Map<FirebirdTemplateParameter, Object> parameterValues = new EnumMap<FirebirdTemplateParameter, Object>( FirebirdTemplateParameter.class); parameterValues.put(FirebirdTemplateParameter.REGISTRATION_COORDINATOR, managedInvestigator.getUser().getPerson()); FirebirdMessage message = templateService .generateMessage(FirebirdMessageTemplate.REGISTRATION_COORDINATOR_REQUEST_EMAIL, parameterValues); String investigatorEmail = managedInvestigator.getInvestigatorProfile().getPerson().getEmail(); emailService.sendMessage(investigatorEmail, null, null, message); } }