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;
11import java.util.ArrayList;
12
13import javax.servlet.ServletConfig;
14import javax.servlet.ServletException;
15import javax.servlet.http.HttpServlet;
16import javax.servlet.http.HttpServletRequest;
17import javax.servlet.http.HttpServletResponse;
18
19import org.antlr.stringtemplate.StringTemplate;
20import org.antlr.stringtemplate.StringTemplateGroup;
21import org.antlr.stringtemplate.language.DefaultTemplateLexer;
22
23import sun.misc.BASE64Encoder;
24
25/**
26 * A servlet that implements a standard n-Tier architecture with
27 * local calls between the application (ejb) and web (servlet)
28 * tiers.
29 *
30 * @author Amin Ahmad
31 */
32public class LocalEjbServlet extends HttpServlet {
33
34	private StringTemplateGroup presidentTemplate;
35
36	public void init(ServletConfig config) throws ServletException {
37		InputStreamReader in = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("org/ahmadsoft/stream/template/presidents.stg"));
38		presidentTemplate = new StringTemplateGroup(in,	DefaultTemplateLexer.class);
39	}
40
41	public void doGet(HttpServletRequest request, HttpServletResponse response)
42			throws ServletException, IOException {
43		long a = System.nanoTime();
44
45		President[] presidents = getPresidents();
46
47		StringTemplate header = presidentTemplate.getInstanceOf("header");
48		PrintWriter out = new PrintWriter(new OutputStreamWriter(response
49				.getOutputStream()));
50
51		long b = System.nanoTime();
52		out.print(header.toString());
53
54		BASE64Encoder base64 = new BASE64Encoder();
55		long c = -1;
56		for (President p : presidents) {
57			if (c == -1)
58				c = System.nanoTime();
59			StringTemplate line = presidentTemplate.getInstanceOf("line");
60			line.setAttribute("president", p);
61			line.setAttribute("thumbnail", base64.encode(p.getThumbnail()));
62			out.print(line.toString());
63		}
64
65		long d = System.nanoTime();
66		StringTemplate footer = presidentTemplate.getInstanceOf("footer");
67		footer.setAttribute("timeByte1", Long.valueOf(b-a));
68		footer.setAttribute("timeRow1" , Long.valueOf(c-a));
69		footer.setAttribute("timeClose", Long.valueOf(d-a));
70		out.print(footer.toString());
71		out.close();
72	}
73
74	/**
75	 * Retrieves a list of presidents. In a standard n-tier architecture, this
76	 * method would call to the application (ejb) tier to retrieve this
77	 * information.
78	 *
79	 * @return
80	 */
81	private President[] getPresidents() {
82		ArrayList presidents = new ArrayList();
83		try {
84			Class.forName("com.mysql.jdbc.Driver");
85			Connection connection = DriverManager
86					.getConnection("jdbc:mysql://localhost/mysql?user=root&password=foo&defaultFetchSize=10&useCursorFetch=true");
87			Statement stmt = connection.createStatement();
88			stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
89			ResultSet rs = stmt.executeQuery("SELECT * FROM PRESIDENT");
90			while (rs.next()) {
91				President p = new President();
92				p.setName(rs.getString("TX_NAME"));
93				p.setOfficeStart(rs.getDate("DT_OFFICE_ST"));
94				p.setOfficeEnd(rs.getDate("DT_OFFICE_END"));
95				p.setSummary(rs.getString("TX_SUMMARY"));
96				p.setThumbnail(Util.getBytes(rs.getBlob("BL_THUMBNAIL")));
97				presidents.add(p);
98
99			}
100			connection.close();
101			return (President[]) presidents.toArray(new President[0]);
102		} catch (Exception e) {
103			// TODO Auto-generated catch block
104			e.printStackTrace();
105			return new President[0];
106		}
107	}
108
109}
110