/** * Builds a {@link BindableDescriptor} for an initialized instance of a * {@link Bindable} type. Notice that the set of {@link AttributeDescriptor} found in * the returned {@link BindableDescriptor} may vary depending on how the provided * instance is initialized. * * @param initializedInstance initialized instance of a {@link Bindable} type for * which to build the descriptor * @return the descriptor built */ public static BindableDescriptor buildDescriptor(Object initializedInstance) { return buildDescriptor(initializedInstance, new HashSet<Object>()); }
final Map<String, AttributeDescriptor> attributeDescriptors = buildAttributeDescriptors( initializedInstance, bindableMetadata); if (fieldValue != null && fieldValue.getClass().getAnnotation(Bindable.class) != null) bindableDescriptors.put(field, buildDescriptor(fieldValue, processedInstances)); assert noHiddenBindables(field, initializedInstance, Bindable.class);
/** * Builds {@link AttributeDescriptor} for a field from a {@link Bindable} type. */ private static AttributeDescriptor buildAttributeDescriptor( Object initializedInstance, Field field, BindableMetadata bindableMetadata) { Object defaultValue = null; try { defaultValue = field.get(initializedInstance); } catch (IllegalAccessException e) { throw new AssertionError("An attribute field must be public: " + field.getDeclaringClass().getName() + "#" + field.getName()); } catch (Exception e) { throw new RuntimeException("Could not retrieve default value of attribute: " + BindableUtils.getKey(field), e); } AttributeMetadata attributeMetadata = null; if (bindableMetadata != null) { attributeMetadata = bindableMetadata.getAttributeMetadata().get( field.getName()); } return new AttributeDescriptor(field, defaultValue, getConstraintAnnotations(field), attributeMetadata); }
/** * Builds descriptors for direct attributes. */ private static Map<String, AttributeDescriptor> buildAttributeDescriptors( Object initializedInstance, BindableMetadata bindableMetadata) { final Class<?> clazz = initializedInstance.getClass(); final Map<String, AttributeDescriptor> result = Maps.newLinkedHashMap(); final Collection<Field> fieldsFromBindableHierarchy = BindableUtils .getFieldsFromBindableHierarchy(clazz); for (final Field field : fieldsFromBindableHierarchy) { if (field.getAnnotation(Attribute.class) != null) { result.put(BindableUtils.getKey(field), buildAttributeDescriptor( initializedInstance, field, bindableMetadata)); } } return result; }
assert BindableDescriptorBuilder.noHiddenBindables(field, object, markerAnnotation); continue;
/** * On commit, attempt to verify component class and instance availability. */ @Commit private void onCommit(Map<Object, Object> session) { this.initializationException = null; try { ResourceLookup resourceLookup = PersisterHelpers.getResourceLookup(session); loadAttributeSets(resourceLookup); bindableDescriptor = BindableDescriptorBuilder.buildDescriptor(newInitializedInstance()); } catch (Throwable e) { org.slf4j.LoggerFactory.getLogger(this.getClass()).warn( "Component unavailable: " + componentClassName, e); this.initializationException = e; } }
BindableDescriptorBuilder.buildDescriptor(component) .only(Input.class, Processing.class).flatten().attributeDescriptors, BindableDescriptorBuilder.buildDescriptor(component) .only(Output.class).flatten().attributeDescriptors);