org.kuali.coeus.propdev.impl.print.ProposalSubmissionXmlStream.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.propdev.impl.print.ProposalSubmissionXmlStream.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.coeus.propdev.impl.print;

import edu.mit.coeus.utils.xml.v2.lookuptypes.ACTIVITYTYPEDocument.ACTIVITYTYPE;
import edu.mit.coeus.utils.xml.v2.lookuptypes.APPLICABLEREVIEWTYPEDocument.APPLICABLEREVIEWTYPE;
import edu.mit.coeus.utils.xml.v2.lookuptypes.NOTICEOFOPPORTUNITYDocument.NOTICEOFOPPORTUNITY;
import edu.mit.coeus.utils.xml.v2.lookuptypes.PROPOSALTYPEDocument.PROPOSALTYPE;
import edu.mit.coeus.utils.xml.v2.lookuptypes.SPECIALREVIEWDocument.SPECIALREVIEW;
import edu.mit.coeus.utils.xml.v2.organization.ORGANIZATIONDocument.ORGANIZATION;
import edu.mit.coeus.utils.xml.v2.propdev.PROPINVESTIGATORTYPE;
import edu.mit.coeus.utils.xml.v2.propdev.PROPOSALDocument;
import edu.mit.coeus.utils.xml.v2.propdev.PROPOSALDocument.PROPOSAL;
import edu.mit.coeus.utils.xml.v2.propdev.PROPOSALMASTERDocument.PROPOSALMASTER;
import edu.mit.coeus.utils.xml.v2.propdev.PROPPERCREDITSPLITDocument.PROPPERCREDITSPLIT;
import edu.mit.coeus.utils.xml.v2.propdev.PROPSPECIALREVIEWDocument.PROPSPECIALREVIEW;
import edu.mit.coeus.utils.xml.v2.propdev.PROPUNITCREDITSPLITDocument.PROPUNITCREDITSPLIT;
import edu.mit.coeus.utils.xml.v2.propdev.PROPUNITSDocument.PROPUNITS;
import edu.mit.coeus.utils.xml.v2.propdev.PROPYNQDocument.PROPYNQ;
import edu.mit.coeus.utils.xml.v2.rolodex.ADDRESSDocument.ADDRESS;
import edu.mit.coeus.utils.xml.v2.rolodex.NAMEDocument.NAME;
import edu.mit.coeus.utils.xml.v2.rolodex.ROLODEXDocument.ROLODEX;
import edu.mit.coeus.utils.xml.v2.sponsor.SPONSORDocument.SPONSOR;
import edu.mit.coeus.utils.xml.v2.userUnit.UNITDocument.UNIT;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.xmlbeans.XmlObject;
import org.kuali.coeus.common.framework.noo.NoticeOfOpportunity;
import org.kuali.coeus.common.framework.person.KcPerson;
import org.kuali.coeus.common.framework.print.PrintingException;
import org.kuali.coeus.common.framework.rolodex.Rolodex;
import org.kuali.coeus.common.framework.sponsor.Sponsor;
import org.kuali.coeus.common.framework.unit.Unit;
import org.kuali.coeus.propdev.impl.abstrct.ProposalAbstract;
import org.kuali.coeus.propdev.impl.core.DevelopmentProposal;
import org.kuali.coeus.propdev.impl.editable.ProposalChangedData;
import org.kuali.coeus.propdev.impl.person.ProposalPerson;
import org.kuali.coeus.propdev.impl.person.ProposalPersonUnit;
import org.kuali.coeus.propdev.impl.person.creditsplit.ProposalPersonCreditSplit;
import org.kuali.coeus.propdev.impl.ynq.ProposalYnq;
import org.kuali.coeus.sys.framework.model.KcPersistableBusinessObjectBase;
import org.kuali.coeus.common.budget.framework.core.Budget;
import org.kuali.kra.infrastructure.Constants;
import org.kuali.coeus.propdev.impl.specialreview.ProposalSpecialReview;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.sql.Date;
import java.util.*;

