org.kuali.kra.irb.actions.ProtocolSubmissionBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.kra.irb.actions.ProtocolSubmissionBuilder.java

Source

/*
 * Kuali Coeus, a comprehensive research administration system for higher education.
 * 
 * Copyright 2005-2015 Kuali, Inc.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kuali.kra.irb.actions;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.upload.FormFile;
import org.kuali.coeus.sys.framework.service.KcServiceLocator;
import org.kuali.kra.committee.bo.Committee;
import org.kuali.kra.committee.bo.CommitteeSchedule;
import org.kuali.kra.committee.service.CommitteeService;
import org.kuali.kra.irb.Protocol;
import org.kuali.kra.irb.ProtocolFinderDao;
import org.kuali.kra.irb.actions.submit.ProtocolExemptStudiesCheckListItem;
import org.kuali.kra.irb.actions.submit.ProtocolExpeditedReviewCheckListItem;
import org.kuali.kra.irb.actions.submit.ProtocolSubmission;
import org.kuali.kra.protocol.actions.notify.ProtocolActionAttachment;
import org.kuali.rice.krad.service.BusinessObjectService;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

// import org.kuali.kra.irb.actions.notifyirb.ProtocolActionAttachment;

/**
 * The Protocol Submission Builder is a helper class used to construct
 * a submission.  A client uses the builder to add items to the submission BO.
 * Once the submission is complete, the create() method is invoked by the
 * client to add the submission to the protocol and save it to the database.
 */
public class ProtocolSubmissionBuilder {

    private static final Log LOG = LogFactory.getLog(ProtocolSubmissionBuilder.class);
    private static final String NEXT_SUBMISSION_NUMBER_KEY = "submissionNumber";
    private static final String NEXT_SUBMISSION_DOCUMENT_ID_KEY = "submissionDocId";

    private ProtocolSubmission protocolSubmission;
    private List<ProtocolActionAttachment> actionAttachments = new ArrayList<ProtocolActionAttachment>();

    /**
     * Constructs a ProtocolSubmissionBuilder.
     * @param protocol
     * @param submissionTypeCode
     */
    public ProtocolSubmissionBuilder(Protocol protocol, String submissionTypeCode) {
        protocolSubmission = new ProtocolSubmission();
        protocolSubmission.setProtocol(protocol);
        protocolSubmission.setProtocolId(protocol.getProtocolId());
        protocolSubmission.setProtocolNumber(protocol.getProtocolNumber());
        protocolSubmission.setSequenceNumber(protocol.getSequenceNumber());
        protocolSubmission.setSubmissionNumber(getNextSubmissionNumber(protocol));

        protocolSubmission.setSubmissionDate(new Date(System.currentTimeMillis()));
        protocolSubmission.setSubmissionTypeCode(submissionTypeCode);

        ProtocolSubmission oldSubmission = (ProtocolSubmission) protocol.getProtocolSubmission();
        setValuesFromOldSubmission(protocolSubmission, oldSubmission);

        /**        
         * this will need to be changed in future development
         */
        protocolSubmission.setSubmissionStatusCode("100");
    }

    private Integer getNextSubmissionNumber(Protocol protocol) {
        Integer nextSubmissionNumber;
        if (protocol.isAmendment() || protocol.isRenewal()) {
            String origProtocolNumber = protocol.getProtocolNumber();
            String protocolNumber = origProtocolNumber.substring(0, 10);
            Protocol origProtocol = (Protocol) getProtocolFinderDao().findCurrentProtocolByNumber(protocolNumber);
            nextSubmissionNumber = origProtocol.getNextValue(NEXT_SUBMISSION_NUMBER_KEY);
            getBusinessObjectService().save(origProtocol.getProtocolDocument().getDocumentNextvalues());

        } else {
            nextSubmissionNumber = protocol.getNextValue(NEXT_SUBMISSION_NUMBER_KEY);
        }
        LOG.info("nextsubmissionnumber " + protocol.getProtocolId() + " "
                + (CollectionUtils.isEmpty(protocol.getProtocolSubmissions()) ? 0
                        : protocol.getProtocolSubmissions().size())
                + "-" + nextSubmissionNumber);
        return nextSubmissionNumber;
    }

    private ProtocolFinderDao getProtocolFinderDao() {
        return KcServiceLocator.getService(ProtocolFinderDao.class);
    }

