package org.kvj.vimtouch.ext; import java.util.List; import java.util.Map; import org.kvj.vimtouch.ext.Transferable.FieldType; import org.kvj.vimtouch.ext.impl.write.BooleanFieldWriter; import org.kvj.vimtouch.ext.impl.write.DoubleFieldWriter; import org.kvj.vimtouch.ext.impl.write.ListFieldWriter; import org.kvj.vimtouch.ext.impl.write.MapFieldWriter; import org.kvj.vimtouch.ext.impl.write.NumberFieldWriter; import org.kvj.vimtouch.ext.impl.write.StringFieldWriter; import org.kvj.vimtouch.ext.impl.write.TransferableFieldWriter; public class OutgoingTransfer { private StringBuilder buffer = null; public void beginWrite() { buffer = new StringBuilder(); } public StringBuilder getBuffer() { return buffer; } public void writeInt(int value) { buffer.append(value); buffer.append(','); } public void writeStr(String value) { writeInt(value.length()); buffer.append(value); buffer.append(','); } public <T> void writeField(String name, T value, FieldWriter<T> writer) { if (null != name) { writeStr(name); } if (null == value) { // No value buffer.append(FieldType.Null.getCode()); buffer.append(','); return; } buffer.append(writer.getType().getCode()); writer.write(this, value); } public void writeString(String name, String value) { writeField(name, value, new StringFieldWriter()); } public void writeNumber(String name, Number value) { writeField(name, value, new NumberFieldWriter()); } public void writeDouble(String name, Double value) { writeField(name, value, new DoubleFieldWriter()); } public void writeBoolean(String name, boolean value) { writeField(name, value, new BooleanFieldWriter()); } public <T> void writeList(String name, List<T> list, FieldWriter<T> writer) { writeField(name, list, new ListFieldWriter<T>(writer)); } public <T> void writeMap(String name, Map<String, T> map, FieldWriter<T> writer) { writeField(name, map, new MapFieldWriter<T>(writer)); } public void writeObject(String name, Transferable obj) { writeField(name, obj, new TransferableFieldWriter()); } public void endWrite() { writeStr(""); } }