package nebula.data.db.serializer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import nebula.data.Entity;
import nebula.data.db.BO2DBSerializer;
import nebula.data.impl.EditableEntity;
public class EntityFieldSerializer extends DefaultFieldSerializer<Entity> implements BO2DBSerializer<Entity> {
final List<DefaultFieldSerializer<?>> fieldSerializer;
public EntityFieldSerializer(List<DefaultFieldSerializer<?>> fieldSerializer) {
super(null, null);
this.fieldSerializer = new CopyOnWriteArrayList<DefaultFieldSerializer<?>>(fieldSerializer);
}
public EntityFieldSerializer(String fieldName, String columnName, List<DefaultFieldSerializer<?>> fieldSerializer) {
super(fieldName, columnName);
this.fieldSerializer = new CopyOnWriteArrayList<DefaultFieldSerializer<?>>(fieldSerializer);
}
int fromEntity(PreparedStatement prepareStatement, Entity entity) throws Exception {
int pos = 1;
for (DefaultFieldSerializer<?> c : fieldSerializer) {
@SuppressWarnings("unchecked")
DefaultFieldSerializer<Object> m = (DefaultFieldSerializer<Object>) c;
pos = m.output(prepareStatement, entity.get(c.fieldName), pos);
}
return pos;
}
EditableEntity toEntity(ResultSet result) throws Exception {
EditableEntity entity = new EditableEntity();
int pos = 1;
for (DefaultFieldSerializer<?> c : fieldSerializer) {
pos = c.inputWithoutCheck(result, pos, entity);
}
return entity;
}
@Override
public int input(ResultSet in, int pos, Entity parent, Entity now) throws Exception {
return inputWithoutCheck(in, pos, parent);
}
@Override
public int inputWithoutCheck(ResultSet in, int pos, Entity parent) throws Exception {
EditableEntity entity = new EditableEntity();
for (DefaultFieldSerializer<?> c : fieldSerializer) {
pos = c.inputWithoutCheck(in, pos, entity);
}
parent.put(this.fieldName, entity);
return pos;
}
@Override
public int output(PreparedStatement out, Entity value, int pos) throws Exception {
if (value != null) {
for (DefaultFieldSerializer<?> c : fieldSerializer) {
@SuppressWarnings("unchecked")
DefaultFieldSerializer<Object> m = (DefaultFieldSerializer<Object>) c;
pos = m.output(out, value.get(c.fieldName), pos);
}
} else {
for (DefaultFieldSerializer<?> c : fieldSerializer) {
@SuppressWarnings("unchecked")
DefaultFieldSerializer<Object> m = (DefaultFieldSerializer<Object>) c;
pos = m.output(out, null, pos);
}
}
return pos;
}
@Override
public EditableEntity fromDb(ResultSet result) throws Exception {
return this.toEntity(result);
}
@Override
public int toDb(PreparedStatement prepareStatement, Entity entity) throws Exception {
return this.fromEntity(prepareStatement, entity);
}
}