/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.legacy.action; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; /** * A subclass of <code>BaseValidatorForm</code> that contains all of the properties for a start and end date. */ public class CalendarForm extends BaseValidatorForm { //------------------------------------- instance variables private Integer startMonth; private Integer startDay; private Integer startYear; private String startHour; private String startMin; private String startAmPm; private boolean wantEndDate; private Integer endMonth; private Integer endDay; private Integer endYear; private String endHour; private String endMin; private String endAmPm; public static final String AM = "am"; public static final String PM = "pm"; //-------------------------------------public methods /** * Utility method that converts the fields associated with the the end time into a date. * * @return A java.util.Date that represents the end date. */ public Date getEndDate() { if (!getWantEndDate()) { return null; } GregorianCalendar cal = new GregorianCalendar(); cal.set(Calendar.YEAR, endYear.intValue()); cal.set(Calendar.MONTH, endMonth.intValue()); cal.set(Calendar.DAY_OF_MONTH, endDay.intValue()); try { cal.set(Calendar.HOUR_OF_DAY, calcHour(endHour, endAmPm)); cal.set(Calendar.MINUTE, Integer.parseInt(endMin)); cal.set(Calendar.SECOND, 0); } catch (NumberFormatException nfe) { return null; } return cal.getTime(); } /** * Populates the form's end date fields with a date. * * @param date A java.util.Date that represents the end date. */ public void populateEndDate(Date d, Locale userLocale) { GregorianCalendar cal = new GregorianCalendar(userLocale); cal.setTime(d); endYear = Integer.valueOf(cal.get(Calendar.YEAR)); endMonth = Integer.valueOf(cal.get(Calendar.MONTH)); endDay = Integer.valueOf(cal.get(Calendar.DAY_OF_MONTH)); endMin = fmtTime(cal.get(Calendar.MINUTE)); int tmpEndHour = cal.get(Calendar.HOUR); if (cal.get(Calendar.HOUR) == 0) { tmpEndHour = 12; } if (cal.get(Calendar.AM_PM) == Calendar.PM) { endAmPm = PM; } else { endAmPm = AM; } endHour = fmtTime(tmpEndHour); } /** * Utility method that converts the fields associated with the the start time into a date. * * @return A java.util.Date that represents the start date. */ public Date getStartDate() { GregorianCalendar cal = new GregorianCalendar(); cal.set(Calendar.YEAR, startYear.intValue()); cal.set(Calendar.MONTH, startMonth.intValue()); cal.set(Calendar.DAY_OF_MONTH, startDay.intValue()); try { cal.set(Calendar.HOUR_OF_DAY, calcHour(startHour, startAmPm)); cal.set(Calendar.MINUTE, Integer.parseInt(startMin)); cal.set(Calendar.SECOND, 0); } catch (NumberFormatException nfe) { return null; } return cal.getTime(); } /* If the hour is 0, or [13-23] inclusive, the user is trying * to use military time. In this case, ignore AM_PM setting. * * This only works if you are setting HOUR_OF_DAY in the calendar object. * * @see http://greenwichmeantime.com/info/noon.htm */ protected int calcHour(String hour, String ampm) throws NumberFormatException { int tmpStart = Integer.parseInt(hour); if ((tmpStart == 0) || ((tmpStart > 12) && (tmpStart <= 23))) { return tmpStart; } else if (PM.equals(ampm)) { if (tmpStart == 12) { return tmpStart; } return tmpStart + 12; } else { if (tmpStart == 12) { tmpStart -= 12; } return tmpStart; } } /** * Utility method that populates fields associated with the the start date. * * @param d A java.util.Date that represents the start date. */ public void populateStartDate(Date startDate, Locale userLocale) { GregorianCalendar cal = new GregorianCalendar(userLocale); cal.setTime(startDate); startYear = Integer.valueOf(cal.get(Calendar.YEAR)); startMonth = Integer.valueOf(cal.get(Calendar.MONTH)); startDay = Integer.valueOf(cal.get(Calendar.DAY_OF_MONTH)); startMin = this.fmtTime(cal.get(Calendar.MINUTE)); int tmpStartHour = cal.get(Calendar.HOUR); if (cal.get(Calendar.HOUR) == 0) { tmpStartHour = 12; } if (cal.get(Calendar.AM_PM) == Calendar.PM) { startAmPm = PM; } else { startAmPm = AM; } startHour = fmtTime(tmpStartHour); } private String fmtTime(int s) { if (s < 10) { return "0" + s; } else { return String.valueOf(s); } } /** * @return an initial current time */ protected Calendar getInitStartTime() { Calendar cal = Calendar.getInstance(); return cal; } @Override public void reset(ActionMapping mapping, HttpServletRequest request) { Calendar cal = getInitStartTime(); this.startMin = fmtTime(cal.get(Calendar.MINUTE)); int hr = cal.get(Calendar.HOUR); // assume that if the hr is 0, it is 12 o'clock am/pm. if (hr == 0) { hr = 12; } this.startHour = fmtTime(hr); if (cal.get(Calendar.AM_PM) == Calendar.AM) { this.startAmPm = AM; } else { this.startAmPm = PM; } this.startDay = Integer.valueOf(cal.get(Calendar.DAY_OF_WEEK)); this.startMonth = Integer.valueOf(cal.get(Calendar.MONTH)); this.startYear = Integer.valueOf(Calendar.YEAR); this.wantEndDate = false; this.endHour = this.startHour; this.endMin = this.startMin; this.endMonth = Integer.valueOf(Calendar.JANUARY); this.endDay = Integer.valueOf(Calendar.SUNDAY); this.endYear = Integer.valueOf(cal.get(Calendar.YEAR)); super.reset(mapping, request); } @Override public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { if (!shouldValidate(mapping, request)) { return null; } ActionErrors errs = super.validate(mapping, request); if (errs == null) { errs = new ActionErrors(); } if (shouldValidateDateRange()) { validateDateRange(mapping, request, errs); } return errs.isEmpty() ? null : errs; } protected boolean shouldValidateDateRange() { return true; } protected final void validateDateRange(ActionMapping mapping, HttpServletRequest request, ActionErrors errs) { // custom validation // Check start time try { int tmph = Integer.parseInt(startHour); if ((tmph < 0) || (tmph > 12)) { errs.add("startHour", new ActionMessage("errors.range", startHour, Integer.valueOf(1), Integer .valueOf(12))); } } catch (NumberFormatException nfe) { errs.add("startHour", new ActionMessage("errors.invalid.StartHour", startHour)); } try { int tmpmin = Integer.parseInt(startMin); if ((tmpmin > 59) || (tmpmin < 0)) { errs.add("startMin", new ActionMessage("errors.range", startMin, Integer.valueOf(0), Integer .valueOf(59))); } } catch (NumberFormatException nfe) { errs.add("startMin", new ActionMessage("errors.invalid.StartMin", startMin)); } // Check end time try { int tmph = Integer.parseInt(endHour); if ((tmph < 0) || (tmph > 12)) { errs .add("endHour", new ActionMessage("errors.range", endHour, Integer.valueOf(1), Integer.valueOf(12))); } } catch (NumberFormatException nfe) { errs.add("endHour", new ActionMessage("errors.invalid.EndHour", endHour)); } try { int tmpmin = Integer.parseInt(endMin); if ((tmpmin > 59) || (tmpmin < 0)) { errs.add("endMin", new ActionMessage("errors.range", endMin, 0, 59)); } } catch (NumberFormatException nfe) { errs.add("endMin", new ActionMessage("errors.invalid.EndMin", endMin)); } Date tmpStartDate = getStartDate(); Date tmpEndDate = getEndDate(); //System.out.println("start: " + tmpStartDate + " end: " + tmpEndDate); if ((tmpStartDate != null) && (tmpEndDate != null) && tmpStartDate.after(tmpEndDate)) { errs.add("endDate", new ActionMessage("resource.common.monitor.error.FromEarlierThanTo")); } } @Override public String toString() { StringBuffer buf = new StringBuffer(super.toString()); buf.append(" startMonth=").append(startMonth); buf.append(" startDay=").append(startDay); buf.append(" startYear=").append(startYear); buf.append(" startHour=").append(startHour); buf.append(" startMin=").append(startMin); buf.append(" startAmPm=").append(startAmPm); buf.append(" endMonth=").append(endMonth); buf.append(" endDay=").append(endDay); buf.append(" endYear=").append(endYear); buf.append(" endHour=").append(endHour); buf.append(" endMin=").append(endMin); buf.append(" endAmPm=").append(endAmPm); return buf.toString(); } /** * A flag indicating whether or not end date should be checked. */ public boolean getWantEndDate() { return wantEndDate; } public void setWantEndDate(boolean b) { this.wantEndDate = b; } /** * Getter for property endDay. * * @return Value of property endDay. */ public Integer getEndDay() { return endDay; } /** * Setter for property endDay. * * @param endDay New value of property endDay. */ public void setEndDay(Integer endDay) { this.endDay = endDay; } /** * Getter for property endMonth. * * @return Value of property endMonth. */ public Integer getEndMonth() { return endMonth; } /** * Setter for property endMonth. * * @param endMonth New value of property endMonth. */ public void setEndMonth(Integer endMonth) { this.endMonth = endMonth; } /** * Getter for property endYear. * * @return Value of property endYear. */ public Integer getEndYear() { return endYear; } /** * Setter for property endYear. * * @param endYear New value of property endYear. */ public void setEndYear(Integer endYear) { this.endYear = endYear; } /** * Getter for property endMin. * * @return Value of property endMin. */ public String getEndMin() { return endMin; } /** * Setter for property endMin. * * @param endMin New value of property endMin. */ public void setEndMin(String endMin) { this.endMin = endMin; } /** * Getter for property endHour. * * @return Value of property endHour. */ public String getEndHour() { return endHour; } /** * Setter for property endHour. * * @param endHour New value of property endHour. */ public void setEndHour(String endHour) { this.endHour = endHour; } /** * Getter for property startDay. * * @return Value of property startDay. */ public Integer getStartDay() { return startDay; } /** * Setter for property startDay. * * @param startDay New value of property startDay. */ public void setStartDay(Integer startDay) { this.startDay = startDay; } /** * Getter for property startAmPm. * * @return Value of property startAmPm. */ public String getStartAmPm() { return startAmPm; } /** * Setter for property startAmPm. * * @param startAmPm New value of property startAmPm. */ public void setStartAmPm(String startAmPm) { this.startAmPm = startAmPm; } /** * Getter for property endAmPm. * * @return Value of property endAmPm. */ public String getEndAmPm() { return endAmPm; } /** * Setter for property endAmPm. * * @param endAmPm New value of property endAmPm. */ public void setEndAmPm(String endAmPm) { this.endAmPm = endAmPm; } /** * Getter for property startYear. * * @return Value of property startYear. */ public Integer getStartYear() { return startYear; } /** * Setter for property startYear. * * @param startYear New value of property startYear. */ public void setStartYear(Integer startYear) { this.startYear = startYear; } /** * Getter for property startMin. * * @return Value of property startMin. */ public String getStartMin() { return startMin; } /** * Setter for property startMin. * * @param startMin New value of property startMin. */ public void setStartMin(String startMin) { this.startMin = startMin; } /** * Getter for property startHour. * * @return Value of property startHour. */ public String getStartHour() { return startHour; } /** * Setter for property startHour. * * @param startHour New value of property startHour. */ public void setStartHour(String startHour) { this.startHour = startHour; } /** * Getter for property startMonth. * * @return Value of property startMonth. */ public Integer getStartMonth() { return startMonth; } /** * Setter for property startMonth. * * @param startMonth New value of property startMonth. */ public void setStartMonth(Integer startMonth) { this.startMonth = startMonth; } public Collection<Integer> getYearOptions() { GregorianCalendar cal = new GregorianCalendar(); cal.setTime(new Date()); int year = cal.get(Calendar.YEAR); List<Integer> ret = new ArrayList<Integer>(11); for (int i = 3; i > 0; i--) { ret.add(year + i); } for (int i = 0; i < 8; i++) { ret.add(year - i); } return ret; } }