From: Eric P. <th...@us...> - 2009-12-03 14:56:02
|
Update of /cvsroot/sandev/sand/platform/tools/build/generate/org/sandev/generator In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv4560 Modified Files: XMLPersisterGenerator.java Log Message: Check for incomplete XML to trap corrupted files and recover from the .bak on init. Provide override points during initialization to allow extending classes to do additional work at startup. Index: XMLPersisterGenerator.java =================================================================== RCS file: /cvsroot/sandev/sand/platform/tools/build/generate/org/sandev/generator/XMLPersisterGenerator.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** XMLPersisterGenerator.java 20 Nov 2008 23:13:37 -0000 1.6 --- XMLPersisterGenerator.java 3 Dec 2009 14:55:51 -0000 1.7 *************** *** 162,166 **** { out.println(" /**"); ! out.println(" * The name of the file we are persisting to."); out.println(" */"); out.println(" protected String fileName=\"localdata.xml\";"); --- 162,169 ---- { out.println(" /**"); ! out.println(" * The name of the file we are persisting to. This data member is"); ! out.println(" * NEVER accessed directly in this file, so the name of the file"); ! out.println(" * can be changed either via setFileName, or through overriding"); ! out.println(" * the getFileName method."); out.println(" */"); out.println(" protected String fileName=\"localdata.xml\";"); *************** *** 196,199 **** --- 199,207 ---- out.println(""); out.println(" /**"); + out.println(" * Error text prefix for any exception that should trigger a restore"); + out.println(" * from backup."); + out.println(" */"); + out.println(" public final static String FILECORRUPTED=\"File Corrupted\";"); + out.println(" /**"); out.println(" * Initialize ourselves to be ready for work."); out.println(" */"); *************** *** 202,217 **** out.println(" {"); out.println(" dm=node;"); - out.println(" lastID=Persister.TEMPIDTHRESHOLD+1;"); out.println(" try {"); ! out.println(" openFile(false);"); ! out.println(" if(br!=null) {"); ! out.println(" String line=null;"); ! out.println(" while((line=br.readLine())!=null) {"); ! out.println(" lastID=Math.max(lastID,idExtract(line)); } }"); ! out.println(" closeFile();"); out.println(" } catch(Exception e) {"); ! out.println(" throw new PersisterException(\"init failed: \" + e,e);"); out.println(" }"); - out.println(" info(\"XMLPersister init successful lastID: \" + lastID);"); out.println(" }"); out.println(""); --- 210,222 ---- out.println(" {"); out.println(" dm=node;"); out.println(" try {"); ! out.println(" initProcessDataFile();"); out.println(" } catch(Exception e) {"); ! out.println(" info(\"initial file read failed, retrying...\");"); ! out.println(" if((e instanceof PersisterException)&&"); ! out.println(" (e.getMessage().startsWith(FILECORRUPTED))) {"); ! out.println(" copyBakToXML();"); ! out.println(" initProcessDataFile(); }"); out.println(" }"); out.println(" }"); out.println(""); *************** *** 249,252 **** --- 254,345 ---- out.println(""); out.println(" /**"); + out.println(" * Overwrite the current file contents with the contents of the"); + out.println(" * backup file."); + out.println(" */"); + out.println(" protected void copyBakToXML()"); + out.println(" throws PersisterException"); + out.println(" {"); + out.println(" info(\"copying \" + getBackupFileName() + \" to \" + getFileName());"); + out.println(" closeFile(); //clear any remaining handles"); + out.println(" try {"); + out.println(" File readfile=new File(getBackupFileName());"); + out.println(" if(!readfile.exists()) {"); + out.println(" throw new PersisterException(\"Backup file \" + "); + out.println(" getBackupFileName() + \"not found\"); }"); + out.println(" FileReader fr=new FileReader(readfile);"); + out.println(" BufferedReader br=new BufferedReader(fr);"); + out.println(" File writefile=new File(getFileName());"); + out.println(" FileWriter fw=new FileWriter(writefile); //rewrite"); + out.println(" PrintWriter pw=new PrintWriter(fw);"); + out.println(" String line=null;"); + out.println(" while((line=br.readLine())!=null) { //eats ending newline"); + out.println(" pw.println(line); }"); + out.println(" pw.close();"); + out.println(" br.close();"); + out.println(" } catch(Exception e) {"); + out.println(" throw new PersisterException(\"Backup copy failed: \" + e,e);"); + out.println(" }"); + out.println(" }"); + out.println(""); + out.println(""); + out.println(" /**"); + out.println(" * Read the data file to ensure integrity and init our ID counter."); + out.println(" * The retry parameter is an indicator of whether this is a second"); + out.println(" * call attempting to restore after the first call failed."); + out.println(" */"); + out.println(" protected void initProcessDataFile()"); + out.println(" throws PersisterException"); + out.println(" {"); + out.println(" info(\"initProcessDataFile calling initPreFileOpen..\");"); + out.println(" initPreFileOpen();"); + out.println(" try {"); + out.println(" openFile(false);"); + out.println(" info(\"initProcessDataFile starting read loop\");"); + out.println(" while(readNextItem()) {"); + out.println(" initProcessItem(); }"); + out.println(" closeFile();"); + out.println(" } catch(Exception e) {"); + out.println(" throw new PersisterException(FILECORRUPTED + \": \" + e,e);"); + out.println(" }"); + out.println(" initPostFileClose();"); + out.println(" }"); + out.println(""); + out.println(""); + out.println(" /**"); + out.println(" * Do whatever needs to happen for initialization before we open"); + out.println(" * the file and walk through all the items to calculate the"); + out.println(" * current max ID."); + out.println(" */"); + out.println(" protected void initPreFileOpen()"); + out.println(" throws PersisterException"); + out.println(" {"); + out.println(" lastID=Persister.TEMPIDTHRESHOLD+1;"); + out.println(" }"); + out.println(""); + out.println(""); + out.println(" /**"); + out.println(" * Do whatever needs to happen with the information from the"); + out.println(" * current item as we walk through all the items in the file."); + out.println(" */"); + out.println(" protected void initProcessItem()"); + out.println(" throws PersisterException"); + out.println(" {"); + out.println(" lastID=Math.max(lastID,getInstID());"); + out.println(" }"); + out.println(""); + out.println(""); + out.println(" /**"); + out.println(" * Do whatever needs to happen for initialization after we have"); + out.println(" * successfully finished walking through all the items in the"); + out.println(" * file."); + out.println(" */"); + out.println(" protected void initPostFileClose()"); + out.println(" throws PersisterException"); + out.println(" {"); + out.println(" info(\"XMLPersister init successful lastID: \" + lastID);"); + out.println(" }"); + out.println(""); + out.println(""); + out.println(" /**"); out.println(" * A synchronized method to process the given message and return"); out.println(" * the result message. Since we are dealing with a single file"); *************** *** 585,590 **** out.println(" }"); out.println(" if(instxml!=null) {"); ! out.println(" return true; }"); ! out.println(" return false;"); out.println(" }"); out.println(""); --- 678,686 ---- out.println(" }"); out.println(" if(instxml!=null) {"); ! out.println(" return true; } //full xml item read"); ! out.println(" if((instbuf.indexOf(\"<\")>=0)&&(!haveBufXMLClosure())) {"); ! out.println(" info(\"readNextItem incomplete item read: \" + instbuf);"); ! out.println(" throw new PersisterException(\"Incomplete item read\"); }"); ! out.println(" return false; //no xml left to read, not even partial."); out.println(" }"); out.println(""); |