* @param type the type for which to gather properties
* @return the map of nested properties keyed by expression name
*/
protected Map<String, Property> getPropertyExpressions(Type<?> type) {
PropertyResolverStrategy propertyResolver = getPropertyResolver();
Map<String, Property> properties = new HashMap<String, Property>();
LinkedHashMap<String, Property> toProcess = new LinkedHashMap<String, Property>(propertyResolver.getProperties(type));
if (type.isMap() || type.isList() || type.isArray()) {
Property selfReferenceProperty =
new Property.Builder()
.name("").getter("").setter(" = %s").type(TypeFactory.valueOf(type))
.build((PropertyResolver) propertyResolver);
toProcess.put("", selfReferenceProperty);
}
while (!toProcess.isEmpty()) {
Entry<String, Property> entry = toProcess.entrySet().iterator().next();
if (!entry.getKey().equals("class")) {
Property owningProperty = entry.getValue();
Type<?> propertyType = owningProperty.getType();
if (!ClassUtil.isImmutable(propertyType)) {
Map<String, Property> props = propertyResolver.getProperties(propertyType);
if (propertyType.isMap()) {
Map<String, Property> valueProperties = getPropertyExpressions(propertyType.getNestedType(1));
for (Entry<String, Property> prop: valueProperties.entrySet()) {
Property elementProp = new NestedElementProperty(entry.getValue(), prop.getValue(), propertyResolver);
String key = entry.getKey() + PropertyResolver.ELEMENT_PROPERT_PREFIX + prop.getKey() + PropertyResolver.ELEMENT_PROPERT_SUFFIX;