/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.ctask.general;
import org.apache.log4j.Logger;
import org.dspace.content.DCValue;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.core.ConfigurationManager;
import org.dspace.curate.AbstractCurationTask;
import org.dspace.curate.Curator;
import org.dspace.curate.Distributive;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* MicrosoftTranslator translates stuff
*
* @author Kim Shepherd
*/
@Distributive
public abstract class AbstractTranslator extends AbstractCurationTask
{
int status = Curator.CURATE_UNSET;
private static final String PLUGIN_PREFIX = "translator";
private static String authLangField = "dc.language";
private static String authLang = "en";
private static String[] toTranslate;
private static String[] langs;
private static String apiKey = "";
private static Logger log = Logger.getLogger(AbstractTranslator.class);
private List<String> results = new ArrayList<String>();
@Override
public void init(Curator curator, String taskId) throws IOException
{
super.init(curator, taskId);
// Load configuration
authLang = ConfigurationManager.getProperty("default.locale");
authLangField = ConfigurationManager.getProperty(PLUGIN_PREFIX, "translate.field.language");
String toTranslateStr = ConfigurationManager.getProperty(PLUGIN_PREFIX, "translate.field.targets");
String langsStr = ConfigurationManager.getProperty(PLUGIN_PREFIX, "translate.language.targets");
toTranslate = toTranslateStr.split(",");
langs = langsStr.split(",");
if(!(toTranslate.length > 0 && langs.length > 0))
{
status = Curator.CURATE_ERROR;
results.add("Configuration error");
setResult(results.toString());
report(results.toString());
return;
}
initApi();
}
@Override
public int perform(DSpaceObject dso) throws IOException
{
if(dso instanceof Item)
{
Item item = (Item) dso;
/*
* We lazily set success here because our success or failure
* is per-field, not per-item
*/
status = Curator.CURATE_SUCCESS;
String handle = item.getHandle();
log.debug("Translating metadata for " + handle);
DCValue[] authLangs = item.getMetadata(authLangField);
if(authLangs.length > 0)
{
/* Assume the first... multiple
"authoritative" languages won't work */
authLang = authLangs[0].value;
log.debug("Authoritative language for " + handle + " is " + authLang);
}
for(String lang : langs)
{
lang = lang.trim();
for(String field : toTranslate)
{
boolean translated = false;
field = field.trim();
String[] fieldSegments = field.split("\\.");
DCValue[] fieldMetadata = null;
if(fieldSegments.length > 2) {
// First, check to see if we've already got this in the target language
DCValue[] checkMetadata = item.getMetadata(fieldSegments[0], fieldSegments[1], fieldSegments[2], lang);
if(checkMetadata.length > 0)
{
// We've already translated this, move along
log.debug(handle + "already has " + field + " in " + lang + ", skipping");
results.add(handle + ": Skipping " + lang + " translation " + "(" + field + ")");
translated = true;
}
// Let's carry on and get the authoritative version, then
fieldMetadata = item.getMetadata(fieldSegments[0], fieldSegments[1], fieldSegments[2], authLang);
}
else {
// First, check to see if we've already got this in the target language
DCValue[] checkMetadata = item.getMetadata(fieldSegments[0], fieldSegments[1], null, lang);
if(checkMetadata.length > 0)
{
// We've already translated this, move along
log.debug(handle + "already has " + field + " in " + lang + ", skipping");
results.add(handle + ": Skipping " + lang + " translation " + "(" + field + ")");
translated = true;
}
// Let's carry on and get the authoritative version, then
fieldMetadata = item.getMetadata(fieldSegments[0], fieldSegments[1], null, authLang);
}
if(!translated && fieldMetadata.length > 0)
{
for(DCValue metadataValue : fieldMetadata) {
String value = metadataValue.value;
String translatedText = translateText(authLang, lang, value);
if(translatedText != null && !"".equals(translatedText))
{
// Add the new metadata
if(fieldSegments.length > 2) {
item.addMetadata(fieldSegments[0], fieldSegments[1], fieldSegments[2], lang, translatedText);
}
else {
item.addMetadata(fieldSegments[0], fieldSegments[1], null, lang, translatedText);
}
try {
item.update();
results.add(handle + ": Translated " + authLang + " -> " + lang + " (" + field + ")");
}
catch(Exception e) {
log.info(e.getLocalizedMessage());
status = Curator.CURATE_ERROR;
}
}
else {
results.add(handle + ": Failed translation of " + authLang + " -> " + lang + "(" + field + ")");
}
}
}
}
}
}
processResults();
return status;
}
protected void initApi() {
/*
* Override this method in your translator
* Only needed to set key, etc.
* apiKey = ConfigurationManager.getProperty(PLUGIN_PREFIX, "translate.api.key.[service]");
*
*/
}
protected String translateText(String from, String to, String text) throws IOException {
// Override this method in your translator
return null;
}
private void processResults() throws IOException
{
StringBuilder sb = new StringBuilder();
sb.append("Translation report: \n----------------\n");
for(String result : results)
{
sb.append(result).append("\n");
}
setResult(sb.toString());
report(sb.toString());
}
}