1package org.ahmadsoft.stream;
2
3import java.io.IOException;
4import java.io.InputStreamReader;
5import java.io.OutputStreamWriter;
6import java.io.PrintWriter;
7import java.sql.Connection;
8import java.sql.DriverManager;
9import java.sql.ResultSet;
10import java.sql.Statement;
11
12import javax.servlet.ServletConfig;
13import javax.servlet.ServletException;
14import javax.servlet.http.HttpServlet;
15import javax.servlet.http.HttpServletRequest;
16import javax.servlet.http.HttpServletResponse;
17
18import org.antlr.stringtemplate.StringTemplate;
19import org.antlr.stringtemplate.StringTemplateGroup;
20import org.antlr.stringtemplate.language.DefaultTemplateLexer;
21
22import sun.misc.BASE64Encoder;
23
24/**
25 * A servlet that implements a streaming architecture.
26 * @author Amin Ahmad
27 */
28public class StreamingServlet extends HttpServlet {
29
30	private StringTemplateGroup presidentTemplate;
31
32	public void init(ServletConfig config) throws ServletException {
33		InputStreamReader in = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("org/ahmadsoft/stream/template/presidents.stg"));
34		presidentTemplate = new StringTemplateGroup(in, DefaultTemplateLexer.class);
35	}
36
37	public void doGet(HttpServletRequest request, HttpServletResponse response)
38			throws ServletException, IOException {
39
40		long a = System.nanoTime();
41
42		StringTemplate header = presidentTemplate.getInstanceOf("header");
43		PrintWriter out = new PrintWriter(new OutputStreamWriter(response
44				.getOutputStream()));
45		long b = System.nanoTime();
46		out.print(header.toString());
47
48		long c = -1;
49		try {
50			Class.forName("com.mysql.jdbc.Driver");
51			Connection connection = DriverManager
52					.getConnection("jdbc:mysql://localhost/mysql?user=root&password=foo&defaultFetchSize=10&useCursorFetch=true");
53			Statement stmt = connection.createStatement();
54			stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
55			ResultSet rs = stmt.executeQuery("SELECT * FROM PRESIDENT");
56
57			BASE64Encoder base64 = new BASE64Encoder();
58			while (rs.next()) {
59				if (c == -1)
60					c = System.nanoTime();
61				President p = new President();
62				p.setName(rs.getString("TX_NAME"));
63				p.setOfficeStart(rs.getDate("DT_OFFICE_ST"));
64				p.setOfficeEnd(rs.getDate("DT_OFFICE_END"));
65				p.setSummary(rs.getString("TX_SUMMARY"));
66				p.setThumbnail(Util.getBytes(rs.getBlob("BL_THUMBNAIL")));
67
68				StringTemplate line = presidentTemplate.getInstanceOf("line");
69				line.setAttribute("president", p);
70				line.setAttribute("thumbnail", base64.encode(p.getThumbnail()));
71				out.print(line.toString());
72			}
73			connection.close();
74		} catch (Exception e) {
75			e.printStackTrace(out);
76		}
77
78		long d = System.nanoTime();
79		StringTemplate footer = presidentTemplate.getInstanceOf("footer");
80		footer.setAttribute("timeByte1", Long.valueOf(b-a));
81		footer.setAttribute("timeRow1" , Long.valueOf(c-a));
82		footer.setAttribute("timeClose", Long.valueOf(d-a));
83		out.print(footer.toString());
84		out.close();
85	}
86}
87