package org.akaza.openclinica.service.crfdata.xform;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.web.client.RestTemplate;
public class EnketoAPI {
private String enketoURL = null;
private String token = null;
private String ocURL = null;
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
public EnketoAPI(EnketoCredentials credentials) {
this.enketoURL = credentials.getServerUrl();
this.token = credentials.getApiKey();
this.ocURL = credentials.getOcInstanceUrl();
}
public String getOfflineFormURL(String crfOID) throws Exception {
if (enketoURL == null)
return "";
URL eURL = new URL(enketoURL + "/api/v2/survey/offline");
EnketoURLResponse response = getURL(eURL, crfOID);
if (response != null) {
String myUrl = response.getOffline_url();
if (enketoURL.toLowerCase().startsWith("https") && !myUrl.toLowerCase().startsWith("https")) {
myUrl = myUrl.replaceFirst("http", "https");
}
return myUrl;
} else
return "";
}
public String getFormURL(String crfOID) throws Exception {
if (enketoURL == null)
return "";
URL eURL = new URL(enketoURL + "/api/v2/survey/single/fieldsubmission/iframe");
//URL eURL = new URL(enketoURL + "/api/v2/survey/iframe");
EnketoURLResponse response = getURL(eURL, crfOID);
if (response != null) {
String myUrl = response.getSingle_fieldsubmission_iframe_url();
if (enketoURL.toLowerCase().startsWith("https") && !myUrl.toLowerCase().startsWith("https")) {
myUrl = myUrl.replaceFirst("http", "https");
}
return myUrl;
} else
return "";
}
public String getFormPreviewURL(String crfOID) throws Exception {
if (enketoURL == null)
return "";
URL eURL = new URL(enketoURL + "/api/v2/survey/preview");
EnketoURLResponse response = getURL(eURL, crfOID);
if (response != null)
return response.getPreview_url();
else
return "";
}
private EnketoURLResponse getURL(URL url, String crfOID) {
try {
String userPasswdCombo = new String(Base64.encodeBase64((token + ":").getBytes()));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", "Basic " + userPasswdCombo);
headers.add("Accept-Charset", "UTF-8");
EnketoURLRequest body = new EnketoURLRequest(ocURL, crfOID);
HttpEntity<EnketoURLRequest> request = new HttpEntity<EnketoURLRequest>(body, headers);
RestTemplate rest = new RestTemplate();
ResponseEntity<EnketoURLResponse> response = rest.postForEntity(url.toString(), request, EnketoURLResponse.class);
if (response != null)
return response.getBody();
else
return null;
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(ExceptionUtils.getStackTrace(e));
}
return null;
}
public EnketoURLResponse getEditURL(String crfOid, String instance, String ecid, String redirect) {
if (enketoURL == null)
return null;
try {
// Build instanceId to cache populated instance at Enketo with
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
String hashString = ecid + "." + String.valueOf(cal.getTimeInMillis());
ShaPasswordEncoder encoder = new ShaPasswordEncoder(256);
String instanceId = encoder.encodePassword(hashString,null);
URL eURL = new URL(enketoURL + "/api/v2/instance/fieldsubmission/iframe");
//URL eURL = new URL(enketoURL + "/api/v1/instance/iframe");
String userPasswdCombo = new String(Base64.encodeBase64((token + ":").getBytes()));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", "Basic " + userPasswdCombo);
headers.add("Accept-Charset", "UTF-8");
EnketoEditURLRequest body = new EnketoEditURLRequest(ocURL, crfOid, instanceId, redirect, instance);
HttpEntity<EnketoEditURLRequest> request = new HttpEntity<EnketoEditURLRequest>(body, headers);
RestTemplate rest = new RestTemplate();
ResponseEntity<EnketoURLResponse> response = rest.postForEntity(eURL.toString(), request, EnketoURLResponse.class);
if (response != null)
return response.getBody();
else
return null;
} catch (Exception e) {
logger.error(e.getMessage());
logger.error(ExceptionUtils.getStackTrace(e));
}
return null;
}
}