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/controllers/HardcopyQuiz.java,v 1.5 2004/07/01 05:50:19 tj_willis Exp $Revision: 1.5 $
019 */
020 package net.sourceforge.pavlov.controllers;
021
022 import net.sourceforge.sillyview.*;
023 import java.awt.event.ActionListener;
024 import java.awt.event.ActionEvent;
025 import javax.swing.text.html.FormSubmitEvent;
026 import javax.swing.event.HyperlinkEvent;
027 import javax.swing.event.HyperlinkListener;
028 import java.net.URL;
029 import java.io.FileWriter;
030 import java.io.File;
031 import java.io.IOException;
032 import java.util.*;
033 import net.sourceforge.pavlov.user.*;
034 import net.sourceforge.pavlov.library.*;
035 import net.sourceforge.pavlov.main.*;
036
037 public class HardcopyQuiz
038 implements ActionListener,HyperlinkListener
039 {
040 //FIXED: these weren't final -- thanks FindBugs
041 public static final String NUMBER_OF_QUESTIONS = "number_questions";
042 public static final String FILENAME = "filename";
043 public static final String TEMPLATE_FILE = "template_file";
044 public static final String BAD_NUMBER_OF_QUESTIONS = "bad_number_questions";
045 public static final String BAD_TEMPLATE_FILE = "bad_template_file";
046 public static final String BAD_QUIZ = "bad_quiz";
047 public static final String BAD_FILENAME = "bad_file_name";
048 public static final String BASE_URL = "BASE_URL";
049 public static final String FILE_SAVED = "file_saved";
050 public static final String QUESTIONS = "QUESTIONS";
051 public static final String BOOK = "BOOK";
052 public static final String CHAPTER = "CHAPTER";
053
054 private VelocityModel mod;
055 private JFrameView view;
056 private AbstractPavlovApplication pavlov;
057 private String baseURL;
058
059 public HardcopyQuiz(final AbstractPavlovApplication pavlov)
060 throws IOException, Exception
061 {
062 this.pavlov = pavlov;
063 baseURL = null;
064 File tmpg = new File("resources/views/HardCopy.vm");
065 URL u = tmpg.toURL();
066 mod = new VelocityModel(u);
067
068 view = new JFrameView(mod, JPanelView.HTMLPANE);
069 HashMap<Object,Object> toks = new HashMap<Object,Object>();
070 toks.put(JPanelView.TITLE,(Object)"HardCopy Quiz Creator");//^
071 view.setToken(JPanelView.HYPERLINK_LISTENER,this);
072 toks.put(BASE_URL,null);
073 toks.put(FILENAME,null);
074
075
076 //view.setVisible(true);
077
078 String directory = "resources/hctemplates";
079 File dir = new File(directory);
080 if( dir==null || !dir.exists()) return;
081 File files[] = dir.listFiles();
082 ArrayList<File> dirs = new ArrayList<File>();
083
084
085 for(File g : files) {
086 if(g.isDirectory()){
087 String s = g.getName() + "/index.vm";
088 File f = new File(dir,s);
089 if(f!=null && f.exists()){
090 dirs.add(g);
091 } else {
092 //FIXME: don't ignore
093 //cat.info("not loading file" + f);
094 }
095 }
096 }
097 toks.put("dirs",dirs);
098 view.addTokens(toks);
099 view.pack();
100 view.reshape(0,0,400,400);
101 }
102
103
104 private int getNumberOfQuestions( String input){
105 if(input==null){
106 return -1;
107 }
108 int nQs = 0;
109 try {
110 nQs = Integer.parseInt(input);
111 } catch (NumberFormatException e) {
112 nQs = -1;
113 }
114 return nQs;
115 }
116
117 public void hyperlinkUpdate(HyperlinkEvent e) {
118 if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
119 if(e instanceof FormSubmitEvent){
120 //System.out.println("In fse");
121 FormSubmitEvent f = (FormSubmitEvent)e;
122 Hashtable<String,String> la = URLParser.parseVariables(f.getData());
123 String numberOfQuestions = la.get(NUMBER_OF_QUESTIONS);
124 String filename = la.get(FILENAME);
125 String templateFile = la.get(TEMPLATE_FILE);
126 baseURL = la.get(BASE_URL);
127
128 int nQs = getNumberOfQuestions(numberOfQuestions);
129
130 HashMap<Object,Object> toks = getDefaultTokens();
131 /* toks.put(BAD_NUMBER_OF_QUESTIONS,null);
132 toks.put(BAD_FILENAME,null);
133 toks.put(BAD_TEMPLATE_FILE,null);
134 toks.put(BAD_QUIZ,null);
135 toks.put(FILE_SAVED,null); */
136
137 if(nQs<1){
138 toks.put(BAD_NUMBER_OF_QUESTIONS,"true");
139 view.addTokens(toks);
140 view.pack();
141 return;
142 }
143
144 File output = getFile(filename);
145 if(output==null){
146 toks.put(BAD_FILENAME,"true");
147 view.addTokens(toks);
148 view.pack();
149 return;
150 }
151
152 VelocityModel template = getTemplate(templateFile);
153 if(template==null){
154 toks.put(BAD_TEMPLATE_FILE,true);
155 view.addTokens(toks);
156 view.pack();
157 return;
158 }
159
160 toks.put(FILENAME,filename);
161 toks.put(BASE_URL,baseURL);
162 view.addTokens(toks);
163 //System.out.println(BAD_FILENAME+" is "+view.getValue(BAD_FILENAME));
164 generateHardcopy(nQs,output,template);
165 view.pack();
166 //System.out.println("Leaving fse");
167 }
168 }
169 }
170
171 private HashMap<Object,Object> getDefaultTokens()
172 {
173 HashMap<Object,Object> map = new HashMap<Object,Object>();
174 map.put(BAD_NUMBER_OF_QUESTIONS,false);
175 map.put(BAD_FILENAME,false);
176 map.put(BAD_TEMPLATE_FILE,false);
177 map.put(BAD_QUIZ,false);
178 map.put(FILE_SAVED,false);
179 return map;
180 }
181
182 private void generateHardcopy(int nQs, File output, VelocityModel mod){
183 Quiz q = pavlov.getQuiz();
184 StringBufferView buf = new StringBufferView(mod);
185 if(q==null){
186 view.setToken(BAD_QUIZ,"true");
187 view.pack();
188 return;
189 }
190 ChapterData cd = q.getChapterData();
191 if(cd==null){
192 view.setToken(BAD_QUIZ,"true");
193 view.pack();
194 return;
195 }
196 ChapterReference cr = q.getChapterReference();
197 if(cr==null){
198 view.setToken(BAD_QUIZ,"true");
199 view.pack();
200 return;
201 }
202 Chapter chap = cr.getChapter();
203 if(chap==null){
204 view.setToken(BAD_QUIZ,"true");
205 view.pack();
206 return;
207 }
208
209 User user = q.getUser();
210 if(user==null){
211 view.setToken(BAD_QUIZ,"true");
212 view.pack();
213 return;
214 }
215
216 int oldExclusionSize = cd.getExclusionSize();
217 cd.setExclusionSize(nQs);
218 Vector<Question> questions = new Vector<Question>();
219 for(int i=0;i<nQs;i++){
220 questions.add(user.getValidQuestion(cd,chap));
221 }
222 cd.setExclusionSize(oldExclusionSize);
223 buf.setToken(QUESTIONS,questions);
224 buf.setToken(BASE_URL,baseURL);
225 buf.setToken(CHAPTER,chap);
226 AbstractBook bk = cr.getBook();
227 buf.setToken(BOOK,bk);
228 HashMap<Object,Object> toks = getDefaultTokens();
229 try {
230 FileWriter fw = new FileWriter(output);
231 String vu = buf.toString();
232 fw.write(vu,0,vu.length());
233 fw.flush();
234 fw.close();// i don't trust the api
235 toks.put(FILE_SAVED,"true");
236 } catch (IOException e) {
237 toks.put(BAD_FILENAME,"true");
238 }
239 view.addTokens(toks);
240 view.pack();
241 //System.out.println("BUF="+buf.toString());
242 }
243
244 private File getFile(String filename){
245 if(filename==null) return null;
246 File f = null;
247 try {
248 f = new File(filename);
249 if(f==null){
250 return null;
251 }
252 if(!f.exists()){
253 f.createNewFile();
254 }
255 if(!f.canWrite()){
256 return null;
257 }
258 return f;
259 } catch (Exception e) {
260 return null;
261 }
262 //return null;
263 }
264
265 private VelocityModel getTemplate(String filename){
266 if(filename==null) return null;
267 File f = null;
268 try {
269 f = new File(filename,"index.vm");
270 if(f==null){
271 return null;
272 }
273 if(!f.exists()){
274 return null;
275 }
276 if(!f.canRead()){
277 return null;
278 }
279 //System.out.println("file = " + f);
280 URL templateURL = f.toURL();
281 //System.out.println("url = " + templateURL);
282 VelocityModel vm = new VelocityModel(templateURL);
283 //System.out.println("raw mod = " + vm.getRawModel());
284 return vm;
285 } catch (Exception e) {
286 return null;
287 }
288 //return null;
289 }
290
291 public void actionPerformed(ActionEvent e){
292 if(view==null) return;
293 if(view.isVisible()){
294 view.setVisible(false);
295 } else {
296 view.setVisible(true);
297 }
298 }
299 }