edu.duke.cabig.c3pr.webservice.helpers.SubjectRegistryRelatedTestCase.java Source code

Java tutorial

Introduction

Here is the source code for edu.duke.cabig.c3pr.webservice.helpers.SubjectRegistryRelatedTestCase.java

Source

/*******************************************************************************
 * Copyright Duke Comprehensive Cancer Center and SemanticBits
 * 
 * Distributed under the OSI-approved BSD 3-Clause License.
 * See http://ncip.github.com/c3pr/LICENSE.txt for details.
 ******************************************************************************/
package edu.duke.cabig.c3pr.webservice.helpers;

import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;

import edu.duke.cabig.c3pr.constants.ConsentingMethod;
import edu.duke.cabig.c3pr.constants.OrganizationIdentifierTypeEnum;
import edu.duke.cabig.c3pr.constants.RaceCodeEnum;
import edu.duke.cabig.c3pr.constants.RegistrationDataEntryStatus;
import edu.duke.cabig.c3pr.dao.HealthcareSiteDao;
import edu.duke.cabig.c3pr.domain.Address;
import edu.duke.cabig.c3pr.domain.Consent;
import edu.duke.cabig.c3pr.domain.ConsentQuestion;
import edu.duke.cabig.c3pr.domain.HealthcareSite;
import edu.duke.cabig.c3pr.domain.LocalHealthcareSite;
import edu.duke.cabig.c3pr.domain.LocalStudy;
import edu.duke.cabig.c3pr.domain.OrganizationAssignedIdentifier;
import edu.duke.cabig.c3pr.domain.PermissibleStudySubjectRegistryStatus;
import edu.duke.cabig.c3pr.domain.RegistryStatus;
import edu.duke.cabig.c3pr.domain.RegistryStatusReason;
import edu.duke.cabig.c3pr.domain.Study;
import edu.duke.cabig.c3pr.domain.StudySite;
import edu.duke.cabig.c3pr.domain.StudySiteStudyVersion;
import edu.duke.cabig.c3pr.domain.StudySubject;
import edu.duke.cabig.c3pr.domain.StudySubjectDemographics;
import edu.duke.cabig.c3pr.domain.StudySubjectRegistryStatus;
import edu.duke.cabig.c3pr.domain.SubjectConsentQuestionAnswer;
import edu.duke.cabig.c3pr.exception.C3PRExceptionHelper;
import edu.duke.cabig.c3pr.utils.ApplicationTestCase;
import edu.duke.cabig.c3pr.webservice.common.AdvanceSearchCriterionParameter;
import edu.duke.cabig.c3pr.webservice.common.BiologicEntityIdentifier;
import edu.duke.cabig.c3pr.webservice.common.Document;
import edu.duke.cabig.c3pr.webservice.common.DocumentIdentifier;
import edu.duke.cabig.c3pr.webservice.common.DocumentVersion;
import edu.duke.cabig.c3pr.webservice.common.Organization;
import edu.duke.cabig.c3pr.webservice.common.OrganizationIdentifier;
import edu.duke.cabig.c3pr.webservice.common.PerformedStudySubjectMilestone;
import edu.duke.cabig.c3pr.webservice.common.Person;
import edu.duke.cabig.c3pr.webservice.common.StudyProtocolDocumentVersion;
import edu.duke.cabig.c3pr.webservice.common.StudyProtocolVersion;
import edu.duke.cabig.c3pr.webservice.common.StudySiteProtocolVersionRelationship;
import edu.duke.cabig.c3pr.webservice.common.StudySubjectConsentVersion;
import edu.duke.cabig.c3pr.webservice.common.StudySubjectProtocolVersionRelationship;
import edu.duke.cabig.c3pr.webservice.common.SubjectIdentifier;
import edu.duke.cabig.c3pr.webservice.iso21090.AddressPartType;
import edu.duke.cabig.c3pr.webservice.iso21090.DSETCD;
import edu.duke.cabig.c3pr.webservice.iso21090.EntityNamePartType;
import edu.duke.cabig.c3pr.webservice.iso21090.NullFlavor;
import edu.duke.cabig.c3pr.webservice.iso21090.ST;
import edu.duke.cabig.c3pr.webservice.subjectregistry.converters.SubjectRegistryJAXBToDomainObjectConverterImpl;

public class SubjectRegistryRelatedTestCase extends ApplicationTestCase {

