package org.skyscreamer.yoga.selector;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("rawtypes")
public class FieldSelector implements Selector
{
protected Map<String, FieldSelector> subSelectors = new HashMap<String, FieldSelector>();
private HashMap<String, Property> allFields;
@Override
public FieldSelector getChildSelector( Class<?> instanceType, String fieldName )
{
return getSelector( fieldName );
}
public FieldSelector getSelector( String fieldName )
{
return subSelectors.get( fieldName );
}
@Override
public boolean containsField( Class<?> instanceType, String property )
{
return containsField( property );
}
@Override
public <T> Property<T> getProperty(Class<T> instanceType, String fieldName)
{
return getAllPossibleFieldMap( instanceType ).get( fieldName );
}
public boolean containsField( String property )
{
return subSelectors.containsKey( property );
}
public int getFieldCount()
{
return subSelectors.size();
}
public void register( String fieldName, FieldSelector subSelector )
{
subSelectors.put( fieldName, subSelector );
}
@Override
public <T> Collection<Property<T>> getSelectedFields( Class<T> instanceType )
{
return getAllPossibleFieldMap( instanceType ).values();
}
@SuppressWarnings("unchecked")
@Override
public <T> Map<String, Property<T>> getAllPossibleFieldMap(Class<T> instanceType)
{
if(allFields == null)
{
// The assumption is that this case will only be called with 1 consistent instance type... which is why we can cache allFields
allFields = new HashMap<String, Property>();
for (String name : subSelectors.keySet())
{
allFields.put( name, new NamedProperty<T>( name ) );
}
}
return (HashMap) allFields;
}
@Override
public boolean isInfluencedExternally()
{
return true;
}
}