    private void setValuesFromOldSubmission(ProtocolSubmission newSubmission, ProtocolSubmission oldSubmission) {
        if (oldSubmission != null) {
            //old submission may not be found if in a unit test
            //TODO : some of these, such as scheduleid/scheduleidfk, should not be copied over.
            // need to investigate if this is good for app.
            // comment scheduleid&scheduleidfk.  this will cause confusing if selected a different committee (or no committee)
            // then this schedule will not match the selected committee
            protocolSubmission.setSubmissionTypeQualifierCode(oldSubmission.getSubmissionTypeQualifierCode());
            protocolSubmission.setComments(oldSubmission.getComments());
            protocolSubmission.setYesVoteCount(oldSubmission.getYesVoteCount());
            protocolSubmission.setNoVoteCount(oldSubmission.getNoVoteCount());
            protocolSubmission.setAbstainerCount(oldSubmission.getAbstainerCount());
            protocolSubmission.setAbstainers(oldSubmission.getAbstainers());
            protocolSubmission.setRecusedCount(oldSubmission.getRecusedCount());
            protocolSubmission.setRecusers(oldSubmission.getRecusers());
            protocolSubmission.setVotingComments(oldSubmission.getVotingComments());
            protocolSubmission.setBillable(oldSubmission.isBillable());
        } else {
            protocolSubmission.setAbstainerCount(0);
            protocolSubmission.setRecusedCount(0);
            protocolSubmission.setBillable(false);
        }
    }

    /**
     * Saves the submission to the database and adds it to the protocol.
     * @return the submission
     */
    public ProtocolSubmission create() {
        protocolSubmission.setSubmissionDate(new Date(System.currentTimeMillis()));
        getBusinessObjectService().save(protocolSubmission);
        protocolSubmission.getProtocol().getProtocolSubmissions().add(protocolSubmission);
        saveAttachments();
        return protocolSubmission;
    }

    /**
     * Set the submission type qualifier code.
     * @param submissionTypeQualifierCode
     */
    public void setSubmissionTypeQualifierCode(String submissionTypeQualifierCode) {
        protocolSubmission.setSubmissionTypeQualifierCode(submissionTypeQualifierCode);
    }

    /**
     * Set the protocol review type code.
     * @param protocolReviewTypeCode
     */
    public void setProtocolReviewTypeCode(String protocolReviewTypeCode) {
        protocolSubmission.setProtocolReviewTypeCode(protocolReviewTypeCode);
    }

    /**
     * Set the submission status.
     * @param submissionStatusCode
     */
    public void setSubmissionStatus(String submissionStatusCode) {
        protocolSubmission.setSubmissionStatusCode(submissionStatusCode);
    }

    /**
     * Set the comments for the submission.
     * @param comments
     */
    public void setComments(String comments) {
        protocolSubmission.setComments(comments);
    }

    /**
     * Set the committee that the submission will use.
     * @param committeeId
     */
    public void setCommittee(String committeeId) {
        Committee committee = getCommitteeService().getCommitteeById(committeeId);
        if (committee != null) {
            protocolSubmission.setCommitteeId(committee.getCommitteeId());
            protocolSubmission.setCommitteeIdFk(committee.getId());
            protocolSubmission.setCommittee(committee);
        }

    }

    /**
     * Set the schedule that the committee will use.
     * @param scheduleId
     */
    public void setSchedule(String scheduleId) {
        if (protocolSubmission.getCommittee() != null) {
            CommitteeSchedule schedule = getCommitteeService()
                    .getCommitteeSchedule((Committee) protocolSubmission.getCommittee(), scheduleId);
            if (schedule != null) {
                protocolSubmission.setScheduleId(schedule.getScheduleId());
                protocolSubmission.setScheduleIdFk(schedule.getId());
                protocolSubmission.setCommitteeSchedule(schedule);
            } else {
                // this builder also copied some data from previous submission.  if it is not cleared here, then it will cause problem
                clearCommScheduleDataFromPreviousSubmission();
            }
        } else {
            // this builder also copied some data from previous submission.  if it is not cleared here, then it will cause problem
            clearCommScheduleDataFromPreviousSubmission();
        }
    }

    private void clearCommScheduleDataFromPreviousSubmission() {
        protocolSubmission.setScheduleId(null);
        protocolSubmission.setScheduleIdFk(null);
        protocolSubmission.setCommitteeSchedule(null);
    }

    /**
     * Add an exempt studies check list item to the submission.
     * @param exemptStudiesCheckListCode
     */
    public void addExemptStudiesCheckListItem(String exemptStudiesCheckListCode) {
        protocolSubmission.getExemptStudiesCheckList()
                .add(createProtocolExemptStudiesCheckListItem(exemptStudiesCheckListCode));
    }

