package org.ahmadsoft.stream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.antlr.stringtemplate.StringTemplate; import org.antlr.stringtemplate.StringTemplateGroup; import org.antlr.stringtemplate.language.DefaultTemplateLexer; import sun.misc.BASE64Encoder; /** * A servlet that implements a standard n-Tier architecture with * remote calls between the application (ejb) and web (servlet) * tiers. * * @author Amin Ahmad */ public class RemoteEjbServlet extends HttpServlet { private StringTemplateGroup presidentTemplate; public void init(ServletConfig config) throws ServletException { InputStreamReader in = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("org/ahmadsoft/stream/template/presidents.stg")); presidentTemplate = new StringTemplateGroup(in, DefaultTemplateLexer.class); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { long a = System.nanoTime(); President[] presidents = getPresidents(); StringTemplate header = presidentTemplate.getInstanceOf("header"); PrintWriter out = new PrintWriter(new OutputStreamWriter(response .getOutputStream())); long b = System.nanoTime(); out.print(header.toString()); BASE64Encoder base64 = new BASE64Encoder(); long c = -1; for (President p : presidents) { if (c == -1) c = System.nanoTime(); StringTemplate line = presidentTemplate.getInstanceOf("line"); line.setAttribute("president", p); line.setAttribute("thumbnail", base64.encode(p.getThumbnail())); out.print(line.toString()); } long d = System.nanoTime(); StringTemplate footer = presidentTemplate.getInstanceOf("footer"); footer.setAttribute("timeByte1", Long.valueOf(b-a)); footer.setAttribute("timeRow1" , Long.valueOf(c-a)); footer.setAttribute("timeClose", Long.valueOf(d-a)); out.print(footer.toString()); out.close(); } /** * Retrieves a list of presidents. In a standard n-tier architecture, this * method would call to the application (ejb) tier to retrieve this * information. * * @return */ private President[] getPresidents() { ArrayList presidents = new ArrayList(); try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager .getConnection("jdbc:mysql://localhost/mysql?user=root&password=foo&defaultFetchSize=10&useCursorFetch=true"); Statement stmt = connection.createStatement(); stmt.setFetchDirection(ResultSet.FETCH_FORWARD); ResultSet rs = stmt.executeQuery("SELECT * FROM PRESIDENT"); while (rs.next()) { President p = new President(); p.setName(rs.getString("TX_NAME")); p.setOfficeStart(rs.getDate("DT_OFFICE_ST")); p.setOfficeEnd(rs.getDate("DT_OFFICE_END")); p.setSummary(rs.getString("TX_SUMMARY")); p.setThumbnail(Util.getBytes(rs.getBlob("BL_THUMBNAIL"))); presidents.add(p); } connection.close(); President[] ssPresidents = (President[]) presidents .toArray(new President[0]); // simulate serialization/deserialization. ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(ssPresidents); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos .toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); ssPresidents = (President[]) ois.readObject(); return ssPresidents; } catch (Exception e) { e.printStackTrace(); return new President[0]; } } }