package org.reldb.rel.client.parser; import java.io.InputStream; import org.reldb.rel.client.Heading; /** A special HTML generator intended for progressive generation of tabular results. */ public abstract class ResponseToHTMLProgressive extends ResponseToHTML { private boolean headingDone = false; private int headingCount = 0; private int tupleCount = 0; public ResponseToHTMLProgressive(InputStream input) { super(input); } public ResponseToHTMLProgressive(String input) { super(input); } // Override to receive initial generated HTML. This may be invoked multiple times before endInitialHTML() is called. public abstract void emitInitialHTML(String s); // Override to receive notification that all emitInitialHTML() calls have been done. public abstract void endInitialHTML(); // Override to receive additional generated HTML. This will typically be a table row, // to be inserted into the HTML table (with id='table') defined via emitInitialHTML() public abstract void emitProgressiveHTML(String s); // Override to receive notification that a table row has ended. public abstract void endProgressiveHTMLRow(); public void emitHTML(String s) { if (headingDone) emitProgressiveHTML(s); else emitInitialHTML(s); } public void beginHeading(String typeName) { super.beginHeading(typeName); headingCount++; } public Heading endHeading() { super.endHeading(); headingCount--; if (headingCount == 0) { emitHTML("</table>"); endInitialHTML(); headingDone = true; } return null; } public void endContainer(int depth) { if (depth > 0) super.endContainer(depth); } public void beginTuple(int depth) { super.beginTuple(depth); tupleCount++; } public void endTuple(int depth) { super.endTuple(depth); tupleCount--; if (tupleCount == 0) endProgressiveHTMLRow(); } }