1 10 11 package org.mmbase.bridge.jsp.taglib.typehandler; 12 13 import javax.servlet.jsp.JspTagException ; 14 import org.mmbase.bridge.*; 15 import org.mmbase.bridge.util.Queries; 16 import org.mmbase.bridge.jsp.taglib.FieldInfoTag; 17 import org.mmbase.bridge.jsp.taglib.ParamHandler; 18 import org.mmbase.bridge.jsp.taglib.util.ContextContainer; 19 20 21 import org.mmbase.storage.search.*; 22 23 import org.mmbase.util.logging.Logging; 24 import org.mmbase.util.logging.Logger; 25 26 33 public class DurationHandler extends AbstractTypeHandler { 34 35 private static final Logger log = Logging.getLoggerInstance(DurationHandler.class); 36 37 private static int DATE_FACTOR = 1000; 39 42 public DurationHandler(FieldInfoTag tag) { 43 super(tag); 44 } 45 46 49 public String htmlInput(Node node, Field field, boolean search) throws JspTagException { 50 long currentValue = -1; 51 long currentHours = 0; 52 long currentMinutes = 0; 53 long currentSeconds = 0; 54 long currentMilliSeconds = 0; 55 if (node !=null) { 56 currentValue = node.getLongValue(field.getName()); 57 long help = currentValue; 58 if (help < 0) help = 0; 59 currentMilliSeconds = help % 1000; 60 help /= 1000; 61 currentSeconds = help % 60; 62 help /= 60; 63 currentMinutes = help % 60; 64 currentHours = help / 60; 65 } 66 67 StringBuffer buffer = new StringBuffer (); 68 buffer.append("<input type=\"hidden\" class=\"" + getClasses(field) + "\" name=\""); 69 buffer.append(prefix(field.getName())); 70 buffer.append("\" value=\""); 71 buffer.append(currentValue); 72 buffer.append("\" />"); 73 75 76 ContextContainer container = tag.getContextProvider().getContextContainer(); 77 78 if (search) { String name = prefix(field.getName() + "_search"); 80 String fieldid = prefixID(field.getName() + "_search"); 81 String searchi = (String ) container.find(tag.getPageContext(), name); 82 if (searchi == null) searchi = "no"; 83 buffer.append("<select name=\"").append(name).append("\" "); 84 buffer.append("id=\"").append(fieldid).append("\">\n"); 85 buffer.append(" <option value=\"no\" "); 86 if (searchi.equals("no")) buffer.append(" selected=\"selected\" "); 87 buffer.append("> </option>"); 88 buffer.append(" <option value=\"less\" "); 89 if (searchi.equals("less")) buffer.append(" selected=\"selected\" "); 90 buffer.append("><</option>"); 91 buffer.append(" <option value=\"greater\" "); 92 if (searchi.equals("greater")) buffer.append(" selected=\"selected\" "); 93 buffer.append(">></option>"); 94 buffer.append(" <option value=\"equal\" "); 95 if (searchi.equals("equal")) buffer.append(" selected=\"selected\" "); 96 buffer.append(">=</option>"); 97 buffer.append("</select>"); 98 } 99 100 101 102 103 String hoursName = prefix(field.getName() + "_hours"); 104 String hoursId = prefixID(field.getName() + "_hours"); 105 String searchHours = (String ) container.find(tag.getPageContext(), hoursName); 106 buffer.append("<input size=\"5\" type=\"text\" name=\"").append(hoursName).append("\" id=\"").append(hoursId).append("\" "); 107 buffer.append("value=\"").append( (searchHours == null ? "" + currentHours : searchHours) ).append("\" /> h :\n"); 108 109 String minutesName = prefix(field.getName() + "_minutes"); 110 String minutesId = prefixID(field.getName() + "_minutes"); 111 buffer.append("<select name=\"").append(minutesName).append("\" "); 112 buffer.append("id=\"").append(minutesId).append("\">\n"); 113 for (int i = 0; i <= 59; i++) { 114 if (currentMinutes == i) { 115 buffer.append(" <option selected=\"selected\">" + i + "</option>\n"); 116 } else { 117 buffer.append(" <option>" + i + "</option>\n"); 118 } 119 } 120 buffer.append("</select> min : "); 121 122 String secondsName = prefix(field.getName() + "_seconds"); 123 String secondsId = prefixID(field.getName() + "_seconds"); 124 buffer.append("<select name=\"").append(secondsName).append("\" "); 125 buffer.append("id=\"").append(secondsId).append("\">\n"); 126 for (int i = 0; i <= 59; i++) { 127 if (currentSeconds == i) { 128 buffer.append(" <option selected=\"selected\">" + i + "</option>\n"); 129 } else { 130 buffer.append(" <option>" + i + "</option>\n"); 131 } 132 } 133 buffer.append("</select> s . "); 134 135 String milliSecondsName = prefix(field.getName() + "_milliseconds"); 136 String milliSecondsId = prefixID(field.getName() + "_milliseconds"); 137 String searchMilliSeconds = (String ) container.find(tag.getPageContext(), milliSecondsName); 138 buffer.append("<input size=\"5\" type=\"text\" name=\"").append(milliSecondsName).append("\" id=\"").append(milliSecondsId).append("\" "); 139 buffer.append("value=\"").append( (searchMilliSeconds == null ? "" + currentMilliSeconds : searchMilliSeconds) ).append("\" /> ms\n"); 140 141 return buffer.toString(); 142 } 143 144 147 public boolean useHtmlInput(Node node, Field field) throws JspTagException { 148 149 String fieldName = field.getName(); 150 try { 151 long oldValue = node.getLongValue(fieldName); 152 long newValue = getSpecifiedValue(field); 153 if (oldValue != newValue) { 154 node.setLongValue(fieldName, newValue); 155 return true; 156 } 157 } catch (java.lang.NumberFormatException e) { 158 throw new JspTagException ("Not a valid number (" + e.toString() + ") in field " + fieldName); 159 } 160 return false; 161 } 162 163 164 protected long getSpecifiedValue(Field field) throws JspTagException { 165 try { 166 String fieldName = field.getName(); 167 Integer hours = new Integer ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hours"))); 168 Integer minutes = new Integer ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minutes"))); 169 Integer seconds = new Integer ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_seconds"))); 170 Integer milliSeconds = new Integer ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_milliseconds"))); 171 return (long) milliSeconds.intValue() + 1000 * (seconds.intValue() + 60 * (minutes.intValue() + 60 * hours.intValue())); 172 } catch (java.lang.NumberFormatException e) { 173 throw new JspTagException ("Not a valid number (" + e.toString() + ")"); 174 } 175 } 176 177 180 public String whereHtmlInput(Field field) throws JspTagException { 181 String fieldName = field.getName(); 182 String operator = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search")); 183 if (operator == null || operator.equals("no")) { 184 return null; 185 } 186 187 long time = getSpecifiedValue(field); 188 if (time == -1) return null; 189 190 if (operator.equals("greater")) { 191 return "( [" + fieldName + "] >" + time + ")"; 192 } else if (operator.equals("smaller")) { 193 return "( [" + fieldName + "] <" + time + ")"; 194 } else if (operator.equals("equal")) { 195 196 String options = tag.getOptions(); 197 if (options != null && options.indexOf("date") > -1) { 198 return "( [" + fieldName + "] >= " + time + " AND [" + fieldName + "] < " + (time + 24 * 60 * 60) + ")"; 199 } else { 200 return "( [" + fieldName + "] = " + time + ")"; 201 } 202 } else { 203 log.warn("Found unknown operator value '" + operator + "'"); 204 return null; 205 } 206 } 207 208 public Constraint whereHtmlInput(Field field, Query query) throws JspTagException { 209 String fieldName = field.getName(); 210 String operator = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search")); 211 if (operator == null || operator.equals("no")) { 212 return null; 213 } 214 215 Long time = new Long (getSpecifiedValue(field)); 216 217 if (query.getSteps().size() > 1) { 218 fieldName = field.getNodeManager().getName()+"."+fieldName; 219 } 220 Constraint con; 221 if (operator.equals("greater")) { 222 con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.GREATER, time); 223 } else if (operator.equals("less")) { 224 con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.LESS, time); 225 } else if (operator.equals("equal")) { 226 String options = tag.getOptions(); 227 if (options != null && options.indexOf("date") > -1) { 228 con = Queries.createConstraint(query, fieldName, Queries.OPERATOR_BETWEEN, time, new Long (time.longValue() + 24 * 60 * 60), false); 229 } else { 230 con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.EQUAL, time); 231 } 232 } else { 233 log.warn("Found unknown operator value '" + operator + "'"); 234 return null; 235 } 236 Queries.addConstraint(query, con); 237 return con; 238 239 } 240 241 public void paramHtmlInput(ParamHandler handler, Field field) throws JspTagException { 242 String fieldName = field.getName(); 243 String operator = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search")); 244 if (operator == null || operator.equals("no")) { 245 return; 246 } 247 handler.addParameter(prefix(fieldName + "_search"), operator); 248 249 String hours = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hours")); 250 String minutes = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minutes")); 251 String seconds = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_seconded")); 252 String milliseconds = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_milliseconds")); 253 handler.addParameter(prefix(fieldName + "_hours"), hours); 254 handler.addParameter(prefix(fieldName + "_minutes"), minutes); 255 handler.addParameter(prefix(fieldName + "_seconds"), seconds); 256 handler.addParameter(prefix(fieldName + "_milliseconds"), milliseconds); 257 } 258 259 260 261 } 262 | Popular Tags |