1    package com.instantbank.lettertemplate.control.web.handlers;
2    
3    import java.util.HashMap;
4    import java.util.ArrayList;
5    import java.util.Enumeration;
6    import java.util.Locale;
7    import java.util.Hashtable;
8    import javax.servlet.http.HttpServletRequest;
9    import javax.servlet.ServletContext;
10   import javax.servlet.http.HttpSession;
11   import java.io.*;
12   import java.util.*;
13   
14   import oracle.xml.parser.v2.*;
15   import org.w3c.dom.*;
16   import org.xml.sax.*;
17   
18   import com.instantbank.lettertemplate.control.event.ImagesRepositoryEvent;
19   import com.instantbank.lettertemplate.control.util.JSPUtil;
20   import com.instantbank.lettertemplate.control.util.WebKeys;
21   import com.instantbank.common.utilcomponents.Debug;
22   import com.instantbank.common.utilcomponents.CommonUtil;
23   import com.instantbank.common.utilcomponents.LetterTemplateExceptionMessage;
24   import com.instantbank.common.utilcomponents.LetterTemplateGlobals;
25   import com.instantbank.lettertemplate.control.LetterTemplateEventException;
26   import com.instantbank.lettertemplate.control.event.LetterTemplateEvent;
27   
28   /**
29    *  Letter Images usecase: handler of user requests in the Application layer
30    *
31    * @author Instant-bank (Consuelo Franky, Jorge Cardenas)
32    * @created August 2002
33    */
34   public class ImagesRepositoryHandler extends RequestHandlerSupport {
35   
36     private Debug debug = null;
37     private String imagesTemporalPath = null;
38     ServletContext context;
39   
40   
41     /**
42      *  principal method that process a user request instantiating a
43      *  ImagesRepositoryEvent with the user request data
44      *
45      * @param request of MainServlet
46      * @param context of MainServlet
47      * @return ImagesRepositoryEvent with the  user request data
48      * @exception LetterTemplateEventException
49      */
50     public LetterTemplateEvent processRequest(HttpServletRequest request,
51                                               ServletContext context)
52        throws LetterTemplateEventException {
53   
54       debug = new Debug();
55       debug.setDebugginOn(true);
56       debug.setPreMessage("** ImagesRepositoryHandler-application tier: ");
57   
58       this.context = context;
59       String action = request.getParameter("action");
60       debug.println("Creation of an ImagesRepository Event; "
61         + "ImagesRepositoryHandler (web): action=" + action);
62   
63       if(action != null) {
64         request.setAttribute(WebKeys.ActionImage, action);
65       }
66   
67       if(action == null) {
68         throw new LetterTemplateEventException
69           (LetterTemplateExceptionMessage.SERVICE_NOT_SELECTED);
70       }
71       else if(action.equals("listImagesNames")) {
72         return createListImagesRepositoryEvent(request);
73       }
74       else if(action.equals("updateImagesNames")) {
75         return this.createUpdateImageEvent(request);
76       }
77       else if(action.equals("uploadImage")) {
78         return this.createUploadImageEvent(request);
79       }
80       return null;
81     }
82   
83   
84     /**
85      *  method for instantiating a ImagesRepositoryEvent demanding a service of
86      *  getting the images list
87      *
88      * @param request of MainServlet
89      * @return ImagesRepositoryEvent with the user request data
90      * @exception LetterTemplateEventException
91      */
92     private LetterTemplateEvent createListImagesRepositoryEvent
93       (HttpServletRequest request)
94        throws LetterTemplateEventException {
95   
96       Hashtable imagesTable = null;
97       String companyId = (String)request.getSession()
98         .getAttribute(WebKeys.CompanyId);
99       try {
100        imagesTable = CommonUtil.getWebContextVariable
101          (context, WebKeys.ImageTable);
102        Object list = imagesTable.get(companyId);
103        if(list != null) {
104          request.setAttribute(WebKeys.ExistsImagesList, "true");
105          return null;
106        }
107  
108        // instantiating ImagesRepositoryEvent:
109        ImagesRepositoryEvent event
110           = new ImagesRepositoryEvent
111          (ImagesRepositoryEvent.LIST_IMAGES_NAMES,
112          (String)request.getSession()
113          .getAttribute(WebKeys.CompanyId),
114          (Long)request.getSession().
115          getAttribute(WebKeys.UserId),
116          LetterTemplateGlobals.STR_UNDEF,
117          new byte[0],
118          null);
119        request.setAttribute(WebKeys.ImagesRepositoryEvent, event);
120        return event;
121      }
122      catch(Exception e) {
123        throw new LetterTemplateEventException
124          (LetterTemplateExceptionMessage.PROBLEM_PARSING + e.getMessage()
125          + LetterTemplateExceptionMessage.RETRY);
126      }
127    }
128  
129  
130    /**
131     *  method for instantiating a ImagesRepositoryEvent demanding a service of
132     *  updating several letters images
133     *
134     * @param request of MainServlet
135     * @return ImagesRepositoryEvent with the user request data
136     * @exception LetterTemplateEventException
137     */
138    private LetterTemplateEvent createUpdateImageEvent
139      (HttpServletRequest request)
140       throws LetterTemplateEventException {
141      ArrayList items = null;
142      try {
143        // getting HTML parameters :
144        String xmlImagesItems = request.getParameter("xmlImagesItems").trim();
145        debug.println("xmlImagesItems=" + xmlImagesItems);
146        // parsing XML of xmlImagesItems:
147        // resulting ArrayList has 3 elements of type String[]
148        // representing the attributes of items: code, name and status
149        items = parseXMLImages(xmlImagesItems);
150        String code[] = (String[])(items.get(0));
151        if(code.length == 0) {
152          request.setAttribute(WebKeys.ExistsImagesList, "true");
153          return null;
154        }
155  
156        // instantiating ImagesRepositoryEvent:
157        ImagesRepositoryEvent event
158           = new ImagesRepositoryEvent
159          (ImagesRepositoryEvent.UPDATE_IMAGES_NAMES,
160          (String)request.getSession()
161          .getAttribute(WebKeys.CompanyId),
162          (Long)request.getSession().
163          getAttribute(WebKeys.UserId),
164          LetterTemplateGlobals.STR_UNDEF,
165          new byte[0],
166          items);
167        request.setAttribute(WebKeys.ImagesRepositoryEvent, event);
168        return event;
169      }
170      catch(Exception e) {
171        throw new LetterTemplateEventException
172          (LetterTemplateExceptionMessage.PROBLEM_PARSING + e.getMessage()
173          + LetterTemplateExceptionMessage.RETRY);
174      }
175    }
176  
177  
178    /**
179     *  method for instantiating a ImagesRepositoryEvent demanding a service of
180     *  updating several images
181     *
182     * @param request of MainServlet
183     * @return ImagesRepositoryEvent with the user request data
184     * @exception LetterTemplateEventException
185     */
186    private LetterTemplateEvent createUploadImageEvent
187      (HttpServletRequest request)
188       throws LetterTemplateEventException {
189      ArrayList items = null;
190      try {
191        // getting HTML parameters :
192        String xmlImagesItems = request.getParameter("xmlImagesItems").trim();
193        debug.println("xmlImagesItems=" + xmlImagesItems);
194        // parsing XML of xmlImagesItems:
195        // resulting ArrayList has 3 elements of type String[]
196        // representing the attributes of items: code, name and status
197        items = parseXMLImages(xmlImagesItems);
198        String code[] = (String[])(items.get(0));
199        if(code.length == 0) {
200          request.setAttribute(WebKeys.ExistsImagesList, "true");
201          return null;
202        }
203  
204        // instantiating ImagesRepositoryEvent:
205        ImagesRepositoryEvent event
206           = new ImagesRepositoryEvent
207          (ImagesRepositoryEvent.PRE_STORE_IMAGE,
208          (String)request.getSession()
209          .getAttribute(WebKeys.CompanyId),
210          (Long)request.getSession().
211          getAttribute(WebKeys.UserId),
212          LetterTemplateGlobals.STR_UNDEF,
213          new byte[0],
214          items);
215        request.setAttribute(WebKeys.ImagesRepositoryEvent, event);
216        return event;
217      }
218      catch(Exception e) {
219        throw new LetterTemplateEventException
220          (LetterTemplateExceptionMessage.PROBLEM_PARSING + e.getMessage()
221          + LetterTemplateExceptionMessage.RETRY);
222      }
223    }
224  
225  
226    /**
227     *  auxiliary method for parsing a XML string containing items to update in
228     *  letters images
229     *
230     * @param imageItems XML string with the items
231     * @return a ArrayList with 3 elements of type String[]
232     *      representing the attributes of items: code, name and status
233     * @exception Exception
234     */
235    private ArrayList parseXMLImages(String imageItems) throws Exception {
236      XMLDocument xmlDoc = CommonUtil.parseInfo(imageItems);
237  
238      NodeList nlCode = xmlDoc.selectNodes("/ImagesList/Image/code/text()");
239      NodeList nlName = xmlDoc.selectNodes("/ImagesList/Image/name/text()");
240      NodeList nlStatus = xmlDoc.selectNodes("/ImagesList/Image/status/text()");
241      int nlLength = nlCode.getLength();
242  
243      String[] code = new String[nlLength];
244      String[] name = new String[nlLength];
245      String[] status = new String[nlLength];
246      for(int i = 0; i < nlLength; i++) {
247        code[i] = nlCode.item(i).getNodeValue();
248        name[i] = nlName.item(i).getNodeValue();
249        status[i] = nlStatus.item(i).getNodeValue();
250      }
251  
252      ArrayList items = new ArrayList(3);
253      items.add(code);
254      items.add(name);
255      items.add(status);
256      return items;
257    }
258  }
259  
260