package org.warp.jcwdb.ann; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.LinkedHashMap; import java.util.Map; public class DataInitializer { private final DataLoader dataLoader; public DataInitializer(DataLoader dataLoader) { this.dataLoader = dataLoader; } public void initializeDBObject(DBObject obj) throws IOException { initializeDBObjectFields(obj); initializeDBObjectProperties(obj); obj.initialize(); } private void initializeDBObjectFields(DBObject obj) throws IOException { // Declare the variables needed to get the biggest field Id Field[] unorderedFields = dataLoader.getFields(obj); // Find the biggest field Id int biggestFieldId = dataLoader.getBiggestFieldId(unorderedFields); // Allocate new UIDs long[] fieldUIDs = dataLoader.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(); dataLoader.loadField(obj, field, fieldType, fieldUIDs[fieldId]); fields[fieldId] = field; orderedFieldTypes[fieldId] = fieldType; } // Set fields metadata obj.setFields(fields, orderedFieldTypes, fieldUIDs); } private void initializeDBObjectProperties(DBObject obj) { // 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 = dataLoader.getBiggestPropertyGetterId(unorderedPropertyGetters); int biggestSetter = dataLoader.getBiggestPropertySetterId(unorderedPropertySetters); int biggestPropertyId = biggestGetter > biggestSetter ? biggestGetter : biggestSetter; // Allocate new UIDs long[] propertyUIDs = dataLoader.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 setterMethods = new LinkedHashMap<>(); Map 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); } }