package io.ebeaninternal.server.dto;
import io.ebeaninternal.server.type.TypeManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
Build the DtoMeta for a bean.
Use TypeManager to map bean property types to ScalarTypes.
/**
* Build the DtoMeta for a bean.
* <p>
* Use TypeManager to map bean property types to ScalarTypes.
*/
class DtoMetaBuilder {
private static final Logger log = LoggerFactory.getLogger(DtoMetaBuilder.class);
private final TypeManager typeManager;
private final Class<?> dtoType;
private final List<DtoMetaProperty> properties = new ArrayList<>();
private final List<DtoMetaConstructor> constructorList = new ArrayList<>();
DtoMetaBuilder(Class<?> dtoType, TypeManager typeManager) {
this.dtoType = dtoType;
this.typeManager = typeManager;
}
public DtoMeta build() throws IntrospectionException {
readConstructors();
readProperties();
return new DtoMeta(dtoType, constructorList, properties);
}
private void readProperties() throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(dtoType);
for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
if (include(propertyDescriptor)) {
try {
properties.add(new DtoMetaProperty(typeManager, propertyDescriptor, dtoType));
} catch (Exception e) {
log.debug("exclude on " + dtoType + " property " + propertyDescriptor.getName(), e);
}
}
}
}
private void readConstructors() {
Constructor<?>[] constructors = dtoType.getConstructors();
for (Constructor<?> constructor : constructors) {
try {
constructorList.add(new DtoMetaConstructor(typeManager, constructor, dtoType));
} catch (Exception e) {
// we don't want that constructor
log.debug("exclude on " + dtoType + " constructor " + constructor, e);
}
}
}
private boolean include(PropertyDescriptor property) {
return !property.getName().equals("class");
}
}