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