package com.transmem.action;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.ArrayList;
import com.transmem.data.db.Databases;
import com.transmem.data.db.Articles;
import com.transmem.data.db.Languages;
import com.transmem.data.db.Paragraphs;
import com.transmem.data.db.Sentences;
import com.transmem.data.db.Users;
/**
* Action class for starting translation of an article.
* This action is invoked from the articles.jsp page by selecting an article link.
*
* @version 0.1
* @author Ted Wen
* @date Jan. 2007
*/
public class TranslateAction extends BaseAction
{
private Logger log_ = Logger.getLogger(TranslateAction.class.getName());
public TranslateAction()
{
super();
}
/**
* Start translation of an article.
*
* <p class="code">
<ul>
<li>Session attributes:<br>
<ul>
<li>user : Users</li>
<li>articles : list of Articles objects</li>
<li>article : selected article ID, not avail first call</li>
<li>translayout : Integer for which translate template page</li>
<li>domains : a list of domain IDs like IT, loaded from corpus by this action</li>
</ul>
</li>
<li>Request parameters:<br>
<ul>
<li>article - ID of an Articles object</li>
<li>op - prevp or nextp, exist only when turning paragraph pages</li>
</ul>
</li>
</ul>
* </p>
*/
public void execute(ServletParams param) throws ServletException, IOException
{
log_.entering("TranslateAction","execute");
Session session = param.getSession();
Users usr = session.getUser();
if (usr == null)
{
param.sendError(MessageCode.ERR_NOT_LOGIN);
return;
}
Articles article = null;
String aids = param.getParameter("article");
if (aids != null)
{
log_.info("---------new article: "+aids);
article = getArticleByIds(session, aids);
session.setSelectedArticle(article);
session.setLangPair(article.getLangPair());
session.removeParagraphList();
}
else
{
article = session.getSelectedArticle();
log_.info("=========old article: "+article.getArticleID());
}
if (article == null)
{
log_.severe("article not selected or put in session");
param.sendError(MessageCode.ERR_NO_ARTICLE);
return;
}
int aid = article.getArticleID();
int translayout = getTranslateLayout(param, session);
Connection conn = null;
try
{
conn = getConnection(param,Databases.CATEGORY_USER);
//get domains from the corpus for this language pair
session.setDomainList(loadDomains(conn,article.getLangPair()));
session.setSelectedDomain("00");
//load a paragraph in session, if no paragraph available, report error
Paragraphs paras = new Paragraphs(conn);
ArrayList<Paragraphs> paragraphs = session.getParagraphList();
if (paragraphs == null)
{
paragraphs = paras.queryByArticle(aid);
if (paragraphs == null)
{
log_.severe("Article "+aid+" has not paragraphs");
param.sendError(MessageCode.ERR_NO_PARAS);
return;
}
session.setParagraphList(paragraphs);
}
int paraCount = paragraphs.size();
if (paraCount < 1)
{
param.sendError(MessageCode.ERR_NO_PARAS);
return;
}
//determine which paragraph to load, T_Articles.F_LastPara.
int parax = article.getParagraph();
//check whether prevp or nextp is called and turn paragraph if necessary
String op = param.getParameter("op");
if (op != null)
{
if (op.equals("prevp"))
{
if (parax > 0) parax --;
}
else if (op.equals("nextp"))
{
if (parax < paraCount-1) parax ++;
}
}
if (parax < 0 || parax >= paragraphs.size())
{
parax = 0;
}
if (parax != article.getParagraph())
{
article.setParagraph(parax); //in memory
Articles tempa = new Articles(conn);
tempa.updateParagraph(aid, parax); //update db as well
}
long paraid = paragraphs.get(parax).getParagraphID();
//load all sentences from T_Sentences with translations
Sentences sent = new Sentences(conn);
ArrayList<Sentences> sents = sent.queryByParagraph(paraid);
//store in session for jsp
session.setSentenceList(sents);
session.setThisParagraph(String.valueOf(parax+1)); //for display in JSP
session.setNumParagraphs(String.valueOf(paraCount));
//log_.info("TranslateAction.execute "+sents.size()+" sentences added in session");
setNextPage(PageLinks.TRANSLATE_PAGES[translayout]);
}
catch (SQLException x)
{
log_.severe("SQLException when getConnection(USER):"+x);
param.sendError(MessageCode.ERR_DB_CONNECT);
}
finally
{
if (conn != null)
try { conn.close(); } catch (SQLException e) {}
}
}
/**
* Load domain strings from corpus table specified by the language pair.
* @param conn - Connection reference
* @param langpair - ENZH etc
* @return ArrayList of strings of domain IDs or null if not found
*/
protected ArrayList<String> loadDomains(Connection conn, String langpair)
{
try
{
Languages ls = new Languages(conn);
String tablename = ls.queryTableName(langpair);
String sql = "SELECT DISTINCT F_Domain FROM "+tablename+" ORDER BY F_Domain";
java.sql.Statement stmt = conn.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(sql);
ArrayList<String> domains = new ArrayList<String>();
while (rs.next())
{
domains.add(rs.getString(1));
}
rs.close();
stmt.close();
return domains;
}
catch (SQLException x)
{
log_.severe(x.toString());
return null;
}
}
/**
* Search the articles in session for the given article index.
* @session - Session reference
* @param aids - ID of article
* @return Articles object found or null
*/
protected Articles getArticleByIds(Session session, String aids)
{
if (aids == null)
{
log_.severe("request.getParameter('article') returned null");
return null;
}
try
{
int aid = Integer.parseInt(aids);
ArrayList<Articles> articles = session.getArticleList();
for (Articles a : articles)
{
if (a.getArticleID() == aid)
{
return a;
}
}
log_.severe("article ID ("+aids+") from request is not found");
}
catch (NumberFormatException e)
{
log_.severe("article ID ("+aids+") from request is not a valid number");
}
return null;
}
/**
* Get the template for translation page, 0, 1, or 2 at the moment.
* If request to change, the param.getParameter('layout') should return a string of '0','1', or '2'.
*
* TODO: It can be loaded from preference database and stored in the session once the user logged in.
* If no such preference set, the default page layout is 1.
*
* @param session - HttpSession
* @return layout number 0,1, or 2
*/
protected int getTranslateLayout(ServletParams param, Session session)
{
int translayout = 1;
Integer tsln = session.getTranslateLayout();
if (tsln != null)
{
int n = tsln.intValue();
if (n != translayout && n >= 0 && n < 3)
translayout = n;
String slayout = param.getParameter("layout");
log_.info("Layout = "+slayout);
if (slayout != null)
{
try
{
int l = Integer.parseInt(slayout);
if (l != translayout)
{
session.setTranslateLayout(new Integer(l));
translayout = l;
}
}
catch (Exception e)
{
log_.warning("layout parameter wrong from links.inc: "+slayout);
}
}
}
else
{
session.setTranslateLayout(new Integer(translayout));
}
return translayout;
}
}