org.sfm.reflect.meta.TuplePropertyFinder Maven / Gradle / Ivy
package org.sfm.reflect.meta;
import org.sfm.reflect.ConstructorDefinition;
import org.sfm.reflect.ConstructorParameter;
import org.sfm.reflect.TypeHelper;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class TuplePropertyFinder implements PropertyFinder {
private final TupleClassMeta tupleClassMeta;
private final List> elements;
private List> constructorDefinitions;
public TuplePropertyFinder(TupleClassMeta tupleClassMeta) {
this.tupleClassMeta = tupleClassMeta;
this.constructorDefinitions = tupleClassMeta.getConstructorDefinitions();
this.elements = new ArrayList>();
for(int i = 0; i < tupleClassMeta.getTupleSize(); i++) {
elements.add(newIndexedElement(tupleClassMeta, i));
}
}
private IndexedElement newIndexedElement(TupleClassMeta tupleClassMeta, int i) {
Type resolvedType = ((ParameterizedType) tupleClassMeta.getType()).getActualTypeArguments()[i];
ConstructorPropertyMeta prop =
new ConstructorPropertyMeta("element" + (i),
"element" + (i), tupleClassMeta.getReflectionService(),
new ConstructorParameter("element" + (i), Object.class, resolvedType));
ClassMeta classMeta = tupleClassMeta.getReflectionService().getClassMeta(resolvedType);
return new IndexedElement(prop, classMeta);
}
@Override
public PropertyMeta findProperty(PropertyNameMatcher propertyNameMatcher) {
IndexedColumn indexedColumn = propertyNameMatcher.matchesIndex();
if (indexedColumn == null) {
indexedColumn = extrapolateIndex(propertyNameMatcher);
}
if (indexedColumn == null || calculateTupleIndex(indexedColumn) >= elements.size()) {
return null;
}
IndexedElement indexedElement = elements.get(calculateTupleIndex(indexedColumn));
if (!indexedColumn.hasSubProperty()) {
return indexedElement.getPropertyMeta();
}
PropertyFinder> propertyFinder = indexedElement.getPropertyFinder();
if (propertyFinder == null) {
return null;
}
PropertyMeta, ?> subProp = propertyFinder.findProperty(indexedColumn.getSubPropertyNameMatcher());
if (subProp == null) {
return null;
}
indexedElement.addProperty(subProp);
return new SubPropertyMeta(tupleClassMeta.getReflectionService(), indexedElement.getPropertyMeta(), subProp);
}
private int calculateTupleIndex(IndexedColumn indexedColumn) {
return indexedColumn.getIndexValue();
}
private IndexedColumn extrapolateIndex(PropertyNameMatcher propertyNameMatcher) {
for(int i = 0; i < elements.size(); i++) {
IndexedElement element = elements.get(i);
if (element.getElementClassMeta() != null) {
PropertyFinder> pf = element.getPropertyFinder();
PropertyMeta, Object> property = pf.findProperty(propertyNameMatcher);
if (property != null) {
if (!element.hasProperty(property)) {
return new IndexedColumn("element" + (i), i , propertyNameMatcher);
}
}
}
}
return null;
}
@Override
public List> getEligibleConstructorDefinitions() {
return constructorDefinitions;
}
@Override
public Class> getClassToInstantiate() {
return TypeHelper.toClass(tupleClassMeta.getType());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy