1    package com.instantbank.lettertemplate.setLetterJob.web;
2    
3    import java.io.*;
4    import java.sql.*;
5    import java.util.ArrayList;
6    import java.util.StringTokenizer;
7    import javax.servlet.*;
8    import javax.servlet.http.*;
9    
10   // utilities:
11   
12   // for working with EJB
13   import java.rmi.RemoteException;
14   import javax.naming.Context;
15   import javax.naming.InitialContext;
16   
17   import com.instantbank.lettertemplate.control.util.*;
18   import com.instantbank.common.utilcomponents.Debug;
19   import com.instantbank.common.utilcomponents.LetterTemplateExceptionMessage;
20   import com.instantbank.common.utilcomponents.JNDINames;
21   import com.instantbank.common.utilcomponents.CommonUtil;
22   
23   import com.instantbank.lettertemplate.editor.web.TemplateTransformer;
24   
25   import com.instantbank.component.lettertemplate.ejb.LetterTemplate;
26   import com.instantbank.component.lettertemplate.ejb.LetterTemplateHome;
27   import com.instantbank.component.lettertemplate.util.Template;
28   
29   import com.instantbank.component.job.ejb.Job;
30   import com.instantbank.component.job.ejb.JobHome;
31   import com.instantbank.component.job.model.JobModel;
32   
33   /**
34    *  Servlet acting as a controller in order to ask ejb services for Preview records
35    *  action in setLetterJob usecase.
36    *
37    * @author InstantBank (Consuelo Franky)
38    * @created November 2002
39    */
40   public class PreviewRecordsServlet extends HttpServlet {
41     /**
42      *  Home of lettertemplate ejb.
43      */
44     private LetterTemplateHome lethome = null;
45     /**
46      *  The lettertemplate ejb that provides the services for this servlet.
47      */
48     private LetterTemplate letejb = null;
49     /**
50      *  Home of job ejb.
51      */
52     private JobHome jobhome = null;
53     /**
54      *  The job ejb that provides model of letter job for this servlet..
55      */
56     private Job jobejb = null;
57   
58     /**
59      * for debugging
60      */
61     private Debug debug = null;
62   
63   
64     /**
65      *  init of servlet: obtains home ejb reference
66      *
67      * @exception ServletException
68      */
69     public void init() throws ServletException {
70       debug = new Debug();
71       debug.setDebugginOn(true);
72       debug.setPreMessage("** PreviewRecordsServlet: ");
73   
74       //obtain LetterTemplateHome reference:
75       try {
76         InitialContext ctx = new InitialContext();
77         lethome = (LetterTemplateHome)ctx.lookup
78           (JNDINames.LETTERTEMPLATE_EJBHOME);
79       }
80       catch(Exception e) {
81         e.printStackTrace();
82         debug.println("Problem instantiating LetterTemplate EJB:"
83           + e.toString());
84         throw new ServletException
85           (LetterTemplateExceptionMessage.PROBLEM_INSTANTIATING_LETTERS_EJB
86           + e.getMessage());
87       }
88   
89       //obtain JobHome reference:
90       try {
91         InitialContext ctx = new InitialContext();
92         jobhome = (JobHome)ctx.lookup(JNDINames.JOB_EJBHOME);
93       }
94       catch(Exception e) {
95         e.printStackTrace();
96         debug.println("Problem instantiating Job EJB:"
97           + e.toString());
98         throw new ServletException
99           (LetterTemplateExceptionMessage.PROBLEM_INSTANTIATING_JOB_EJB
100          + e.getMessage());
101      }
102    }
103  
104  
105    /**
106     *  Gets the result set of the letter job, through an ejb service and
107     *  sends the text to the browser
108     *
109     * @param request HTTP request
110     * @param response HTTP response
111     * @exception ServletException
112     * @exception IOException
113     */
114    public void doGet(HttpServletRequest request, HttpServletResponse response)
115       throws ServletException, IOException {
116      HttpSession session = request.getSession();
117      debug.println("new request=========================");
118  
119      if(CommonUtil.controlTimeout(request, response,
120        getServletConfig().getServletContext())) {
121        debug.println("invalidate session and return by timeout");
122        session.invalidate();
123        return;
124        // here there is a forward to /control_web/TimeOutPageOff.jsp
125        // prepared by controlTimeout()
126      }
127  
128      // get parameters from request:
129      Long jobId = new Long(request.getParameter("jobId"));
130      String selectedFieldsNames = request.getParameter("selectedFieldsNames");
131  
132      ServletOutputStream out = null;
133      try {
134        out = response.getOutputStream();
135  
136        // gets LetterTemplate ejb instance reference:
137        letejb = (LetterTemplate)request.getSession()
138          .getAttribute(WebKeys.LetterTemplateEJB);
139        if(letejb == null) {
140          debug.println("creating reference to LetterTemplate EJB");
141          String companyId = (String)request.getSession()
142            .getAttribute(WebKeys.CompanyId);
143          Long userId = (Long)request.getSession()
144            .getAttribute(WebKeys.UserId);
145          letejb = lethome.create(companyId, userId);
146          request.getSession().setAttribute
147            (WebKeys.LetterTemplateEJB, letejb);
148        }
149  
150        // gets Job ejb instance reference:
151        debug.println("creating reference to Job EJB");
152        jobejb = jobhome.findByPrimaryKey(jobId);
153  
154        // gets jobModel of letter job:
155        JobModel jobModel = jobejb.getState();
156  
157        // gets letter template associated to letter job:
158        long templateCode = jobModel.getTemplateCode();
159        Template template = letejb.loadTemplate(templateCode);
160        ArrayList[] variables = template.setOfVariables();
161  
162        // executes sql sentence of letter job:
163        String sql = jobModel.getSqlText();
164        ArrayList[] sqlExec
165           = letejb.executeSQL
166          (sql,
167          TemplateTransformer.varCodesFromSet(variables),
168          jobModel.getJobORDERtable());
169  
170        // extracts the parts of the gotten result set:
171        ArrayList firstColumn = sqlExec[0];
172        ArrayList otherColumns = sqlExec[1];
173  
174        // builds titles of first and other columns with display names:
175        StringTokenizer selectedFieldsNamesTokens
176           = new StringTokenizer(selectedFieldsNames, "|");
177        String firstColumnTitle = selectedFieldsNamesTokens.nextToken();
178        String[] otherColumnsTitles = new String[variables.length];
179        int i = 0;
180        while(selectedFieldsNamesTokens.hasMoreTokens()) {
181          otherColumnsTitles[i] = selectedFieldsNamesTokens.nextToken();
182          i++;
183        }
184  
185        // begins to build HTML table with data of result set:
186        response.setContentType("text/html");
187        char ch = '"';
188        out.println("<link href=" + ch
189          + "/lettertemplate/control_web/instantbank.css" + ch
190          + " rel=" + ch + "stylesheet" + ch + ">");
191        out.println("<H1>Preview of letter job records</H1>");
192        out.println("<H4>Total records are: "
193          + String.valueOf(firstColumn.size()) + "</H4>");
194        out.println("<H5>First column is added for control purposes" + "</H5>");
195        out.println("<table class=" + ch + "tabFormLines" + ch
196          + " cellspacing=" + ch + "1" + ch
197          + " cellpadding=" + ch + "2" + ch
198          + " border=0>");
199  
200        // <tr> of titles:
201        out.println("<tr>");
202        out.println("<td align=" + ch + "center" + ch
203          + " class=" + ch + "labelFormTitle" + ch + ">"
204          + "<strong>" + firstColumnTitle
205          + "</strong></td>");
206  
207        for(int j = 0; j < variables.length; j++) {
208          out.println("<td align=" + ch + "center" + ch
209            + " class=" + ch + "labelFormTitle" + ch + ">"
210            + "<strong>" + otherColumnsTitles[j]
211            + "</strong></td>");
212        }
213        out.println("</tr>");
214  
215        // <tr> of rows data:
216        for(int k = 0; k < firstColumn.size(); k++) {
217          out.println("<tr>");
218          out.println("<td class=" + ch + "labelFormFirst" + ch + ">"
219            + (String)firstColumn.get(k) + "</td>");
220          String[] tuple = (String[])otherColumns.get(k);
221          for(int j = 0; j < tuple.length; j++) {
222            out.println("<td class=" + ch + "labelFormCell" + ch + ">"
223              + tuple[j] + "</td>");
224          }
225          out.println("</tr>");
226        }
227  
228        // ends HTML table
229        out.println("</table>");
230        out.flush();
231  
232      }
233      catch(Exception ex) {
234        debug.println("Exception:" + ex);
235        ex.printStackTrace();
236        response.setContentType("text/html");
237        out.println("<H3>EXCEPTION: " + ex + "</H3>");
238      }
239    }
240  
241  
242    /**
243     *  doPost has the same effect than doGet
244     *
245     * @param request Description of the Parameter
246     * @param response Description of the Parameter
247     * @exception ServletException
248     * @exception IOException
249     */
250    public void doPost(HttpServletRequest request, HttpServletResponse response)
251       throws ServletException, IOException {
252      doGet(request, response);
253    }
254  
255  }
256