001 /* PAVLOV -- Multiple Choice Study System 002 * Copyright (C) 2000 - 2004 T.J. Willis 003 * 004 * This program is free software; you can redistribute it and/or 005 * modify it under the terms of the GNU General Public License 006 * as published by the Free Software Foundation; either version 2 007 * of the License, or (at your option) any later version. 008 * 009 * This program is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 * GNU General Public License for more details. 013 * 014 * You should have received a copy of the GNU General Public License 015 * along with this program; if not, write to the Free Software 016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. 017 * 018 * $Header: /cvsroot/pavlov/net/sourceforge/pavlov/user/BookData.java,v 1.6 2004/07/01 09:03:44 tj_willis Exp $ 019 */ 020 package net.sourceforge.pavlov.user; 021 022 import net.sourceforge.pavlov.library.AbstractBook; 023 import net.sourceforge.pavlov.library.AbstractChapter; 024 import java.util.*; 025 import org.apache.log4j.*; 026 027 028 /** 029 * Encapsulates a users responses to all questions in a book. 030 * 031 * @author <a href="mailto:tj_willis@users.sourceforge.net"> T.J. Willis </a> 032 * @version $Revision: 1.6 $ 033 * @see net.sourceforge.pavlov.library.Book 034 * @see ChapterData 035 * @see QuestionData 036 */ 037 public final class BookData { 038 /** Title of the net.sourceforge.pavlov.library.Book this BookData corresponds to. */ 039 private String title; 040 /** Date of last response */ 041 private Date last; 042 /** Holds the ChapterData objects. */ 043 private Hashtable<String,ChapterData> chapters; 044 045 /** 046 * Creates a new BookData with the given title 047 * @param title a <code>String</code> value 048 */ 049 public BookData(final String title) { 050 this.title = title; 051 init(); 052 } 053 054 /** Creates a new BookData entitled "Untitled". */ 055 public BookData() { 056 this("Untitled"); 057 } 058 059 private void init(){ 060 chapters = new Hashtable<String,ChapterData>(); 061 } 062 063 /** 064 * Returns the Book's title. 065 * @return a <code>String</code> value 066 */ 067 public String getTitle() { 068 return title; 069 } 070 /** 071 * Sets the Book's title. 072 * @param title a <code>String</code> value 073 */ 074 public void setTitle(final String title) { 075 this.title = title; 076 } 077 078 /** 079 * Returns the named ChapterData, or null if it doesn't exist. 080 * @param chapterName a <code>String</code> value 081 * @return a <code>ChapterData</code> value 082 */ 083 public ChapterData getChapter(final String chapterName) { 084 assert (chapters!=null) : "chapters is null"; 085 return (ChapterData) chapters.get(chapterName); 086 } 087 088 /** 089 * Returns the named ChapterData, or null if it doesn't exist. 090 * @param chapterName a <code>String</code> value 091 * @param questionID a <code>String</code> value 092 * @return a <code>QuestionData</code> value 093 */ 094 public QuestionData getQuestionData(final String chapterName, final String questionID) { 095 ChapterData cp = getChapter(chapterName); 096 if(cp==null) return null; 097 return cp.getQuestionData(questionID); 098 } 099 100 // FIXME: write getQuestionData(final QuestionReference ref) 101 102 /** 103 * Adds the given ChapterData to this book, keyed on ChapterData.getTitle(). 104 * @param c a <code>ChapterData</code> value 105 */ 106 public void addChapter(final ChapterData chap) { 107 assert (chapters!=null) : "chapters is null"; 108 chapters.put(chap.getTitle(), chap); 109 } 110 111 /** 112 * Sets the time of the last response to a question in this book. 113 * @param t a <code>String</code> value 114 * @deprecated 115 */ 116 @Deprecated public void setLast(final String date) { 117 last = new Date(date); 118 } 119 120 /** 121 * Describe <code>validate</code> method here. 122 * 123 * @param book an <code>AbstractBook</code> value 124 */ 125 public void validate(AbstractBook book) { 126 // foreach chapter in book 127 // get ChapterData for chapter 128 // ChapterData.validate(chapter) 129 Collection<AbstractChapter> chaps = book.getChaptersReadOnly(); 130 131 if( chaps == null){ 132 return; // thanks junit 133 } 134 135 for(AbstractChapter left : chaps) { 136 if(left==null) continue; 137 String s = left.getTitle(); 138 if(s==null) continue; 139 ChapterData da = (ChapterData) chapters.get(s); 140 141 if (da == null) { 142 ChapterData x = new ChapterData(left.getTitle()); 143 144 chapters.put(x.getTitle(), x); 145 da = x; 146 } 147 da.validate(left); 148 } 149 chaps = null; 150 } 151 152 /** 153 * Dumps the BookData in XML format to the given writer. 154 * Loops throught chapters, questions. 155 * @param writer a <code>java.io.Writer</code> value 156 * @exception java.io.IOException if an error occurs 157 */ 158 public void toXML(java.io.Writer writer) 159 throws java.io.IOException { 160 final Collection<ChapterData> v = chapters.values(); 161 162 // FIXME: LAST=19/Feb/02 ?!? format this.last 163 writer.write("\t<BOOK TITLE=\"" + title + "\" LAST=\"19/Feb/02\">\n"); 164 for(ChapterData da : v){ 165 da.toXML(writer); 166 } 167 writer.write("\t</BOOK>\n"); 168 } 169 } 170 171 172 173 174 175 176 177 178 179