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

org.sfm.reflect.meta.ArrayPropertyFinder Maven / Gradle / Ivy

package org.sfm.reflect.meta;

import org.sfm.utils.BooleanSupplier;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class ArrayPropertyFinder extends AbstractIndexPropertyFinder {

	private final List> elements = new ArrayList>();


    public ArrayPropertyFinder(ArrayClassMeta arrayClassMeta) {
        super(arrayClassMeta);
    }

    @Override
    protected IndexedElement getIndexedElement(IndexedColumn indexedColumn) {
        while (elements.size() <= indexedColumn.getIndexValue()) {
            elements.add(new IndexedElement(newElementPropertyMeta(elements.size(), "element" + elements.size()), ((ArrayClassMeta)classMeta).getElementClassMeta()));
        }

        return elements.get(indexedColumn.getIndexValue());
	}

    private PropertyMeta newElementPropertyMeta(int index, String name) {
        ArrayClassMeta arrayClassMeta = (ArrayClassMeta) classMeta;
        if (arrayClassMeta.isArray()) {
            return new ArrayElementPropertyMeta(name,
                    arrayClassMeta.getReflectionService(), index, arrayClassMeta);
        } else {
            return new ListElementPropertyMeta(name,
                    arrayClassMeta.getReflectionService(), index, arrayClassMeta, new BooleanSupplier() {

                @Override
                public boolean getAsBoolean() {
                    return elements.size() == 1;
                }
            });
        }
    }

    @Override
    protected IndexedColumn extrapolateIndex(PropertyNameMatcher propertyNameMatcher) {
        final ClassMeta elementClassMeta = ((ArrayClassMeta)classMeta).getElementClassMeta();

        PropertyMeta property;

        property = elementClassMeta.newPropertyFinder().findProperty(propertyNameMatcher);
        if (property != null) {
            for (int i = 0; i < elements.size(); i++) {
                IndexedElement element = elements.get(i);
                if (!element.hasProperty(property)) {
                    return new IndexedColumn(i, propertyNameMatcher);
                }
            }

            return new IndexedColumn(elements.size(), propertyNameMatcher);
        }
		return null;
	}

    @Override
    protected boolean isValidIndex(IndexedColumn indexedColumn) {
        return indexedColumn.getIndexValue() >= 0;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy