/*
* NOTE: This copyright does *not* cover user programs that use HQ
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
* This file is part of HQ.
*
* HQ is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package org.hyperic.hq.ui.action;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.components.ActionMessage;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
public class CalendarFormNG extends BaseValidatorFormNG {
// ------------------------------------- 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 = new Integer(cal.get(Calendar.YEAR));
endMonth = new Integer(cal.get(Calendar.MONTH));
endDay = new Integer(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);
cal.set(Calendar.MILLISECOND,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 = new Integer(cal.get(Calendar.YEAR));
startMonth = new Integer(cal.get(Calendar.MONTH));
startDay = new Integer(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 new Integer(s).toString();
}
}
/**
* @return an initial current time
*/
protected Calendar getInitStartTime() {
Calendar cal = Calendar.getInstance();
return cal;
}
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 = new Integer(cal.get(Calendar.DAY_OF_WEEK_IN_MONTH));
this.startMonth = new Integer(cal.get(Calendar.MONTH));
this.startYear = new Integer(Calendar.YEAR);
this.wantEndDate = false;
this.endHour = this.startHour;
this.endMin = this.startMin;
this.endMonth = new Integer(Calendar.JANUARY);
this.endDay = new Integer(Calendar.SUNDAY);
this.endYear = new Integer(cal.get(Calendar.YEAR));
}
/*
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, new Integer(1), new Integer(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, new Integer(0), new Integer(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, new Integer(1), new Integer(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, new Integer(0), new Integer(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"));
}
}
*/
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 getYearOptions() {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
int year = cal.get(Calendar.YEAR);
ArrayList ret = new ArrayList(8);
for (int i = 0; i < 8; i++) {
ret.add(new Integer(year - i));
}
return ret;
}
}