package org.test4j.json.encoder.single;
import java.io.Writer;
import java.util.List;
import org.test4j.json.encoder.SingleEncoder;
import org.test4j.json.helper.JSONFeature;
@SuppressWarnings({ "rawtypes" })
public abstract class SpecTypeEncoder<T> extends SingleEncoder<T> {
protected SpecTypeEncoder(Class clazz) {
super(clazz);
}
@Override
public final boolean encode(T target, Writer writer, List<String> references) {
try {
return this.encodeSpecType(target, writer, references);
} catch (Exception e) {
throw this.wrapException(e);
}
}
private final boolean encodeSpecType(T target, Writer writer, List<String> references) throws Exception {
boolean isNullOrRef = this.writerNullOrReference(target, writer, references, true);
if (isNullOrRef) {
return false;
}
Class type = target.getClass();
if (type == this.clazz) {
if (this.unMarkClassFlag) {
this.encodeSingleValue(target, writer);
} else {
writer.append("{");
this.writeClassFlag(target, writer);
writer.append(',');
this.writerSpecProperty(JSONFeature.ValueFlag, writer);
writer.append(':');
this.encodeSingleValue(target, writer);
writer.append('}');
}
} else {
writer.append("{");
if (this.unMarkClassFlag == false) {
this.writeClassFlag(target, writer);
writer.append(',');
}
this.writerSpecProperty(JSONFeature.ValueFlag, writer);
writer.append(':');
this.encodeSingleValue(target, writer);
this.encodeOtherProperty(target, writer);
writer.append('}');
}
return true;
}
protected abstract void encodeSingleValue(T target, Writer writer) throws Exception;
protected abstract void encodeOtherProperty(T target, Writer writer) throws Exception;
}