    /**
     * Create an exempt studies check list item.
     * @param exemptStudiesCheckListCode
     * @return
     */
    private ProtocolExemptStudiesCheckListItem createProtocolExemptStudiesCheckListItem(
            String exemptStudiesCheckListCode) {
        ProtocolExemptStudiesCheckListItem chkLstItem = new ProtocolExemptStudiesCheckListItem();
        chkLstItem.setProtocolId(protocolSubmission.getProtocolId());
        chkLstItem.setSubmissionIdFk(protocolSubmission.getSubmissionId());
        chkLstItem.setProtocolNumber(protocolSubmission.getProtocolNumber());
        chkLstItem.setSequenceNumber(protocolSubmission.getSequenceNumber());
        chkLstItem.setSubmissionNumber(protocolSubmission.getSubmissionNumber());
        chkLstItem.setExemptStudiesCheckListCode(exemptStudiesCheckListCode);
        return chkLstItem;
    }

    /**
     * Add an expedited review check list item to the submission.
     * @param expeditedReviewCheckListCode
     */
    public void addExpeditedReviewCheckListItem(String expeditedReviewCheckListCode) {
        protocolSubmission.getExpeditedReviewCheckList()
                .add(createProtocolExpeditedReviewCheckListItem(expeditedReviewCheckListCode));
    }

    /**
     * Create an expedited review check list item.
     * @param expeditedReviewCheckListCode
     * @return
     */
    private ProtocolExpeditedReviewCheckListItem createProtocolExpeditedReviewCheckListItem(
            String expeditedReviewCheckListCode) {
        ProtocolExpeditedReviewCheckListItem chkLstItem = new ProtocolExpeditedReviewCheckListItem();
        chkLstItem.setProtocolId(protocolSubmission.getProtocolId());
        chkLstItem.setSubmissionIdFk(protocolSubmission.getSubmissionId());
        chkLstItem.setProtocolNumber(protocolSubmission.getProtocolNumber());
        chkLstItem.setSequenceNumber(protocolSubmission.getSequenceNumber());
        chkLstItem.setSubmissionNumber(protocolSubmission.getSubmissionNumber());
        chkLstItem.setExpeditedReviewCheckListCode(expeditedReviewCheckListCode);
        return chkLstItem;
    }

    /*
     * save notify irb attachments.
     */
    private void saveAttachments() {
        for (ProtocolActionAttachment attachment : actionAttachments) {
            saveAttachment(attachment.getFile(), attachment.getDescription());
        }

    }

    /**
     * Save an attachment file to the database.
     * @param file
     */
    private void saveAttachment(FormFile file, String description) {
        try {
            byte[] data = file.getFileData();
            if (data.length > 0) {
                ProtocolSubmissionDoc submissionDoc = createProtocolSubmissionDoc(protocolSubmission,
                        file.getFileName(), file.getContentType(), data, description);
                getBusinessObjectService().save(submissionDoc);
            }
        } catch (FileNotFoundException ex) {
            throw new RuntimeException(ex);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    /**
     * Create a protocol submission document (attachment).
     * @param submission
     * @param fileName
     * @param document
     * @return
     */
    private ProtocolSubmissionDoc createProtocolSubmissionDoc(ProtocolSubmission submission, String fileName,
            String contentType, byte[] document, String description) {
        ProtocolSubmissionDoc submissionDoc = new ProtocolSubmissionDoc();
        submissionDoc.setProtocolNumber(submission.getProtocolNumber());
        submissionDoc.setSequenceNumber(submission.getSequenceNumber());
        submissionDoc.setSubmissionNumber(submission.getSubmissionNumber());
        submissionDoc.setProtocolId(submission.getProtocolId());
        submissionDoc.setSubmissionIdFk(submission.getSubmissionId());
        submissionDoc.setProtocol(submission.getProtocol());
        submissionDoc.setProtocolSubmission(submission);
        submissionDoc.setDocumentId(submission.getProtocol().getNextValue(NEXT_SUBMISSION_DOCUMENT_ID_KEY));
        submissionDoc.setFileName(fileName);
        submissionDoc.setDocument(document);
        submissionDoc.setDescription(description);
        submissionDoc.setContentType(contentType);
        return submissionDoc;
    }

    private CommitteeService getCommitteeService() {
        return KcServiceLocator.getService(CommitteeService.class);
    }

    private BusinessObjectService getBusinessObjectService() {
        return KcServiceLocator.getService(BusinessObjectService.class);
    }

    public List<ProtocolActionAttachment> getActionAttachments() {
        return actionAttachments;
    }

    public void setActionAttachments(List<ProtocolActionAttachment> actionAttachments) {
        this.actionAttachments = actionAttachments;
    }
}