package net.codjo.dataprocess.common.table.model;
import net.codjo.dataprocess.common.table.annotations.PrimaryKey;
import net.codjo.dataprocess.common.table.annotations.Table;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class TableModel {
private Class<?> clazz;
private List<FieldModel> fields;
private HandlerIdProvider handlerIdProvider;
public TableModel(Class<?> clazz) {
this(clazz, new DefaultHandlerIdProvider(clazz));
}
public TableModel(Class<?> clazz, HandlerIdProvider handlerIdProvider) {
this.clazz = clazz;
this.handlerIdProvider = handlerIdProvider;
}
public String getName() {
Table table = clazz.getAnnotation(Table.class);
return table.name();
}
public List<FieldModel> getFields() {
if (fields == null) {
fields = new ArrayList<FieldModel>();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(net.codjo.dataprocess.common.table.annotations.Field.class)) {
net.codjo.dataprocess.common.table.annotations.Field fieldAnno
= field.getAnnotation(net.codjo.dataprocess.common.table.annotations.Field.class);
String name = fieldAnno.name().length() == 0 ? field.getName() : fieldAnno.name();
FieldModel fieldModel = new FieldModel(name, field.getType(), fieldAnno.type());
fieldModel.setDescription(fieldAnno.description());
if (field.isAnnotationPresent(PrimaryKey.class)) {
fieldModel.setPk(true);
}
fields.add(fieldModel);
}
}
}
return fields;
}
public List<FieldModel> getPks() {
List<FieldModel> pks = new ArrayList<FieldModel>();
for (FieldModel fieldModel : getFields()) {
if (fieldModel.isPk()) {
pks.add(fieldModel);
}
}
return pks;
}
public List<FieldModel> getNotPks() {
List<FieldModel> pks = new ArrayList<FieldModel>();
for (FieldModel fieldModel : getFields()) {
if (!fieldModel.isPk()) {
pks.add(fieldModel);
}
}
return pks;
}
public String[] getPkAsStrArray() {
List<String> pks = new ArrayList<String>();
for (FieldModel fieldModel : getFields()) {
if (fieldModel.isPk()) {
pks.add(fieldModel.getName());
}
}
return pks.toArray(new String[pks.size()]);
}
public HandlerIdProvider getHandlerIdProvider() {
return handlerIdProvider;
}
}