package com.venky.swf.db.model.io.xls;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.poi.ss.usermodel.Row;
import com.venky.core.collections.SequenceSet;
import com.venky.core.string.StringUtil;
import com.venky.swf.db.Database;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.io.ModelIO;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.db.model.reflection.uniquekey.UniqueKey;
import com.venky.swf.db.model.reflection.uniquekey.UniqueKeyFieldDescriptor;
import com.venky.swf.db.table.Table;
import com.venky.swf.routing.Config;
public class XLSModelIO<M extends Model> extends ModelIO<M>{
protected XLSModelIO(Class<M> beanClass) {
super(beanClass);
}
protected void loadFieldsToExport(SequenceSet<String> fields, String baseFieldHeading , ModelReflector<? extends Model> referredModelReflector){
for (UniqueKey<? extends Model> k : referredModelReflector.getUniqueKeys()){
for (UniqueKeyFieldDescriptor<? extends Model> ukf: k.getFields()){
if (ukf.getReferredModelReflector() == null){
if (ukf.isExportable() && referredModelReflector.isFieldExportable(ukf.getFieldName())){
fields.add(baseFieldHeading + "." + StringUtil.camelize(ukf.getFieldName()));
}
}else {
loadFieldsToExport(fields, baseFieldHeading + "." + StringUtil.camelize(ukf.getFieldName().substring(0,ukf.getFieldName().length() - "_ID".length())) , ukf.getReferredModelReflector());
}
}
}
if (fields.isEmpty()){
fields.add(baseFieldHeading + ".Id");
}
}
protected Object getValue(Model record, String headingName){
StringTokenizer fieldPartTokenizer = new StringTokenizer(headingName,".");
ModelReflector<? extends Model> ref = getReflector();
Model current = record;
while (fieldPartTokenizer.hasMoreTokens()){
String nextToken = fieldPartTokenizer.nextToken();
if (fieldPartTokenizer.hasMoreTokens()){
String referenceFieldName = StringUtil.underscorize(nextToken + "Id");
Integer value = ref.get(current, referenceFieldName);
if (Database.getJdbcTypeHelper(ref.getPool()).isVoid(value)){
break;
}
Class<? extends Model> referredModelClass = ref.getReferredModelClass(ref.getReferredModelGetterFor(ref.getFieldGetter(referenceFieldName)));
Table<?> table = Database.getTable(referredModelClass);
current = table.get(value);
if (current == null){
Config.instance().getLogger(getReflector().getModelClass().getName()).warning( table.getRealTableName() + " doesnot have id " + value + " being Referenced from " + getReflector().getTableName());
break;
}
ref = table.getReflector();
}else {
return ref.get(current, StringUtil.underscorize(nextToken));
}
}
return null;
}
protected Method getGetter(Row row, String heading, Map<String, Integer> headingIndexMap) {
return getGetter(heading);
}
protected Method getGetter(Row row, String heading) {
return getGetter(heading);
}
protected Method getGetter(String heading){
StringTokenizer tok = new StringTokenizer(heading, ".");
String firstPart = tok.nextToken();
return super.getGetter(firstPart);
}
}