package org.bbaw.wsp.cms.translator;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import de.mpg.mpiwg.berlin.mpdl.xml.xquery.XQueryEvaluator;
public class GlosbeTranslator {
private static GlosbeTranslator instance;
private String[] DEST_LANGUAGES = {"eng", "deu", "fra"};
private String protocol = "http";
private String host = "glosbe.com";
private int port = 80;
private String servlet = "/gapi/translate";
private HttpClient httpClient; // local http client
private XQueryEvaluator xQueryEvaluator;
public static GlosbeTranslator getInstance() throws ApplicationException {
if (instance == null) {
instance = new GlosbeTranslator();
instance.init();
}
return instance;
}
private void init() throws ApplicationException {
httpClient = new HttpClient();
xQueryEvaluator = new XQueryEvaluator(); }
public String[] getDestLanguages() {
return DEST_LANGUAGES;
}
public ArrayList<String> translate(String[] query, String fromLanguageStr, String[] toLanguagesStr) throws ApplicationException {
ArrayList<String> translations = new ArrayList<String>();
for (int i=0; i<toLanguagesStr.length; i++) {
String toLanguageStr = toLanguagesStr[i];
String[] translationsArray = translate(query, fromLanguageStr, toLanguageStr);
for (int j=0; j<translationsArray.length; j++) {
String translation = translationsArray[j];
translations.add(translation);
}
}
return translations;
}
public String[] translate(String[] query, String fromLanguageStr, String toLanguageStr) throws ApplicationException {
if (fromLanguageStr == null)
throw new ApplicationException("Translator: toLanguageStr is null");
if (toLanguageStr == null)
throw new ApplicationException("Translator: fromLanguageStr is null");
String[] translations = null;
try {
ArrayList<String> translationsArrayList = new ArrayList<String>();
for (int i=0; i<query.length; i++) {
String queryStr = query[i].toLowerCase();
String request = servlet + "?from=" + fromLanguageStr + "&dest=" + toLanguageStr + "&phrase=" + queryStr + "&format=" + "xml";
String translationsXml = performGetRequest(request);
ArrayList<String> translationsTmp = getTranslations(translationsXml);
translationsArrayList.addAll(translationsTmp);
}
translations = new String[translationsArrayList.size()];
translationsArrayList.toArray(translations);
} catch (Exception e) {
throw new ApplicationException(e);
}
return translations;
}
/**
* TODO hack, very slow and too much requests
* @param query
* @return
* @throws ApplicationException
*/
public String detectLanguageCode(String query) throws ApplicationException {
String langCode = null;
String[] languages = {"eng", "deu", "fra"};
for (int i=0; i<languages.length; i++) {
String lang = languages[i];
String request = servlet + "?from=" + lang + "&dest=" + lang + "&phrase=" + query + "&format=" + "xml"; // translate into the same language to get the word if it exists
String translationsXml = performGetRequest(request);
langCode = getLanguageCode(translationsXml);
if (langCode != null)
return langCode;
}
return langCode;
}
private String getLanguageCode(String glosbeXmlStr) throws ApplicationException {
String languageCode = null;
String translationsStr = xQueryEvaluator.evaluateAsStringValueJoined(glosbeXmlStr, "/map/entry/string[text() = 'tuc']/../list/map/entry/string[text() = 'phrase']/../text/languageCode", "###");
if (translationsStr != null) {
String[] translationsArray = translationsStr.split("###");
if (translationsArray != null) {
languageCode = translationsArray[0]; // delivers the first language code of all found TODO
}
}
return languageCode;
}
private ArrayList<String> getTranslations(String glosbeXmlStr) throws ApplicationException {
ArrayList<String> translations = new ArrayList<String>();
String translationsStr = xQueryEvaluator.evaluateAsStringValueJoined(glosbeXmlStr, "/map/entry/string[text() = 'tuc']/../list/map/entry/string[text() = 'phrase']/../text/text", "###");
if (translationsStr != null) {
String[] translationsArray = translationsStr.split("###");
if (translationsArray != null) {
for (int i=0; i<translationsArray.length; i++) {
String t = translationsArray[i];
translations.add(t);
}
}
}
return translations;
}
private String performGetRequest(String requestName) throws ApplicationException {
String resultStr = null;
try {
String portPart = ":" + port;
String urlStr = protocol + "://" + host + portPart + requestName;
GetMethod method = new GetMethod(urlStr);
httpClient.executeMethod(method);
byte[] resultBytes = method.getResponseBody();
resultStr = new String(resultBytes, "utf-8");
method.releaseConnection();
} catch (HttpException e) {
throw new ApplicationException(e);
} catch (IOException e) {
throw new ApplicationException(e);
}
return resultStr;
}
private String performPostRequest(String requestName, NameValuePair[] data) throws ApplicationException {
String resultStr = null;
try {
String portPart = ":" + port;
String urlStr = protocol + "://" + host + portPart + requestName;
PostMethod method = new PostMethod(urlStr);
for (int i=0; i<data.length; i++) {
NameValuePair param = data[i];
method.addParameter(param);
}
httpClient.executeMethod(method);
byte[] resultBytes = method.getResponseBody();
resultStr = new String(resultBytes, "utf-8");
method.releaseConnection();
} catch (HttpException e) {
throw new ApplicationException(e);
} catch (IOException e) {
throw new ApplicationException(e);
}
return resultStr;
}
}