package org.akaza.openclinica.service.subject;
import org.akaza.openclinica.bean.core.Status;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudySubjectBean;
import org.akaza.openclinica.bean.managestudy.SubjectTransferBean;
import org.akaza.openclinica.bean.service.StudyParameterValueBean;
import org.akaza.openclinica.bean.submit.SubjectBean;
import org.akaza.openclinica.core.SessionManager;
import org.akaza.openclinica.dao.login.UserAccountDAO;
import org.akaza.openclinica.dao.managestudy.StudyDAO;
import org.akaza.openclinica.dao.managestudy.StudySubjectDAO;
import org.akaza.openclinica.dao.service.StudyParameterValueDAO;
import org.akaza.openclinica.dao.submit.SubjectDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
public class SubjectService implements SubjectServiceInterface {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
SubjectDAO subjectDao;
StudyParameterValueDAO studyParameterValueDAO;
StudySubjectDAO studySubjectDao;
UserAccountDAO userAccountDao;
StudyDAO studyDao;
DataSource dataSource;
public SubjectService(DataSource dataSource) {
this.dataSource = dataSource;
}
public SubjectService(SessionManager sessionManager) {
this.dataSource = sessionManager.getDataSource();
}
public List<StudySubjectBean> getStudySubject(StudyBean study) {
return getStudySubjectDao().findAllByStudy(study);
}
/*
* (non-Javadoc)
* @see org.akaza.openclinica.service.subject.SubjectServiceInterface#createSubject(org.akaza.openclinica.bean.submit.SubjectBean,
* org.akaza.openclinica.bean.managestudy.StudyBean)
*/
public String createSubject(SubjectBean subjectBean, StudyBean studyBean, Date enrollmentDate, String secondaryId) {
if (subjectBean.getUniqueIdentifier() != null && subjectBean.getUniqueIdentifier().trim().length()> 0 &&
getSubjectDao().findByUniqueIdentifier(subjectBean.getUniqueIdentifier()).getId() != 0) {
//we need to keep the label to transfer it to the StudySubjectBean later
String label = subjectBean.getLabel();
subjectBean = getSubjectDao().findByUniqueIdentifier(subjectBean.getUniqueIdentifier());
subjectBean.setLabel(label);
} else {
subjectBean.setStatus(Status.AVAILABLE);
subjectBean = getSubjectDao().create(subjectBean);
}
StudySubjectBean studySubject = createStudySubject(subjectBean, studyBean, enrollmentDate, secondaryId);
getStudySubjectDao().createWithoutGroup(studySubject);
return studySubject.getLabel();
}
private StudySubjectBean createStudySubject(SubjectBean subject, StudyBean studyBean, Date enrollmentDate, String secondaryId) {
StudySubjectBean studySubject = new StudySubjectBean();
studySubject.setSecondaryLabel(secondaryId);
studySubject.setOwner(getUserAccount());
studySubject.setEnrollmentDate(enrollmentDate);
studySubject.setSubjectId(subject.getId());
studySubject.setStudyId(studyBean.getId());
studySubject.setStatus(Status.AVAILABLE);
int handleStudyId = studyBean.getParentStudyId() > 0 ? studyBean.getParentStudyId() : studyBean.getId();
StudyParameterValueBean subjectIdGenerationParameter = getStudyParameterValueDAO().findByHandleAndStudy(handleStudyId, "subjectIdGeneration");
String idSetting = subjectIdGenerationParameter.getValue();
if (idSetting.equals("auto editable") || idSetting.equals("auto non-editable")) {
// Warning: Here we have a race condition.
// At least, a uniqueness constraint should be set on the database! Better provide an atomic method which stores a new label in the database and returns it.
int nextLabel = getStudySubjectDao().findTheGreatestLabel() + 1;
studySubject.setLabel(Integer.toString(nextLabel));
} else {
studySubject.setLabel(subject.getLabel());
subject.setLabel(null);
}
return studySubject;
}
public void validateSubjectTransfer(SubjectTransferBean subjectTransferBean) {
// TODO: Validate here
}
/**
* Getting the first user account from the database. This would be replaced by an authenticated user who is doing the SOAP requests .
*
* @return UserAccountBean
*/
private UserAccountBean getUserAccount() {
UserAccountBean user = new UserAccountBean();
user.setId(1);
return user;
}
/**
* @return the subjectDao
*/
public SubjectDAO getSubjectDao() {
subjectDao = subjectDao != null ? subjectDao : new SubjectDAO(dataSource);
return subjectDao;
}
public StudyParameterValueDAO getStudyParameterValueDAO() {
return this.studyParameterValueDAO != null ? studyParameterValueDAO : new StudyParameterValueDAO(dataSource);
}
/**
* @return the subjectDao
*/
public StudyDAO getStudyDao() {
studyDao = studyDao != null ? studyDao : new StudyDAO(dataSource);
return studyDao;
}
/**
* @return the subjectDao
*/
public StudySubjectDAO getStudySubjectDao() {
studySubjectDao = studySubjectDao != null ? studySubjectDao : new StudySubjectDAO(dataSource);
return studySubjectDao;
}
/**
* @return the UserAccountDao
*/
public UserAccountDAO getUserAccountDao() {
userAccountDao = userAccountDao != null ? userAccountDao : new UserAccountDAO(dataSource);
return userAccountDao;
}
/**
* @return the datasource
*/
public DataSource getDataSource() {
return dataSource;
}
/**
* @param datasource
* the datasource to set
*/
public void setDatasource(DataSource dataSource) {
this.dataSource = dataSource;
}
}