package com.netflix.fabricator; /** * Encapsulate a representation of a property and different method variations * for setting it. * * I. Primitive type * prefix.${id}.field1=boolean|number|string|list|... withField1(String value) * withField1(Supplier<String> value) * withField1(ListenableSupplier<String> value) * * II. Named * 1. prefix.${id}.field1=${name} withField1(Foo foo); * * bind(Foo.class).annotatedWith("name").to(FooImpl.class) // Has a named binding * MapBinder<String, Snack> mapbinder * = MapBinder.newMapBinder(binder(), String.class, Snack.class); * * III. Policy (policy is an interface) * 1. prefix.${id}.policy1.type MapBinder<String, Snack> mapbinder * prefix.${id}.policy1.field1=... = MapBinder.newMapBinder(binder(), String.class, Snack.class); * * IV. Embedded (embedded is a complex type) withFoo(Foo foo); // No named binding * 1. prefix.${id}.embedded1.field1 * prefix.${id}.embedded2.field2 * * @author elandau */ public class PropertyInfo { private String name; private PropertyBinder simple; private PropertyBinder dynamic; private PropertyBinder binding; public PropertyInfo(String name) { this.name = name; } public void addSimple(PropertyBinder simple) { this.simple = simple; } public void addDynamic(PropertyBinder dynamic) { this.dynamic = dynamic; } public void addBinding(PropertyBinder binding) { this.binding = binding; } public void apply(Object obj, ConfigurationNode config) throws Exception { if (binding != null && binding.bind(obj, config)) {} else if (dynamic != null && dynamic.bind(obj, config)) {} else if (simple != null && simple.bind(obj, config)) {} } public String getName() { return name; } }