View Javadoc

1   package org.paneris.jammyjoes.controller;
2   
3   import java.util.Enumeration;
4   import java.util.List;
5   import java.util.Vector;
6   
7   import org.melati.poem.Persistent;
8   import org.melati.template.ServletTemplateContext;
9   import org.melati.poem.util.EnumUtils;
10  import org.melati.util.StringUtils;
11  import org.paneris.jammyjoes.model.Age;
12  import org.paneris.jammyjoes.model.JammyjoesDatabase;
13  
14  public class TemplateContextSearchCriteria implements SearchCriteria {
15    
16    private ParameterProvider provider; 
17    private JammyjoesDatabase db;
18    Logger logger;
19    private String andOr;
20    
21    public TemplateContextSearchCriteria(ServletTemplateContext tc, String[] pathInfo, JammyjoesDatabase db, Logger logger, String andOr) {
22      provider = new ParameterProvider(tc, pathInfo);
23      this.db = db;
24      this.logger = logger;
25      this.andOr = andOr;
26    }
27  
28    public void constrain(List constraints) {
29      if (!constrainTroid(constraints)) {
30        constrainOutOfStock(constraints);
31        constrainDescription(constraints);
32        constrainType(constraints);
33        constrainSupplier(constraints);
34        constrainManufacturer(constraints);
35        constrainPrice(constraints);
36        constrainAge(constraints);
37        constrainSale(constraints);
38      }
39    }
40    
41    
42    private void constrainSale(List constraints) {
43      String sale = provider.getParam("field_sale", 7);
44      if (sale != null) {
45        constraints.add(q("saleprice") + " IS NOT NULL");
46      }
47    }
48  
49    public void constrainDicontinued(List constraints) {
50      constraints.add(q("status") + " != " + db.getProductStatusTable().getDiscontinued().getTroid());
51    }
52  
53    public String order() {
54      return null;
55    }
56  
57    public boolean constrainTroid(List constraints) {
58      String troidString = provider.getParam("troid", 0);
59      Integer troid =  null;
60      try {
61        troid = getInt(troidString);
62      } catch (NumberFormatException e) {
63        Enumeration en = db.getProductTable().getNameColumn().selectionWhereEq(troidString);
64        if (en.hasMoreElements()) {
65          troid = ((Persistent) en.nextElement()).getTroid();
66        }
67      }
68      if (troid != null) {
69        constraints.add(q("id") + " = " + troid);
70        logger.logTroid(troid);
71        return true;
72      }
73      return false;
74    }
75  
76    public void constrainPrice(List constraints) {
77      String price = provider.getParam("field_price", 3);
78      if (price != null) {
79        String[] prices = StringUtils.split(price, '_');
80        constraints.add(q("retailpriceincvat") + " >= " + prices[0]);
81        constraints.add(q("retailpriceincvat") + " <= " + prices[1]);
82        logger.logPrice(price);
83      }
84    }
85  
86    public void constrainOutOfStock(List constraints) {
87      String outofstock = provider.getParam("field_outofstock", 6);
88      if (outofstock == null) {
89        constraints.add(q("stocklevel") + " > 0");
90      }
91    }
92  
93    public void constrainDescription(List constraints) {
94      String description = provider.getParam("field_description", 4);
95      if (description != null) {
96        description = description.trim();
97        logger.logDescription(description);
98        String[] parts = StringUtils.split(description, ' ');
99        Vector subwhere = new Vector();
100       String descClause = makeClause(db, "description", parts);
101       String nameClause = makeClause(db, "name", parts);
102       String typeClause = makeClause(db, "type", parts);
103       if (descClause != null)
104         subwhere.add(descClause);
105       if (nameClause != null)
106         subwhere.add(nameClause);
107       if (typeClause != null)
108       subwhere.add(
109         q("type")
110           + " IN (SELECT "
111           + q("id")
112           + " FROM "
113           + q("type")
114           + " WHERE "
115           + typeClause
116           + ")");
117       subwhere.add(
118         q("type2")
119           + " IN (SELECT "
120           + q("id")
121           + " FROM "
122           + q("type")
123           + " WHERE "
124           + typeClause
125           + ")");
126        if (!subwhere.isEmpty()) {
127         constraints.add("(" + EnumUtils.concatenated(" OR ", subwhere.elements()) + ")");
128       }
129     }
130   }
131 
132   public void constrainType(List constraints) {
133     String typeString = provider.getParam("field_type", 1);
134     Integer type = null;
135     try {
136       type = getInt(typeString);
137     } catch (NumberFormatException e) {
138       Enumeration en = db.getTypeTable().getTypeColumn().selectionWhereEq(typeString);
139       if (en.hasMoreElements())
140         type = ((Persistent) en.nextElement()).getTroid();
141     }
142     if (type != null)
143       constraints.add("(" + q("type") + " = " + type + " OR " + q("type2") + " = " + type + ")");
144   }
145 
146   public String q(String name) {
147     StringBuffer b = new StringBuffer();
148     StringUtils.appendQuoted(b, name, '"');
149     return b.toString();
150   }
151 
152   public String e(String value) {
153     StringBuffer b = new StringBuffer();
154     StringUtils.appendQuoted(b, value, '\'');
155     return b.toString();
156   }
157 
158   private Integer getInt(String in) {
159     return in == null ? null : new Integer(in);
160   }
161 
162   private String makeClause(JammyjoesDatabase db, String field, String[] parts) {
163     Vector clause = new Vector();
164     for (int i = 0; i < parts.length; i++) {
165       String part = parts[i];
166       if (!part.equals("")) {
167         clause.add(db.getDbms().caseInsensitiveRegExpSQL(q(field), e(part)));
168       }
169     }
170     if (clause.isEmpty())
171       return null;
172     return "(" + EnumUtils.concatenated(" " + andOr + " ", clause.elements()) + ")";
173   }
174 
175   public void constrainSupplier(List constraints) {
176     String supplierString = provider.getParam("field_supplier", 9);
177     Integer supplier = null;
178     try {
179       supplier = getInt(supplierString);
180     } catch (NumberFormatException e) {
181       Enumeration en = db.getSupplierTable().getNameColumn().selectionWhereEq(supplierString);
182       if (en.hasMoreElements())
183         supplier = ((Persistent) en.nextElement()).getTroid();
184     }
185     if (supplier != null)
186       constraints.add(q("supplier") + " = " + supplier);
187   }
188   
189   public void constrainManufacturer(List constraints) {
190     String manufacturerString = provider.getParam("field_manufacturer", 8);
191     Integer manufacturer = null;
192     try {
193       manufacturer = getInt(manufacturerString);
194     } catch (NumberFormatException e) {
195       Enumeration en =
196         db.getManufacturerTable().getNameColumn().selectionWhereEq(manufacturerString);
197       if (en.hasMoreElements())
198         manufacturer = ((Persistent) en.nextElement()).getTroid();
199     }
200     if (manufacturer != null)
201       constraints.add(q("manufacturer") + " = " + manufacturer);
202   }
203 
204   public void constrainAge(List constraints) {
205     String ageString = provider.getParam("field_age", 2);
206     Integer minAge = null;
207     Integer maxAge = null;
208     if (ageString != null) {
209       int hyphen = ageString.indexOf('_');
210       if (hyphen > 0) {
211         String[] ages = StringUtils.split(ageString, '_');
212         minAge = new Integer(ages[0]);
213         maxAge = new Integer(ages[1]);
214       } else {
215         Enumeration en = db.getAgeTable().getNameColumn().selectionWhereEq(ageString);
216         if (en.hasMoreElements()) {
217           Age theAge = (Age)en.nextElement();
218           minAge = theAge.getMinage();
219           maxAge = theAge.getMaxage();
220         }
221       }
222     }
223     if (minAge != null && maxAge != null) {
224       constraints .add(
225         "(("
226           + minAge
227           + " >= "
228           + q("minage")
229           + " AND "
230           + minAge
231           + " <= "
232           + q("maxage")
233           + " ) OR ("
234           + maxAge
235           + " >= "
236           + q("minage")
237           + " AND "
238           + maxAge
239           + " <= "
240           + q("maxage")
241           + "))");
242           logger.logAge(ageString);
243     }
244   }
245 
246 }