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/UserXMLHandler.java,v 1.5 2004/05/19 03:12:14 tj_willis Exp $ 019 */ 020 package net.sourceforge.pavlov.user; 021 022 import org.xml.sax.*; 023 import org.xml.sax.helpers.*; 024 import org.apache.log4j.*; 025 026 027 028 /** 029 * Loads a User from an XML file. 030 * @author <a href="mailto:tj_willis@users.sourceforge.net"> T.J. Willis </a> 031 * @version 1.0 032 */ 033 public final class UserXMLHandler extends DefaultHandler { 034 035 private User ud; 036 private BookData bd; 037 private ChapterData cd; 038 private QuizData qz; 039 private String qid; 040 private static Category cat 041 = Category.getInstance(UserXMLHandler.class.getName()); 042 043 // Override methods of the DefaultHandler class 044 // to gain notification of SAX Events. 045 // 046 // See org.xml.sax.ContentHandler for all available events. 047 // 048 /** 049 * Describe <code>startDocument</code> method here. 050 * 051 * @exception SAXException if an error occurs 052 */ 053 public void startDocument() throws SAXException { 054 ud = new User(); 055 cat.setLevel(Level.WARN); 056 } 057 058 /** 059 * Describe <code>endDocument</code> method here. 060 * 061 * @exception SAXException if an error occurs 062 */ 063 public void endDocument() throws SAXException { 064 } 065 066 /** 067 * Describe <code>startElement</code> method here. 068 * 069 * @param namespaceURI a <code>String</code> value 070 * @param localName a <code>String</code> value 071 * @param qName a <code>String</code> value 072 * @param attr an <code>Attributes</code> value 073 * @exception SAXException if an error occurs 074 */ 075 public void startElement(String namespaceURI, 076 String localName, 077 String qName, 078 Attributes attr) throws SAXException { 079 080 if (localName.equals("USER")) { 081 String key, value; 082 083 for (int i = 0; i < attr.getLength(); i++) { 084 key = attr.getLocalName(i); 085 value = attr.getValue(i); 086 if (key.equals("SN")) ud.setName(value); 087 else if (key.equals("PASSWORD")) ud.setPassword(value); 088 } 089 } else if (localName.equals("BOOK")) { 090 bd = new BookData(); 091 String key, value; 092 093 for (int i = 0; i < attr.getLength(); i++) { 094 key = attr.getLocalName(i); 095 value = attr.getValue(i); 096 if (key.equals("TITLE")) bd.setTitle(value); 097 //else if (key.equals("LAST")) bd.setLast(value); 098 } 099 100 } 101 else if (localName.equals("QUIZ")) { 102 qz = new QuizData(); 103 String key, value; 104 105 for (int i = 0; i < attr.getLength(); i++) { 106 key = attr.getLocalName(i); 107 value = attr.getValue(i); 108 if (key.equals("DATE")) qz.setStart(Long.parseLong(value)); 109 if (key.equals("RIGHT")) qz.setRight(Integer.parseInt(value)); 110 if (key.equals("WRONG")) qz.setWrong(Integer.parseInt(value)); 111 if (key.equals("TOTAL")) qz.setTotal(Integer.parseInt(value)); 112 //else if (key.equals("LAST")) bd.setLast(value); 113 } 114 115 } else if (localName.equals("CHAPTER")) { 116 cd = new ChapterData(); 117 String key, value; 118 119 for (int i = 0; i < attr.getLength(); i++) { 120 key = attr.getLocalName(i); 121 value = attr.getValue(i); 122 if (key.equals("TITLE")) cd.setTitle(value); 123 //else if (key.equals("LAST")) cd.setLast(value); 124 } 125 126 } else if (localName.equals("QUESTION")) { 127 //qd = new QuestionData(); 128 String key, value; 129 130 for (int i = 0; i < attr.getLength(); i++) { 131 key = attr.getLocalName(i); 132 value = attr.getValue(i); 133 if (key.equals("SN")) qid = value; 134 //else if (key.equals("DATE")) qd.setLast(value); 135 } 136 137 } else if (localName.equals("RIGHT")) { 138 String key, value; 139 140 for (int i = 0; i < attr.getLength(); i++) { 141 key = attr.getLocalName(i); 142 value = attr.getValue(i); 143 if (key.equals("DATE")) { 144 long foo = -1; 145 146 try { 147 foo = Long.parseLong(value); 148 } catch (Exception e) { 149 foo = -1; 150 } 151 assert cd != null: "Chapter is null"; 152 assert qid != null: "QuestionID is null"; 153 cd.addRight(qid, foo); 154 } 155 } 156 157 } else if (localName.equals("WRONG")) { 158 String key, value; 159 160 for (int i = 0; i < attr.getLength(); i++) { 161 key = attr.getLocalName(i); 162 value = attr.getValue(i); 163 if (key.equals("DATE")) { 164 long foo = -1; 165 try { 166 foo = Long.parseLong(value); 167 } catch (Exception e) { 168 foo = -1; 169 } 170 assert cd != null: "Chapter is null"; 171 assert qid != null: "QuestionID is null"; 172 cd.addWrong(qid, foo); 173 } 174 } 175 } else if (localName.equals("BOOKS")) { 176 // DO NOTHING 177 } else if (localName.equals("BOOKMARKS")) { 178 // DO NOTHING 179 180 } 181 else { 182 183 cat.warn("Unrecognized XML element: [ " + localName + " ]"); 184 185 // Also, let's print the attributes if 186 // there are any... 187 for (int i = 0; i < attr.getLength(); i++) { 188 cat.warn(" Unrecognized XML attribute: " + 189 attr.getLocalName(i) + 190 " VALUE: " + 191 attr.getValue(i)); 192 } 193 194 } 195 } 196 197 /** 198 * Describe <code>endElement</code> method here. 199 * 200 * @param namespaceURI a <code>String</code> value 201 * @param localName a <code>String</code> value 202 * @param qName a <code>String</code> value 203 * @exception SAXException if an error occurs 204 */ 205 public void endElement(String namespaceURI, 206 String localName, 207 String qName) throws SAXException { 208 209 if (localName.equals("USER")) { 210 // do nothing 211 } else if (localName.equals("BOOK")) { 212 assert ud != null: "User is null"; 213 ud.addBook(bd); 214 } else if (localName.equals("QUIZ")) { 215 assert cd != null: "Chapter is null"; 216 cd.addQuizData(qz); 217 } else if (localName.equals("CHAPTER")) { 218 assert bd != null: "BookData is null"; 219 assert cd != null: "ChapterData is null"; 220 bd.addChapter(cd); 221 } else if (localName.equals("QUESTION")) {// NOT NECESSARY 222 //cd.addQuestion(qd); 223 } else if (localName.equals("RIGHT")) {// RIGHT & WRONG ARE ALREADY CLOSED UP 224 } else if (localName.equals("WRONG")) {// RIGHT & WRONG ARE ALREADY CLOSED UP 225 } else if (localName.equals("BOOKS")) { 226 // DO NOTHING 227 } 228 else if (localName.equals("BOOKMARKS")) { 229 // DO NOTHING 230 } 231 else { 232 cat.warn("Unrecognized XML end element[ " + localName + " ]"); 233 } 234 } 235 236 /** 237 * Describe <code>characters</code> method here. 238 * 239 * @param ch a <code>char[]</code> value 240 * @param start an <code>int</code> value 241 * @param length an <code>int</code> value 242 * @exception SAXException if an error occurs 243 */ 244 public void characters(char[] ch, int start, int length) 245 throws SAXException { 246 } 247 248 249 /** 250 * Return the loaded user 251 * @return an <code>User</code> value 252 */ 253 public User getUser() { 254 return ud; 255 } 256 } 257