@Component("proposalSubmissionXmlStream")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ProposalSubmissionXmlStream extends ProposalBaseStream {

    private static final String DOES_REQUIRE = "does require";
    private static final String DOES_NOT_REQUIRE = "does not require";
    private static final String COI_DEFAULT_VALUE = "__________";
    private static final String INCOMPLETE_STRING_TERMINATOR = "...";
    private static final String CONFLICT_OF_INTEREST = "CONFLICT_OF_INTEREST";
    private static final String NOTICE_OF_OPPORTUNITY_CODE = "noticeOfOpportunityCode";
    private static final String MAIL_SUBMISSINON_METHOD_DHL = "DHL";
    private static final String MAIL_SUBMISSINON_METHOD_REGULAR = "Regular";
    private static final String MAIL_SUBMISSINON_METHOD_ELECTRONIC = "Electronic";
    private static final String MAIL_TYPE_DHL = "D";
    private static final String MAIL_TYPE_REGULAR = "R";
    private static final String MAIL_TYPE_ELECTRONIC = "E";
    private static final String ABSTRACT_TYPE_CODE_MAILING = "16";
    private static final String ABSTRACT_TYPE_CODE_OTHER = "17";
    private static final String STRING_DOUBLE_SEPARATOR = "--";
    private static final String INVESTIGATOR_CREDIT_TYPE_CODE_TWO = "2";
    private static final String INVESTIGATOR_CREDIT_TYPE_CODE_ONE = "1";
    private static final String IDENTIFIER_NO = "No";
    private static final String IDENTIFIER_YES = "Yes";
    private static final String NOT_AVAILABLE = "N/A";
    private static final String PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_3 = "ITAP_FLAG_3";
    private static final String PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_2 = "ITAP_FLAG_2";
    private static final String PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_1 = "ITAP_FLAG_1";
    private static final String QUESTION_ID_E = "E";
    private static final String QUESTION_ID_D = MAIL_TYPE_DHL;
    private static final String QUESTION_ID_C = "C";
    private static final String QUESTION_ID_B = "B";
    private static final String QUESTION_ID_A = "A";
    private static final String QUESTION_ID_G8 = "G8";
    private static final String PROPOSAL_YNQ_ID_P_03 = "P-03";
    private static final String PROPOSAL_YNQ_ID_P_02 = "P-02";
    private static final String PROPOSAL_YNQ_ID_P_01 = "P-01";
    private static final String CENTER_INSTITUTE_CODE5 = "CENTER_INSTITUTE_CODE5";
    private static final String CENTER_INSTITUTE_CODE4 = "CENTER_INSTITUTE_CODE4";
    private static final String CENTER_INSTITUTE_CODE3 = "CENTER_INSTITUTE_CODE3";
    private static final String CENTER_INSTITUTE_CODE2 = "CENTER_INSTITUTE_CODE2";
    private static final String CENTER_INSTITUTE_CODE = "CENTER_INSTITUTE_CODE";
    private static final String NEW_LINE = "/n";
    private static final String SPONSOR_DEADLINE_RECEIPT_DESCRIPTION = "(Receipt)";
    private static final String SPONSOR_DEADLINE_TYPE_RECEIPT = "R";
    private static final String SPONSOR_DEADLINE_POSTMARK_DESCRIPTION = "(Postmark)";
    private static final String SPONSOR_DEADLINE_TYPE_POSTMARK = "P";
    private static final String STRING_SEPRATOR = "-";
    private static final String BLANK_STRING = " ";
    private static final String OPEN_BRACES = "(";
    private static final String CLOSE_BRACES = ")";
    private static final String IMAGES_PATH = "/images/";
    private static final String REPORT_NAME = "Proposal Submission";

    /**
     * This method generates XML for Proposal Development Report. It uses data
     * passed in {@link org.kuali.coeus.sys.framework.model.KcTransactionalDocumentBase} for populating the XML nodes. The
     * XMl once generated is returned as {@link XmlObject}
     * 
     * @param printableBusinessObject
     *            using which XML is generated
     * @param reportParameters
     *            parameters related to XML generation
     * @return {@link XmlObject} representing the XML
     * @throws PrintingException
     *             in case of any errors occur during XML generation.
     */
    public Map<String, XmlObject> generateXmlStream(KcPersistableBusinessObjectBase printableBusinessObject,
            Map<String, Object> reportParameters) {
        DevelopmentProposal developmentProposal = (DevelopmentProposal) printableBusinessObject;
        Budget budget = getBudget(developmentProposal.getProposalDocument());
        PROPOSALDocument proposalDocument = PROPOSALDocument.Factory.newInstance();
        PROPOSAL proposal = getProposal(developmentProposal, budget);
        proposalDocument.setPROPOSAL(proposal);

        Map<String, XmlObject> xmlObjectList = new LinkedHashMap<String, XmlObject>();
        xmlObjectList.put(REPORT_NAME, proposalDocument);
        return xmlObjectList;
    }

    /*
     * This method gets PROPOSAL XMLObject and set data to it from
     * developmentProposal
     */
    private PROPOSAL getProposal(DevelopmentProposal developmentProposal, Budget budget) {
        PROPOSAL proposal = PROPOSAL.Factory.newInstance();
        proposal.setPROPOSALMASTER(getProposalMaster(developmentProposal, budget));
        proposal.setLOGOPATH(IMAGES_PATH);
        proposal.setPROPUNITSArray(getPropUnits(developmentProposal.getProposalPersons()));
        proposal.setPROPINVESTIGATORSArray(getProposalInvestigators(developmentProposal.getProposalPersons()));
        proposal.setPROPSPECIALREVIEWArray(getPropSpecialReviews(developmentProposal.getPropSpecialReviews()));
        proposal.setPROPYNQArray(getProposalYNQs(developmentProposal.getProposalYnqs(),
                developmentProposal.getProposalChangedDataList()));
        proposal.setCURDATE(getDateTimeService().getCurrentDate().toString());
        return proposal;
    }

    /*
     * This method gets arrays of PROPYNQ XMLObject by setting data from list of
     * proposalYnqs and list of proposalChangedData data by checking the
     * Question id
     */
    private PROPYNQ[] getProposalYNQs(List<ProposalYnq> proposalYnqs,
            List<ProposalChangedData> proposalChangedDataList) {
        List<PROPYNQ> propYnqList = new ArrayList<PROPYNQ>();
        PROPYNQ propYnqG8 = getProposalYnqByQuestionId(QUESTION_ID_G8, PROPOSAL_YNQ_ID_P_01, proposalYnqs);
        if (propYnqG8 != null) {
            propYnqList.add(propYnqG8);
        }
        PROPYNQ propYnqA = getProposalYnqByQuestionId(QUESTION_ID_A, PROPOSAL_YNQ_ID_P_02, proposalYnqs);
        if (propYnqA != null) {
            propYnqList.add(propYnqA);
        }
        PROPYNQ propYnqB = getProposalYnqByQuestionId(QUESTION_ID_B, PROPOSAL_YNQ_ID_P_03, proposalYnqs);
        if (propYnqB != null) {
            propYnqList.add(propYnqB);
        }
        setQuestionAnswerForProposalYNQS(proposalChangedDataList, propYnqList);
        return propYnqList.toArray(new PROPYNQ[0]);
    }

    /*
     * This method sets Question and Answer to propYnq XMLObject from
     * proposalChangeData List by checking the ITAP flag of proposalChangeData
     */
    private void setQuestionAnswerForProposalYNQS(List<ProposalChangedData> proposalChangedDataList,
            List<PROPYNQ> propYnqList) {
        PROPYNQ propYnqC = PROPYNQ.Factory.newInstance();
        propYnqC.setQUESTIONID(QUESTION_ID_C);
        propYnqC.setANSWER(
                getProposalChangeDataAnswer(PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_1, proposalChangedDataList));
        propYnqList.add(propYnqC);
        PROPYNQ propYnqD = PROPYNQ.Factory.newInstance();
        propYnqD.setQUESTIONID(QUESTION_ID_D);
        propYnqD.setANSWER(
                getProposalChangeDataAnswer(PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_2, proposalChangedDataList));
        propYnqList.add(propYnqD);
        PROPYNQ propYnqE = PROPYNQ.Factory.newInstance();
        propYnqE.setQUESTIONID(QUESTION_ID_E);
        propYnqE.setANSWER(
                getProposalChangeDataAnswer(PROPOSAL_CHANGE_DATA_COLUMN_NAME_ITAP_FLAG_3, proposalChangedDataList));
        propYnqList.add(propYnqE);
    }

    /*
     * This method gets ProposalChageData Answer by column name from
     * ProposalChangeData
     */
    private String getProposalChangeDataAnswer(String columenName,
            List<ProposalChangedData> proposalChangedDataList) {
        ProposalChangedData proposalChangeData = null;
        String columnValue = Constants.EMPTY_STRING;
        for (ProposalChangedData propChangeData : proposalChangedDataList) {
            if (propChangeData.getColumnName().equals(columenName)) {
                proposalChangeData = propChangeData;
                break;
            }
        }
        if (proposalChangeData != null) {
            columnValue = proposalChangeData.getChangedValue();
        }
        return columnValue;
    }

    /*
     * This method gets PROPYNQ XMLObeject details by QuestionIds
     */
    private PROPYNQ getProposalYnqByQuestionId(String questionId1, String questionId2,
            List<ProposalYnq> proposalYnqs) {
        PROPYNQ propYnq = null;
        ProposalYnq proposalYnq = getProposalYnqById(questionId2, proposalYnqs);
        if (proposalYnq != null) {
            propYnq = PROPYNQ.Factory.newInstance();
            propYnq.setQUESTIONID(questionId1);
            propYnq.setANSWER(getProposalYnqAnswerDetail(proposalYnq.getAnswer()));
            propYnq.setEXPLANATION(proposalYnq.getExplanation());
        }
        return propYnq;
    }

    /*
     * This method gets answerDetails of Answer like Y-Yes, N-No from answer
     */
    private String getProposalYnqAnswerDetail(String answer) {
        String detailAnswer = NOT_AVAILABLE;
        if (answer.equals(Constants.TRUE_FLAG)) {
            detailAnswer = IDENTIFIER_YES;
        }
        if (answer.equals(Constants.FALSE_FLAG)) {
            detailAnswer = IDENTIFIER_NO;
        }
        return detailAnswer;
    }

    /*
     * This method gets ProposalYnq by questionId by checking in list of
     * proposalYnq
     */
    private ProposalYnq getProposalYnqById(String questionId, List<ProposalYnq> proposalYnqs) {
        ProposalYnq proposalYnq = null;
        for (ProposalYnq propYnq : proposalYnqs) {
            if (propYnq.getQuestionId().equals(questionId)) {
                proposalYnq = propYnq;
                break;
            }
        }
        return proposalYnq;
    }

    /*
     * This method gets arrays of PROPSPECIALREVIEW XMLObject by setting the
     * data to each PROPSPECIALREVIEW from list of ProposalSpecialReview object
     * and add it to PROPSPECIALREVIEW List
     */
    private PROPSPECIALREVIEW[] getPropSpecialReviews(List<ProposalSpecialReview> proposalSpecialReviewList) {
        List<PROPSPECIALREVIEW> propSplReviewList = new ArrayList<PROPSPECIALREVIEW>();
        for (ProposalSpecialReview specialReview : proposalSpecialReviewList) {
            PROPSPECIALREVIEW propSplReview = PROPSPECIALREVIEW.Factory.newInstance();
            APPLICABLEREVIEWTYPE appReviewType = APPLICABLEREVIEWTYPE.Factory.newInstance();
            appReviewType.setAPPLICABLEREVIEWTYPECODE(0);
            appReviewType.setDESCRIPTION(specialReview.getApprovalType().getDescription());
            propSplReview.setAPPLICABLEREVIEWTYPE(appReviewType);
            SPECIALREVIEW splReview = SPECIALREVIEW.Factory.newInstance();
            splReview.setSPECIALREVIEWCODE(0);
            splReview.setDESCRIPTION(specialReview.getSpecialReviewType().getDescription());
            propSplReview.setSPECIALREVIEW(splReview);
            propSplReview.setPROTOCOLNUMBER(specialReview.getProtocolNumber());
            propSplReview.setPROPOSALNUMBER(specialReview.getDevelopmentProposal().getProposalNumber());
            propSplReviewList.add(propSplReview);
        }
        return propSplReviewList.toArray(new PROPSPECIALREVIEW[0]);
    }

    /*
     * This method gets arrays of PROPINVESTIGATORS XMLObject and set data to it
     * from list of proposalPerson
     */
    private PROPINVESTIGATORTYPE[] getProposalInvestigators(List<ProposalPerson> proposalPersons) {
        List<PROPINVESTIGATORTYPE> propInvestigatorList = new ArrayList<PROPINVESTIGATORTYPE>();
        for (ProposalPerson propPerson : proposalPersons) {
            PROPINVESTIGATORTYPE propInvestigator = PROPINVESTIGATORTYPE.Factory.newInstance();
            propInvestigator.setPERSONNAME(propPerson.getPerson().getFullName());
            propInvestigator.setPRINCIPALINVESTIGATORFLAG(propPerson.getProposalPersonRoleId());
            PROPPERCREDITSPLIT propPersonCredit = PROPPERCREDITSPLIT.Factory.newInstance();
            propPersonCredit.setCREDIT(getCreditForProposalInvestigator(propPerson));
            propPersonCredit.setPROPUNITCREDITSPLITArray(getProposalUnitCreditSplits(propPerson));
            propInvestigator.setPROPPERCREDITSPLIT(propPersonCredit);
            propInvestigatorList.add(propInvestigator);
        }
        return propInvestigatorList.toArray(new PROPINVESTIGATORTYPE[0]);
    }

    /*
     * This method gets credit from List of ProposalPersonCreditSplit by
     * checking the Investigator credit TypeCode is 1
     */
    private String getCreditForProposalInvestigator(ProposalPerson propPerson) {
        String credit = Constants.EMPTY_STRING;
        for (ProposalPersonCreditSplit creditSplit : propPerson.getCreditSplits()) {
            if (creditSplit.getInvCreditTypeCode().equals(INVESTIGATOR_CREDIT_TYPE_CODE_ONE)) {
                credit = creditSplit.getCredit().toString();
                break;
            }
        }
        return credit;
    }

    /*
     * This method gets Proposal Unit Splits XMLObject array by setting the data
     * to Proposal Unit Splits and add it to List list of
     * ProposalPersonCreditSplit
     */
    private PROPUNITCREDITSPLIT[] getProposalUnitCreditSplits(ProposalPerson propPerson) {
        List<PROPUNITCREDITSPLIT> propUnitCreditSplitList = new ArrayList<PROPUNITCREDITSPLIT>();
        String unit = getUnitForCreditSplit(propPerson.getUnit());
        for (ProposalPersonCreditSplit creditSplit : propPerson.getCreditSplits()) {
            if (creditSplit.getInvCreditTypeCode().equals(INVESTIGATOR_CREDIT_TYPE_CODE_ONE)
                    || creditSplit.getInvCreditTypeCode().equals(INVESTIGATOR_CREDIT_TYPE_CODE_TWO)) {
                PROPUNITCREDITSPLIT propUnitCreditSplit = PROPUNITCREDITSPLIT.Factory.newInstance();
                propUnitCreditSplit.setUNIT(unit);
                propUnitCreditSplit.setPRIMARY(creditSplit.getCredit() == null ? STRING_DOUBLE_SEPARATOR
                        : creditSplit.getCredit().toString());
                propUnitCreditSplit.setSECONDARY(creditSplit.getCredit() == null ? STRING_DOUBLE_SEPARATOR
                        : creditSplit.getCredit().toString());
                propUnitCreditSplitList.add(propUnitCreditSplit);
            }
        }
        return propUnitCreditSplitList.toArray(new PROPUNITCREDITSPLIT[0]);
    }

    /*
     * This method gets Unit for creditSplit by concatenating unitNumber and
     * unitName
     */
    private String getUnitForCreditSplit(Unit unit) {
        String unitCredit = null;
        if (unit != null) {
            String unitName = unit.getUnitName();
            unitCredit = new StringBuilder(unit.getUnitNumber()).append(STRING_SEPRATOR)
                    .append(unitName.substring(0, 29))
                    .append(unitName.length() <= 30 ? Constants.EMPTY_STRING : INCOMPLETE_STRING_TERMINATOR)
                    .toString();
        }
        return unitCredit;
    }

    /*
     * This methods gets arrays of PROPUNITS and set data to each PROPUNIT from
     * ProposalPersonUnit. here List of ProposalPersonUnit get created by
     * checking leadUnit
     */
    private PROPUNITS[] getPropUnits(List<ProposalPerson> proposalPersonList) {
        List<PROPUNITS> propUnitsList = new ArrayList<PROPUNITS>();
        List<ProposalPersonUnit> propPersonUnitList = new ArrayList<ProposalPersonUnit>();
        for (ProposalPerson pPerson : proposalPersonList) {
            for (ProposalPersonUnit propPersonUnit : pPerson.getUnits()) {
                if (propPersonUnit.isLeadUnit() && propPersonUnit.getUnit() != null) {
                    propPersonUnitList.add(propPersonUnit);
                }
            }
        }
        for (ProposalPersonUnit propPersonUnit : propPersonUnitList) {
            PROPUNITS propUnits = PROPUNITS.Factory.newInstance();
            propUnits.setLEADUNITFLAG(propPersonUnit.isLeadUnit() ? Constants.TRUE_FLAG : Constants.FALSE_FLAG);
            propUnits.setPROPOSALNUMBER(
                    propPersonUnit.getProposalPerson().getDevelopmentProposal().getProposalNumber());
            UNIT unit = UNIT.Factory.newInstance();
            unit.setUNITNUMBER(propPersonUnit.getUnitNumber());
            unit.setUNITNAME(propPersonUnit.getUnit().getUnitName());
            propUnits.setUNIT(unit);
            propUnitsList.add(propUnits);
        }
        return propUnitsList.toArray(new PROPUNITS[0]);
    }

    /*
     * This method gets PROPOSALMASTER XMLObject and set data to it from Budget
     * and ProposalDevelopment
     */
    private PROPOSALMASTER getProposalMaster(DevelopmentProposal developmentProposal, Budget budget) {
        PROPOSALMASTER proposalMaster = PROPOSALMASTER.Factory.newInstance();
        proposalMaster.setPROPOSALNUMBER(developmentProposal.getProposalNumber());
        if (developmentProposal.getApplicantOrganization().getRolodex() != null) {
            proposalMaster.setORGANIZATION(getDevelopmentProposalOrganizationXMLObject(
                    developmentProposal.getApplicantOrganization().getRolodex()));
        }
        proposalMaster.setLEADUNIT(getProposalLeadUnit(developmentProposal.getProposalPersons()));
        proposalMaster.setTITLE(developmentProposal.getTitle());
        proposalMaster.setPERIOD(getProjectPeriod(developmentProposal.getRequestedStartDateInitial(),
                developmentProposal.getRequestedEndDateInitial()));
        proposalMaster.setSPONSORCOST(getSponsorCost(budget));
        proposalMaster.setCOSTSHARING(budget.getCostSharingAmount().toString());
        proposalMaster.setOTHERCOMMENTS(getAbstractFromProposalAbstract(developmentProposal.getProposalAbstracts(),
                ABSTRACT_TYPE_CODE_OTHER));
        proposalMaster.setCOI(getConflictOfInterest(developmentProposal.getProposalChangedDataList()));
        proposalMaster.setDEADLINE(
                getSponsorDeadLine(developmentProposal.getDeadlineDate(), developmentProposal.getDeadlineType()));
        proposalMaster.setADDLMAILINGINSTR(getAbstractFromProposalAbstract(
                developmentProposal.getProposalAbstracts(), ABSTRACT_TYPE_CODE_MAILING));
        proposalMaster.setCENTERINST(getCenterInstitute(developmentProposal.getProposalChangedDataList(),
                developmentProposal.getProposalPersons()));
        proposalMaster.setSPONSOR(getSponsorXMLObject(developmentProposal.getSponsorName()));
        proposalMaster.setPRIMESPONSOR(getPrimeSponsorXMLObject(developmentProposal.getPrimeSponsorCode()));
        proposalMaster
                .setPROPINVESTIGATORS(getProposalInvestigatorXMLObject(developmentProposal.getProposalPersons()));
        proposalMaster
                .setPROPOSALTYPE(getProposalTypeXMLObject(developmentProposal.getProposalType().getDescription()));
        proposalMaster
                .setACTIVITYTYPE(getActivityTypeXMLObject(developmentProposal.getActivityType().getDescription()));
        proposalMaster.setNOTICEOFOPPORTUNITY(
                getNoticeOfOpportunityXMLObject(developmentProposal.getNoticeOfOpportunityCode()));
        proposalMaster.setPROGRAMANNOUNCEMENTNUMBER(developmentProposal.getProgramAnnouncementNumber());
        proposalMaster.setPROGRAMANNOUNCEMENTTITLE(developmentProposal.getProgramAnnouncementTitle());
        proposalMaster.setMAILTYPE(getMailType(developmentProposal.getMailType()));
        proposalMaster.setNUMBEROFCOPIES(developmentProposal.getNumberOfCopies());
        proposalMaster.setMAILADDRESS(
                getMailingAddressXMLObject(developmentProposal.getApplicantOrganization().getRolodex()));
        proposalMaster.setMAILDESCRIPTION(developmentProposal.getMailDescription());

        return proposalMaster;
    }

    /*
     * This method gets mailAddress XMLObject and Rolodex, Rolodex address
     * details are set to it.
     */
    private PROPOSALMASTER.MAILADDRESS getMailingAddressXMLObject(Rolodex rolodexDetails) {
        ADDRESS address = ADDRESS.Factory.newInstance();
        address.setADDRESSLINE1(getSponsorAddress(rolodexDetails));
        ROLODEX rolodex = ROLODEX.Factory.newInstance();
        rolodex.setADDRESS(address);
        PROPOSALMASTER.MAILADDRESS mailAddress = PROPOSALMASTER.MAILADDRESS.Factory.newInstance();
        mailAddress.setROLODEX(rolodex);
        return mailAddress;
    }

    /*
     * This method gets sponsorAddress by concatenating Rolodex details if
     * rolodexPerson is there
     */
    private String getSponsorAddress(Rolodex rolodex) {
        String address = Constants.EMPTY_STRING;
        if (rolodex != null && rolodex.getRolodexId() != null) {
            address = new StringBuilder(
                    rolodex.getLastName() == null ? Constants.EMPTY_STRING : rolodex.getLastName()).append(
                            rolodex.getFirstName() == null ? Constants.EMPTY_STRING : rolodex.getFirstName())
                            .append(rolodex.getMiddleName() == null ? Constants.EMPTY_STRING
                                    : rolodex.getMiddleName())
                            .append(rolodex.getEmailAddress() == null ? Constants.EMPTY_STRING
                                    : new StringBuilder(OPEN_BRACES).append(rolodex.getEmailAddress())
                                            .append(CLOSE_BRACES))
                            .append(rolodex.getPhoneNumber() == null ? Constants.EMPTY_STRING
                                    : rolodex.getPhoneNumber())
                            .append(NEW_LINE).append(rolodex.getOrganization()).append(NEW_LINE)
                            .append(rolodex.getAddressLine1() == null ? Constants.EMPTY_STRING
                                    : rolodex.getAddressLine1())
                            .append(NEW_LINE)
                            .append(rolodex.getAddressLine2() == null ? Constants.EMPTY_STRING
                                    : rolodex.getAddressLine2())
                            .append(NEW_LINE)
                            .append(rolodex.getAddressLine3() == null ? Constants.EMPTY_STRING
                                    : rolodex.getAddressLine3())
                            .append(NEW_LINE)
                            .append(rolodex.getCity() == null ? Constants.EMPTY_STRING : rolodex.getCity())
                            .append(Constants.COMMA)
                            .append(rolodex.getState() == null ? Constants.EMPTY_STRING : rolodex.getState())
                            .append(BLANK_STRING)
                            .append(rolodex.getPostalCode() == null ? Constants.EMPTY_STRING
                                    : rolodex.getPostalCode())
                            .append(BLANK_STRING).append(rolodex.getCountryCode() == null ? Constants.EMPTY_STRING
                                    : rolodex.getCountryCode())
                            .toString();
        }
        return address;
    }

    /*
     * This method get Submission method by checking the mailType
     */
    private String getMailType(String mailType) {
        String submissionMethod = Constants.EMPTY_STRING;
        if (MAIL_TYPE_ELECTRONIC.equals(mailType)) {
            submissionMethod = MAIL_SUBMISSINON_METHOD_ELECTRONIC;
        } else if (MAIL_TYPE_REGULAR.equals(mailType)) {
            submissionMethod = MAIL_SUBMISSINON_METHOD_REGULAR;
        } else if (MAIL_TYPE_DHL.equals(mailType)) {
            submissionMethod = MAIL_SUBMISSINON_METHOD_DHL;
        }
        return submissionMethod;
    }

    /*
     * This method gets NoticeOfOpportunityXMLObject by setting description and
     * typeCode
     * 
     */
    private NOTICEOFOPPORTUNITY getNoticeOfOpportunityXMLObject(String noticeOfOpportunityCode) {
        NOTICEOFOPPORTUNITY noticeOfOpportunity = NOTICEOFOPPORTUNITY.Factory.newInstance();
        String description = getNoticeOfOpportunityDesc(noticeOfOpportunityCode);
        noticeOfOpportunity.setDESCRIPTION(description);
        noticeOfOpportunity.setNOTICEOFOPPORTUNITYCODE(0);
        return noticeOfOpportunity;
    }

    /*
     * This method gets NoticeOfOpportunity description by calling database
     * using noticeOfOpportunityCode
     */
    private String getNoticeOfOpportunityDesc(String noticeOfOpportunityCode) {
        Map<String, String> noticeCodeMap = new HashMap<String, String>();
        noticeCodeMap.put(NOTICE_OF_OPPORTUNITY_CODE, noticeOfOpportunityCode);
        String description = Constants.EMPTY_STRING;
        NoticeOfOpportunity noticeOfOpportunity = (NoticeOfOpportunity) getBusinessObjectService()
                .findByPrimaryKey(NoticeOfOpportunity.class, noticeCodeMap);
        if (noticeOfOpportunity != null) {
            description = noticeOfOpportunity.getDescription();
        }
        return description;
    }

    /*
     * This method gets activityType XMLObject and set description, typeCode
     * data
     */
    private ACTIVITYTYPE getActivityTypeXMLObject(String description) {
        ACTIVITYTYPE activityType = ACTIVITYTYPE.Factory.newInstance();
        activityType.setDESCRIPTION(description);
        activityType.setACTIVITYTYPECODE(0);
        return activityType;
    }

    /*
     * This method gets proposalType XMLObject and set description, typeCode
     * data
     */
    private PROPOSALTYPE getProposalTypeXMLObject(String description) {
        PROPOSALTYPE propType = PROPOSALTYPE.Factory.newInstance();
        propType.setDESCRIPTION(description);
        propType.setPROPOSALTYPECODE(0);
        return propType;
    }

    /*
     * This methods gets Proposal Investigator XMLObject by setting person name
     * and info from principalInvestigator Person
     * 
     */
    private PROPINVESTIGATORTYPE getProposalInvestigatorXMLObject(List<ProposalPerson> proposalPersonList) {
        PROPINVESTIGATORTYPE propInvestigatorType = PROPINVESTIGATORTYPE.Factory.newInstance();
        KcPerson person = getPrincipalInvetigatorPerson(proposalPersonList);
        if (person != null) {
            propInvestigatorType.setPERSONNAME(getPersonNameAndInfo(person));
        }
        if (person.getFullName() != null) {
            propInvestigatorType.setPERSONID(person.getFullName());
        }
        return propInvestigatorType;
    }

    /*
     * This method gets Principal Investigator Person from list of Proposal
     * Person
     */
    private KcPerson getPrincipalInvetigatorPerson(List<ProposalPerson> proposalPersonList) {
        KcPerson person = null;
        for (ProposalPerson pPerson : proposalPersonList) {
            if (pPerson.getPersonId() != null
                    && pPerson.getProposalPersonRoleId().equals(Constants.PRINCIPAL_INVESTIGATOR_ROLE)) {
                person = pPerson.getPerson();
                break;
            }
        }
        return person;
    }

    /*
     * This method gets PrimsSponsor XMLObject by get and set sponsor details
     * using primeSponsorCode
     */
    private PROPOSALMASTER.PRIMESPONSOR getPrimeSponsorXMLObject(String primeSponsorCode) {
        Sponsor primSponsor = getSponsorBySponsorCode(primeSponsorCode);
        SPONSOR sponsor = SPONSOR.Factory.newInstance();
        if (primSponsor != null) {
            sponsor.setSPONSORNAME(primSponsor.getSponsorName());
        }
        PROPOSALMASTER.PRIMESPONSOR primeSponsor = PROPOSALMASTER.PRIMESPONSOR.Factory.newInstance();
        primeSponsor.setSPONSOR(sponsor);
        return primeSponsor;
    }

    /*
     * This method get sponsor by calling the database with sponsorCode
     */
    private Sponsor getSponsorBySponsorCode(String sponsorCode) {
        Map<String, String> sponsorCodeMap = new HashMap<String, String>();
        sponsorCodeMap.put(Constants.SPONSOR_CODE, sponsorCode);
        Sponsor sponsor = (Sponsor) getBusinessObjectService().findByPrimaryKey(Sponsor.class, sponsorCodeMap);
        return sponsor;
    }

    /*
     * This method get sponsor XMLObject by setting sponsor name from
     * developmentProposal
     */
    private SPONSOR getSponsorXMLObject(String sponsorName) {
        SPONSOR sponsor = SPONSOR.Factory.newInstance();
        sponsor.setSPONSORNAME(sponsorName);
        return sponsor;
    }

    /*
     * This method gets Central Institute by concatenating five central
     * Institute which gets from unit and column value
     */
    private String getCenterInstitute(List<ProposalChangedData> proposalChangedDataList,
            List<ProposalPerson> proposalPersons) {
        String columnValue1 = getProposalChangeDataColumnValue(CENTER_INSTITUTE_CODE, proposalChangedDataList);
        String columnValue2 = getProposalChangeDataColumnValue(CENTER_INSTITUTE_CODE2, proposalChangedDataList);
        String columnValue3 = getProposalChangeDataColumnValue(CENTER_INSTITUTE_CODE3, proposalChangedDataList);
        String columnValue4 = getProposalChangeDataColumnValue(CENTER_INSTITUTE_CODE4, proposalChangedDataList);
        String columnValue5 = getProposalChangeDataColumnValue(CENTER_INSTITUTE_CODE5, proposalChangedDataList);
        Unit unit1 = getUnitFromProposalChangeData(columnValue1, proposalPersons);
        Unit unit2 = getUnitFromProposalChangeData(columnValue2, proposalPersons);
        Unit unit3 = getUnitFromProposalChangeData(columnValue3, proposalPersons);
        Unit unit4 = getUnitFromProposalChangeData(columnValue4, proposalPersons);
        Unit unit5 = getUnitFromProposalChangeData(columnValue5, proposalPersons);
        String centerInstitute1 = getCenterInstitute(columnValue1, unit1);
        String centerInstitute2 = getCenterInstitute(columnValue2, unit2);
        String centerInstitute3 = getCenterInstitute(columnValue3, unit3);
        String centerInstitute4 = getCenterInstitute(columnValue4, unit4);
        String centerInstitute5 = getCenterInstitute(columnValue5, unit5);
        return new StringBuilder(centerInstitute1).append(NEW_LINE).append(centerInstitute2).append(NEW_LINE)
                .append(centerInstitute3).append(NEW_LINE).append(centerInstitute4).append(NEW_LINE)
                .append(centerInstitute5).toString();
    }

    /*
     * This method gets columnValue as central Institute if unitNumber is null
     * else concatenating of columnValue and unitName
     */
    private String getCenterInstitute(String columnValue, Unit unit) {
        String centerInstitue = columnValue;
        if (unit != null && unit.getUnitNumber() != null) {
            centerInstitue = new StringBuilder(columnValue).append(STRING_SEPRATOR).append(unit.getUnitName())
                    .toString();
        }
        return centerInstitue;
    }

    /*
     * This method gets columValue from List of ProposalChangeData by checking
     * the CentralInstituteCode
     */
    private String getProposalChangeDataColumnValue(String centerInstituteCode,
            List<ProposalChangedData> proposalChangedDataList) {
        String columnValue = Constants.EMPTY_STRING;
        for (ProposalChangedData propChangeData : proposalChangedDataList) {
            if (propChangeData.getColumnName().equals(centerInstituteCode)) {
                columnValue = propChangeData.getChangedValue();
            }
        }
        return columnValue;
    }

    /*
     * This method gets Unit from List of ProposalPerson by comparing unitNumber
     * with passes value
     */
    private Unit getUnitFromProposalChangeData(String value, List<ProposalPerson> proposalPersons) {
        Unit unit = null;
        for (ProposalPerson pPerson : proposalPersons) {
            for (ProposalPersonUnit pUnit : pPerson.getUnits()) {
                if (pUnit.getUnitNumber().equals(value)) {
                    unit = pUnit.getUnit();
                }
            }
        }
        return unit;
    }

    /*
     * This method gets conflictOfInterest value based on value of
     * proposalChangesData, if the value not match it return default value of
     * conflictOfInterest
     */
    private String getConflictOfInterest(List<ProposalChangedData> proposalChangedDataList) {
        String conflictOfInterest = COI_DEFAULT_VALUE;
        for (ProposalChangedData propChangesData : proposalChangedDataList) {
            if (propChangesData.getColumnName().equals(CONFLICT_OF_INTEREST)) {
                if (propChangesData.getChangedValue().equals(IDENTIFIER_NO)) {
                    conflictOfInterest = DOES_NOT_REQUIRE;
                } else if (propChangesData.getChangedValue().equals(IDENTIFIER_YES)) {
                    conflictOfInterest = DOES_REQUIRE;
                }
            }
        }
        return conflictOfInterest;
    }

    /*
     * This method gets sponsorDeadLine by concatenating DevelopmentProposal
     * deadLineDate and deadLineType
     */
    private String getSponsorDeadLine(Date deadLineDate, String deadLineType) {
        String sponsorDeadLineType = Constants.EMPTY_STRING;
        String deadLineDateFormated = DateFormatUtils.format(deadLineDate, Constants.DEFAULT_DATE_FORMAT_PATTERN);
        if (SPONSOR_DEADLINE_TYPE_POSTMARK.equals(deadLineType)) {
            sponsorDeadLineType = SPONSOR_DEADLINE_POSTMARK_DESCRIPTION;
        } else if (SPONSOR_DEADLINE_TYPE_RECEIPT.equals(deadLineType)) {
            sponsorDeadLineType = SPONSOR_DEADLINE_RECEIPT_DESCRIPTION;
        }
        String sponsorDeadLine = new StringBuilder(deadLineDateFormated).append(sponsorDeadLineType).toString();
        return sponsorDeadLine;
    }

    /*
     * This method gets abstractDetails as OtherComment(17) or Address Mailing
     * Instruction(16) from ProposalAbstract by checking abstractTypeCode as 17
     * and 16
     */
    private String getAbstractFromProposalAbstract(List<ProposalAbstract> proposalAbstracts,
            String abstractTypeCode) {
        String abstractDetail = Constants.EMPTY_STRING;
        for (ProposalAbstract proposalAbstract : proposalAbstracts) {
            if (proposalAbstract.getAbstractTypeCode().equals(abstractTypeCode)) {
                abstractDetail = proposalAbstract.getAbstractDetails();
                break;
            }
        }
        return abstractDetail;
    }

    /*
     * This method gets totalCost as sponsorCost from budget if finalVersionFlag
     * is true else it return sponsorCost as No Final Budget
     */
    private String getSponsorCost(Budget budget) {
        String sponsorCost = budget.getTotalCost().toString();
        return sponsorCost;
    }

    /*
     * This method gets the period by concatenating startData and endDate of
     * DevelopmentProposal RequestStartDate and RequestEndDate with String
     * separator
     * 
     */
    private String getProjectPeriod(Date requestedStartDate, Date requestedEndDate) {
        String startDate = DateFormatUtils.format(requestedStartDate, Constants.DEFAULT_DATE_FORMAT_PATTERN);
        String endDate = DateFormatUtils.format(requestedEndDate, Constants.DEFAULT_DATE_FORMAT_PATTERN);
        String projectPeriod = new StringBuilder(startDate).append(STRING_SEPRATOR).append(endDate).toString();
        return projectPeriod;
    }

    /*
     * This method gets proposalLeadUnit by concatenating unitNumber of
     * ProposalPersonUnit and UnitName with Blank separator from List of
     * ProposalPerson
     * 
     */
    private String getProposalLeadUnit(List<ProposalPerson> proposalPersonList) {
        String leadUnit = Constants.EMPTY_STRING;
        for (ProposalPerson proposalPerson : proposalPersonList) {
            for (ProposalPersonUnit proposalPersonUnit : proposalPerson.getUnits()) {
                if (proposalPersonUnit.isLeadUnit()) {
                    leadUnit = new StringBuilder(proposalPersonUnit.getUnitNumber()).append(BLANK_STRING)
                            .append(proposalPersonUnit.getUnit().getUnitName()).toString();
                    break;
                }
            }
        }
        return leadUnit;
    }

    /*
     * This method get Organization XMLObject by setting Rolodex details to
     * organization XMLObject
     */
    private ORGANIZATION getDevelopmentProposalOrganizationXMLObject(Rolodex rolodexDetails) {
        String nameAndInfo = getRolodexNameAndInfo(rolodexDetails);
        NAME name = NAME.Factory.newInstance();
        name.setFIRSTNAME(nameAndInfo);
        ADDRESS address = ADDRESS.Factory.newInstance();
        address.setADDRESSLINE1(nameAndInfo);
        ROLODEX rolodex = ROLODEX.Factory.newInstance();
        rolodex.setNAME(name);
        rolodex.setADDRESS(address);
        ORGANIZATION organization = ORGANIZATION.Factory.newInstance();
        organization.setROLODEX(rolodex);
        return organization;
    }

    /*
     * This method gets PersonName and Information by concatenating Person
     * FullName, Email and OfficePhone
     */
    private String getPersonNameAndInfo(KcPerson person) {
        String personEmail = person.getEmailAddress();
        String officePhone = person.getOfficePhone();
        String personInfo = Constants.EMPTY_STRING;
        if (personEmail != null && officePhone != null) {
            personInfo = new StringBuilder(OPEN_BRACES).append(person.getEmailAddress())
                    .append(person.getOfficePhone()).append(CLOSE_BRACES).toString();
        }
        if (personEmail == null && officePhone != null) {
            personInfo = new StringBuilder(OPEN_BRACES).append(person.getOfficePhone()).append(CLOSE_BRACES)
                    .toString();
        }
        String personNameAndInfo = new StringBuilder(person.getFullName()).append(personInfo).toString();
        return personNameAndInfo;
    }

    /*
     * This method gets Rolodex and Information by concatenating Rolodex
     * FullName, Email and OfficePhone
     */
    private String getRolodexNameAndInfo(Rolodex rolodex) {
        String personEmail = rolodex.getEmailAddress();
        String officePhone = rolodex.getPhoneNumber();
        String rolodexinfo = Constants.EMPTY_STRING;
        if (personEmail != null && officePhone != null) {
            rolodexinfo = new StringBuilder(OPEN_BRACES).append(rolodex.getEmailAddress())
                    .append(rolodex.getPhoneNumber()).append(CLOSE_BRACES).toString();
        }
        if (personEmail == null && officePhone != null) {
            rolodexinfo = new StringBuilder(OPEN_BRACES).append(rolodex.getPhoneNumber()).append(CLOSE_BRACES)
                    .toString();
        }
        String personNameAndInfo = new StringBuilder(rolodex.getFullName()).append(rolodexinfo).toString();
        return personNameAndInfo;
    }
}