package org.akaza.openclinica.service.pmanage;
import java.util.Date;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.akaza.openclinica.bean.login.UserAccountBean;
import org.akaza.openclinica.core.EmailEngine;
import org.akaza.openclinica.dao.core.CoreResources;
import org.akaza.openclinica.exception.OpenClinicaSystemException;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.client.RestTemplate;
public class RandomizationRegistrar {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
public static final String AVAILABLE = "available";
public static final String UNAVAILABLE = "unavailable";
public static final String INVALID = "invalid";
public static final String UNKNOWN = "unknown";
public static final int RANDOMIZATION_READ_TIMEOUT = 5000;
private static final String CACHE_KEY = "randomizeObject";
private CacheManager cacheManager;
private net.sf.ehcache.Cache cache;
public RandomizationRegistrar() {
cacheManager = CacheManager.getInstance();
this.cache = cacheManager.getCache(CACHE_KEY);
}
// Rest Call to OCUI to get Randomization
public SeRandomizationDTO getRandomizationDTOObject(String studyOid) {
String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid;
String randomizationUrl = CoreResources.getField("moduleManager") + "/app/rest/oc/se_randomizations?studyoid=" + studyOid + "&instanceurl=" + ocUrl;
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(RANDOMIZATION_READ_TIMEOUT);
RestTemplate rest = new RestTemplate(requestFactory);
try {
SeRandomizationDTO response = rest.getForObject(randomizationUrl, SeRandomizationDTO.class);
if (response.getStudyOid() != null) {
return response;
} else {
return null;
}
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(ExceptionUtils.getStackTrace(e));
System.out.println(e.getMessage());
System.out.println(ExceptionUtils.getStackTrace(e));
}
return null;
}
public SeRandomizationDTO getCachedRandomizationDTOObject(String studyOid, Boolean resetCache) throws Exception {
SeRandomizationDTO seRandomizationDTO = null; // check if exist in cache ;
String ocUrl = CoreResources.getField("sysURL.base");
String mapKey = ocUrl + studyOid;
Element element = cache.get(mapKey);
if (element != null && element.getObjectValue() != null && !resetCache) {
seRandomizationDTO = (SeRandomizationDTO) element.getObjectValue();
}
if (seRandomizationDTO == null) {
seRandomizationDTO = getRandomizationDTOObject(studyOid);
}
if (seRandomizationDTO != null) {
cache.put(new Element(mapKey, seRandomizationDTO));
}
return seRandomizationDTO;
}
public void sendEmail(JavaMailSenderImpl mailSender, UserAccountBean user, String emailSubject, String message) throws OpenClinicaSystemException {
logger.info("Sending email...");
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setFrom(EmailEngine.getAdminEmail());
helper.setTo(user.getEmail());
helper.setSubject(emailSubject);
helper.setText(message);
mailSender.send(mimeMessage);
logger.debug("Email sent successfully on {}", new Date());
} catch (MailException me) {
logger.error("Email could not be sent");
} catch (MessagingException me) {
logger.error("Email could not be sent");
}
}
public String randomizeStudy(String studyOid, String studyName,UserAccountBean userAccount) {
String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid;
String randomizationUrl = CoreResources.getField("moduleManager") + "/app/rest/oc/se_randomizations";
SeRandomizationDTO seRandomizationDTO = new SeRandomizationDTO();
seRandomizationDTO.setStudyOid(studyOid);
seRandomizationDTO.setInstanceUrl(ocUrl);
seRandomizationDTO.setOcUser_username(userAccount.getName());
seRandomizationDTO.setOcUser_name(userAccount.getFirstName());
seRandomizationDTO.setOcUser_lastname(userAccount.getLastName());
seRandomizationDTO.setOcUser_emailAddress(userAccount.getEmail());
seRandomizationDTO.setStudyName(studyName);
seRandomizationDTO.setOpenClinicaVersion(CoreResources.getField("OpenClinica.version"));
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(RANDOMIZATION_READ_TIMEOUT);
RestTemplate rest = new RestTemplate(requestFactory);
try {
SeRandomizationDTO response = rest.postForObject(randomizationUrl, seRandomizationDTO, SeRandomizationDTO.class);
if (response != null && response.getStatus() != null)
return response.getStatus();
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(ExceptionUtils.getStackTrace(e));
System.out.println(e.getMessage());
System.out.println(ExceptionUtils.getStackTrace(e));
}
return "";
}
}