/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/postem/trunk/postem-hbm/src/java/org/sakaiproject/component/app/postem/data/StudentGradesImpl.java $ * $Id: StudentGradesImpl.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.component.app.postem.data; import java.io.Serializable; import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringEscapeUtils; import org.sakaiproject.api.app.postem.data.Gradebook; import org.sakaiproject.api.app.postem.data.StudentGrades; import org.sakaiproject.api.app.postem.data.Template; public class StudentGradesImpl implements StudentGrades, Comparable, Serializable { protected Gradebook gradebook; protected String username; protected List grades = new ArrayList(); protected DateFormat dateFormat = new SimpleDateFormat("d MMM yyyy HH:mm"); protected Timestamp lastChecked; protected Long id; protected Integer lockId; public StudentGradesImpl() { } public StudentGradesImpl(String username, List grades) { // ensure the usernames are trimmed and lowercase this.username = username.trim().toLowerCase(); this.grades = grades; } public Integer getLockId() { return lockId; } public void setLockId(Integer lockId) { this.lockId = lockId; } public Gradebook getGradebook() { return gradebook; } public void setGradebook(Gradebook gradebook) { this.gradebook = gradebook; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username.trim(); } public List getGrades() { return grades; } public void setGrades(List grades) { this.grades = grades; } public String getCheckDateTime() { if (lastChecked == null) { return "never"; } return dateFormat.format((Date) lastChecked); } public Timestamp getLastChecked() { return lastChecked; } public void setLastChecked(Timestamp lastChecked) { this.lastChecked = lastChecked; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public int compareTo(Object other) { if (this == other) return 0; final StudentGrades that = (StudentGrades) other; return this.getUsername().compareTo(that.getUsername()); } public boolean equals(Object other) { if (this == other) return true; if (!(other instanceof StudentGrades)) return false; final StudentGrades that = (StudentGrades) other; return this.getUsername().equals(that.getUsername()); } public int hashCode() { return getUsername().hashCode(); } public boolean getReadAfterUpdate() { if (lastChecked == null) { return false; } return getLastChecked().after(gradebook.getLastUpdated()); } /** * Formats the grades for display, independently of the JSF display. If a * {@link Template} exists for the parent gradebook, that template's * fillGrades method is used. Otherwise, the grades are formatted into a plain * old table. * <p> * This is a bad method for including display code within it; however, I do * this for a simple reason: we're already including display code at this * level via the template. * <p> * The prettier eventual solution will be to inject a default template via the * controller, or possibly in the manager class (using a defaultTemplate * property). This works for the quick and dirty now. */ public String formatGrades() { if (gradebook.getTemplate() == null) { List h2 = new ArrayList(gradebook.getHeadings()); StringBuilder gradeBuffer = new StringBuilder(); gradeBuffer.append("<table class=\"itemSummary\">"); if (h2.size() != 0) { gradeBuffer.append("<tr><th scope=\"row\">" + StringEscapeUtils.escapeHtml(h2.get(0).toString()) + "</th><td>"); h2.remove(0); gradeBuffer.append(StringEscapeUtils.escapeHtml(getUsername())); gradeBuffer.append("</td></tr>"); Iterator ii = h2.iterator(); Iterator jj = grades.iterator(); while (ii.hasNext()) { gradeBuffer.append("<tr><th scope=\"row\">"); gradeBuffer.append(StringEscapeUtils.escapeHtml((String) ii.next())); gradeBuffer.append("</th><td>"); gradeBuffer.append(StringEscapeUtils.escapeHtml((String) jj.next())); gradeBuffer.append("</td></tr>"); } } else { gradeBuffer.append("<tr><td>"); gradeBuffer.append(StringEscapeUtils.escapeHtml(getUsername())); gradeBuffer.append("</td></tr>"); Iterator jj = grades.iterator(); while (jj.hasNext()) { gradeBuffer.append("<tr><td>"); gradeBuffer.append(StringEscapeUtils.escapeHtml((String) jj.next())); gradeBuffer.append("</td></tr>"); } } gradeBuffer.append("</table>"); return gradeBuffer.toString(); } else { return gradebook.getTemplate().fillGrades(this); } } public String getGradesRow() { StringBuilder gradeBuffer = new StringBuilder(); // gradeBuffer.append("<table><tr>"); int totalWidth = 0; Iterator jj = grades.iterator(); int ii = 0; while (jj.hasNext()) { String current = (String) jj.next(); String width = gradebook.getProperWidth(ii); int iwidth = Integer.parseInt(width.substring(0, width.length() - 2)); totalWidth += iwidth; /*gradeBuffer.append("<td width='"); gradeBuffer.append(width); gradeBuffer.append("' style='min-width: "); gradeBuffer.append(width); gradeBuffer.append("; width: "); gradeBuffer.append(width); gradeBuffer.append(";' >");*/ gradeBuffer.append("<td style=\"padding:0.6em;\">"); gradeBuffer.append(StringEscapeUtils.escapeHtml(current)); gradeBuffer.append("</td>"); ii++; } /*StringBuilder newBuffer = new StringBuilder(); newBuffer.append("<table width='"); newBuffer.append(totalWidth); newBuffer.append("px' style='min-width: "); newBuffer.append(totalWidth); newBuffer.append("px; width: "); newBuffer.append(totalWidth); newBuffer.append("px;' ><tr>"); newBuffer.append(gradeBuffer); newBuffer.append("</tr></table>"); newBuffer.append("</tr>");*/ return gradeBuffer.toString(); } }