package openmods.sync;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import java.lang.reflect.Field;
import java.util.List;
import openmods.Log;
import openmods.utils.FieldsSelector;
public class SyncObjectScanner extends FieldsSelector {
public static final SyncObjectScanner INSTANCE = new SyncObjectScanner();
@Override
protected List<FieldEntry> listFields(Class<?> cls) {
List<FieldEntry> result = Lists.newArrayList();
while (cls != Object.class) {
for (Field f : cls.getDeclaredFields())
if (ISyncableObject.class.isAssignableFrom(f.getType())) result.add(new FieldEntry(f, 0));
cls = cls.getSuperclass();
}
return result;
}
public void registerAllFields(SyncMap<?> map, Object target) {
for (Field field : getFields(target.getClass())) {
ISyncableObject obj;
try {
obj = (ISyncableObject)field.get(target);
Preconditions.checkNotNull(obj, "Null field value");
} catch (Exception e) {
obj = DummySyncableObject.INSTANCE;
Log.severe(e, "Exception while registering synced field '%s' of object '%s'", field, target);
}
final String fieldName = field.getName();
map.put(fieldName, obj);
}
}
}