    public static final String BAD_RACE_CODE = "invalid race code";
    public static final String BAD_ISO_DATE = "1990-01-01";
    public static final String TS_DATETIME_PATTERN = "yyyyMMddHHmmss";
    public static final String TEST_FAX = "555-555-5555";
    public static final String TEST_FAX_ISO = "x-text-fax:" + TEST_FAX;
    public static final String TEST_PHONE = "555-555-5555";
    public static final String TEST_PHONE_ISO = "tel:" + TEST_PHONE;
    public static final String TEST_EMAIL_ADDR = "johndoe@semanticbits.com";
    public static final String TEST_EMAIL_ADDR_ISO = "mailto:" + TEST_EMAIL_ADDR;
    public static final String RACE_ASIAN = "Asian";
    public static final String RACE_WHITE = "White";
    public static final String TEST_COUNTRY = "USA";
    public static final String TEST_ZIP_CODE = "22203-5555";
    public static final String TEST_STATE_CODE = "VA";
    public static final String TEST_CITY_NAME = "Arlington";
    public static final String TEST_STREET_ADDRESS = "1029 N Stuart St Unit 999";
    public static final String TEST_LAST_NAME = "Doe";
    public static final String TEST_MID_NAME = "Z";
    public static final String TEST_FIRST_NAME = "John";
    public static final String MARITAL_STATUS_SINGLE = "Single";
    public static final String ETHNIC_CODE_NOT_REPORTED = "Not Reported";
    public static final String TEST_BIRTH_DATE_ISO = "19800101000000";
    public static final Date TEST_BIRTH_DATE = parseISODate(TEST_BIRTH_DATE_ISO);
    public static final String GENDER_MALE = "Male";
    public static final String STATE_ACTIVE = "ACTIVE";
    public static final String STATE_INACTIVE = "INACTIVE";
    public static final String ORG_ID_TYPE_MRN = OrganizationIdentifierTypeEnum.MRN.getName();
    public static final String ORG_ID_TYPE_STUDY = OrganizationIdentifierTypeEnum.COORDINATING_CENTER_IDENTIFIER
            .getName();
    public static final String ORG_ID_TYPE_STUDYSUBJECT = OrganizationIdentifierTypeEnum.COORDINATING_CENTER_ASSIGNED_STUDY_SUBJECT_IDENTIFIER
            .getName();
    public static final String TEST_BIO_ID = "test_subject_id";
    public static final Boolean TEST_BIO_ID_PRIMARYINDICATOR = true;
    public static final String TEST_STUDYSUBJECT_ID = "002";
    public static final Boolean TEST_STUDYSUBJECT_ID_PRIMARYINDICATOR = true;
    public static final String TEST_STUDY_ID = "test_study_id";
    public static final Boolean TEST_STUDY_ID_PRIMARYINDICATOR = true;
    public static final String TEST_HEALTHCARESITE_ID = "MN026";
    public static final Boolean TEST_HEALTHCARESITE_ID_PRIMARYINDICATOR = false;
    public static final String ORG_ID_TYPE_CTEP = OrganizationIdentifierTypeEnum.CTEP.getName();
    public static final String TEST_ORG_ID = "MN026";
    public static final String TEST_CONSENT_DELIVERY_DATE1 = "20090101000000";
    public static final String TEST_CONSENT_SIGNED_DATE1 = "20100101000000";
    public static final String TEST_CONSENT_PRESENTER1 = "John Doe";
    public static final String TEST_CONSENTING_METHOD1 = "Written";
    public static final String TEST_CONSENTING_DOCID1 = "DOC_ID1";
    public static final String TEST_CONSENT_NAME1 = "General1";
    public static final String TEST_CONSENT_DESC1 = "Desc1";
    public static final String TEST_CONSENT_VERSION1 = "1.0";
    public static final Boolean TEST_CONSENT_ANS11 = true;
    public static final Boolean TEST_CONSENT_ANS12 = false;
    public static final String TEST_CONSENT_QUES11 = "Q11";
    public static final String TEST_CONSENT_QUES12 = "Q12";
    public static final String TEST_CONSENT_DELIVERY_DATE2 = "20060101000000";
    public static final String TEST_CONSENT_SIGNED_DATE2 = "20070101000000";
    public static final String TEST_CONSENT_PRESENTER2 = "Deep Singh";
    public static final String TEST_CONSENTING_METHOD2 = "Verbal";
    public static final String TEST_CONSENTING_DOCID2 = "DOC_ID2";
    public static final String TEST_CONSENT_NAME2 = "general2";
    public static final String TEST_CONSENT_DESC2 = "Desc2";
    public static final String TEST_CONSENT_VERSION2 = "2.0";
    public static final Boolean TEST_CONSENT_ANS21 = true;
    public static final Boolean TEST_CONSENT_ANS22 = false;
    public static final String TEST_CONSENT_QUES21 = "Q21";
    public static final String TEST_CONSENT_QUES22 = "Q22";
    public static final String TEST_REGISTRYSTATUS_CODE1 = "Screen Failed";
    public static final String TEST_REGISTRYSTATUS_DATE1 = "20080101000000";
    public static final String TEST_REGISTRYSTATUS_REASON11 = "FAILED INCLUSION";
    public static final String TEST_REGISTRYSTATUS_REASON12 = "Lab_Out_Of_Range1";
    public static final String TEST_REGISTRYSTATUS_CODE2 = "Withdrawn";
    public static final String TEST_REGISTRYSTATUS_DATE2 = "20070101000000";
    public static final String TEST_REGISTRYSTATUS_REASON21 = "UNWILLING";
    public static final String TEST_REGISTRYSTATUS_REASON22 = "Distance";
    public static final String TEST_PAYMENT_METHOD = "private insurance";
    public static final String TEST_DATA_ENTRY_STATUS = "Complete";
    public static final String TEST_SHORTTITLE = "short_title_text";
    public static final String TEST_LONGTITLE = "long_title";
    public static final String TEST_DESC = "description";
    public static final String TEST_VALUE2 = "v2";
    public static final String TEST_VALUE1 = "v1";
    public static final String TEST_PREDICATE = "Predicate";
    public static final String TEST_OBJ_NAME = "objName";
    public static final String TEST_OBJ_CTX_NAME = "objCtxName";
    public static final String TEST_ATTRIBUTE_NAME = "attribute_name";

    protected static final ISO21090Helper iso = new ISO21090Helper();

