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