Класс для создания файлов снимков
Создание файлов снимков осуществляется классом PrepQxml, как показано в листинге 7.24 и следующих листингах. Конструктор берет объект XML Document и извлекает имена выходных файлов, которые являются значениями атрибута file в тегах Questionnaire и Terminal. Этот класс используется в сервлете, выполняющем анализ результатов (этот сервлет рассматривается далее в этой главе), но может использоваться также и в других процессах.
Листинг 7.24. Код класса PrepQxml (PrepQxml.java)
package com.XmlEcomBook.Chap07;
import com.XmlEcomBook.DOMlibrary ; import org.w3c.dom.* ; import com.sun.xml.tree.* ; import java.io.*; import java.util.* ;
public class PrepQxml { public int state = 1 ; Document doc ; public String primaryfile ; public String title ; public String author ; public String date ; String[] files ; Vector allfiles = new Vector() ; Hashtable prepHash = new Hashtable() ;
PrepQxml( Document d ){ doc = d ; Element E = doc.getDocumentElement(); primaryfile = E.getAttribute("file"); allfiles.addElement( primaryfile ); title = E.getAttribute("title"); author = E.getAttribute("author"); date = E.getAttribute("date"); NodeList terminals = E.getElementsByTagName("Terminal"); int ct = terminals.getLength(); // this locates any output files created by <Terminal> tags for( int i = 0 ; i < ct ; i++ ){ E = (Element)terminals.item(i); String tmp = E.getAttribute("file"); if( tmp.length() > 0 ) allfiles.addElement( tmp ); } }
public String[] getFiles(){ return files ; }
Для каждого выходного файла из опроса метод createFiles, показанный в листинге 7.25, вызывает метод makeXML, чтобы создать файл, у которого имеется открывающий и закрывающий теги <QResu1tSet>, необходимые для создания корневого элемента. Имя этого файла получается добавлением символов FMT к имени файла с результатами.
Листинг 7.25. Методы createFiles и makeXML (PrepQxml.java)
// for every file in allfiles, create a temporary with xml root // return array of file path/names public String[] createFiles() throws IOException { files = new String[ allfiles.size() ]; int n = 0 ; Enumeration e = allfiles.elements(); while( e.hasMoreElements() ){ String tmp = (String)e.nextElement(); files[n++] = tmp ; System.out.println("Create temporary for " + tmp ); prepHash.put( tmp, makeXML( tmp ) ); } return files ; } // fn is the name of the answers file, return the name of // the formatted file with root for creation of DOM public String getAnsXml( String fn ){ return (String) prepHash.get( fn ); } // this creates a complete XML document by adding a root // element to the Questionnaire output file contents private String makeXML(String fn )throws IOException { File inf = new File( fn ); BufferedReader read = new BufferedReader ( new FileReader( inf )); int p = fn.lastIndexOf('.'); String outFN = fn.substring( 0,p ) + "FMT" + fn.substring(p); File outf = new File( outFN ); BufferedWriter bw = new BufferedWriter ( new FileWriter( outf ), 4096); PrintWriter write = new PrintWriter( bw ); write.println( "<?xml version=\"1.0\" standalone=\"yes\" ?>"); write.println( "<!-- formatted Questionnaire results -->"); write.println( "<QresultSet title=\"" + title + "\" >"); String tmp = read.readLine(); int ct = 1 ; while( tmp != null ){ write.println( tmp ); tmp = read.readLine(); } read.close(); write.println("</QresultSet>"); write.close(); System.out.println("Created " + outFN ); return outFN ; }
public String toString() { StringBuffer sb = new StringBuffer("PrepQxml title: "); sb.append( title ); sb.append(" author: "); sb.append( author ); sb.append(" date: " ); sb.append( date ); sb.append(" primary output: "); sb.append( primaryfile ); sb.append(" other files: " ); sb.append( "none"); return sb.toString(); }
}