    protected static Date parseISODate(String isoDate) {
        try {
            return DateUtils.parseDate(isoDate, new String[] { TS_DATETIME_PATTERN });
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    protected SubjectRegistryJAXBToDomainObjectConverterImpl converter;

    protected HealthcareSiteDao healthcareSiteDao;

    protected static HealthcareSite healthcareSite;

    /*
     * (non-Javadoc)
     * 
     * @see junit.framework.TestCase#setUp()
     */
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        healthcareSiteDao = createMock(HealthcareSiteDao.class);
        converter = new SubjectRegistryJAXBToDomainObjectConverterImpl();
        C3PRExceptionHelper exceptionHelper = new C3PRExceptionHelper(getMessageSourceMock());
        converter.setExceptionHelper(exceptionHelper);

        converter.setHealthcareSiteDao(healthcareSiteDao);

        healthcareSite = new LocalHealthcareSite();
        healthcareSite.setCtepCode(TEST_ORG_ID, true);
        expect(healthcareSiteDao.getByTypeAndCodeFromLocal(ORG_ID_TYPE_CTEP, TEST_ORG_ID, true))
                .andReturn(healthcareSite).anyTimes();
        replay(healthcareSiteDao);

    }

    //   @Override
    //   protected void tearDown() throws Exception {
    //      verifyMocks();
    //      super.tearDown();
    //   }

    /**
     * @return
     */
    public static BiologicEntityIdentifier createBioEntityId() {
        BiologicEntityIdentifier bioId = new BiologicEntityIdentifier();
        bioId.setAssigningOrganization(createOrganization());
        bioId.setIdentifier(iso.II(TEST_BIO_ID));
        bioId.setTypeCode(iso.CD(ORG_ID_TYPE_MRN));
        bioId.setEffectiveDateRange(iso.IVLTSDateTime(NullFlavor.NI));
        bioId.setPrimaryIndicator(iso.BL(TEST_BIO_ID_PRIMARYINDICATOR));
        return bioId;
    }

    /**
     * @return
     */
    public static DocumentIdentifier createDocumentId() {
        DocumentIdentifier docId = new DocumentIdentifier();
        docId.setAssigningOrganization(createOrganization());
        docId.setIdentifier(iso.II(TEST_STUDY_ID));
        docId.setTypeCode(iso.CD(ORG_ID_TYPE_STUDY));
        docId.setPrimaryIndicator(iso.BL(TEST_STUDY_ID_PRIMARYINDICATOR));
        return docId;
    }

    /**
     * @return
     */
    public static SubjectIdentifier createSubjectId() {
        SubjectIdentifier subId = new SubjectIdentifier();
        subId.setAssigningOrganization(createOrganization());
        subId.setIdentifier(iso.II(TEST_STUDYSUBJECT_ID));
        subId.setTypeCode(iso.CD(ORG_ID_TYPE_STUDYSUBJECT));
        subId.setPrimaryIndicator(iso.BL(TEST_STUDYSUBJECT_ID_PRIMARYINDICATOR));
        return subId;
    }

    /**
     * @return
     */
    protected MessageSource getMessageSourceMock() {
        return new MessageSource() {
            public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
                // TODO Auto-generated method stub
                return "";
            }

            public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
                // TODO Auto-generated method stub
                return "";
            }

            public String getMessage(MessageSourceResolvable resolvable, Locale locale)
                    throws NoSuchMessageException {
                // TODO Auto-generated method stub
                return "";
            }
        };
    }

    public static Organization createOrganization() {
        Organization organization = new Organization();
        OrganizationIdentifier oid = createOrgId();
        organization.getOrganizationIdentifier().add(oid);
        return organization;
    }

    public static OrganizationIdentifier createOrgId() {
        OrganizationIdentifier oid = new OrganizationIdentifier();
        oid.setIdentifier(iso.II(TEST_ORG_ID));
        oid.setPrimaryIndicator(iso.BL(true));
        oid.setTypeCode(iso.CD(ORG_ID_TYPE_CTEP));
        return oid;
    }

    public static List<StudySubjectConsentVersion> getSubjectConsents() {
        List<StudySubjectConsentVersion> returnList = new ArrayList<StudySubjectConsentVersion>();
        //add 1st consent
        StudySubjectConsentVersion studySubjectConsentVersion = new StudySubjectConsentVersion();
        studySubjectConsentVersion.setConsentDeliveryDate(iso.TSDateTime(TEST_CONSENT_DELIVERY_DATE1));
        studySubjectConsentVersion.setIdentifier(iso.II(TEST_CONSENTING_DOCID1));
        studySubjectConsentVersion.setInformedConsentDate(iso.TSDateTime(TEST_CONSENT_SIGNED_DATE1));
        studySubjectConsentVersion.setConsentingMethod(iso.CD(TEST_CONSENTING_METHOD1));
        studySubjectConsentVersion.setConsentPresenter(iso.ST(TEST_CONSENT_PRESENTER1));
        studySubjectConsentVersion.setConsent(new DocumentVersion());
        studySubjectConsentVersion.getConsent().setOfficialTitle(iso.ST(TEST_CONSENT_NAME1));
        studySubjectConsentVersion.getConsent().setText(iso.ED(TEST_CONSENT_DESC1));
        studySubjectConsentVersion.getConsent().setVersionNumberText(iso.ST(TEST_CONSENT_VERSION1));

        PerformedStudySubjectMilestone subjectAnswer = new PerformedStudySubjectMilestone();
        subjectAnswer.setMissedIndicator(iso.BL(TEST_CONSENT_ANS11));
        subjectAnswer.setConsentQuestion(new DocumentVersion());
        subjectAnswer.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES11));
        studySubjectConsentVersion.getSubjectConsentAnswer().add(subjectAnswer);
        subjectAnswer = new PerformedStudySubjectMilestone();
        subjectAnswer.setMissedIndicator(iso.BL(TEST_CONSENT_ANS12));
        subjectAnswer.setConsentQuestion(new DocumentVersion());
        subjectAnswer.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES12));
        studySubjectConsentVersion.getSubjectConsentAnswer().add(subjectAnswer);

        returnList.add(studySubjectConsentVersion);

        //add 2nd consent
        studySubjectConsentVersion = new StudySubjectConsentVersion();
        studySubjectConsentVersion.setConsentDeliveryDate(iso.TSDateTime(TEST_CONSENT_DELIVERY_DATE2));
        studySubjectConsentVersion.setIdentifier(iso.II(TEST_CONSENTING_DOCID2));
        studySubjectConsentVersion.setInformedConsentDate(iso.TSDateTime(TEST_CONSENT_SIGNED_DATE2));
        studySubjectConsentVersion.setConsentingMethod(iso.CD(TEST_CONSENTING_METHOD2));
        studySubjectConsentVersion.setConsentPresenter(iso.ST(TEST_CONSENT_PRESENTER2));
        studySubjectConsentVersion.setConsent(new DocumentVersion());
        studySubjectConsentVersion.getConsent().setOfficialTitle(iso.ST(TEST_CONSENT_NAME2));
        studySubjectConsentVersion.getConsent().setText(iso.ED(TEST_CONSENT_DESC2));
        studySubjectConsentVersion.getConsent().setVersionNumberText(iso.ST(TEST_CONSENT_VERSION2));

        subjectAnswer = new PerformedStudySubjectMilestone();
        subjectAnswer.setMissedIndicator(iso.BL(TEST_CONSENT_ANS21));
        subjectAnswer.setConsentQuestion(new DocumentVersion());
        subjectAnswer.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES21));
        studySubjectConsentVersion.getSubjectConsentAnswer().add(subjectAnswer);
        subjectAnswer = new PerformedStudySubjectMilestone();
        subjectAnswer.setMissedIndicator(iso.BL(TEST_CONSENT_ANS22));
        subjectAnswer.setConsentQuestion(new DocumentVersion());
        subjectAnswer.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES22));
        studySubjectConsentVersion.getSubjectConsentAnswer().add(subjectAnswer);

        returnList.add(studySubjectConsentVersion);

        return returnList;
    }

    protected void assertSubjectConsent(List<edu.duke.cabig.c3pr.domain.StudySubjectConsentVersion> actual) {
        assertEquals(parseISODate(TEST_CONSENT_DELIVERY_DATE1), actual.get(0).getConsentDeliveryDate());
        assertEquals(TEST_CONSENTING_DOCID1, actual.get(0).getDocumentId());
        assertEquals(parseISODate(TEST_CONSENT_SIGNED_DATE1), actual.get(0).getInformedConsentSignedDate());
        assertEquals(TEST_CONSENT_PRESENTER1, actual.get(0).getConsentPresenter());
        assertEquals(TEST_CONSENTING_METHOD1, actual.get(0).getConsentingMethod().getCode());
        assertEquals(TEST_CONSENT_NAME1, actual.get(0).getConsent().getName());
        assertEquals(TEST_CONSENT_DESC1, actual.get(0).getConsent().getDescriptionText());
        assertEquals(TEST_CONSENT_VERSION1, actual.get(0).getConsent().getVersionId());
        assertEquals(TEST_CONSENT_ANS11, actual.get(0).getSubjectConsentAnswers().get(0).getAgreementIndicator());
        assertEquals(TEST_CONSENT_QUES11,
                actual.get(0).getSubjectConsentAnswers().get(0).getConsentQuestion().getCode());
        assertEquals(TEST_CONSENT_ANS12, actual.get(0).getSubjectConsentAnswers().get(1).getAgreementIndicator());
        assertEquals(TEST_CONSENT_QUES12,
                actual.get(0).getSubjectConsentAnswers().get(1).getConsentQuestion().getCode());

        assertEquals(parseISODate(TEST_CONSENT_DELIVERY_DATE2), actual.get(1).getConsentDeliveryDate());
        assertEquals(TEST_CONSENTING_DOCID2, actual.get(1).getDocumentId());
        assertEquals(parseISODate(TEST_CONSENT_SIGNED_DATE2), actual.get(1).getInformedConsentSignedDate());
        assertEquals(TEST_CONSENT_PRESENTER2, actual.get(1).getConsentPresenter());
        assertEquals(TEST_CONSENTING_METHOD2, actual.get(1).getConsentingMethod().getCode());
        assertEquals(TEST_CONSENT_NAME2, actual.get(1).getConsent().getName());
        assertEquals(TEST_CONSENT_DESC2, actual.get(1).getConsent().getDescriptionText());
        assertEquals(TEST_CONSENT_VERSION2, actual.get(1).getConsent().getVersionId());
        assertEquals(TEST_CONSENT_ANS21, actual.get(1).getSubjectConsentAnswers().get(0).getAgreementIndicator());
        assertEquals(TEST_CONSENT_QUES21,
                actual.get(1).getSubjectConsentAnswers().get(0).getConsentQuestion().getCode());
        assertEquals(TEST_CONSENT_ANS22, actual.get(1).getSubjectConsentAnswers().get(1).getAgreementIndicator());
        assertEquals(TEST_CONSENT_QUES22,
                actual.get(1).getSubjectConsentAnswers().get(1).getConsentQuestion().getCode());
    }

    /**
     * @return
     */
    public static AdvanceSearchCriterionParameter createAdvaceSearchParam() {
        AdvanceSearchCriterionParameter param = new AdvanceSearchCriterionParameter();
        param.setAttributeName(iso.ST(TEST_ATTRIBUTE_NAME));
        param.setObjectContextName(iso.ST(TEST_OBJ_CTX_NAME));
        param.setObjectName(iso.ST(TEST_OBJ_NAME));
        param.setPredicate(iso.CD(TEST_PREDICATE));
        param.setValues(iso.DSETST(Arrays.asList(new ST[] { iso.ST(TEST_VALUE1), iso.ST(TEST_VALUE2) })));
        return param;
    }

    public static PerformedStudySubjectMilestone createStatus() {
        PerformedStudySubjectMilestone status = new PerformedStudySubjectMilestone();
        status.setStatusCode(iso.CD(TEST_REGISTRYSTATUS_CODE1));
        status.setStatusDate(iso.TSDateTime(TEST_REGISTRYSTATUS_DATE1));
        status.setReasonCode(new DSETCD());
        status.getReasonCode().getItem().add(iso.CD(TEST_REGISTRYSTATUS_REASON11));
        status.getReasonCode().getItem().add(iso.CD(TEST_REGISTRYSTATUS_REASON12));
        return status;
    }

    /**
     * @return
     */
    public static StudySubjectDemographics createSubjectDemographics() {
        StudySubjectDemographics s = new StudySubjectDemographics();

        OrganizationAssignedIdentifier id = new OrganizationAssignedIdentifier();
        id.setHealthcareSite(healthcareSite);
        id.setPrimaryIndicator(true);
        id.setType(OrganizationIdentifierTypeEnum.MRN);
        id.setValue(TEST_BIO_ID);
        s.addIdentifier(id);

        s.setAdministrativeGenderCode(GENDER_MALE);
        s.setBirthDate(TEST_BIRTH_DATE);
        s.setEthnicGroupCode(ETHNIC_CODE_NOT_REPORTED);
        s.setMaritalStatusCode(MARITAL_STATUS_SINGLE);
        s.setFirstName(TEST_FIRST_NAME);
        s.setMaidenName(StringUtils.EMPTY);
        s.setMiddleName(TEST_MID_NAME);
        s.setLastName(TEST_LAST_NAME);
        s.setAddress(
                new Address(TEST_STREET_ADDRESS, TEST_CITY_NAME, TEST_STATE_CODE, TEST_ZIP_CODE, TEST_COUNTRY));

        s.setRaceCodes(createRaceCodes());
        s.setEmail(TEST_EMAIL_ADDR);
        s.setPhone(TEST_PHONE);
        s.setFax(TEST_FAX);
        return s;
    }

    public static StudySubject createStudySubjectDomainObject() {
        StudySubject studySubject = new StudySubject();
        studySubject.setStudySubjectDemographics(createSubjectDemographics());
        studySubject.setPaymentMethod(TEST_PAYMENT_METHOD);
        studySubject.setRegDataEntryStatus(RegistrationDataEntryStatus.getByCode(TEST_DATA_ENTRY_STATUS));

        OrganizationAssignedIdentifier id = new OrganizationAssignedIdentifier();
        id.setHealthcareSite(healthcareSite);
        id.setPrimaryIndicator(true);
        id.setType(OrganizationIdentifierTypeEnum.COORDINATING_CENTER_ASSIGNED_STUDY_SUBJECT_IDENTIFIER);
        id.setValue(TEST_STUDYSUBJECT_ID);
        id.setPrimaryIndicator(TEST_STUDYSUBJECT_ID_PRIMARYINDICATOR);
        studySubject.addIdentifier(id);

        Study study = new LocalStudy();
        StudySite studySite = new StudySite();
        StudySiteStudyVersion studySiteStudyVersion = new StudySiteStudyVersion();
        studySiteStudyVersion.setStartDate(new Date());
        studySiteStudyVersion.setStudySite(studySite);
        studySite.addStudySiteStudyVersion(studySiteStudyVersion);
        studySite.setStudy(study);
        studySubject.setStudySite(studySite);
        study.setShortTitleText(TEST_SHORTTITLE);
        study.setLongTitleText(TEST_LONGTITLE);
        study.setDescriptionText(TEST_DESC);
        id = new OrganizationAssignedIdentifier();
        id.setHealthcareSite(healthcareSite);
        id.setPrimaryIndicator(true);
        id.setType(OrganizationIdentifierTypeEnum.COORDINATING_CENTER_IDENTIFIER);
        id.setValue(TEST_STUDY_ID);
        study.addIdentifier(id);
        HealthcareSite healthcareSite1 = new LocalHealthcareSite();
        id = new OrganizationAssignedIdentifier();
        id.setPrimaryIndicator(true);
        id.setType(OrganizationIdentifierTypeEnum.CTEP);
        id.setValue(TEST_HEALTHCARESITE_ID);
        id.setPrimaryIndicator(TEST_HEALTHCARESITE_ID_PRIMARYINDICATOR);
        healthcareSite1.getIdentifiersAssignedToOrganization().add(id);
        studySite.setHealthcareSite(healthcareSite1);

        edu.duke.cabig.c3pr.domain.StudySubjectConsentVersion studySubjectConsentVersion = new edu.duke.cabig.c3pr.domain.StudySubjectConsentVersion();
        studySubjectConsentVersion.setConsent(new Consent());
        studySubjectConsentVersion.getConsent().setName(TEST_CONSENT_NAME1);
        studySubjectConsentVersion.getConsent().setDescriptionText(TEST_CONSENT_DESC1);
        studySubjectConsentVersion.getConsent().setVersionId(TEST_CONSENT_VERSION1);
        studySubjectConsentVersion.setConsentDeliveryDate(parseISODate(TEST_CONSENT_DELIVERY_DATE1));
        studySubjectConsentVersion.setDocumentId(TEST_CONSENTING_DOCID1);
        studySubjectConsentVersion.setInformedConsentSignedDate(parseISODate(TEST_CONSENT_SIGNED_DATE1));
        studySubjectConsentVersion.setConsentingMethod(ConsentingMethod.getByCode(TEST_CONSENTING_METHOD1));
        studySubjectConsentVersion.setConsentPresenter(TEST_CONSENT_PRESENTER1);
        SubjectConsentQuestionAnswer ans = new SubjectConsentQuestionAnswer();
        ans.setAgreementIndicator(TEST_CONSENT_ANS11);
        ans.setConsentQuestion(new ConsentQuestion());
        ans.getConsentQuestion().setCode(TEST_CONSENT_QUES11);
        studySubjectConsentVersion.addSubjectConsentAnswer(ans);
        ans = new SubjectConsentQuestionAnswer();
        ans.setAgreementIndicator(TEST_CONSENT_ANS12);
        ans.setConsentQuestion(new ConsentQuestion());
        ans.getConsentQuestion().setCode(TEST_CONSENT_QUES12);
        studySubjectConsentVersion.addSubjectConsentAnswer(ans);
        studySubject.getStudySubjectStudyVersion().addStudySubjectConsentVersion(studySubjectConsentVersion);

        studySubjectConsentVersion = new edu.duke.cabig.c3pr.domain.StudySubjectConsentVersion();
        studySubjectConsentVersion.setConsent(new Consent());
        studySubjectConsentVersion.getConsent().setName(TEST_CONSENT_NAME2);
        studySubjectConsentVersion.getConsent().setDescriptionText(TEST_CONSENT_DESC2);
        studySubjectConsentVersion.getConsent().setVersionId(TEST_CONSENT_VERSION2);
        studySubjectConsentVersion.setConsentDeliveryDate(parseISODate(TEST_CONSENT_DELIVERY_DATE2));
        studySubjectConsentVersion.setDocumentId(TEST_CONSENTING_DOCID2);
        studySubjectConsentVersion.setInformedConsentSignedDate(parseISODate(TEST_CONSENT_SIGNED_DATE2));
        studySubjectConsentVersion.setConsentingMethod(ConsentingMethod.getByCode(TEST_CONSENTING_METHOD2));
        studySubjectConsentVersion.setConsentPresenter(TEST_CONSENT_PRESENTER2);
        ans = new SubjectConsentQuestionAnswer();
        ans.setAgreementIndicator(TEST_CONSENT_ANS21);
        ans.setConsentQuestion(new ConsentQuestion());
        ans.getConsentQuestion().setCode(TEST_CONSENT_QUES21);
        studySubjectConsentVersion.addSubjectConsentAnswer(ans);
        ans = new SubjectConsentQuestionAnswer();
        ans.setAgreementIndicator(TEST_CONSENT_ANS22);
        ans.setConsentQuestion(new ConsentQuestion());
        ans.getConsentQuestion().setCode(TEST_CONSENT_QUES22);
        studySubjectConsentVersion.addSubjectConsentAnswer(ans);
        studySubject.getStudySubjectStudyVersion().addStudySubjectConsentVersion(studySubjectConsentVersion);

        StudySubjectRegistryStatus studySubjectRegistryStatus = new StudySubjectRegistryStatus();
        studySubjectRegistryStatus
                .setPermissibleStudySubjectRegistryStatus(new PermissibleStudySubjectRegistryStatus());
        studySubjectRegistryStatus.getPermissibleStudySubjectRegistryStatus()
                .setRegistryStatus(new RegistryStatus(TEST_REGISTRYSTATUS_CODE1, "", null));
        studySubjectRegistryStatus.getReasons()
                .addAll(Arrays.asList(new RegistryStatusReason[] {
                        new RegistryStatusReason(TEST_REGISTRYSTATUS_REASON11, null, null, true),
                        new RegistryStatusReason(TEST_REGISTRYSTATUS_REASON12, null, null, true) }));
        studySubjectRegistryStatus.setEffectiveDate(parseISODate(TEST_REGISTRYSTATUS_DATE1));
        studySubject.getStudySubjectRegistryStatusHistoryInternal().add(studySubjectRegistryStatus);

        studySubjectRegistryStatus = new StudySubjectRegistryStatus();
        studySubjectRegistryStatus
                .setPermissibleStudySubjectRegistryStatus(new PermissibleStudySubjectRegistryStatus());
        studySubjectRegistryStatus.getPermissibleStudySubjectRegistryStatus()
                .setRegistryStatus(new RegistryStatus(TEST_REGISTRYSTATUS_CODE2, "", null));
        studySubjectRegistryStatus.getReasons()
                .addAll(Arrays.asList(new RegistryStatusReason[] {
                        new RegistryStatusReason(TEST_REGISTRYSTATUS_REASON21, null, null, true),
                        new RegistryStatusReason(TEST_REGISTRYSTATUS_REASON22, null, null, true) }));
        studySubjectRegistryStatus.setEffectiveDate(parseISODate(TEST_REGISTRYSTATUS_DATE2));
        studySubject.getStudySubjectRegistryStatusHistoryInternal().add(studySubjectRegistryStatus);

        return studySubject;
    }

    public static edu.duke.cabig.c3pr.webservice.subjectregistry.StudySubject createStudySubjectJAXBObject() {
        edu.duke.cabig.c3pr.webservice.subjectregistry.StudySubject studySubject = new edu.duke.cabig.c3pr.webservice.subjectregistry.StudySubject();
        studySubject.setEntity(createPerson());
        studySubject.setPaymentMethodCode(iso.CD(TEST_PAYMENT_METHOD));
        studySubject.setStatusCode(iso.CD(TEST_DATA_ENTRY_STATUS));

        studySubject.getSubjectIdentifier().add(createSubjectId());

        StudySubjectProtocolVersionRelationship studySubjectProtocolVersion = new StudySubjectProtocolVersionRelationship();
        studySubject.setStudySubjectProtocolVersion(studySubjectProtocolVersion);
        studySubjectProtocolVersion.setStudySiteProtocolVersion(new StudySiteProtocolVersionRelationship());

        //setup study
        studySubjectProtocolVersion.getStudySiteProtocolVersion()
                .setStudyProtocolVersion(new StudyProtocolVersion());
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .setStudyProtocolDocument(new StudyProtocolDocumentVersion());
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .getStudyProtocolDocument().setPublicTitle(iso.ST(TEST_LONGTITLE));
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .getStudyProtocolDocument().setOfficialTitle(iso.ST(TEST_SHORTTITLE));
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .getStudyProtocolDocument().setPublicDescription(iso.ST(TEST_DESC));
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .getStudyProtocolDocument().setDocument(new Document());
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudyProtocolVersion()
                .getStudyProtocolDocument().getDocument().getDocumentIdentifier().add(createDocumentId());

        //setup studysite
        studySubjectProtocolVersion.getStudySiteProtocolVersion()
                .setStudySite(new edu.duke.cabig.c3pr.webservice.common.StudySite());
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudySite()
                .setOrganization(new Organization());
        studySubjectProtocolVersion.getStudySiteProtocolVersion().getStudySite().getOrganization()
                .getOrganizationIdentifier().add(createOrgId());

        StudySubjectConsentVersion target = new StudySubjectConsentVersion();
        target.setConsentDeliveryDate(iso.TSDateTime(TEST_CONSENT_DELIVERY_DATE1));
        target.setIdentifier(iso.II(TEST_CONSENTING_DOCID1));
        target.setConsentingMethod(iso.CD(TEST_CONSENTING_METHOD1));
        target.setConsentPresenter(iso.ST(TEST_CONSENT_PRESENTER1));
        target.setInformedConsentDate(iso.TSDateTime(TEST_CONSENT_SIGNED_DATE1));
        target.setConsent(new DocumentVersion());
        target.getConsent().setOfficialTitle(iso.ST(TEST_CONSENT_NAME1));
        target.getConsent().setText(iso.ED(TEST_CONSENT_DESC1));
        target.getConsent().setVersionNumberText(iso.ST(TEST_CONSENT_VERSION1));
        PerformedStudySubjectMilestone subjectAnswerTarget = new PerformedStudySubjectMilestone();
        subjectAnswerTarget.setMissedIndicator(iso.BL(TEST_CONSENT_ANS11));
        subjectAnswerTarget.setConsentQuestion(new DocumentVersion());
        subjectAnswerTarget.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES11));
        target.getSubjectConsentAnswer().add(subjectAnswerTarget);
        subjectAnswerTarget = new PerformedStudySubjectMilestone();
        subjectAnswerTarget.setMissedIndicator(iso.BL(TEST_CONSENT_ANS12));
        subjectAnswerTarget.setConsentQuestion(new DocumentVersion());
        subjectAnswerTarget.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES12));
        target.getSubjectConsentAnswer().add(subjectAnswerTarget);
        studySubjectProtocolVersion.getStudySubjectConsentVersion().add(target);

        target = new StudySubjectConsentVersion();
        target.setConsentDeliveryDate(iso.TSDateTime(TEST_CONSENT_DELIVERY_DATE2));
        target.setIdentifier(iso.II(TEST_CONSENTING_DOCID2));
        target.setConsentingMethod(iso.CD(TEST_CONSENTING_METHOD2));
        target.setConsentPresenter(iso.ST(TEST_CONSENT_PRESENTER2));
        target.setInformedConsentDate(iso.TSDateTime(TEST_CONSENT_SIGNED_DATE2));
        target.setConsent(new DocumentVersion());
        target.getConsent().setOfficialTitle(iso.ST(TEST_CONSENT_NAME2));
        target.getConsent().setText(iso.ED(TEST_CONSENT_DESC2));
        target.getConsent().setVersionNumberText(iso.ST(TEST_CONSENT_VERSION2));
        subjectAnswerTarget = new PerformedStudySubjectMilestone();
        subjectAnswerTarget.setMissedIndicator(iso.BL(TEST_CONSENT_ANS21));
        subjectAnswerTarget.setConsentQuestion(new DocumentVersion());
        subjectAnswerTarget.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES21));
        target.getSubjectConsentAnswer().add(subjectAnswerTarget);
        subjectAnswerTarget = new PerformedStudySubjectMilestone();
        subjectAnswerTarget.setMissedIndicator(iso.BL(TEST_CONSENT_ANS22));
        subjectAnswerTarget.setConsentQuestion(new DocumentVersion());
        subjectAnswerTarget.getConsentQuestion().setOfficialTitle(iso.ST(TEST_CONSENT_QUES22));
        target.getSubjectConsentAnswer().add(subjectAnswerTarget);
        studySubjectProtocolVersion.getStudySubjectConsentVersion().add(target);

        return studySubject;
    }

    /**
     * @param s
     */
    protected void assertPerson(Person person) {
        assertTrue(CollectionUtils.isNotEmpty(person.getBiologicEntityIdentifier()));
        BiologicEntityIdentifier bioId = person.getBiologicEntityIdentifier().get(0);
        assertEquals(TEST_BIO_ID, bioId.getIdentifier().getExtension());
        assertEquals(ORG_ID_TYPE_MRN, bioId.getTypeCode().getCode());
        Organization org = bioId.getAssigningOrganization();
        assertNotNull(org);
        assertTrue(CollectionUtils.isNotEmpty(org.getOrganizationIdentifier()));
        OrganizationIdentifier orgId = org.getOrganizationIdentifier().get(0);
        assertEquals(TEST_ORG_ID, orgId.getIdentifier().getExtension());
        assertTrue(orgId.getPrimaryIndicator().isValue());
        assertEquals(ORG_ID_TYPE_CTEP, orgId.getTypeCode().getCode());

        assertEquals(GENDER_MALE, person.getAdministrativeGenderCode().getCode());
        assertEquals(TEST_BIRTH_DATE_ISO, person.getBirthDate().getValue());
        assertEquals(ETHNIC_CODE_NOT_REPORTED, person.getEthnicGroupCode().getItem().get(0).getCode());
        assertEquals(MARITAL_STATUS_SINGLE, person.getMaritalStatusCode().getCode());
        assertEquals(TEST_FIRST_NAME, person.getName().getItem().get(0).getPart().get(0).getValue());
        assertEquals(EntityNamePartType.GIV, person.getName().getItem().get(0).getPart().get(0).getType());
        assertEquals(TEST_MID_NAME, person.getName().getItem().get(0).getPart().get(1).getValue());
        assertEquals(EntityNamePartType.GIV, person.getName().getItem().get(0).getPart().get(1).getType());
        assertEquals(TEST_LAST_NAME, person.getName().getItem().get(0).getPart().get(2).getValue());
        assertEquals(EntityNamePartType.FAM, person.getName().getItem().get(0).getPart().get(2).getType());
        assertEquals(TEST_STREET_ADDRESS, person.getPostalAddress().getItem().get(0).getPart().get(0).getValue());
        assertEquals(TEST_CITY_NAME, person.getPostalAddress().getItem().get(0).getPart().get(1).getValue());
        assertEquals(TEST_STATE_CODE, person.getPostalAddress().getItem().get(0).getPart().get(2).getValue());
        assertEquals(TEST_ZIP_CODE, person.getPostalAddress().getItem().get(0).getPart().get(3).getValue());
        assertEquals(TEST_COUNTRY, person.getPostalAddress().getItem().get(0).getPart().get(4).getValue());
        assertEquals(AddressPartType.SAL, person.getPostalAddress().getItem().get(0).getPart().get(0).getType());
        assertEquals(AddressPartType.CTY, person.getPostalAddress().getItem().get(0).getPart().get(1).getType());
        assertEquals(AddressPartType.STA, person.getPostalAddress().getItem().get(0).getPart().get(2).getType());
        assertEquals(AddressPartType.ZIP, person.getPostalAddress().getItem().get(0).getPart().get(3).getType());
        assertEquals(AddressPartType.CNT, person.getPostalAddress().getItem().get(0).getPart().get(4).getType());
        assertEquals(RACE_WHITE, person.getRaceCode().getItem().get(0).getCode());
        assertEquals(RACE_ASIAN, person.getRaceCode().getItem().get(1).getCode());
        assertEquals(TEST_EMAIL_ADDR_ISO, person.getTelecomAddress().getItem().get(0).getValue());
        assertEquals(TEST_PHONE_ISO, person.getTelecomAddress().getItem().get(1).getValue());
        assertEquals(TEST_FAX_ISO, person.getTelecomAddress().getItem().get(2).getValue());
    }

    /**
     * @return
     */
    public static List<RaceCodeEnum> createRaceCodes() {
        List<RaceCodeEnum> list = new ArrayList<RaceCodeEnum>();
        list.add(RaceCodeEnum.White);
        list.add(RaceCodeEnum.Asian);
        return list;
    }

    /**
     * @return
     */
    public static Person createPerson() {
        Person person = new Person();
        person.getBiologicEntityIdentifier().add(createBioEntityId());
        person.setAdministrativeGenderCode(iso.CD(GENDER_MALE));
        person.setBirthDate(iso.TSDateTime(TEST_BIRTH_DATE_ISO));
        person.setEthnicGroupCode(iso.DSETCD(iso.CD(ETHNIC_CODE_NOT_REPORTED)));
        person.setMaritalStatusCode(iso.CD(MARITAL_STATUS_SINGLE));
        person.setName(iso.DSETENPN(iso.ENPN(iso.ENXP(TEST_FIRST_NAME, EntityNamePartType.GIV),
                iso.ENXP(TEST_MID_NAME, EntityNamePartType.GIV),
                iso.ENXP(TEST_LAST_NAME, EntityNamePartType.FAM))));
        person.setPostalAddress(iso.DSETAD(iso.AD(iso.ADXP(TEST_STREET_ADDRESS, AddressPartType.SAL),
                iso.ADXP(TEST_CITY_NAME, AddressPartType.CTY), iso.ADXP(TEST_STATE_CODE, AddressPartType.STA),
                iso.ADXP(TEST_ZIP_CODE, AddressPartType.ZIP), iso.ADXP(TEST_COUNTRY, AddressPartType.CNT))));
        person.setRaceCode(iso.DSETCD(iso.CD(RACE_WHITE), iso.CD(RACE_ASIAN)));
        person.setTelecomAddress(iso.BAGTEL(iso.TEL(TEST_EMAIL_ADDR_ISO, null), iso.TEL(TEST_PHONE_ISO, null),
                iso.TEL(TEST_FAX_ISO, null)));
        return person;
    }

    /**
     * @param s
     */
    protected void assertSubjectDemographics(final StudySubjectDemographics s) {
        assertEquals(GENDER_MALE, s.getAdministrativeGenderCode());
        assertEquals(TEST_BIRTH_DATE, s.getBirthDate());
        assertEquals(ETHNIC_CODE_NOT_REPORTED, s.getEthnicGroupCode());
        assertEquals(MARITAL_STATUS_SINGLE, s.getMaritalStatusCode());
        assertEquals(TEST_FIRST_NAME, s.getFirstName());
        assertEquals(TEST_MID_NAME, s.getMiddleName());
        assertEquals(TEST_LAST_NAME, s.getLastName());
        assertEquals(StringUtils.EMPTY, s.getMaidenName());
        assertNotNull(s.getAddress());
        assertEquals(TEST_STREET_ADDRESS, s.getAddress().getStreetAddress());
        assertEquals(TEST_CITY_NAME, s.getAddress().getCity());
        assertEquals(TEST_STATE_CODE, s.getAddress().getStateCode());
        assertEquals(TEST_ZIP_CODE, s.getAddress().getPostalCode());
        assertEquals(TEST_COUNTRY, s.getAddress().getCountryCode());
        assertEquals(Arrays.asList(new RaceCodeEnum[] { RaceCodeEnum.White, RaceCodeEnum.Asian }),
                (s.getRaceCodes()));
        assertEquals(TEST_EMAIL_ADDR, s.getEmail());
        assertEquals(TEST_PHONE, s.getPhone());
        assertEquals(TEST_FAX, s.getFax());
    }

    /**
     * @param oaId
     */
    protected void assertOrgAssId(OrganizationAssignedIdentifier oaId) {
        assertNotNull(oaId);
        assertEquals(TEST_BIO_ID, oaId.getValue());
        assertEquals(OrganizationIdentifierTypeEnum.MRN, oaId.getType());
        assertEquals(healthcareSite, oaId.getHealthcareSite());
        assertEquals(TEST_BIO_ID_PRIMARYINDICATOR, oaId.getPrimaryIndicator());
    }

    /**
     * @param oaId
     */
    protected void assertOrgAssIdDoc(OrganizationAssignedIdentifier oaId) {
        assertNotNull(oaId);
        assertEquals(TEST_STUDY_ID, oaId.getValue());
        assertEquals(OrganizationIdentifierTypeEnum.COORDINATING_CENTER_IDENTIFIER, oaId.getType());
        assertEquals(healthcareSite, oaId.getHealthcareSite());
        assertEquals(TEST_STUDY_ID_PRIMARYINDICATOR, oaId.getPrimaryIndicator());
    }

    protected void assertOrgAssIdSub(OrganizationAssignedIdentifier oaId) {
        assertNotNull(oaId);
        assertEquals(TEST_STUDYSUBJECT_ID, oaId.getValue());
        assertEquals(OrganizationIdentifierTypeEnum.COORDINATING_CENTER_ASSIGNED_STUDY_SUBJECT_IDENTIFIER,
                oaId.getType());
        assertEquals(healthcareSite, oaId.getHealthcareSite());
        assertEquals(TEST_STUDYSUBJECT_ID_PRIMARYINDICATOR, oaId.getPrimaryIndicator());
    }
}