
com.j256.ormlite.table.DatabaseTableConfig Maven / Gradle / Ivy
package com.j256.ormlite.table;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import com.j256.ormlite.db.DatabaseType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.DatabaseFieldConfig;
import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.misc.JavaxPersistence;
/**
* Database table configuration information either supplied by Spring or direct Java wiring or from a
* {@link DatabaseTable} annotation.
*
* @author graywatson
*/
public class DatabaseTableConfig {
private Class dataClass;
private String tableName;
private List fieldConfigs;
private FieldType[] fieldTypes;
public DatabaseTableConfig() {
// for spring
}
public DatabaseTableConfig(Class dataClass, List fieldConfigs) {
this(dataClass, extractTableName(dataClass), fieldConfigs);
}
public DatabaseTableConfig(Class dataClass, String tableName, List fieldConfigs) {
this.dataClass = dataClass;
this.tableName = tableName;
this.fieldConfigs = fieldConfigs;
}
private DatabaseTableConfig(Class dataClass, String tableName, FieldType[] fieldTypes) {
this.dataClass = dataClass;
this.tableName = tableName;
this.fieldTypes = fieldTypes;
}
public void initialize() {
if (dataClass == null) {
throw new IllegalStateException("dataClass was never set on " + getClass().getSimpleName());
}
if (tableName == null) {
tableName = extractTableName(dataClass);
}
}
public Class getDataClass() {
return dataClass;
}
// @Required
public void setDataClass(Class dataClass) {
this.dataClass = dataClass;
}
public String getTableName() {
return tableName;
}
/**
* Set the table name which is turned into lowercase. If not specified then the name is gotten from the class name.
*/
public void setTableName(String tableName) {
this.tableName = tableName.toLowerCase();
}
public void setFieldConfigs(List fieldConfigs) {
this.fieldConfigs = fieldConfigs;
}
public FieldType[] extractFieldTypes(DatabaseType databaseType) {
if (fieldTypes == null) {
if (fieldConfigs == null) {
fieldTypes = extractFieldTypes(databaseType, dataClass, tableName);
} else {
fieldTypes = convertFieldConfigs(databaseType, tableName, fieldConfigs);
}
}
return fieldTypes;
}
public static DatabaseTableConfig fromClass(DatabaseType databaseType, Class clazz) {
String tableName = extractTableName(clazz);
if (databaseType.isEntityNamesMustBeUpCase()) {
tableName = tableName.toUpperCase();
}
return new DatabaseTableConfig(clazz, tableName, extractFieldTypes(databaseType, clazz, tableName));
}
private static FieldType[] extractFieldTypes(DatabaseType databaseType, Class clazz, String tableName) {
List fieldTypes = new ArrayList();
for (Field field : clazz.getDeclaredFields()) {
FieldType fieldType = FieldType.createFieldType(databaseType, tableName, field);
if (fieldType != null) {
fieldTypes.add(fieldType);
}
}
if (fieldTypes.size() == 0) {
throw new IllegalArgumentException("No fields have a " + DatabaseField.class.getSimpleName()
+ " annotation in " + clazz);
}
return fieldTypes.toArray(new FieldType[fieldTypes.size()]);
}
private static String extractTableName(Class clazz) {
DatabaseTable databaseTable = clazz.getAnnotation(DatabaseTable.class);
String name = null;
if (databaseTable != null && databaseTable.tableName() != null && databaseTable.tableName().length() > 0) {
name = databaseTable.tableName();
} else {
/*
* NOTE: to remove javax.persistence usage, comment the following line out
*/
name = JavaxPersistence.getEntityName(clazz);
if (name == null) {
// if the name isn't specified, it is the class name lowercased
name = clazz.getSimpleName().toLowerCase();
}
}
return name;
}
private FieldType[] convertFieldConfigs(DatabaseType databaseType, String tableName,
List fieldConfigs) {
List fieldTypes = new ArrayList();
for (DatabaseFieldConfig fieldConfig : fieldConfigs) {
Field field;
try {
field = dataClass.getDeclaredField(fieldConfig.getFieldName());
} catch (Exception e) {
throw new IllegalArgumentException("Could not configure field with name '" + fieldConfig.getFieldName()
+ "' for " + dataClass, e);
}
FieldType fieldType = new FieldType(databaseType, tableName, field, fieldConfig);
fieldTypes.add(fieldType);
}
if (fieldTypes.size() == 0) {
throw new IllegalArgumentException("No fields have a " + DatabaseField.class + " annotation in "
+ dataClass);
}
return fieldTypes.toArray(new FieldType[fieldTypes.size()]);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy