for (AutoBeanMethod method : type.getMethods()) {
if (!method.getAction().equals(JBeanMethod.GET)) {
continue;
}
AutoBeanMethod setter = null;
// If it's not a simple bean type, try to find a real setter method
if (!type.isSimpleBean()) {
for (AutoBeanMethod maybeSetter : type.getMethods()) {
boolean isASetter =
maybeSetter.getAction().equals(JBeanMethod.SET)
|| maybeSetter.getAction().equals(JBeanMethod.SET_BUILDER);
if (isASetter && maybeSetter.getPropertyName().equals(method.getPropertyName())) {
setter = maybeSetter;
break;
}
}
}
// The type of property influences the visitation
String valueExpression =
String.format("bean = (%1$s) %2$s.getAutoBean(as.%3$s());", AbstractAutoBean.class
.getCanonicalName(), AutoBeanUtils.class.getCanonicalName(), method.getMethod()
.getName());
String visitMethod;
String visitVariable = "bean";
if (method.isCollection()) {
visitMethod = "Collection";
} else if (method.isMap()) {
visitMethod = "Map";
} else if (method.isValueType()) {
valueExpression = String.format("value = as.%s();", method.getMethod().getName());
visitMethod = "Value";
visitVariable = "value";
} else {
visitMethod = "Reference";
}
sw.println(valueExpression);
// Map<List<Foo>, Bar> --> Map, List, Foo, Bar
List<JType> typeList = new ArrayList<JType>();
createTypeList(typeList, method.getMethod().getReturnType());
assert typeList.size() > 0;
/*
* Make the PropertyContext that lets us call the setter. We allow
* multiple methods to be bound to the same property (e.g. to allow JSON
* payloads to be interpreted as different types). The leading underscore
* allows purely numeric property names, which are valid JSON map keys.
*/
// propertyContext = new CPContext(.....);
sw.println("propertyContext = new %s(", ClientPropertyContext.class.getCanonicalName());
sw.indent();
// The instance on which the context is nominally operating
sw.println("as,");
// Produce a JSNI reference to a setter function to call
{
if (setter != null) {
// Call a method that returns a JSNI reference to the method to call
// setFooMethodReference(),
sw.println("%sMethodReference(as),", setter.getMethod().getName());
referencedSetters.add(setter);
} else {
// Create a function that will update the values map
// CPContext.beanSetter(FooBeanImpl.this, "foo");
sw.println("%s.beanSetter(%s.this, \"%s\"),", ClientPropertyContext.Setter.class