}
if (parent == reportEnvironmentDataRow)
{
final String[] columnNames = reportEnvironmentDataRow.getColumnNames();
final String name = columnNames[index];
final ReportDataSchemaModel model = getContext().getReportDataSchemaModel();
final Class targetClass = reportEnvironmentDataRow.isRolesArray(name) ? String[].class : String.class;
return new ReportFieldNode(model, name, targetClass);
}
if (parent == reportFunctionNode)
{
return getExpressions().getExpression(index);
}
if (parent instanceof DataFactory)
{
final DataFactory dataFactory = (DataFactory) parent;
final String[] queryNames = dataFactory.getQueryNames();
return new ReportQueryNode(dataFactory, queryNames[index], true);
}
if (parent instanceof ReportQueryNode)
{
final ReportQueryNode queryNode = (ReportQueryNode) parent;
final DataFactory dataFactory = queryNode.getDataFactory();
final ReportDataSchemaModel model = context.getReportDataSchemaModel();
if (model.isSelectedDataSource(dataFactory, queryNode.getQueryName()))
{
final String[] names = getDataFactoryColumns();
final String name = names[index];
final DataAttributes attributes = model.getDataSchema().getAttributes(name);
final Class type = (Class) attributes.getMetaAttribute
(MetaAttributeNames.Core.NAMESPACE, MetaAttributeNames.Core.TYPE, Class.class, model.getDataAttributeContext());
return new ReportFieldNode(model, dataFactory, name, type);
}
throw new IndexOutOfBoundsException();
}