package com.ricebridge.xmlman.test;
import com.ricebridge.xmlman.*;
import com.ricebridge.xmlman.in.*;
import com.ricebridge.xmlman.in.test.*;
import com.ricebridge.xmlman.log.*;
import com.ricebridge.util.RBTestUtil;
import org.jostraca.util.*;
import junit.framework.*;
import junit.textui.*;
import org.xml.sax.InputSource;
import java.util.*;
import java.io.*;
import java.text.*;
public class CallSequenceTest extends TestCase {
public CallSequenceTest( String pName ) {
super( pName );
}
public static TestSuite suite() {
return new TestSuite( CallSequenceTest.class );
}
public static void main( String[] pArgs ) {
TestRunner.run( suite() );
}
public void testLoadNormal() throws Exception {
File xf = RBTestUtil.findTestFile("com/ricebridge/xmlman/test/badrec.xml");
RecordSpec rs = new RecordSpec( "//que",
new String[] {"@rec","@q","//h:p[@class='t']"},
new String[] {"rec","q","p"} );
XmlManager xm = new XmlManager();
xm.getXmlSpec().addNamespace("h","html");
StringBuffer seq = new StringBuffer();
SequenceRecordListener srl = new SequenceRecordListener( seq, false );
xm.load( xf, rs, srl );
Stats stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 0, stats.getTotalBadRecords() );
assertEquals( 0, xm.getBadRecords().size() );
assertEquals( "RL-sxs,RL-sfn,RL-sp,RL-hr,RL-hr,RL-hr,RL-hr,RL-hr,RL-ep,",
seq.toString() );
seq = new StringBuffer();
srl = new SequenceRecordListener( seq, false );
SequenceBadRecordListener sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
xm.load( xf, rs, srl );
stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 0, stats.getTotalBadRecords() );
assertEquals( 0, xm.getBadRecords().size() );
assertEquals( "RL-sxs,RL-sfn,RL-sp,BRL-sp,RL-hr,RL-hr,RL-hr,RL-hr,RL-hr,BRL-ep,RL-ep,BRL-gbr,", seq.toString() );
BadRecordContext brc1 = new BadRecordContext("brc1");
seq = new StringBuffer();
srl = new SequenceRecordListener( seq, brc1, false );
sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
xm.getXmlSpec().setIgnoreBadRecords( true );
xm.load( xf, rs, srl );
stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 0, stats.getTotalBadRecords() );
assertEquals( 0, xm.getBadRecords().size() );
assertEquals( "RL-sxs,RL-sfn,RL-sp,BRL-sp,RL-hr,RL-hr,RL-hr,RL-hr,RL-hr,BRL-ep,RL-ep,BRL-gbr,",
seq.toString() );
}
public void testLoadBadRecordListener() throws Exception {
File xf = RBTestUtil.findTestFile("com/ricebridge/xmlman/test/badrec.xml");
RecordSpec rs = new RecordSpec( "//que",
new String[] {"@rec","@q","//h:p[@class='t']"},
new String[] {"rec","q","p"} );
XmlManager xm = new XmlManager();
xm.getXmlSpec().addNamespace("h","html");
StringBuffer seq = new StringBuffer();
SequenceRecordListener srl = new SequenceRecordListener( seq );
SequenceBadRecordListener sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
try {
xm.load( xf, rs, srl );
fail();
}
catch( XmlManagerException xme ) {
assertTrue( XmlManagerException.CODE_bad_record == xme.getCode() );
Stats stats = xm.getStats();
assertEquals( 2, stats.getTotalRecords() );
assertEquals( 1, stats.getTotalBadRecords() );
assertEquals( 1, xm.getBadRecords().size() );
assertEquals( "RL-sxs,RL-sfn,RL-sp,BRL-sp,RL-hr,RL-hr,BRL-hbr,BRL-ep,RL-ep,BRL-gbr,", seq.toString() );
}
BadRecordContext brc1 = new BadRecordContext("brc1");
seq = new StringBuffer();
srl = new SequenceRecordListener( seq, brc1 );
sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
xm.getXmlSpec().setIgnoreBadRecords( true );
xm.load( xf, rs, srl );
Stats stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 3, stats.getTotalBadRecords() );
assertEquals( 3, xm.getBadRecords().size() );
assertEquals( "RL-sxs,RL-sfn,RL-sp,BRL-sp,RL-hr,RL-hr,BRL-hbr,RL-hr,RL-hr,BRL-hbr,RL-hr,BRL-hbr,BRL-ep,RL-ep,BRL-gbr,",
seq.toString() );
}
public void testSaveNormal() throws Exception {
File xf = RBTestUtil.findTestFile("com/ricebridge/xmlman/test/save.xml");
RecordSpec rs = new RecordSpec( "/foo/bar/que",
new String[] {"/foo/bar/@b","@q","h:div/h:p/@class","h:div/h:p"},
new String[] {"rec","q","class","p"} );
List data = new ArrayList();
data.add( ListUtil.make( "b1","q1","t","t1") );
data.add( ListUtil.make( "b1","q2","t","t2") );
data.add( ListUtil.make( "b1","q3","t","t3") );
data.add( ListUtil.make( "b2","q4","t","t4") );
data.add( ListUtil.make( "b2","q5","t","t5") );
XmlManager xm = new XmlManager();
xm.getXmlSpec().addNamespace("h","html");
StringBuffer seq = new StringBuffer();
SequenceRecordProvider srp = new SequenceRecordProvider( data, seq, false );
FileUtil.writeFile( xf, "" );
xm.save( xf, rs, srp );
assertEquals( "RP-sxs,RP-sfn,RP-sp,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RP-ep,",
seq.toString() );
Stats stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 0, stats.getTotalBadRecords() );
assertEquals( 0, xm.getBadRecords().size() );
seq = new StringBuffer();
srp = new SequenceRecordProvider( data, seq, false );
SequenceBadRecordListener sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
FileUtil.writeFile( xf, "" );
xm.save( xf, rs, srp );
assertEquals( "RP-sxs,RP-sfn,RP-sp,BRL-sp,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,RL-nr,RP-hnr,BRL-ep,RP-ep,",
seq.toString() );
stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 0, stats.getTotalBadRecords() );
assertEquals( 0, xm.getBadRecords().size() );
}
public void testSaveBadRecordListener() throws Exception {
File xf = RBTestUtil.findTestFile("com/ricebridge/xmlman/test/save.xml");
RecordSpec rs = new RecordSpec( "/foo/bar/que",
new String[] {"/foo/bar/@b","@q","h:div/h:p/@class","h:div/h:p"},
new String[] {"rec","q","p","pt"} );
List data = new ArrayList();
data.add( ListUtil.make( "b1","q1","t","t1") );
data.add( ListUtil.make( "b1","q2","t","t2") );
data.add( ListUtil.make( "b1","q3","t","t3") );
data.add( ListUtil.make( "b2","q4","t","t4") );
data.add( ListUtil.make( "b2","q5","t","t5") );
XmlManager xm = new XmlManager();
xm.getXmlSpec().addNamespace("h","html");
StringBuffer seq = new StringBuffer();
SequenceRecordProvider srp = new SequenceRecordProvider( data, seq, true );
SequenceBadRecordListener sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
FileUtil.writeFile( xf, "" );
try {
xm.save( xf, rs, srp );
fail();
}
catch( Exception e ) {
assertEquals( XmlManagerException.CODE_bad_record, ((XmlManagerException)e).getCode() );
assertEquals( "RP-sxs,RP-sfn,RP-sp,BRL-sp,RP-hnr,RL-nr,RP-hnr,RL-nr,BRL-hbr,BRL-ep,RP-ep,",
seq.toString() );
Stats stats = xm.getStats();
assertEquals( 2, stats.getTotalRecords() );
assertEquals( 1, stats.getTotalBadRecords() );
assertEquals( 1, xm.getBadRecords().size() );
}
xm.getXmlSpec().setIgnoreBadRecords( true );
seq = new StringBuffer();
srp = new SequenceRecordProvider( data, seq, true );
sbrl = new SequenceBadRecordListener( seq );
xm.setBadRecordListener( sbrl );
FileUtil.writeFile( xf, "" );
xm.save( xf, rs, srp );
assertEquals( "RP-sxs,RP-sfn,RP-sp,BRL-sp,RP-hnr,RL-nr,RP-hnr,RL-nr,BRL-hbr,RP-hnr,RL-nr,RP-hnr,RL-nr,BRL-hbr,RP-hnr,RL-nr,BRL-hbr,RP-hnr,BRL-ep,RP-ep,", seq.toString() );
Stats stats = xm.getStats();
assertEquals( 5, stats.getTotalRecords() );
assertEquals( 3, stats.getTotalBadRecords() );
assertEquals( 3, xm.getBadRecords().size() );
}
public static class BadRecordContext {
public String iValue;
public BadRecordContext( String pValue ) { iValue = pValue; }
public String toString() { return "BadRecordContext:"+iValue; }
}
public class SequenceRecordListener extends RecordListenerSupport {
private StringBuffer iSequence = null;
private boolean iHasFailures = false;
private BadRecordContext iBRC = null;
public SequenceRecordListener( StringBuffer pSequence ) {
this( pSequence, true );
}
public SequenceRecordListener( StringBuffer pSequence, boolean pHasFailures ) {
iSequence = pSequence;
iHasFailures = pHasFailures;
}
public SequenceRecordListener( StringBuffer pSequence, BadRecordContext pBRC) {
this( pSequence, pBRC, true );
}
public SequenceRecordListener( StringBuffer pSequence, BadRecordContext pBRC, boolean pHasFailures ) {
this(pSequence,pHasFailures);
iBRC = pBRC;
}
protected void setXmlSpecImpl( XmlSpec pXmlSpec ) {
iSequence.append("RL-sxs,");
}
protected void setFieldNamesImpl( String[] pFieldNames ) {
iSequence.append("RL-sfn,");
}
protected void startProcessImpl() {
iSequence.append("RL-sp,");
}
protected void endProcessImpl() {
iSequence.append("RL-ep,");
}
public BadRecord handleRecordImpl( String[] pRecord, long pRecordNumber ) {
iSequence.append("RL-hr,");
if( iHasFailures && "bad".equals(pRecord[0]) ) {
if( null == iBRC ) {
return new BadRecord( "que", pRecordNumber, pRecord, "bad");
}
else {
return new BadRecord( "que", pRecordNumber, pRecord, "bad", iBRC );
}
}
return null;
}
}
public class SequenceBadRecordListener extends CollectingBadRecordListener {
private ArrayList iBadRecs = new ArrayList();
private StringBuffer iSequence = null;
public SequenceBadRecordListener( StringBuffer pSequence ) {
iSequence = pSequence;
}
protected void startProcessImpl() {
iSequence.append("BRL-sp,");
}
protected void endProcessImpl() {
iSequence.append("BRL-ep,");
}
protected void handleBadRecordImpl( BadRecord pBadRecord ) {
iBadRecs.add( pBadRecord );
iSequence.append("BRL-hbr,");
}
protected List getBadRecordsImpl() {
iSequence.append("BRL-gbr,");
return iBadRecs;
}
}
public class SequenceRecordProvider extends StringListRecordProvider {
private StringBuffer iSequence = null;
private boolean iHasFailures = false;
public SequenceRecordProvider( List pData, StringBuffer pSequence ) {
this( pData, pSequence, true );
}
public SequenceRecordProvider( List pData, StringBuffer pSequence, boolean pHasFailures ) {
super( pData );
iSequence = pSequence;
iHasFailures = pHasFailures;
}
protected void setXmlSpecImpl( XmlSpec pXmlSpec ) {
iSequence.append("RP-sxs,");
}
protected void setFieldNamesImpl( String[] pFieldNames ) {
iSequence.append("RP-sfn,");
}
protected void startProcessImpl() {
iSequence.append("RP-sp,");
super.startProcessImpl();
}
protected void endProcessImpl() {
iSequence.append("RP-ep,");
super.endProcessImpl();
}
public boolean hasNextRecordImpl() {
iSequence.append("RP-hnr,");
return super.hasNextRecordImpl();
}
public String[] nextRecordImpl() {
iSequence.append("RL-nr,");
String[] record = super.nextRecordImpl();
if( iHasFailures && (2 == iRecordIndex || 4 == iRecordIndex || 5 == iRecordIndex ) ) {
throw new RuntimeException( "bad rec "+iRecordIndex );
}
return record;
}
}
}