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.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.transmem.data.db.Databases;
import com.transmem.data.db.Projects;
import com.transmem.data.db.Articles;
import com.transmem.data.db.Sources;
import com.transmem.data.db.Sentences;
import com.transmem.data.db.Languages;
import com.transmem.data.db.Users;
/**
* Action class for changing the translator of an article by a group member.
* This action can only be invoked by a group leader.
*
* This action is invoked by Ajax engine, so it should return differently.
*
* @version 0.1
* @author Ted Wen
* @date May. 2007
*/
public class ReplaceTranslator extends BaseAction
{
private Logger log_ = Logger.getLogger(ReplaceTranslator.class.getName());
public ReplaceTranslator()
{
super();
}
/**
* Accept user's translation for the current sentence.
*
* <p class="doc">
* <ul>
* <li>Request parameters
* <ul>
* <li><b>aid</b> - string of article ID</li>
* <li><b>translator</b> - ID of new translator, '0' to get group members</li>
* </ul>
* </li>
* <li>Session attributes
* <ul>
* <li><b>user</b> - Users object created after login or register.</li>
* <li><b>articles</b> - array list of articles.</li>
* </ul>
* </li>
* <li>Response page
* <ul>
* <li> - not used as a whole web page but for Ajax response</li>
* </ul>
* </li>
* </ul>
* </p>
*
* @param param - HttpServletRequest object
* @param response - HttpServletResponse object
*/
public void execute(ServletParams param) throws ServletException, IOException
{
log_.entering("ShareTranslation","execute");
Session session = param.getSession();
setNextPage(null); //for Ajax return
param.setContentType("text/html;charset=utf-8");
param.setHeader("Cache-Control", "no-cache");
Users usr = session.getUser();
if (usr == null) {
param.sendError(MessageCode.ERR_NOT_LOGIN);
return;
}
if (!usr.getRole().equals("G"))
{
log_.warning("Non Group leader executes ReplaceTranslator");
return;
}
String said = param.getParameter("aid");
if (said == null)
{
log_.warning("ReplaceTranslator called without aid parameter");
return;
}
ArrayList<Articles> articles = session.getArticleList();
if (articles == null)
{
log_.severe("session.getArticleList() return null");
param.sendError(MessageCode.ERR_NO_ARTICLE);
return;
}
int aid = 0;
Articles article = null;
try
{
aid = Integer.parseInt(said);
for (Articles a : articles)
{
if (a.getArticleID()==aid)
{
article = a;
break;
}
}
}
catch (NumberFormatException e)
{
log_.severe("Invalid aid:"+said);
return;
}
if (article == null)
{
log_.severe("Article given by ID "+said+" not found in list");
return;
}
//default return without group members
String result_html = "<input type=\"radio\" name=\"translator\" value=\""+usr.getUserID()+"\" checked/>"+usr.getUsername()+"</input>";
int groupid = usr.getGroup();
if (groupid == 0)
{
log_.warning("article.getGroup() is 0 while asking for group members");
//response with user himself (id and name)
param.getWriter().write(result_html);
return;
}
String stranslator = param.getParameter("translator");
Connection conn = null;
try
{
conn = getConnection(param,Databases.CATEGORY_USER,true);
if (stranslator == null || stranslator.equals("0"))
{
//translator unknown, get a list of candidates for the group
Users us = new Users(conn);
ArrayList<Users> uss = us.queryByGroup(groupid);
StringBuffer sb = new StringBuffer();
/*
Assume the receiving div is contained inside a form element,
with a hidden input element of translator.
*/
for (Users u : uss)
{
sb.append("<input type=\"radio\" name=\"translator\" value=\"");
sb.append(u.getUserID());
sb.append("\"");
if (u.getUserID()==article.getTranslator())
sb.append(" checked");
sb.append(" onclick=\"setTranslator(");
sb.append(u.getUserID());
sb.append(")\">");
sb.append(u.getUsername());
sb.append("</input><br>");
}
log_.info(sb.toString());
param.getWriter().write(sb.toString());
}
else
{
//if translator different, replace it for the article
int translator = Integer.parseInt(stranslator);
if (translator != 0)
{
article.clearUpdates(); //TODO: document this! it must be called before directly updating
article.setTranslator(translator);
article.update(conn);
//update the page
Users u = new Users(conn);
String transname = u.queryNameByID(translator);
String s = "("+aid+")"+transname;
//log_.info("sendback: "+s);
param.getWriter().write(s);
} else
param.getWriter().write("("+aid+")"+usr.getUsername());
}
}
catch (SQLException x)
{
log_.severe("SQLException: "+x);
//param.sendError(MessageCode.ERR_DB_CONNECT);
param.getWriter().write(result_html);
}
finally
{
if (conn != null)
try { conn.close(); } catch (SQLException e) {}
}
}
}