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.util.List;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class TuplePropertyFinder extends AbstractIndexPropertyFinder {
private final List> constructorDefinitions;
public TuplePropertyFinder(TupleClassMeta tupleClassMeta) {
super(tupleClassMeta);
this.constructorDefinitions = tupleClassMeta.getConstructorDefinitions();
for(int i = 0; i < tupleClassMeta.getTupleSize(); i++) {
elements.add(newIndexedElement(tupleClassMeta, i));
}
}
private IndexedElement newIndexedElement(TupleClassMeta tupleClassMeta, int i) {
ConstructorPropertyMeta prop =
newConstructorPropertyMeta(tupleClassMeta, i);
ClassMeta classMeta = tupleClassMeta.getReflectionService().getClassMeta(prop.getType(), false);
return new IndexedElement(prop, classMeta);
}
private ConstructorPropertyMeta newConstructorPropertyMeta(TupleClassMeta tupleClassMeta, int i) {
Class tClass = TypeHelper.toClass(tupleClassMeta.getType());
final ConstructorParameter constructorParameter = constructorDefinitions.get(0).getParameters()[i];
return new ConstructorPropertyMeta(constructorParameter.getName(), tupleClassMeta.getReflectionService(),
constructorParameter, tClass);
}
@Override
protected boolean isValidIndex(IndexedColumn indexedColumn) {
return indexedColumn.getIndexValue() < elements.size();
}
@Override
protected IndexedElement getIndexedElement(IndexedColumn indexedColumn) {
return elements.get(indexedColumn.getIndexValue());
}
protected 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 property = pf.findProperty(propertyNameMatcher);
if (property != null) {
if (!element.hasProperty(property)) {
return new IndexedColumn(i , propertyNameMatcher);
}
}
}
}
return null;
}
@Override
public List> getEligibleConstructorDefinitions() {
return constructorDefinitions;
}
@Override
public ConstructorPropertyMeta findConstructor(ConstructorDefinition constructorDefinition) {
return null;
}
}