package nebula.data.db.serializer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import nebula.data.Entity;
import nebula.data.impl.EditableEntity;
public class EntityListFieldSerializer extends DefaultFieldSerializer<List<Entity>> {
final List<ListTypeAdapter<?>> adapteres;
final List<String> subFieldNames;
public EntityListFieldSerializer(String fieldName, List<ListTypeAdapter<?>> adapteres, List<String> subFieldNames) {
super(fieldName, null);
this.adapteres = adapteres;
this.subFieldNames = subFieldNames;
}
public int input(ResultSet in, int pos, Entity parent, List<Entity> now) throws Exception {
throw new UnsupportedOperationException(
"public int input(ResultSet in, int pos, Entity parent, List<Entity> now) throws Exception {");
}
@Override
public int inputWithoutCheck(ResultSet in, int pos, Entity parent) throws Exception {
List<EditableEntity> enities = new ArrayList<EditableEntity>();
for (int i = 0; i < adapteres.size(); i++) {
List<?> dataList = (List<?>) adapteres.get(i).readFrom(in, pos);
if (enities.size() < dataList.size()) {
for (int j = enities.size(); j < dataList.size(); j++) {
EditableEntity entity = new EditableEntity();
enities.add(entity);
}
}
String subFieldName = subFieldNames.get(i);
for (int j = 0; j < dataList.size(); j++) {
EditableEntity entity = enities.get(j);
entity.put(subFieldName, dataList.get(j));
}
++pos;
}
parent.put(fieldName, enities);
return pos;
}
@Override
public int output(PreparedStatement out, List<Entity> enities, int pos) throws Exception {
for (int i = 0; i < adapteres.size(); i++) {
List<Object> dataList = new ArrayList<Object>();
if (enities == null) {
adapteres.get(i).writeTo(pos, dataList, out);
} else {
String subFieldName = subFieldNames.get(i);
for (int j = 0; j < enities.size(); j++) {
Entity entity = enities.get(j);
dataList.add(entity.get(subFieldName));
}
adapteres.get(i).writeTo(pos, dataList, out);
}
++pos;
}
return pos;
}
}