package com.josketres.builderator; import org.apache.commons.beanutils.PropertyUtils; import java.beans.PropertyDescriptor; class MetadataExtractor { private TargetClass data; private Class<?> targetClass; public MetadataExtractor(Class<?> targetClass) { this.targetClass = targetClass; } public TargetClass getMetadata() { data = new TargetClass(); data.setName(targetClass.getSimpleName()); data.setQualifiedName(targetClass.getName()); data.setPackageName(targetClass.getPackage().getName()); addProperties(); return data; } private void addProperties() { PropertyDescriptor[] desc = PropertyUtils .getPropertyDescriptors(targetClass); for (PropertyDescriptor descriptor : desc) { Property property = extractPropertyMetadata(descriptor); if (property != null) { data.addProperty(property); } } } private Property extractPropertyMetadata(PropertyDescriptor descriptor) { Property property = null; if (descriptor != null && !descriptor.getPropertyType().equals(Class.class) && descriptor.getWriteMethod() != null) { Class<?> type = descriptor.getPropertyType(); String name = descriptor.getName(); String simpleName = type.getSimpleName(); String writeMethod = getSetterName(descriptor); String typeQualifiedName = getTypeQualifiedName(type); property = createProperty(type, simpleName, name, writeMethod, typeQualifiedName); } return property; } private String getTypeQualifiedName(Class<?> type) { return type.getName(); } public Property createProperty(Class<?> typeClass, String type, String name, String setterName, String typeQualifiedName) { Property property = new Property(); property.setTypeClass(typeClass); property.setType(type); property.setName(name); property.setSetterName(setterName); property.setQualifiedName(typeQualifiedName); return property; } private String getSetterName(PropertyDescriptor descriptor) { if (descriptor.getWriteMethod() != null) { return descriptor.getWriteMethod().getName(); } return null; } }