105 lines
4.0 KiB
Java
105 lines
4.0 KiB
Java
package org.warp.cowdb.database;
|
|
|
|
import org.warp.cowdb.EnhancedObject;
|
|
import org.warp.cowdb.IDataInitializer;
|
|
import org.warp.jcwdb.ann.DBDataType;
|
|
import org.warp.jcwdb.ann.DBField;
|
|
import org.warp.jcwdb.ann.DBPropertyGetter;
|
|
import org.warp.jcwdb.ann.DBPropertySetter;
|
|
|
|
import java.io.IOException;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
|
|
public class DatabaseDataInitializer implements IDataInitializer {
|
|
|
|
private final DatabaseObjectsIO objectsIO;
|
|
|
|
public DatabaseDataInitializer(DatabaseObjectsIO objectsIO) {
|
|
this.objectsIO = objectsIO;
|
|
}
|
|
|
|
@Override
|
|
public void initializeDBObject(EnhancedObject obj) throws IOException {
|
|
initializeDBObjectFields(obj);
|
|
initializeDBObjectProperties(obj);
|
|
}
|
|
|
|
private void initializeDBObjectFields(EnhancedObject obj) throws IOException {
|
|
// Declare the variables needed to get the biggest field Id
|
|
Field[] unorderedFields = objectsIO.getFields(obj);
|
|
// Find the biggest field Id
|
|
int biggestFieldId = objectsIO.getBiggestFieldId(unorderedFields);
|
|
|
|
// Allocate new UIDs
|
|
long[] fieldUIDs = objectsIO.allocateNewUIDs(biggestFieldId + 1);
|
|
|
|
// Declare the other variables
|
|
Field[] fields = new Field[biggestFieldId + 1];
|
|
DBDataType[] orderedFieldTypes = new DBDataType[biggestFieldId + 1];
|
|
|
|
// Load all fields metadata and load them
|
|
for (Field field : unorderedFields) {
|
|
DBField fieldAnnotation = field.getAnnotation(DBField.class);
|
|
int fieldId = fieldAnnotation.id();
|
|
DBDataType fieldType = fieldAnnotation.type();
|
|
objectsIO.loadField(obj, field, fieldType, fieldUIDs[fieldId]);
|
|
fields[fieldId] = field;
|
|
orderedFieldTypes[fieldId] = fieldType;
|
|
}
|
|
// Set fields metadata
|
|
obj.setFields(fields, orderedFieldTypes, fieldUIDs);
|
|
}
|
|
|
|
private void initializeDBObjectProperties(EnhancedObject obj) throws IOException {
|
|
// Declare the variables needed to get the biggest property Id
|
|
Method[] unorderedPropertyGetters = obj.getPropertyGetters();
|
|
Method[] unorderedPropertySetters = obj.getPropertySetters();
|
|
|
|
// Find the biggest property Id
|
|
int biggestGetter = objectsIO.getBiggestPropertyGetterId(unorderedPropertyGetters);
|
|
int biggestSetter = objectsIO.getBiggestPropertySetterId(unorderedPropertySetters);
|
|
int biggestPropertyId = biggestGetter > biggestSetter ? biggestGetter : biggestSetter;
|
|
|
|
// Allocate new UIDs
|
|
long[] propertyUIDs = objectsIO.allocateNewUIDs(biggestPropertyId + 1);
|
|
|
|
for (Method property : unorderedPropertySetters) {
|
|
DBPropertySetter fieldAnnotation = property.getAnnotation(DBPropertySetter.class);
|
|
int propertyId = fieldAnnotation.id();
|
|
if (propertyId > biggestPropertyId) {
|
|
biggestPropertyId = propertyId;
|
|
}
|
|
}
|
|
|
|
// Declare the other variables
|
|
DBDataType[] propertyTypes = new DBDataType[biggestPropertyId + 1];
|
|
Method[] propertyGetters = new Method[biggestPropertyId + 1];
|
|
Method[] propertySetters = new Method[biggestPropertyId + 1];
|
|
Map<String, DBPropertySetter> setterMethods = new LinkedHashMap<>();
|
|
Map<String, DBPropertyGetter> getterMethods = new LinkedHashMap<>();
|
|
|
|
// Load the properties metadata
|
|
for (Method property : unorderedPropertyGetters) {
|
|
DBPropertyGetter propertyAnnotation = property.getAnnotation(DBPropertyGetter.class);
|
|
int propertyId = propertyAnnotation.id();
|
|
DBDataType propertyType = propertyAnnotation.type();
|
|
propertyTypes[propertyId] = propertyType;
|
|
propertyGetters[propertyId] = property;
|
|
getterMethods.put(property.getName(), propertyAnnotation);
|
|
}
|
|
for (Method property : unorderedPropertySetters) {
|
|
DBPropertySetter propertyAnnotation = property.getAnnotation(DBPropertySetter.class);
|
|
int propertyId = propertyAnnotation.id();
|
|
DBDataType propertyType = propertyAnnotation.type();
|
|
propertyTypes[propertyId] = propertyType;
|
|
propertySetters[propertyId] = property;
|
|
setterMethods.put(property.getName(), propertyAnnotation);
|
|
}
|
|
// Set properties metadata
|
|
obj.setProperties(propertyGetters, propertySetters, propertyTypes, propertyUIDs, setterMethods, getterMethods);
|
|
}
|
|
}
|