package org.akaza.openclinica.controller.openrosa.processor; import java.util.Date; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.controller.openrosa.SubmissionContainer; import org.akaza.openclinica.dao.hibernate.StudyDao; import org.akaza.openclinica.dao.hibernate.StudyUserRoleDao; import org.akaza.openclinica.dao.hibernate.UserAccountDao; import org.akaza.openclinica.dao.hibernate.UserTypeDao; import org.akaza.openclinica.domain.Status; import org.akaza.openclinica.domain.datamap.Study; import org.akaza.openclinica.domain.datamap.StudyUserRole; import org.akaza.openclinica.domain.datamap.StudyUserRoleId; import org.akaza.openclinica.domain.user.UserAccount; import org.akaza.openclinica.domain.user.UserType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.validation.Errors; import static org.akaza.openclinica.controller.openrosa.SubmissionProcessorChain.ProcessorEnum; @Component @Order(value=4) public class UserProcessor implements Processor { @Autowired UserAccountDao userAccountDao; @Autowired UserTypeDao userTypeDao; @Autowired StudyUserRoleDao studyUserRoleDao; @Autowired StudyDao studyDao; public static final String INPUT_FIRST_NAME = "Participant"; public static final String INPUT_LAST_NAME = "User"; public static final String INPUT_EMAIL = "email"; public static final String INPUT_INSTITUTION = "PFORM"; protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); @Override public ProcessorEnum process(SubmissionContainer container) throws Exception{ logger.info("Executing User Processor."); Errors errors = container.getErrors(); String contextStudySubjectOid = container.getSubjectContext().get("studySubjectOID"); String studySubjectOid = container.getSubject().getOcOid(); String parentStudyOid = getParentStudy(container.getStudy().getOc_oid()).getOc_oid(); String userAccountId = container.getSubjectContext().get("userAccountID"); // Check if UserAccount is specified in subject context if (!StringUtils.isEmpty(userAccountId)) { UserAccount existingAccount = userAccountDao.findByUserId(Integer.valueOf(userAccountId)); if (existingAccount == null) { logger.info("Could not find existing user account from provided context. Aborting submission."); errors.reject("Could not find existing user account from provided context. Aborting submission."); throw new Exception("Could not find existing user account from provided context. Aborting submission."); } container.setUser(existingAccount); // if study subject oid is not null, just look up user account } else if (contextStudySubjectOid != null) { String userName = parentStudyOid + "." + contextStudySubjectOid; UserAccount existingAccount = userAccountDao.findByUserName(userName); if (existingAccount == null) { logger.info("Could not find existing user account. Aborting submission."); errors.reject("Could not find existing user account. Aborting submission."); throw new Exception("Could not find existing user account. Aborting submission."); } container.setUser(existingAccount); } else { String userName = parentStudyOid + "." + studySubjectOid; UserAccount existingAccount = userAccountDao.findByUserName(userName); if (existingAccount != null) { container.setUser(existingAccount); } else { //Create user account UserAccount rootUser = userAccountDao.findByUserId(1); UserAccount createdUser = new UserAccount(); createdUser.setUserName(parentStudyOid + "." + container.getSubject().getOcOid()); createdUser.setFirstName(INPUT_FIRST_NAME); createdUser.setLastName(INPUT_LAST_NAME); createdUser.setEmail(INPUT_EMAIL); createdUser.setInstitutionalAffiliation(INPUT_INSTITUTION); createdUser.setActiveStudy(container.getStudy()); String passwordHash = UserAccountBean.LDAP_PASSWORD; createdUser.setPasswd(passwordHash); createdUser.setPasswdTimestamp(null); createdUser.setDateLastvisit(null); createdUser.setStatus(Status.DELETED); createdUser.setPasswdChallengeQuestion(""); createdUser.setPasswdChallengeAnswer(""); createdUser.setPhone(""); createdUser.setUserAccount(rootUser); createdUser.setRunWebservices(false); createdUser.setActiveStudy(container.getStudy()); UserType type = userTypeDao.findByUserTypeId(2); createdUser.setUserType(type); createdUser.setEnabled(true); createdUser.setAccountNonLocked(true); createdUser.setAccessCode(""); createdUser.setApiKey(""); createdUser = userAccountDao.saveOrUpdate(createdUser); container.setUser(createdUser); //Create study user role Date date = new Date(); StudyUserRoleId studyUserRoleId = new StudyUserRoleId(Role.RESEARCHASSISTANT2.getName(), container.getStudy().getStudyId(), Status.AUTO_DELETED.getCode(), rootUser.getUserId(), date, createdUser.getUserName()); StudyUserRole studyUserRole = new StudyUserRole(studyUserRoleId); studyUserRoleDao.saveOrUpdate(studyUserRole); //TODO: StudyUserRole object had to be heavily modified. May need fixing. Also roleName specified // doesn't exist in role table. May need to fix that. // This table should also foreign key to user_account but doesn't. } } return ProcessorEnum.PROCEED; } private Study getParentStudy(String studyOid) { Study study = studyDao.findByOcOID(studyOid); Study parentStudy = study.getStudy(); if (parentStudy != null && parentStudy.getStudyId() > 0) return parentStudy; else return study; } }