1 package org.cacert.gigi.output;
3 import java.io.PrintWriter;
4 import java.text.SimpleDateFormat;
5 import java.util.Arrays;
6 import java.util.Calendar;
8 import java.util.GregorianCalendar;
10 import java.util.TimeZone;
12 import javax.servlet.http.HttpServletRequest;
14 import org.cacert.gigi.GigiApiException;
15 import org.cacert.gigi.localisation.Language;
16 import org.cacert.gigi.output.template.Outputable;
18 public class DateSelector implements Outputable {
20 private String[] names;
22 public DateSelector(String day, String month, String year, Date date) {
23 this(day, month, year);
24 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTF"));
26 this.day = cal.get(Calendar.DAY_OF_MONTH);
27 this.month = cal.get(Calendar.MONTH) + 1;
28 this.year = cal.get(Calendar.YEAR);
31 public DateSelector(String day, String month, String year) {
32 this.names = new String[] {
43 private static ThreadLocal<SimpleDateFormat> fmt = new ThreadLocal<>();
46 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
54 private void outputDay(PrintWriter out) {
55 out.print("<select name=\"");
58 for (int i = 1; i <= 31; i++) {
61 out.print(" selected=\"selected\"");
63 out.println(">" + i + "</option>");
65 out.println("</select>");
68 private void outputMonth(PrintWriter out, Language l) {
69 SimpleDateFormat sdf = new SimpleDateFormat("MMMM", l.getLocale());
70 out.print("<select name=\"");
73 Calendar c = sdf.getCalendar();
74 for (int i = 1; i <= 12; i++) {
75 c.set(Calendar.MONTH, i - 1);
76 out.print("<option value='" + i + "'");
78 out.print(" selected=\"selected\"");
80 out.println(">" + sdf.format(c.getTime()) + " (" + i + ")</option>");
82 out.println("</select>");
85 private void outputYear(PrintWriter out) {
86 out.print("<input type=\"text\" name=\"");
88 out.print("\" value=\"");
92 out.print("\" size=\"4\" autocomplete=\"off\">");
95 public void update(HttpServletRequest r) throws GigiApiException {
97 String dayS = r.getParameter(names[0]);
99 day = Integer.parseInt(dayS);
102 String monthS = r.getParameter(names[1]);
103 if (monthS != null) {
104 month = Integer.parseInt(monthS);
107 String yearS = r.getParameter(names[2]);
109 year = Integer.parseInt(yearS);
111 } catch (NumberFormatException e) {
112 throw new GigiApiException("Unparsable date.");
116 public boolean isValid() {
117 if ( !(1900 < year && 1 <= month && month <= 12 && 1 <= day && day <= 32)) {
120 return true; // TODO checkdate
124 public String toString() {
125 return "DateSelector [names=" + Arrays.toString(names) + ", day=" + day + ", month=" + month + ", year=" + year + "]";
128 public java.sql.Date getDate() {
129 Calendar gc = GregorianCalendar.getInstance();
130 gc.set(year, month - 1, day);
131 return new java.sql.Date(gc.getTime().getTime());
134 public static SimpleDateFormat getDateFormat() {
135 SimpleDateFormat local = fmt.get();
137 local = new SimpleDateFormat("yyyy-MM-dd");
138 local.setLenient(false);
139 local.setTimeZone(TimeZone.getTimeZone("UTC"));