package com.transmem.action; import java.util.logging.Logger; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.transmem.data.db.Databases; import com.transmem.data.db.Users; /** * Action class for downloading an article. * * @version 0.1 * @author Ted Wen * @date Jan. 2007 */ public class DownloadAction extends BaseAction { private static Logger log_ = Logger.getLogger(DownloadAction.class.getName()); public DownloadAction() { super(); } /** * Download the translated sentences as a text stream. * * <p class="doc"> <ul> <li>Request parameters <ul> <li>user - user object created after login or register</li> <li>article - article id string for the article to download</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; } int aid = 0; String aids = param.getParameter("article"); if (aids == null || aids.equals("")) { param.sendError(MessageCode.ERR_NULL_PARAM); return; } Connection conn = null; //PrintWriter pw = param.getResponse().getWriter(); param.setContentType("text/plain;charset=utf-8"); param.setHeader("Cache-Control", "no-cache"); param.addHeader("Content-Disposition","attachment; filename="+aids+".txt"); ServletOutputStream os = param.getOutputStream(); try { aid = Integer.parseInt(aids); conn = getConnection(param,Databases.CATEGORY_USER); //load paragraphs first String sql = "SELECT F_ParagraphID FROM T_Paragraphs WHERE F_Article=? ORDER BY F_ParagraphID"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, aid); ResultSet rs = ps.executeQuery(); ArrayList<Long> paras = new ArrayList<Long>(); while (rs.next()) { paras.add(new Long(rs.getLong(1))); } rs.close(); ps.close(); //load all paragraphs byte[] linefeed = "\n\n".getBytes(); sql = "SELECT F_Translation FROM T_Sentences WHERE F_Article=? AND F_Paragraph=? ORDER BY F_Sequence"; for (Long p : paras) { ps = conn.prepareStatement(sql); ps.setInt(1, aid); ps.setLong(2, p.longValue()); rs = ps.executeQuery(); while (rs.next()) { String s = rs.getString(1); log_.info(s); byte[] bs = s.getBytes("GBK"); //TODO: GB code only! if (s != null) os.write(bs); //pw.print(s); } rs.close(); ps.close(); os.write(linefeed); } //for } catch (Exception e) { log_.severe(e.getMessage()); //pw.print("Error sending translations"); } finally { if (conn != null) { try { conn.close(); } catch (Exception x) {} } //pw.close(); os.close(); } } }