Conversion error with CalendarDataModel from Seam
teacurran Dec 11, 2008 1:30 PMI am tring to use a CalendarDataModel to display an icon within each cell of a calendar. I have a custom class that implements CalendarDataModel but I am getting an error from jsf when I try to link it to a calendar.
Here is my DataModel (almost the same as the demo site)
public class ProblemCalendarDataModel implements CalendarDataModel { /* (non-Javadoc) * @see org.richfaces.component.CalendarDataModel#getData(java.util.Date[]) */ private CalendarDataModelItem[] items; private String currentIconHtml; private Date currentDate; private boolean currentDisabled; /* (non-Javadoc) * @see org.richfaces.model.CalendarDataModel#getData(java.util.Date[]) */ public CalendarDataModelItem[] getData(Date[] dateArray) { if (dateArray == null) { return null; } if (items==null) { items = new CalendarDataModelItem[dateArray.length]; for (int i = 0; i < dateArray.length; i++) { items = createDataModelItem(dateArray); } } return items; } /** * @param date * @return CalendarDataModelItem for date */ protected CalendarDataModelItem createDataModelItem(Date date) { CalendarDataModelItemImpl item = new CalendarDataModelItemImpl(); Map data = new HashMap(); data.put("iconHtml", "<img src=\"/img/icon-failed.gif\"/>"); Calendar c = Calendar.getInstance(); c.setTime(date); item.setDay(c.get(Calendar.DAY_OF_MONTH)); item.setEnabled(true); item.setStyleClass("rel-hol"); item.setData(data); return item; } /* (non-Javadoc) * @see org.richfaces.model.CalendarDataModel#getToolTip(java.util.Date) */ public Object getToolTip(Date date) { // TODO Auto-generated method stub return null; } /** * @return items */ public CalendarDataModelItem[] getItems() { return items; } /** * @param items - setter for items */ public void setItems(CalendarDataModelItem[] items) { this.items = items; } /** * @param event - valueChangeEvent handling */ public void valueChanged(ValueChangeEvent event) { System.out.println(event.getNewValue()+"selected"); setCurrentDate((Date)event.getNewValue()); Calendar calendar = Calendar.getInstance(); calendar.setTime(getCurrentDate()); setCurrentIconHtml((String)((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).get("iconHtml")); } /** * Storing changes action */ public void storeDayDetails() { Calendar calendar = Calendar.getInstance(); calendar.setTime(getCurrentDate()); ((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).put("iconHtml", getCurrentIconHtml()); } /** * @return currentIconHtml */ public String getCurrentIconHtml() { return currentIconHtml; } /** * @param currentIconHtml */ public void setCurrentIconHtml(String currentIconHtml) { this.currentIconHtml = currentIconHtml; } /** * @return currentDisabled */ public boolean isCurrentDisabled() { return currentDisabled; } /** * @param currentDisabled */ public void setCurrentDisabled(boolean currentDisabled) { this.currentDisabled = currentDisabled; } /** * @return currentDate */ public Date getCurrentDate() { return currentDate; } /** * @param currentDate */ public void setCurrentDate(Date currentDate) { this.currentDate = currentDate; }
Then within my seam class I have:
@Out private CalendarDataModel problemsCalData = new ProblemCalendarDataModel();
And within my xhtml I have:
<rich:calendar popup="false" showApplyButton="false" cellWidth="30px" cellHeight="30px" boundaryDatesMode="none" showWeeksBar="false" value="#{dashboard.problemsDate}" showFooter="false" mode="ajax" reRender="problemList" dataModel="#{problemsCalData}" valueChangeListener="#{problemsCalData.valueChanged}" > <a4j:support event="onchanged" reRender="problemList"/> <a4j:outputPanel layout="block" id="cell" style="height: 100%;"> <h:panelGrid columns="1"> <h:outputText value="{day}" style="align:center"/> <h:outputText value="{data.iconHtml}"/> </h:panelGrid> </a4j:outputPanel> </rich:calendar>
This appears to me to be very similar to the example on the richfaces site, but I am getting this exception:
java.lang.IllegalArgumentException: Cannot convert com.namemedia.sitesense.services.dashboard.model.ProblemCalendarDataModel@79134c of type class com.namemedia.sitesense.services.dashboard.model.ProblemCalendarDataModel to interface org.richfaces.model.CalendarDataModel at org.jboss.el.lang.ELSupport.coerceToType(ELSupport.java:358) at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:188) at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) at org.richfaces.component.html.HtmlCalendar.getDataModel(HtmlCalendar.java:812) at org.richfaces.component.UICalendar.getPreload(UICalendar.java:608)
Is this because Seam is wrapping my object in something that is no longer an implementation CalendarDataModel? Does anyone know what I am doing wrong?