View Javadoc

1   package org.paneris.jammyjoes.controller;
2   
3   import java.util.Enumeration;
4   import java.util.Vector;
5   
6   import javax.servlet.ServletConfig;
7   import javax.servlet.ServletException;
8   
9   import org.melati.Melati;
10  import org.melati.poem.Field;
11  import org.melati.poem.Persistent;
12  import org.melati.poem.util.DumbPagedEnumeration;
13  import org.melati.poem.util.PagedEnumeration;
14  import org.melati.servlet.Form;
15  import org.melati.template.ServletTemplateContext;
16  import org.melati.util.MelatiException;
17  import org.melati.util.UTF8URLEncoder;
18  import org.paneris.jammyjoes.model.JammyjoesDatabase;
19  import org.paneris.jammyjoes.model.Product;
20  import org.paneris.jammyjoes.model.Supplier;
21  import org.paneris.jammyjoes.servlet.JammyJoesMelatiServlet;
22  import org.paneris.jammyjoes.shopping.MelatiShoppingConfig;
23  import org.paneris.jammyjoes.shopping.ShoppingTrolley;
24  import org.paneris.jammyjoes.util.JammyJoesUtil;
25  
26  public class Search extends JammyJoesMelatiServlet {
27  
28    private static final long serialVersionUID = 1L;
29  
30    public MelatiShoppingConfig config;
31    private JammyjoesDatabase db;
32  
33    public void init(ServletConfig conf) throws ServletException {
34      super.init(conf);
35      try {
36        config = new MelatiShoppingConfig();
37      } catch (MelatiException e) {
38        throw new ServletException(e.toString());
39      }
40    }
41  
42    protected String jammyjoesRequest(Melati melati, ServletTemplateContext context) throws Exception {
43  
44      db = (JammyjoesDatabase) melati.getDatabase();
45      ServletTemplateContext tc = melati.getServletTemplateContext();
46      String debug = "";
47      String print = Form.getFormNulled(tc, "print");
48      String inframe = Form.getFormNulled(tc, "inframe");
49      String template = JammyJoesUtil.shoppingTemplate(melati, "Results.wm");
50      if (print != null)
51        template = "view/PrintResults.wm";
52  
53      String[] pathInfo = melati.getPathInfoParts();
54      
55      Logger logger = new Logger(db.getSettingTable().get("UploadDir") + "/../");
56      SearchCriteria andSearchCriteria = new TemplateContextSearchCriteria(tc,pathInfo,db,logger, "AND");
57  
58      ParameterProvider provider = new ParameterProvider(tc, pathInfo);
59      SearchType type = db.getTypeTable().fromParameter(provider);
60      SearchAge age = db.getAgeTable().fromParameter(provider);
61      SearchMaufacturer manufacturer = db.getManufacturerTable().fromParameter(provider);
62  
63      String sale = getParam(tc, "field_sale", pathInfo, 7);
64  
65      String supplierString = getParam(tc, "field_supplier", pathInfo, 9);
66      Integer supplier = null;
67      try {
68        supplier = getInt(supplierString);
69        if (supplier != null)
70          supplierString = ((Supplier) db.getSupplierTable().getObject(supplier)).getName();
71      } catch (NumberFormatException e) {
72        Enumeration en = db.getSupplierTable().getNameColumn().selectionWhereEq(supplierString);
73        if (en.hasMoreElements())
74          supplier = ((Persistent) en.nextElement()).getTroid();
75      }
76  
77      String troidString = getParam(tc, "troid", pathInfo, 0);
78      Integer troid = null;
79      try {
80        troid = getInt(troidString);
81        if (troid != null)
82          troidString = ((Product) db.getProductTable().getObject(troid)).getName();
83      } catch (NumberFormatException e) {}
84  
85      String price = getParam(tc, "field_price", pathInfo, 3);
86      String description = getParam(tc, "field_description", pathInfo, 4);
87      String outofstock = getParam(tc, "field_outofstock", pathInfo, 6);
88      Integer hitsPerPage = getInt(getParam(tc, "hits", pathInfo, 10));
89      String startString = getParam(tc, "start", pathInfo, 11);
90  
91      String go = Form.getFormNulled(tc, "go");
92      
93      logger.logType(type);
94  
95      String path =
96        pathise(troidString)
97          + type.pathise()
98          + age.pathise()
99          + pathise(price)
100         + pathise(description)
101         + pathise("_")
102         + pathise(outofstock)
103         + pathise(sale)
104         + manufacturer.pathise()
105         + pathise(supplierString)
106         + pathise(hitsPerPage);
107 
108     if (hitsPerPage == null)
109       hitsPerPage = new Integer(100);
110 
111     context.put("path", path);
112     context.put("type", new Field(type, db.getProductTable().getTypeColumn()));
113     context.put("ages", makeVector(db.getAgeTable().selection()));
114     context.put("trolley", ShoppingTrolley.getInstance(melati, config));
115     context.put("metaData", new TitleGenerator(type, age, manufacturer, troidString, description));
116     context.put("metaRange", "");
117     context.put("metaSupplier", notNull(supplierString));
118     context.put("metaName", notNull(troidString));
119     context.put("metaDescription", notNull(description));
120 
121     boolean run = false;
122     if (go != null
123       || troidString != null
124       || !type.isNull()
125       || !age.isNull()
126       || price != null
127       || description != null
128       || outofstock != null
129       || !manufacturer.isNull()
130       || sale != null
131       || supplier != null
132       || startString != null)
133       run = true;
134 
135     if (pathInfo.length < 1 && !run) {
136       template = JammyJoesUtil.shoppingTemplate(melati, "Shopping.wm");
137       if (print != null)
138         template = "view/PrintSearch.wm";
139     } else {
140       logger.logUsersIp(melati.getRequest().getRemoteAddr());
141       PagedEnumeration r = null;
142       if (run) {
143         r = new ProductSearch(db, 200, logger).doSearch(andSearchCriteria);
144       }
145       int start = 0;
146       if (startString != null) {
147         try {
148           start = new Integer(startString).intValue();
149         } catch (NumberFormatException e) {
150         }
151       }
152       if (r != null){
153         logger.writeLog();
154         if (r.getTotalCount() == 0) {
155           SearchCriteria orSearchCriteria = new TemplateContextSearchCriteria(tc,pathInfo,db,logger, "OR");
156           r = new ProductSearch(db, 200, logger).doSearch(orSearchCriteria);
157         }
158         if (r.getTotalCount() == 1) {
159           Product similarToMe = (Product)r.nextElement();
160           Vector oneResult = new Vector();
161           oneResult.add(similarToMe);
162           context.put("results", new DumbPagedEnumeration(oneResult.elements(), start, hitsPerPage.intValue(), 200));
163           context.put("similarResults", new DumbPagedEnumeration(new ProductSearch(db, 10, new Logger(null)).doSearch(new SimilarSearchCriteria(similarToMe)), 0, 10, 10));
164         } else {
165           melati.getSession().setAttribute("path", path + pathise(startString));
166           context.put("results", new DumbPagedEnumeration(r, start, hitsPerPage.intValue(), 200));
167         }
168       }
169       context.put("debug", debug);
170     }
171     return template;
172   }
173 
174   private Vector makeVector(Enumeration enumeration) {
175     Vector result = new Vector();
176     while (enumeration.hasMoreElements()) {
177       result.add(enumeration.nextElement());
178     }
179     return result;
180   }
181 
182   private String pathise(Object in) {
183     if (in == null)
184       return "/_";
185     return "/" + UTF8URLEncoder.encode(in.toString());
186   }
187 
188   private String getParam(ServletTemplateContext tc, String name, String[] pathInfo, int pos) {
189     String value = Form.getFormNulled(tc, name);
190     if (value == null && pos > -1 && pos < pathInfo.length) {
191       value = pathInfo[pos];
192       if (value != null) {
193         if (value.equals("") || value.equals("_")) {
194           value = null;
195         } else {
196           try {
197             value = UTF8URLEncoder.decode(value);
198           } catch (Exception e) {
199           }
200         }
201       }
202     }
203     return value;
204   }
205 
206   private Integer getInt(String in) {
207     if (in != null)
208       return new Integer(in);
209     return null;
210   }
211 
212   private String notNull(String in) {
213     if (in != null)
214       return in;
215     return "";
216   }
217 
218 }