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