001 package com.croftsoft.apps.quiz; 002 003 import java.io.*; 004 005 import com.croftsoft.core.io.FileLib; 006 import com.croftsoft.core.io.SerializableLib; 007 import com.croftsoft.core.lang.NullArgumentException; 008 009 /********************************************************************* 010 * Quizzes a student for test preparation. 011 * 012 * @version 013 * 2001-07-10 014 * @since 015 * 2001-06-10 016 * @author 017 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 018 *********************************************************************/ 019 020 public final class QuizLib 021 ////////////////////////////////////////////////////////////////////// 022 ////////////////////////////////////////////////////////////////////// 023 { 024 025 private static final String DEFAULT_QUIZ_FILENAME = "quiz.xml"; 026 027 private static final String DEFAULT_BACKUP_FILENAME = "quiz.bak"; 028 029 ////////////////////////////////////////////////////////////////////// 030 ////////////////////////////////////////////////////////////////////// 031 032 public static void main ( String [ ] args ) 033 throws IOException 034 ////////////////////////////////////////////////////////////////////// 035 { 036 String quizFilename = DEFAULT_QUIZ_FILENAME; 037 038 if ( ( args != null ) 039 && ( args.length > 0 ) ) 040 { 041 quizFilename = args [ 0 ]; 042 } 043 044 String backupFilename = DEFAULT_BACKUP_FILENAME; 045 046 if ( ( args != null ) 047 && ( args.length > 1 ) ) 048 { 049 backupFilename = args [ 1 ]; 050 } 051 052 Quiz quiz = loadQuiz ( quizFilename ); 053 054 if ( quiz == null ) 055 { 056 addToQuiz ( quiz = new Quiz ( ) ); 057 058 saveQuiz ( quizFilename, backupFilename, quiz ); 059 } 060 061 System.out.println ( "1. Take quiz" ); 062 063 System.out.println ( "2. Add to quiz" ); 064 065 System.out.println ( "" ); 066 067 System.out.print ( "Choice? [1]: " ); 068 069 String choice = promptSingleLine ( ); 070 071 if ( "2".equals ( choice ) ) 072 { 073 addToQuiz ( quiz ); 074 075 saveQuiz ( quizFilename, backupFilename, quiz ); 076 } 077 else 078 { 079 giveQuiz ( quiz ); 080 } 081 } 082 083 ////////////////////////////////////////////////////////////////////// 084 ////////////////////////////////////////////////////////////////////// 085 086 public static void addToQuiz ( Quiz quiz ) 087 throws IOException 088 ////////////////////////////////////////////////////////////////////// 089 { 090 QuizItem quizItem = null; 091 092 while ( ( quizItem = promptForQuizItem ( ) ) != null ) 093 { 094 quiz.add ( quizItem ); 095 } 096 } 097 098 public static void giveQuiz ( Quiz quiz ) 099 throws IOException 100 ////////////////////////////////////////////////////////////////////// 101 { 102 QuizItem [ ] quizItems = quiz.getQuizItems ( ); 103 104 for ( int i = 0; i < quizItems.length; i++ ) 105 { 106 QuizItem quizItem = quizItems [ i ]; 107 108 System.out.println ( "Question:" ); 109 110 System.out.println ( quizItem.getQuestion ( ) ); 111 112 System.out.println ( "Answer:" ); 113 114 promptMultiLine ( ); 115 116 System.out.println ( "" ); 117 118 String answer = quizItem.getAnswer ( ); 119 120 if ( answer != null ) 121 { 122 System.out.println ( "Answer:" ); 123 124 System.out.println ( answer ); 125 126 System.out.println ( "" ); 127 } 128 129 String reference = quizItem.getReference ( ); 130 131 if ( reference != null ) 132 { 133 System.out.println ( "Reference:" ); 134 135 System.out.println ( reference ); 136 137 System.out.println ( "" ); 138 } 139 } 140 } 141 142 public static Quiz loadQuiz ( String quizFilename ) 143 throws IOException 144 ////////////////////////////////////////////////////////////////////// 145 { 146 try 147 { 148 String quizString = FileLib.loadTextFile ( quizFilename ); 149 150 return Quiz.fromString ( quizString ); 151 } 152 catch ( FileNotFoundException ex ) 153 { 154 return null; 155 } 156 } 157 158 public static QuizItem promptForQuizItem ( ) 159 throws IOException 160 ////////////////////////////////////////////////////////////////////// 161 { 162 System.out.println ( 163 "Question (press F6 or Control-D on blank line to stop):" ); 164 165 String question = promptMultiLine ( ); 166 167 if ( question == null ) 168 { 169 return null; 170 } 171 172 System.out.println ( "Answer:" ); 173 174 String answer = promptMultiLine ( ); 175 176 System.out.println ( "Reference:" ); 177 178 String reference = promptMultiLine ( ); 179 180 return new QuizItem ( question, answer, reference ); 181 } 182 183 public static String promptMultiLine ( ) 184 throws IOException 185 ////////////////////////////////////////////////////////////////////// 186 { 187 BufferedReader bufferedReader = new BufferedReader ( 188 new InputStreamReader ( System.in ) ); 189 190 StringBuffer stringBuffer = new StringBuffer ( ); 191 192 String line; 193 194 while ( ( line = bufferedReader.readLine ( ) ) != null ) 195 { 196 stringBuffer.append ( line ); 197 198 stringBuffer.append ( '\n' ); 199 } 200 201 String entry = stringBuffer.toString ( ); 202 203 entry = entry.trim ( ); 204 205 if ( "".equals ( entry ) ) 206 { 207 entry = null; 208 } 209 210 return entry; 211 } 212 213 public static String promptSingleLine ( ) 214 throws IOException 215 ////////////////////////////////////////////////////////////////////// 216 { 217 String entry = new BufferedReader ( 218 new InputStreamReader ( System.in ) ).readLine ( ); 219 220 entry = entry.trim ( ); 221 222 if ( "".equals ( entry ) ) 223 { 224 entry = null; 225 } 226 227 return entry; 228 } 229 230 public static void saveQuiz ( 231 String quizFilename, 232 String backupFilename, 233 Quiz quiz ) 234 throws IOException 235 ////////////////////////////////////////////////////////////////////// 236 { 237 File file = new File ( quizFilename ); 238 239 if ( file.exists ( ) ) 240 { 241 file.renameTo ( new File ( backupFilename ) ); 242 } 243 244 FileLib.saveTextFile ( quizFilename, quiz.toString ( ) ); 245 } 246 247 ////////////////////////////////////////////////////////////////////// 248 ////////////////////////////////////////////////////////////////////// 249 250 private QuizLib ( ) { } 251 252 ////////////////////////////////////////////////////////////////////// 253 ////////////////////////////////////////////////////////////////////// 254 }