Hi Stephen, I've created a separate branch in my personal fork of the kitchensink app [1] and pasted some of your code there in order to reproduce the issue. Could you please follow a similar pattern next time to allow faster debugging?
I have not debugged further but it might be an issue with storing Date types in the viewmodel memento, could you raise a ticket in Jira? Cheers, Jeroen [1] https://github.com/jcvanderwal/isis-app-kitchensink/tree/bug-stephen On 12 October 2016 at 11:49, Stephen Cameron <steve.cameron...@gmail.com> wrote: > Hi, > > I've done a bit more investigation on this but no solution, maybe someone > can tell me what is happening? > > I've defined a View Model, objects properties will normally get seeded from > a database view but the behaviour is the same if I initialise the property > values directly. > > I have the action below to demonstrate the effect: > > public List<ActivityAttendanceSummary> listAttendanceData() { > ArrayList<ActivityAttendanceSummary> list = new ArrayList<>(); > Calendar calendar1 = new GregorianCalendar(2015,0,29); > ActivityAttendanceSummary temp1 = new ActivityAttendanceSummary(); > temp1.setActivityId(1000L); > temp1.setActivityName("Activity 1"); > temp1.setAttendedCount(10); > temp1.setCancelled(false); > temp1.setRegionName("SOUTH"); > temp1.setMaxEndDateTime(calendar1.getTime()); > temp1.setMinEndDateTime(calendar1.getTime()); > temp1.setMaxStartDateTime(calendar1.getTime()); > temp1.setMinStartDateTime(calendar1.getTime()); > list.add(temp1); > > Calendar calendar2 = new GregorianCalendar(2015,0,30); > ActivityAttendanceSummary temp2 = new ActivityAttendanceSummary(); > temp2.setActivityId(1001L); > temp2.setActivityName("Activity 2"); > temp2.setAttendedCount(20); > temp2.setCancelled(true); > temp2.setRegionName("NORTH"); > temp2.setMaxEndDateTime(calendar2.getTime()); > temp2.setMinEndDateTime(calendar2.getTime()); > temp2.setMaxStartDateTime(calendar2.getTime()); > temp2.setMinStartDateTime(calendar2.getTime()); > //list.add(temp2); > return list; > } > > The effect seen is that if there is only one object in the list then all > the dates are displayed fine, whereas if there is two (I do add temp2) no > dates for either temp1 or temp2 get displayed in the table but the other > values I set do get displayed. > > The class ActivityAttendanceSummary is very simple: > > package au.com.scds.chats.dom.report.view; > > import java.util.Date; > > import javax.jdo.annotations.Extension; > import javax.jdo.annotations.IdentityType; > import javax.jdo.annotations.Inheritance; > import javax.jdo.annotations.InheritanceStrategy; > import javax.jdo.annotations.PersistenceCapable; > import javax.jdo.annotations.Queries; > import javax.jdo.annotations.Query; > > import org.apache.isis.applib.annotation.DomainObject; > import org.apache.isis.applib.annotation.Editing; > import org.apache.isis.applib.annotation.ViewModel; > import org.joda.time.DateTime; > > @ViewModel > @DomainObject(editing = Editing.DISABLED) > @PersistenceCapable(identityType = IdentityType.NONDURABLE, table = > "ActivityAttendanceSummary", extensions = { > @Extension(vendorName = "datanucleus", key = "view-definition", > value = "CREATE VIEW ActivityAttendanceSummary " > + "( " + " {this.activityId}, " + " {this.activityName}, > " + " {this.regionName}, " > + " {this.startDateTime}, " + " {this.cancelled}, " + " > {this.attendedCount}, " > + " {this.notAttendedCount}, " + " > {this.hasStartAndEndDateTimesCount}, " > + " {this.minStartDateTime}, " + " > {this.maxStartDateTime}, " + " {this.minEndDateTime}, " > + " {this.maxEndDateTime} " + ") AS " + "SELECT " + " > activity.activity_id as activityId, " > + " activity.name AS activityName, " + " > activity.region_name AS regionName, " > + " activity.startdatetime AS startDateTime, " + " > activity.cancelled, " > + " sum(case when attend.attended = TRUE then 1 else 0 > end) as attendedCount, " > + " sum(case when attend.attended = FALSE then 1 else 0 > end) as notAttendedCount, " > + " sum(case when attend.attended = TRUE AND not > isnull(attend.startdatetime) AND not isnull(attend.enddatetime) then 1 else > 0 end) as hasStartAndEndDateTimesCount, " > + " min(attend.startdatetime) as minStartDateTime, " > + " max(attend.startdatetime) as maxStartDateTime, " + " > min(attend.enddatetime) as minEndDateTime, " > + " max(attend.enddatetime) as maxEndDateTime " + "FROM " > + " activity " + "LEFT OUTER JOIN" > + " attend " + "ON " + " attend.activity_activity_id = > activity.activity_id " + "GROUP BY" > + " activity.activity_id") }) > @Queries({ > @Query(name = "allActivityAttendanceSummary", language = "JDOQL", > value = "SELECT FROM > au.com.scds.chats.dom.report.view.ActivityAttendanceSummary"), > @Query(name = "allActivityAttendanceSummaryForPeriodAndRegion", > language = "JDOQL", value = "SELECT FROM > au.com.scds.chats.dom.report.view.ActivityAttendanceSummary pa " > + "WHERE pa.startDateTime >= :startDateTime && > pa.startDateTime <= :endDateTime && pa.regionName == :region"), }) > @Inheritance(strategy = InheritanceStrategy.NEW_TABLE) > public class ActivityAttendanceSummary implements > Comparable<ActivityAttendanceSummary> { > > private Long activityId; > private String activityName; > private String regionName; > private Date startDateTime; > private Boolean cancelled; > private Integer attendedCount; > private Integer notAttendedCount; > private Integer hasStartAndEndDateTimesCount; > private Date minStartDateTime; > private Date maxStartDateTime; > private Date minEndDateTime; > private Date maxEndDateTime; > > public Long getActivityId() { > return activityId; > } > > public void setActivityId(Long activityId) { > this.activityId = activityId; > } > > public String getActivityName() { > return activityName; > } > > public void setActivityName(String activityName) { > this.activityName = activityName; > } > > public String getRegionName() { > return regionName; > } > > public void setRegionName(String regionName) { > this.regionName = regionName; > } > > public Date getStartDateTime() { > return startDateTime; > } > > public void setStartDateTime(Date startDateTime) { > this.startDateTime = startDateTime; > } > > public Boolean getCancelled() { > return cancelled; > } > > public void setCancelled(Boolean cancelled) { > this.cancelled = cancelled; > } > > public Integer getAttendedCount() { > return attendedCount; > } > > public void setAttendedCount(Integer attendedCount) { > this.attendedCount = attendedCount; > } > > public Integer getNotAttendedCount() { > return notAttendedCount; > } > > public void setNotAttendedCount(Integer notAttendedCount) { > this.notAttendedCount = notAttendedCount; > } > > public Integer getHasStartAndEndDateTimesCount() { > return hasStartAndEndDateTimesCount; > } > > public void setHasStartAndEndDateTimesCount(Integer > hasStartAndEndDateTimesCount) { > this.hasStartAndEndDateTimesCount = hasStartAndEndDateTimesCount; > } > > public Date getMinStartDateTime() { > return minStartDateTime; > } > > public void setMinStartDateTime(Date minStartDateTime) { > this.minStartDateTime = minStartDateTime; > } > > public Date getMaxStartDateTime() { > return maxStartDateTime; > } > > public void setMaxStartDateTime(Date maxStartDateTime) { > this.maxStartDateTime = maxStartDateTime; > } > > public Date getMinEndDateTime() { > return minEndDateTime; > } > > public void setMinEndDateTime(Date minEndDateTime) { > this.minEndDateTime = minEndDateTime; > } > > public Date getMaxEndDateTime() { > return maxEndDateTime; > } > > public void setMaxEndDateTime(Date maxEndDateTime) { > this.maxEndDateTime = maxEndDateTime; > } > > public String getMinStartDateTimeName() { > if (getMinStartDateTime() == null) > return null; > else > return getMinStartDateTime().toString(); > } > > public String getMaxStartDateTimeName() { > if (getMaxStartDateTime() == null) > return null; > else > return getMaxStartDateTime().toString(); > } > > public String getMinEndDateTimeName() { > if (getMinEndDateTime() == null) > return null; > else > return getMinEndDateTime().toString(); > } > > public String getMaxEndDateTimeName() { > if (getMaxEndDateTime() == null) > return null; > else > return getMaxEndDateTime().toString(); > } > > @Override > public int compareTo(ActivityAttendanceSummary o) { > // compare on name > if (getActivityName() != null && o.getActivityName() != null) { > if (!getActivityName().equals(o.getActivityName())) > return getActivityName().compareTo(o.getActivityName()); > } > // compare on start date > if (getStartDateTime() != null && o.getStartDateTime() != null) { > if (getStartDateTime().equals(o.getStartDateTime())) > return 0; > else if (getStartDateTime().before(o.getStartDateTime())) > return -1; > else > return 1; > } > // compare on activity Id > if (getActivityId() != null && o.getActivityId() != null) { > if (getActivityId().equals(o.getActivityId())) > return 0; > else if (getActivityId() < o.getActivityId()) > return -1; > else > return 1; > } else > return 0; > } > > } > > > > > On Tue, Oct 4, 2016 at 11:58 AM, Stephen Cameron < > steve.cameron...@gmail.com > > wrote: > > > Hi, > > > > I've noticed that Dates and Joda DateTimes are not being shown in Wicket > > Viewer from a View Model class based on a database view. > > > > I am using 1.13.0 and a MySQL database. > > > > Its not critical at the moment, I'll look into it further soon. > > > > Steve > > >