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.sponsor; import static gov.nih.nci.firebird.service.messages.FirebirdTemplateParameter.*; import gov.nih.nci.firebird.cagrid.GridGrouperService; import gov.nih.nci.firebird.cagrid.GridInvocationException; import gov.nih.nci.firebird.common.FirebirdConstants; import gov.nih.nci.firebird.data.AbstractProtocolRegistration; import gov.nih.nci.firebird.data.AbstractRegistration; import gov.nih.nci.firebird.data.AnnualRegistration; import gov.nih.nci.firebird.data.Organization; import gov.nih.nci.firebird.data.Protocol; import gov.nih.nci.firebird.data.RegistrationStatus; import gov.nih.nci.firebird.data.user.FirebirdUser; import gov.nih.nci.firebird.data.user.SponsorRole; 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.OrganizationService; import gov.nih.nci.firebird.service.user.FirebirdUserService; import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; /** * Manage Sponsor Organizations. */ @Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) @SuppressWarnings({ "PMD.TooManyStaticImports", "PMD.TooManyMethods" }) // require various templates and parameters for notification emails // helper methods broken out for readability public class SponsorServiceBean implements SponsorService { private static final Logger LOG = Logger.getLogger(SponsorServiceBean.class); private OrganizationService organizationService; private Provider<Session> sessionProvider; private FirebirdUserService firebirdUserService; private GridGrouperService gridGrouperService; private TemplateService templateService; private EmailService emailService; private Map<String, String> sponsorEmailMappings = Maps.newHashMap(); private Set<String> validSponsorExternalIds; private Set<String> sponsorWithProtocolRegistrationsExternalIds; private String sponsorWithAnnualRegistrationsExternalId; private Organization sponsorWithAnnualRegistrations; private Set<Organization> sponsorsWithProtocolRegistrations; private Set<Organization> sponsorOrganizations; @Inject void setGridGrouperService(GridGrouperService gridGrouperService) { this.gridGrouperService = gridGrouperService; } @Inject void setSessionProvider(Provider<Session> sessionProvider) { this.sessionProvider = sessionProvider; } @Resource(mappedName = "firebird/FirebirdUserServiceBean/local") void setFirebirdUserService(FirebirdUserService firebirdUserService) { this.firebirdUserService = firebirdUserService; } @Inject void setTemplateService(TemplateService templateService) { this.templateService = templateService; } @Inject void setEmailService(@Named("jmsEmailService") EmailService emailService) { this.emailService = emailService; } @Inject void setValidSponsorExternalIds(@Named("sponsor.organization.nes.ids") Set<String> validSponsorExternalIds) { this.validSponsorExternalIds = validSponsorExternalIds; } @Inject void setSponsorWithAnnualRegistrationsExternalId( @Named("sponsor.organization.with.annual.registrations.nes.id") String sponsorWithAnnualRegistrationsExternalId) { this.sponsorWithAnnualRegistrationsExternalId = sponsorWithAnnualRegistrationsExternalId; } @Inject void setSponsorWithProtocolRegistrationsExternalIds( @Named("sponsor.organization.with.protocol.registrations.nes.ids") Set<String> sponsorWithProtocolRegistrationsExternalIds) { this.sponsorWithProtocolRegistrationsExternalIds = sponsorWithProtocolRegistrationsExternalIds; } @Resource(mappedName = "firebird/OrganizationServiceBean/local") void setOrganizationService(OrganizationService organizationService) { this.organizationService = organizationService; } @Inject void setSponsorEmailMappings( @Named("sponsor.organization.email.mappings") Map<String, String> sponsorEmailMappings) { this.sponsorEmailMappings = sponsorEmailMappings; } @Override public void initializeSponsorOrganizations() throws GridInvocationException { for (Organization sponsor : getSponsorsWithProtocolRegistrations()) { initialize(sponsor); } } private void initialize(Organization sponsor) throws GridInvocationException { ensureGroupExists(SponsorRole.getSponsorRepresentativeOrganizationGroupName(sponsor), SponsorRole.getSponsorRepresentativeOrganizationGroupDisplayName(sponsor), SponsorRole.SPONSOR_GROUP_NAME); ensureGroupExists(SponsorRole.getSponsorDelegateOrganizationGroupName(sponsor), SponsorRole.getSponsorDelegateOrganizationGroupDisplayName(sponsor), SponsorRole.SPONSOR_DELEGATE_GROUP_NAME); ensureGroupExists(SponsorRole.getVerifiedSponsorRepresentativeOrganizationGroupName(sponsor), SponsorRole.getVerifiedSponsorRepresentativeOrganizationGroupDisplayName(sponsor), SponsorRole.VERIFIED_SPONSOR_GROUP_NAME); ensureGroupExists(SponsorRole.getVerifiedSponsorDelegateOrganizationGroupName(sponsor), SponsorRole.getVerifiedSponsorDelegateOrganizationGroupDisplayName(sponsor), SponsorRole.VERIFIED_SPONSOR_DELEGATE_GROUP_NAME); } private void ensureGroupExists(String groupName, String groupDisplayName, String parentGroupName) throws GridInvocationException { if (!gridGrouperService.doesGroupExist(groupName)) { LOG.info( "Creating group " + groupDisplayName + "(" + groupName + "), parent group: " + parentGroupName); gridGrouperService.createGroup(groupName, groupDisplayName); gridGrouperService.addGridGroupToGroup(groupName, parentGroupName); } } @Override public Set<Organization> getSponsorOrganizations() { if (sponsorOrganizations == null) { sponsorOrganizations = getSponsorsWithExternalIds(validSponsorExternalIds); } return sponsorOrganizations; } private Set<Organization> getSponsorsWithExternalIds(Set<String> sponsorExternalIds) { Set<Organization> sponsors = Sets.newTreeSet(); for (String sponsorExternalId : sponsorExternalIds) { try { sponsors.add(organizationService.getByExternalId(sponsorExternalId)); } catch (InvalidatedOrganizationException e) { LOG.warn("Sponsor with the external ID " + sponsorExternalId + " has been nullified."); } } return sponsors; } @Override public Set<Organization> getSponsorsWithProtocolRegistrations() { if (sponsorsWithProtocolRegistrations == null) { sponsorsWithProtocolRegistrations = getSponsorsWithExternalIds( sponsorWithProtocolRegistrationsExternalIds); } return sponsorsWithProtocolRegistrations; } @Override public String getSponsorWithAnnualRegistrationsExternalId() { return sponsorWithAnnualRegistrationsExternalId; } @Override public Organization getSponsorOrganizationWithAnnualRegistrations() { if (sponsorWithAnnualRegistrations == null) { sponsorWithAnnualRegistrations = retrieveSponsorOrganizationWithAnnualRegistrationsFromExternalService(); } return sponsorWithAnnualRegistrations; } private Organization retrieveSponsorOrganizationWithAnnualRegistrationsFromExternalService() { if (!StringUtils.isEmpty(sponsorWithAnnualRegistrationsExternalId)) { try { return organizationService.getByExternalId(sponsorWithAnnualRegistrationsExternalId); } catch (InvalidatedOrganizationException e) { LOG.warn("Sponsor with the external ID " + sponsorWithAnnualRegistrationsExternalId + " has been nullified."); } } return null; } @Override public void notifySubmittedRegistration(AbstractProtocolRegistration registration) { checkIsRegistrationSubmitted(registration); String sponsorMailbox = getProtocolSponsorMailbox(registration.getProtocol()); FirebirdMessage message = getProtocolRegistrationNotificationEmailMessage(registration); emailService.sendMessage(sponsorMailbox, null, null, message); } private void checkIsRegistrationSubmitted(AbstractRegistration registration) { if (registration.getStatus() != RegistrationStatus.SUBMITTED) { throw new IllegalArgumentException( "registration status " + registration.getStatus() + " is not" + RegistrationStatus.SUBMITTED); } } private String getProtocolSponsorMailbox(Protocol protocol) { return getSponsorEmailAddress(protocol.getSponsor()); } private FirebirdMessage getProtocolRegistrationNotificationEmailMessage( AbstractProtocolRegistration registration) { Map<FirebirdTemplateParameter, Object> parameterValues = new EnumMap<FirebirdTemplateParameter, Object>( FirebirdTemplateParameter.class); parameterValues.put(REGISTRATION, registration); parameterValues.put(FIREBIRD_LINK, generateReviewProtocolRegistrationLink(registration)); return templateService.generateMessage(FirebirdMessageTemplate.SPONSOR_SUBMISSION_NOTIFICATION_EMAIL, parameterValues); } private String generateReviewProtocolRegistrationLink(AbstractProtocolRegistration registration) { return FirebirdConstants.REVIEW_REGISTRATION_URL_PATH_WITH_ID_PARAM + registration.getId(); } @Override public void notifySubmittedRegistration(AnnualRegistration registration) { checkIsRegistrationSubmitted(registration); String sponsorMailbox = getAnnualRegistrationSponsorMailbox(); FirebirdMessage message = getAnnualRegistrationNotificationEmailMessage(registration); emailService.sendMessage(sponsorMailbox, null, null, message); } private String getAnnualRegistrationSponsorMailbox() { return getSponsorEmailAddress(getSponsorOrganizationWithAnnualRegistrations()); } private FirebirdMessage getAnnualRegistrationNotificationEmailMessage(AnnualRegistration registration) { Map<FirebirdTemplateParameter, Object> parameterValues = new EnumMap<FirebirdTemplateParameter, Object>( FirebirdTemplateParameter.class); parameterValues.put(ANNUAL_REGISTRATION, registration); parameterValues.put(FIREBIRD_LINK, generateReviewAnnualRegistrationLink(registration)); return templateService.generateMessage( FirebirdMessageTemplate.SPONSOR_ANNUAL_REGISTRATION_SUBMISSION_NOTIFICATION_EMAIL, parameterValues); } private String generateReviewAnnualRegistrationLink(AnnualRegistration registration) { return FirebirdConstants.REVIEW_ANNUAL_REGISTRATION_URL_PATH_WITH_ID_PARAM + registration.getId(); } @Override public void removeSponsorDelegateRole(SponsorRole sponsorDelegateRole) throws GridInvocationException { if (!sponsorDelegateRole.isDelegate()) { throw new IllegalArgumentException( "A sponsor representative role was passed in to removeSponsorDelegateRole()"); } FirebirdUser user = sponsorDelegateRole.getUser(); user.getSponsorRoles().remove(sponsorDelegateRole); gridGrouperService.removeGridUserFromGroup(user.getUsername(), sponsorDelegateRole.getSponsorOrganizationGroupName()); gridGrouperService.removeGridUserFromGroup(user.getUsername(), sponsorDelegateRole.getVerifiedSponsorGroupName()); firebirdUserService.save(user); notifyDelegateOfRemoval(sponsorDelegateRole); } private void notifyDelegateOfRemoval(SponsorRole sponsorDelegateRole) { FirebirdUser delegateUser = sponsorDelegateRole.getUser(); String delegateEmailAddress = delegateUser.getPerson().getEmail(); FirebirdMessage message = getDelegateRemovalNotificationEmailMessage(sponsorDelegateRole); emailService.sendMessage(delegateEmailAddress, null, null, message); } private FirebirdMessage getDelegateRemovalNotificationEmailMessage(SponsorRole sponsorDelegateRole) { Map<FirebirdTemplateParameter, Object> parameterValues = new EnumMap<FirebirdTemplateParameter, Object>( FirebirdTemplateParameter.class); parameterValues.put(SPONSOR_ROLE, sponsorDelegateRole); parameterValues.put(SPONSOR_EMAIL_ADDRESS, getSponsorEmailAddress(sponsorDelegateRole.getSponsor())); return templateService.generateMessage(FirebirdMessageTemplate.DELEGATE_REMOVAL_NOTIFICATION_EMAIL, parameterValues); } @Override @SuppressWarnings("unchecked") // Hibernate list() method is untyped public List<SponsorRole> getSponsorDelegateRoles(Organization sponsor) { Session session = sessionProvider.get(); return session.createCriteria(SponsorRole.class).add(Restrictions.eq("sponsor", sponsor)) .add(Restrictions.eq("delegate", true)).list(); } @Override public SponsorRole getSponsorRole(Long id) { Session session = sessionProvider.get(); return (SponsorRole) session.get(SponsorRole.class, id); } @Override public String getSponsorEmailAddress(Organization sponsor) { String emailAddress = sponsorEmailMappings.get(sponsor.getExternalId()); if (StringUtils.isNotBlank(emailAddress)) { return emailAddress; } else { throw new IllegalArgumentException(sponsor.getName() + " does not have a mailbox address configured!"); } } }