package qa.qcri.aidr.trainer.pybossa.service.impl; import org.apache.log4j.Logger; import org.springframework.http.*; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import qa.qcri.aidr.trainer.pybossa.entity.TaskTranslation; import qa.qcri.aidr.trainer.pybossa.format.impl.TranslationProjectModel; import qa.qcri.aidr.trainer.pybossa.format.impl.TranslationRequestModel; import qa.qcri.aidr.trainer.pybossa.store.PybossaConf; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; /** * Created by kamal on 4/25/15. */ public class TranslationCenterCommunicator { protected static Logger logger = Logger.getLogger("service.TranslationCenterCommunicator"); public static Map pushTranslationRequest(TranslationRequestModel request) { ResponseEntity<Map> response = null; try{ Map documentResult = pushDocumentForRequest(request); // maybe throw exceptions if (documentResult == null) { return null; } long documentIds[] = new long[1]; documentIds[0] = ((Integer)documentResult.get("document_id")).longValue(); request.setSourceDocumentIds(documentIds); final String url= PybossaConf.BASE_URL+"/orders"; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.setContentType(MediaType.APPLICATION_JSON); RestTemplate restTemplate=new RestTemplate(); //restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); HttpEntity entity = new HttpEntity(getJsonForRequest(request), requestHeaders); response=restTemplate.exchange(url, HttpMethod.POST, entity, Map.class); logger.debug(response); System.out.println("response : " + response); } catch(Exception e){ logger.debug("pushTranslationRequest : " + e); System.out.println("pushTranslationRequest failed : " + e); System.out.println("pushTranslationRequest failed : " + response); } return response.getBody(); } //brute force but simpler to debug than using Jackson private static String getJsonForRequest(TranslationRequestModel request) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("GMT")); String formattedDate = formatter.format(request.getDeadline()); String jsonString = "{ \n" + " \"contact_email\": \"" + request.getContactEmail() + "\",\n" + " \"title\": \"" + request.getTitle() + "\",\n" + " \"source_lang\": \"" + request.getSourceLanguage() + "\",\n" + " \"target_langs\": [\"" + request.getTargetLanguages()[0] + "\"],\n" + " \"source_document_ids\": [" + request.getSourceDocumentIds()[0] + "],\n" + " \"source_wordcount\":" + request.getSourceWordCount() + ",\n" + " \"instructions\": \"" + request.getInstructions() + "\",\n" + " \"deadline\": \"" + formattedDate + "\",\n" + " \"urgency\": \"" + request.getUrgency() + "\",\n" + " \"project_id\": " + request.getProjectId() + "\n" + "}"; return jsonString; } public static Map pushDocumentForRequest(TranslationRequestModel request) { ResponseEntity<Map> result = null; try{ String filename = "TWB_Source_"+System.currentTimeMillis()+".csv"; //decide whether its better to send file or content String content = getCSVData(request.getTranslationList()); //generateCsvFile(filename, request.getTranslationList()); System.out.println("content : " + content); final String url=PybossaConf.BASE_URL+"/documents"; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.setContentType(new MediaType("multipart", "form-data")); RestTemplate restTemplate=new RestTemplate(); restTemplate.getMessageConverters() .add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); map.add("document", content.getBytes(StandardCharsets.UTF_8)); map.add("name", "translation_source.csv"); HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<LinkedMultiValueMap<String, Object>>( map, requestHeaders); result = restTemplate.exchange(url, HttpMethod.POST, requestEntity, Map.class); logger.debug("Result of document push:"+result.getBody()); } catch(Exception e){ logger.debug("pushDocumentForRequest : " + e); } return result.getBody(); } public static void updateTranslationOrder(String selfLink, String status, String comment) { final String url=selfLink; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.add("X-HTTP-Method-Override", "PATCH"); requestHeaders.setContentType(MediaType.APPLICATION_JSON); RestTemplate restTemplate=new RestTemplate(); //restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); String json = "{ \"delivery_status\": \""+status+"\", \"reject_reason\": \""+comment+"\"}"; HttpEntity entity = new HttpEntity(json, requestHeaders); ResponseEntity<Map> response=restTemplate.exchange(url, HttpMethod.POST, entity, Map.class); logger.debug(response); } private static String getCSVData(List<TaskTranslation> list) { StringBuffer buffer = new StringBuffer(); buffer.append("Task Id"); buffer.append(","); buffer.append("Original Text"); buffer.append(","); buffer.append("Translated Text"); buffer.append(","); buffer.append("Answer Code"); buffer.append("\n"); if (list != null) { Iterator<TaskTranslation> iterator = list.iterator(); while (iterator.hasNext()) { TaskTranslation translation = iterator.next(); if(translation.getTaskId() == null){ buffer.append(Long.toString(translation.getTranslationId())); } else{ buffer.append(Long.toString(translation.getTaskId())); } buffer.append(","); buffer.append(translation.getCSVFormattedOriginalText()); buffer.append(","); buffer.append(","); buffer.append("\n"); } } return buffer.toString(); } public static List<Map> pullAllTranslationResponses (Long clientAppId, Long twbProjectId) { final String url=PybossaConf.BASE_URL+"/orders?delivery_status=to_accept"; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json"))); RestTemplate restTemplate=new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); try { ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Map>(requestHeaders), Map.class); logger.debug(response.getBody().toString()); return (List<Map>)response.getBody().get("data"); } catch (HttpClientErrorException exception) { logger.debug("Exception caught: " +exception.getResponseBodyAsString()); } return null; } public static List<TranslationProjectModel> pullTranslationProjects(String clientId) { final String url=PybossaConf.BASE_URL+"/projects?client="+clientId; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json"))); RestTemplate restTemplate=new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); try { ResponseEntity<TranslationProjectModel[]> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(requestHeaders), TranslationProjectModel[].class); logger.debug(response); TranslationProjectModel[] projectArray = response.getBody(); ArrayList<TranslationProjectModel> list = new ArrayList<TranslationProjectModel>(Arrays.asList(projectArray)); return list; } catch (HttpClientErrorException exception) { logger.debug("Exception caught: " +exception.getResponseBodyAsString()); } return null; } public static String getTranslationDocumentContent(String download_link) throws Exception { final String url=download_link; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json"))); RestTemplate restTemplate=new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<String>(requestHeaders), String.class); logger.debug("ResponseEntity : response body - " + response.getBody()); logger.debug("ResponseEntity : response code - " + response.getStatusCode()); logger.debug(response.getBody()); return response.getBody(); } //temporary for testing public static String pullTranslationProjectsAsString(String clientId) { final String url=PybossaConf.BASE_URL+"/projects?client="+clientId; HttpHeaders requestHeaders=new HttpHeaders(); requestHeaders.add("X-Proz-API-Key", PybossaConf.API_KEY); RestTemplate restTemplate=new RestTemplate(); ResponseEntity<String> response=restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(requestHeaders), String.class); logger.debug(response); return response.getBody(); } }