//
// Copyright (c) 2012, Brian Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 25 Sep 2012 Brian Frank Creation
//
package org.haystack.io;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map.Entry;
import org.haystack.HCol;
import org.haystack.HDict;
import org.haystack.HGrid;
import org.haystack.HRow;
import org.haystack.tagval.HMarker;
import org.haystack.tagval.HVal;
/**
* HZincWriter is used to write grids in the Zinc format
*
* @see <a href='http://project-haystack.org/doc/Zinc'>Project Haystack</a>
*/
public class HZincWriter extends HGridWriter {
//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////
public HZincWriter(OutputStream out) {
super(out);
}
public HZincWriter(Writer out) {
super(out);
}
/** Write a grid to an in-memory a string */
public static String gridToString(HGrid grid) {
StringWriter out = new StringWriter(grid.numCols() * grid.numRows() * 16);
writeGrid(new HZincWriter(out), grid);
return out.toString();
}
//////////////////////////////////////////////////////////////////////////
// HGridWriter
//////////////////////////////////////////////////////////////////////////
@Override
public void writeMeta(HDict meta) {
out.write("ver:\"2.0\"");
writeMetaImpl(meta);
out.write('\n');
}
@Override
public void writeCols(HCol[] cols) {
for (int i = 0; i < cols.length; ++i) {
if (i > 0)
out.write(',');
out.write(cols[i].name());
writeMetaImpl(cols[i].meta());
}
out.write('\n');
}
@Override
public void writeRow(HCol[] cols, HRow row, int index) {
for (int i = 0; i < cols.length; ++i) {
HVal val = row.get(cols[i], false);
if (i > 0)
out.write(',');
if (val == null) {
if (i == 0)
out.write('N');
}
else {
out.write(val.toZinc());
}
}
out.write('\n');
}
//////////////////////////////////////////////////////////////////////////
// Implementation
//////////////////////////////////////////////////////////////////////////
private void writeMetaImpl(HDict meta) {
if (meta.isEmpty())
return;
for (Iterator<Entry<String, HVal>> it = meta.iterator(); it.hasNext();) {
Entry<String, HVal> entry = it.next();
String name = entry.getKey();
HVal val = entry.getValue();
out.write(' ');
out.write(name);
if (val != HMarker.VAL) {
out.write(':');
out.write(val.toZinc());
}
}
}
}