
org.sfm.reflect.meta.MapPropertyFinder Maven / Gradle / Ivy
package org.sfm.reflect.meta;
import org.sfm.reflect.InstantiatorDefinition;
import org.sfm.tuples.Tuple2;
import org.sfm.utils.ErrorHelper;
import org.sfm.utils.conv.Converter;
import java.util.*;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class MapPropertyFinder, K, V> implements PropertyFinder {
private final ClassMeta valueMetaData;
private final ClassMeta mapMeta;
private final Converter keyConverter;
private Map> finders = new HashMap>();
public MapPropertyFinder(ClassMeta mapMeta, ClassMeta valueMetaData, Converter keyConverter) {
this.mapMeta = mapMeta;
this.valueMetaData = valueMetaData;
this.keyConverter = keyConverter;
}
@Override
public PropertyMeta findProperty(PropertyNameMatcher propertyNameMatcher) {
try {
for(Tuple2 keyValue : propertyNameMatcher.keyValuePairs())
{
final PropertyNameMatcher keyMatcher = keyValue.first();
final PropertyNameMatcher valueMatcher = keyValue.second();
PropertyFinder propertyFinder = finders.get(keyMatcher);
if (propertyFinder == null) {
propertyFinder = valueMetaData.newPropertyFinder();
}
final PropertyMeta propertyMeta = propertyFinder.findProperty(valueMatcher);
if (propertyMeta != null) {
finders.put(keyMatcher, propertyFinder);
if (propertyMeta instanceof DirectClassMeta.DirectPropertyMeta) {
return newKeyProperty(keyMatcher);
} else {
return newSubPropertyMeta(keyMatcher, propertyMeta);
}
}
}
} catch(Exception e) {
ErrorHelper.rethrow(e);
}
return null;
}
private PropertyMeta newSubPropertyMeta(PropertyNameMatcher keyMatcher, PropertyMeta propertyMeta) throws Exception {
final PropertyMeta keyProperty = newKeyProperty(keyMatcher);
final SubPropertyMeta subPropertyMeta =
new SubPropertyMeta(
valueMetaData.getReflectionService(),
keyProperty,
(PropertyMeta) propertyMeta);
return subPropertyMeta;
}
private PropertyMeta newKeyProperty(PropertyNameMatcher propertyNameMatcher) throws Exception {
return (PropertyMeta)
new MapElementPropertyMeta(
propertyNameMatcher,
valueMetaData.getReflectionService(),
valueMetaData,
keyConverter.convert(propertyNameMatcher.toString()));
}
@Override
public List getEligibleInstantiatorDefinitions() {
return mapMeta.getInstantiatorDefinitions();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy