package de.jpaw.bonaparte.core;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.joda.time.Instant;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;
import de.jpaw.bonaparte.enums.BonaNonTokenizableEnum;
import de.jpaw.bonaparte.enums.BonaTokenizableEnum;
import de.jpaw.bonaparte.pojos.meta.AlphanumericElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.BasicNumericElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.BinaryElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.EnumDataItem;
import de.jpaw.bonaparte.pojos.meta.FieldDefinition;
import de.jpaw.bonaparte.pojos.meta.MiscElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.NumericElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.ObjectReference;
import de.jpaw.bonaparte.pojos.meta.TemporalElementaryDataItem;
import de.jpaw.bonaparte.pojos.meta.XEnumDataItem;
import de.jpaw.enums.XEnum;
import de.jpaw.util.ByteArray;
/** Delegates output to the delegateComposer. This class is intended as a superclass for Composers which want to modify only certain aspects of a composer.
* It is not declared abstract just in order to allow testing (as this class represents the idempotency delegator). */
public class DelegatingBaseComposer<E extends Exception> implements MessageComposer<E> {
protected final MessageComposer<E> delegateComposer;
public DelegatingBaseComposer(MessageComposer<E> delegateComposer) {
this.delegateComposer = delegateComposer;
}
@Override
public void writeNull(FieldDefinition di) throws E {
delegateComposer.writeNull(di);
}
@Override
public void writeNullCollection(FieldDefinition di) throws E {
delegateComposer.writeNullCollection(di);
}
@Override
public void startTransmission() throws E {
delegateComposer.startTransmission();
}
@Override
public void startRecord() throws E {
delegateComposer.startRecord();
}
@Override
public void startArray(FieldDefinition di, int currentMembers, int sizeOfElement) throws E {
delegateComposer.startArray(di, currentMembers, sizeOfElement);
}
@Override
public void startMap(FieldDefinition di, int currentMembers) throws E {
delegateComposer.startMap(di, currentMembers);
}
@Override
public void writeSuperclassSeparator() throws E {
delegateComposer.writeSuperclassSeparator();
}
@Override
public void terminateMap() throws E {
delegateComposer.terminateMap();
}
@Override
public void terminateArray() throws E {
delegateComposer.terminateArray();
}
@Override
public void terminateRecord() throws E {
delegateComposer.terminateRecord();
}
@Override
public void terminateTransmission() throws E {
delegateComposer.terminateTransmission();
}
// cannot delegate this, as it would give away control
@Override
public void writeRecord(BonaCustom o) throws E {
startRecord();
addField(StaticMeta.OUTER_BONAPORTABLE, o);
terminateRecord();
}
@Override
public void addField(AlphanumericElementaryDataItem di, String s) throws E {
delegateComposer.addField(di, s);
}
@Override
public void addField(MiscElementaryDataItem di, boolean b) throws E {
delegateComposer.addField(di, b);
}
@Override
public void addField(MiscElementaryDataItem di, char c) throws E {
delegateComposer.addField(di, c);
}
@Override
public void addField(BasicNumericElementaryDataItem di, double d) throws E {
delegateComposer.addField(di, d);
}
@Override
public void addField(BasicNumericElementaryDataItem di, float f) throws E {
delegateComposer.addField(di, f);
}
@Override
public void addField(BasicNumericElementaryDataItem di, byte n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(BasicNumericElementaryDataItem di, short n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(BasicNumericElementaryDataItem di, int n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(BasicNumericElementaryDataItem di, long n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(BasicNumericElementaryDataItem di, BigInteger n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(NumericElementaryDataItem di, BigDecimal n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(MiscElementaryDataItem di, UUID n) throws E {
delegateComposer.addField(di, n);
}
@Override
public void addField(BinaryElementaryDataItem di, ByteArray b) throws E {
delegateComposer.addField(di, b);
}
@Override
public void addField(BinaryElementaryDataItem di, byte[] b) throws E {
delegateComposer.addField(di, b);
}
@Override
public void addField(TemporalElementaryDataItem di, LocalDate t) throws E {
delegateComposer.addField(di, t);
}
@Override
public void addField(TemporalElementaryDataItem di, LocalDateTime t) throws E {
delegateComposer.addField(di, t);
}
@Override
public void addField(TemporalElementaryDataItem di, LocalTime t) throws E {
delegateComposer.addField(di, t);
}
@Override
public void addField(TemporalElementaryDataItem di, Instant t) throws E {
delegateComposer.addField(di, t);
}
@Override
public void startObject(ObjectReference di, BonaCustom obj) throws E {
delegateComposer.startObject(di, obj);
}
@Override
public void terminateObject(ObjectReference di, BonaCustom obj) throws E {
delegateComposer.terminateObject(di, obj);
}
// cannot delegate this, as it would give away control
@Override
public void addField(ObjectReference di, BonaCustom obj) throws E {
if (obj == null) {
writeNull(di); // delegates...
} else {
// start a new object
startObject(di, obj);
// do all fields
obj.serializeSub(this);
// start a new object
terminateObject(di, obj);
}
}
@Override
public void addEnum(EnumDataItem di, BasicNumericElementaryDataItem ord, BonaNonTokenizableEnum n) throws E {
delegateComposer.addEnum(di, ord, n);
}
@Override
public void addEnum(EnumDataItem di, AlphanumericElementaryDataItem token, BonaTokenizableEnum n) throws E {
delegateComposer.addEnum(di, token, n);
}
// xenum with alphanumeric expansion: delegate to Null/String
@Override
public void addEnum(XEnumDataItem di, AlphanumericElementaryDataItem token, XEnum<?> n) throws E {
delegateComposer.addEnum(di, token, n);
}
@Override
public boolean addExternal(ObjectReference di, Object obj) throws E {
return delegateComposer.addExternal(di, obj);
}
@Override
public void writeTransmission(Collection<? extends BonaCustom> coll) throws E {
delegateComposer.writeTransmission(coll);
}
@Override
public void writeTransmission(Iterable<? extends BonaCustom> coll) throws E {
delegateComposer.writeTransmission(coll);
}
@Override
public void writeObject(BonaCustom o) throws E {
delegateComposer.writeObject(o);
}
@Override
public void close() throws IOException {
delegateComposer.close();
}
@Override
public boolean getWriteCRs() {
return delegateComposer.getWriteCRs();
}
@Override
public void setWriteCRs(boolean writeCRs) {
delegateComposer.setWriteCRs(writeCRs);
}
@Override
public Charset getCharset() {
return delegateComposer.getCharset();
}
@Override
public void setCharset(Charset charset) {
delegateComposer.setCharset(charset);
}
@Override
public void addField(ObjectReference di, Map<String, Object> obj) throws E {
delegateComposer.addField(di, obj);
}
@Override
public void addField(ObjectReference di, List<Object> obj) throws E {
delegateComposer.addField(di, obj);
}
@Override
public void addField(ObjectReference di, Object obj) throws E {
delegateComposer.addField(di, obj);
}
}