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/QuestionData.java,v 1.6 2004/07/01 09:03:44 tj_willis Exp $
019 */
020 package net.sourceforge.pavlov.user;
021 import java.util.*;
022 import org.apache.log4j.*;
023
024
025 /**
026 * Encapsulates correct and incorrect responses to a given question.
027 * @author <a href="mailto:tj_willis@users.sourceforge.net"> T.J. Willis </a>
028 * @version 1.0
029 */
030 public final class QuestionData {
031 /** This question's unique identifier */
032 private String id;
033 /** Vector of Dates of correct responses. */
034 private Vector<Date> rights;
035 /** Vector of Dates of incorrect responses. */
036 private Vector<Date> wrongs;
037 /**Total number of responses. */
038 private int total = 0;
039 /**Total number of correct responses. */
040 private int right = 0;
041 /**Total number of incorrect responses. */
042 private int wrong = 0;
043 /** Last time this question was asked */
044 private Date last;
045 private static int globalQDs =0;
046 private static final boolean DEBUG = false;
047
048 /** Creates a QuestionData with id "NOID" */
049 public QuestionData() {
050 this("NOID");
051 }
052
053 /**
054 * Creates a QuestionData with the given id
055 * @param id a <code>String</code> value
056 */
057 public QuestionData(final String id) {
058 if(DEBUG){
059 globalQDs++;
060 System.out.println("+Global # of question data: " + globalQDs);
061 }
062 this.id = id;
063 init();
064 }
065
066 private void init(){
067 rights = new Vector<Date>();
068 wrongs = new Vector<Date>();
069 last = new Date(0);
070 }
071
072 /**
073 * Return's this question's unique identifier
074 * @return a <code>String</code> value
075 */
076 public String getID() {
077 return id;
078 }
079 /**
080 * Sets this question's unique identifier
081 * @param _id a <code>String</code> value
082 */
083 public void setID(final String id) {
084 this.id = id;
085 }
086
087 /**
088 * Adds a correct response for this question
089 * @param when a <code>Date</code> value
090 */
091 public void addRight(final Date when) {
092 rights.add(when);
093 right++;
094 total++;
095 if (last.before(when)){
096 last = when;
097 }
098 }
099
100 /**
101 * Adds an incorrect response for this question
102 * @param when a <code>Date</code> value
103 */
104 public void addWrong(final Date when) {
105 wrongs.add(when);
106 wrong++;
107 total++;
108 if (last.before(when)){
109 last = when;
110 }
111 }
112
113 /**
114 * When last asked.
115 * @return a <code>Date</code> value
116 */
117 public Date getLastAsked() {
118 return last;
119 }
120
121 /** double from 0 to 100.0 of correct response percentage
122 * @deprecated use getPercentage() instead.
123 */
124 @Deprecated public double percentage() {
125 return getPercentage();
126 }
127
128
129 /**
130 * Number of times asked.
131 * @return an <code>int</code> value
132 */
133 public int getNumAsked() {
134 return total;
135 }
136
137
138 /**
139 * True if this question has been asked.
140 * @return a <code>boolean</code> value
141 */
142 public boolean hasBeenAsked() {
143 if (total > 0) return true;
144 return false;
145 }
146
147 /**
148 * Percentage of correct answers, or -1 if no answers.
149 *
150 * @return a <code>double</code> value
151 */
152 public double getPercentage() {
153 if (total <= 0) return -1;
154 return ((1.0 * right) / (1.0 * total) * 100.0);
155 }
156
157 /**
158 * Number of correct responses.
159 * @return an <code>int</code> value
160 */
161 public int getRight() {
162 return right;
163 }
164
165 /**
166 * Number of incorrect responses.
167 * @return an <code>int</code> value
168 */
169 public int getWrong() {
170 return wrong;
171 }
172
173 /**
174 * Number of total responses.
175 * @return an <code>int</code> value
176 */
177 public int getTotal() {
178 return total;
179 }
180
181 /**
182 * Dumps this question in XML to the given writer.
183 * @param writer a <code>java.io.Writer</code> value
184 * @exception java.io.IOException if an error occurs
185 */
186 public void toXML(java.io.Writer writer)
187 throws java.io.IOException
188 {
189 boolean multiline = (rights.size() + wrongs.size() > 0);
190
191 if (!multiline){
192 return; // don't output questions with no data
193 } else {
194 writer.write("\t\t\t<QUESTION SN=\"" + getID() + "\">");
195 //if (multiline)
196 writer.write("\n");
197 for(Date da : rights) {
198 writer.write("\t\t\t\t<RIGHT DATE=\"" + da.getTime() + "\"></RIGHT>\n");
199 }
200 for(Date da : wrongs) {
201 writer.write("\t\t\t\t<WRONG DATE=\"" + da.getTime() + "\"></WRONG>\n");
202 }
203 //if (multiline)
204 writer.write("\t\t\t");
205 writer.write("</QUESTION>\n");
206 }
207 }
208
209 protected void finalize() throws Throwable
210 {
211 if(DEBUG){
212 globalQDs--;
213 System.out.println("-Global # of question data: " + globalQDs);
214 }
215 super.finalize();
216 }
217 }
218