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         }