package jeql.command.io.kml;
import java.io.IOException;
import java.io.PrintWriter;
import jeql.api.row.Row;
import jeql.api.row.RowSchema;
/**
* Adds folder prologue and epilogue elements to
* a stream of rows which contain appropriate columns
* specifying folder partitioning.
*
* @author Martin Davis
*
*/
class FolderWriter
{
private boolean doWriteFolders = false;
private String currentName = null;
private int folderGroupColIndex = -1;
private int folderVisibilityIndex = -1;
private int folderOpenIndex = -1;
private boolean isInFolder = false;
public FolderWriter(RowSchema rs)
{
initColumns(rs);
if (folderGroupColIndex >= 0) {
doWriteFolders = true;
}
}
private void initColumns(RowSchema rs)
{
// can use either id or name for folder grouping
folderGroupColIndex = rs.getColIndexIgnoreCase(KMLCol.KML_FOLDER_ID);
if (folderGroupColIndex < 0) {
folderGroupColIndex = rs.getColIndexIgnoreCase(KMLCol.KML_FOLDER_NAME);
}
folderVisibilityIndex = rs.getColIndexIgnoreCase(KMLCol.KML_FOLDER_VISIBILITY);
folderOpenIndex = rs.getColIndexIgnoreCase(KMLCol.KML_FOLDER_OPEN);
}
public void nextRow(Row row, PrintWriter writer)
throws IOException
{
if (! doWriteFolders) return;
String folderName = (String) row.getValue(folderGroupColIndex);
// no change in name
if (currentName != null
&& currentName.equals(folderName)) return;
if (isInFolder) {
writeEpilogue(writer);
}
// at this point we know we are starting a new folder
writer.println();
writer.println("<Folder>");
writer.println(" <name>" + folderName + "</name>");
XMLWriter.writeElement(writer, 2, KMLCol.KML_VISIBILITY, folderVisibilityIndex, row, null, false);
XMLWriter.writeElement(writer, 2, KMLCol.KML_OPEN, folderOpenIndex, row, null, false);
currentName = folderName;
isInFolder = true;
}
public void finishedRows(PrintWriter writer)
throws IOException
{
writeEpilogue(writer);
}
private void writeEpilogue(PrintWriter writer)
{
if (! doWriteFolders) return;
if (! isInFolder) return;
writer.println("</Folder>");
}
}