All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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