[Batchserver-cvs] batchserver/test/org/jmonks/batchserver/io/xml TestStax.java, NONE, 1.1 XMLFileRe
Brought to you by:
suresh_pragada
From: Suresh <sur...@us...> - 2006-06-07 22:26:53
|
Update of /cvsroot/batchserver/batchserver/test/org/jmonks/batchserver/io/xml In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22209 Added Files: TestStax.java XMLFileReaderTest.java Log Message: no message --- NEW FILE: TestStax.java --- /* * TestStax.java * * Created on June 1, 2006, 9:41 AM * * To change this template, choose Tools | Options and locate the template under * the Source Creation and Management node. Right-click the template and choose * Open. You can then make changes to the template in the Source Editor. */ package org.jmonks.batchserver.io.xml; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Stack; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; /** * * @author Suresh Pragada */ public class TestStax { protected XMLFileSpec fileSpec=null; protected XMLEventReader eventReader=null; protected String xpath=""; public TestStax(String absoluteFilePath,org.jmonks.batchserver.io.FileSpec fileSpec) { this.fileSpec=(XMLFileSpec)fileSpec; try { XMLInputFactory inputFactory=XMLInputFactory.newInstance(); eventReader=inputFactory.createXMLEventReader(new java.io.FileReader(absoluteFilePath)); String rootElement=this.fileSpec.getRootElement(); if(this.validateRootElement(rootElement, eventReader)) xpath="/"+rootElement; else { eventReader.close(); throw new RuntimeException("Root tag doesnt match."); } } catch(FileNotFoundException exception) { exception.printStackTrace(); //logger.fatal(); this.eventReader=null; throw new RuntimeException("Exception while initializing the XML File reader = " + absoluteFilePath); } catch(XMLStreamException exception) { exception.printStackTrace(); //logger.fatal(); this.eventReader=null; throw new RuntimeException("Exception while initializing the XML File reader = " + absoluteFilePath); } } public org.jmonks.batchserver.io.ReaderRecord getNextRecord() { XMLReaderRecord readerRecord=null; if(this.eventReader==null) return readerRecord; else { try { while(eventReader.hasNext()) { XMLEvent event=eventReader.nextEvent(); if(event.isStartElement()) { StartElement startElement=(StartElement)event; String startElementName=startElement.getName().getLocalPart(); xpath=xpath+"/"+startElementName; XMLRecordSpec recordSpec=this.getRecordSpec(); if(recordSpec!=null) { //logger.debug("Found configured " + xpath); readerRecord=retrieveRecord(eventReader,recordSpec,startElementName); int index=xpath.lastIndexOf("/"+startElementName); if(index!=-1) xpath=xpath.substring(0, index); break; } } else if(event.isEndElement()) { EndElement endElement=(EndElement)event; String endElementName=endElement.getName().getLocalPart(); int index=xpath.lastIndexOf("/"+endElementName); if(index!=-1) xpath=xpath.substring(0, index); } } } catch(XMLStreamException exception) { exception.printStackTrace(); //logger.fatal(); throw new RuntimeException("Exception while reading the record. Message = " + exception.getMessage()); } } return readerRecord; } public void close() { if(this.eventReader!=null) { try { this.eventReader.close(); } catch(XMLStreamException exception) { //logger.debug("Streamexception while closing the reader. Message = " + exception.getMessage(),exception); } finally { this.eventReader=null; } } } public static void main(String args[]) throws Exception { org.jmonks.batchserver.io.FileSpec fileSpec=org.jmonks.batchserver.io.FileSpec.createFileSpec("D:\\workarea\\personal\\latestcvs\\batchserver\\src\\org\\jmonks\\batchserver\\io\\xml\\sample-xml-file-spec.xml"); TestStax stax=new TestStax("D:\\workarea\\personal\\latestcvs\\batchserver\\src\\org\\jmonks\\batchserver\\io\\xml\\sample-xml-file_1.xml",fileSpec); } private boolean validateRootElement(String rootElement,XMLEventReader reader) { boolean valid=false; try { while(reader.hasNext()) { XMLEvent event=reader.nextEvent(); if(event.isStartElement()) { StartElement startElement=(StartElement)event; if(rootElement.equalsIgnoreCase(startElement.getName().getLocalPart())) { valid=true; break; } } } } catch(XMLStreamException exception) { exception.printStackTrace(); //logger.fatal(); throw new RuntimeException("Exception while validating the root element. Message = " + exception.getMessage(),exception); } return valid; } private XMLRecordSpec getRecordSpec() { List recordSpecs=this.fileSpec.getRecordSpecs(); for(Iterator iterator=recordSpecs.iterator();iterator.hasNext();) { XMLRecordSpec recordSpec=(XMLRecordSpec)iterator.next(); if(recordSpec.isMatch(this.xpath)) return recordSpec; } return null; } private XMLReaderRecord retrieveRecord(XMLEventReader eventReader,XMLRecordSpec recordSpec,String recordElement) { XMLReaderRecord readerRecord=new XMLReaderRecord(recordSpec.getRecordType()); Stack elementStack=new Stack(); boolean isPreviousElementStart=false; try { while(eventReader.hasNext()) { XMLEvent nextEvent=eventReader.peek(); if(nextEvent.isStartElement()) { /** * If the previous element is also a start element, retrieve the * nested element and returns it as a nested record. */ if(isPreviousElementStart) { StartElement previousStartElement=(StartElement)elementStack.pop(); XMLReaderRecord nestedRecord=this.retrieveRecord(eventReader, recordSpec, previousStartElement.getName().getLocalPart()); readerRecord.writeElement(previousStartElement.getName().getLocalPart(),nestedRecord); isPreviousElementStart=false; } else { StartElement startElement=(StartElement)eventReader.nextEvent(); isPreviousElementStart=true; elementStack.push(startElement); } } else if(nextEvent.isEndElement()) { EndElement endElement=(EndElement)eventReader.nextEvent(); isPreviousElementStart=false; if(recordElement.equalsIgnoreCase(endElement.getName().getLocalPart())) break; else { /** * Check the value on top of the stack. If it is start element, no value has * been provided for this element in the file, otherwise pop the values and start element. */ Object topValue=elementStack.peek(); if(topValue instanceof StartElement) { StartElement startElement=(StartElement)elementStack.pop(); readerRecord.writeElement(startElement.getName().getLocalPart(),""); } else { Object fieldValue=elementStack.pop(); StartElement startElement=(StartElement)elementStack.pop(); readerRecord.writeElement(startElement.getName().getLocalPart(), fieldValue); } } } else if(nextEvent.isCharacters()) { Characters chars=(Characters)eventReader.nextEvent(); if(!chars.isWhiteSpace()) { isPreviousElementStart=false; elementStack.push(chars.getData()); } } else { /** * Ignore the other events for now. */ eventReader.nextEvent(); } } } catch(XMLStreamException exception) { throw new RuntimeException("XMLStream exception while retrieving the record. Message = " + exception.getMessage(), exception); } return readerRecord; } private void printRecord(XMLReaderRecord record) { System.out.println("*******************************************"); System.out.println(record); System.out.println("*******************************************"); } public class XMLReaderRecord extends org.jmonks.batchserver.io.ReaderRecord { private Map fieldMap=null; private XMLReaderRecord(org.jmonks.batchserver.io.RecordType recordType) { super(recordType); fieldMap=new HashMap(); } public Object readField(String fieldName) { return readElement(fieldName); } public Object readElement(String elementName) { return fieldMap.get(elementName); } protected void writeElement(String fieldName, Object fieldValue) { if(fieldMap.containsKey(fieldName)) { Object existingFieldValue=fieldMap.remove(fieldName); if(existingFieldValue instanceof List) { List existingFieldValueList=(List)existingFieldValue; existingFieldValueList.add(fieldValue); fieldMap.put(fieldName, existingFieldValueList); } else { List fieldValueList=new ArrayList(); fieldValueList.add(existingFieldValue); fieldValueList.add(fieldValue); fieldMap.put(fieldName,fieldValueList); } } else fieldMap.put(fieldName,fieldValue); } public String toString() { return this.fieldMap.toString(); } } } --- NEW FILE: XMLFileReaderTest.java --- /* * XMLFileReaderTest.java * JUnit based test * * Created on June 5, 2006, 4:38 PM */ package org.jmonks.batchserver.io.xml; import junit.framework.*; import org.jmonks.batchserver.io.*; /** * * @author w951h8m */ public class XMLFileReaderTest extends TestCase { public XMLFileReaderTest(String testName) { super(testName); } protected void setUp() throws Exception { } protected void tearDown() throws Exception { } public static Test suite() { TestSuite suite = new TestSuite(XMLFileReaderTest.class); return suite; } /** * Test of getNextRecord method, of class org.jmonks.batchserver.io.xml.XMLFileReader. */ public void testGetNextRecord() { System.out.println("testGetNextRecord"); FileReader fileReader=FileReader.getFileReader("D:\\workarea\\personal\\latestcvs\\batchserver\\src\\org\\jmonks\\batchserver\\io\\xml\\sample-xml-file_1.xml", "D:\\workarea\\personal\\latestcvs\\batchserver\\src\\org\\jmonks\\batchserver\\io\\xml\\sample-xml-file-spec.xml"); ReaderRecord readerRecord=null; while((readerRecord=fileReader.getNextRecord())!=null) System.out.println(readerRecord); fileReader.close(); } } |