package org.skyscreamer.yoga.selector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
public class CompositeSelector implements Selector
{
protected final CoreSelector coreSelector;
protected final FieldSelector fieldSelector;
public CompositeSelector( CoreSelector coreSelector, FieldSelector fieldSelector )
{
this.coreSelector = coreSelector;
this.fieldSelector = fieldSelector;
}
@Override
public Selector getChildSelector( Class<?> instanceType, String fieldName )
{
FieldSelector fieldSelectorChild = fieldSelector.getChildSelector( instanceType, fieldName );
if (fieldSelectorChild == null)
{
return coreSelector;
}
else
{
return new CompositeSelector( coreSelector, fieldSelectorChild );
}
}
@Override
public boolean containsField( Class<?> instanceType, String property )
{
return coreSelector.containsField( instanceType, property )
|| fieldSelector.containsField( instanceType, property );
}
@Override
public <T> Property<T> getProperty(Class<T> instanceType, String fieldName)
{
Property<T> property = coreSelector.getProperty(instanceType, fieldName);
return property != null ? property : fieldSelector.getProperty(instanceType, fieldName);
}
@Override
public <T> Collection<Property<T>> getSelectedFields( Class<T> instanceType )
{
ArrayList<Property<T>> list = new ArrayList<Property<T>>();
for( Property<T> p : fieldSelector.getSelectedFields( instanceType ) )
{
Property<T> property = coreSelector.getProperty( instanceType, p.name() );
if(property != null)
{
list.add( property );
}
}
Collection<Property<T>> coreFields = coreSelector.getSelectedFields( instanceType );
if ( coreFields != null )
{
list.addAll( coreFields );
}
return list;
}
@Override
public <T> Map<String, Property<T>> getAllPossibleFieldMap( Class<T> instanceType )
{
return coreSelector.getAllPossibleFieldMap( instanceType );
}
@Override
public boolean isInfluencedExternally()
{
return true;
}
}