package de.jpaw.bonaparte.core; import java.io.IOException; import java.util.Locale; import org.joda.time.DateTimeZone; import de.jpaw.bonaparte.pojos.meta.AlphanumericElementaryDataItem; import de.jpaw.bonaparte.pojos.meta.FieldDefinition; import de.jpaw.bonaparte.pojos.meta.MiscElementaryDataItem; import de.jpaw.bonaparte.pojos.meta.ObjectReference; /** text based composer which emits the fields in stringified form into an abstract method. * This composer is intended to be used by UI adaptions such as Android or ZK. */ public abstract class AbstractUIComposer extends CSVComposer2 { public final static CSVConfiguration UI_DEFAULT_CONFIGURATION = CSVConfiguration.CSV_DEFAULT_CONFIGURATION.builder() .usingGrouping(true) .forLocale(Locale.getDefault()) .forTimeZone(DateTimeZone.getDefault()) .build(); protected final StringBuilder buffer; private AbstractUIComposer(StringBuilder buffer, CSVConfiguration cfg) { super(buffer, cfg); this.buffer = buffer; } public AbstractUIComposer(CSVConfiguration cfg) { this(new StringBuilder(250), cfg); } public AbstractUIComposer() { this(UI_DEFAULT_CONFIGURATION); } public AbstractUIComposer(Locale locale, DateTimeZone zone) { this(UI_DEFAULT_CONFIGURATION.builder() .forLocale(locale == null ? Locale.getDefault() : locale) .forTimeZone(zone == null ? DateTimeZone.getDefault() : zone) .build()); } protected abstract void emit(String text); @Override protected void writeSeparator() { // use this as an indicator that a new field has been started buffer.setLength(0); } @Override protected void terminateField() { // a field has been rendered emit(buffer.toString()); } @Override public void writeNull(FieldDefinition di) throws RuntimeException { emit(null); } @Override public void startMap(FieldDefinition di, int currentMembers) throws RuntimeException { } @Override public void terminateMap() throws RuntimeException { } @Override public void startArray(FieldDefinition di, int currentMembers, int sizeOfElement) throws RuntimeException { } @Override public void terminateArray() throws RuntimeException { } @Override public void terminateRecord() throws RuntimeException { } @Override public void startObject(ObjectReference di, BonaCustom obj) throws RuntimeException { } @Override public void terminateObject(ObjectReference di, BonaCustom obj) throws RuntimeException { } // field type specific output functions // character: No escaping for UI output @Override public void addField(MiscElementaryDataItem di, char c) throws IOException { if (c < ' ') emit("^" + String.valueOf((char)(c + '@'))); else emit(String.valueOf(c)); } // ascii only (unicode uses different method) @Override public void addField(AlphanumericElementaryDataItem di, String s) throws IOException { emit(s); } }