package org.kohsuke.bali.writer;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.MessageFormat;
import org.kohsuke.bali.automaton.ElementAlphabet;
import org.kohsuke.bali.automaton.State;
import org.kohsuke.bali.automaton.Transition;
import org.kohsuke.bali.automaton.TreeAutomaton;
import com.sun.msv.grammar.util.ExpressionPrinter;
/**
* Dumps the automaton into a text file
*
* @author Kohsuke Kawaguchi (kk@kohsuke.org)
*/
public class AutomatonDumper implements AutomatonWriter {
private final PrintWriter out;
public AutomatonDumper( OutputStream os ) {
out = new PrintWriter(os);
}
public void write(TreeAutomaton automaton) throws IOException {
System.err.println("dumping");
State[] states = automaton.getStates();
for( int i=0; i<states.length; i++ ) {
State s = states[i];
// print the name of state
out.println("##"+Integer.toString(s.id)+"\t"+
ExpressionPrinter.printContentModel(s.exp));
Transition[] trans = s.getDeclaredTransitions();
for( int j=0; j<trans.length; j++ ) {
Transition t = trans[j];
String left;
if(t.left!=null)
left = Integer.toString(t.left.id);
else
left = "(null)";
out.println(MessageFormat.format(" {0} -> #{1} x #{2}",
new Object[]{ t.alphabet,
left,
Integer.toString(t.right.id) }));
}
if( s.nextState!=null ) {
out.println(" -> #"+Integer.toString(s.nextState.id) );
}
}
out.flush();
}
}