/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.support.pva.adapters;
import java.util.ArrayList;
import java.util.List;
import org.epics.pvdata.pv.PVField;
import org.epics.pvdata.pv.PVScalarArray;
import org.epics.pvdata.pv.PVStringArray;
import org.epics.pvdata.pv.PVStructure;
import org.epics.pvdata.pv.ScalarType;
import org.epics.pvdata.pv.StringArrayData;
import org.diirt.vtype.VTable;
import org.diirt.vtype.VTypeToString;
/**
* @author msekoranja
*
*/
public class PVFieldToVTable implements VTable {
private final List<Class<?>> types;
private final List<String> names;
private final List<Object> values;
private final int rowCount;
/**
* @param pvField
* @param disconnected
*/
public PVFieldToVTable(PVStructure pvField, boolean disconnected) {
PVStringArray labelsField =
(PVStringArray)pvField.getScalarArrayField("labels", ScalarType.pvString);
String[] labels;
if (labelsField != null)
{
StringArrayData data = new StringArrayData();
labelsField.get(0, labelsField.getLength(), data);
labels = data.data;
}
else
labels = null;
PVStructure valueField = pvField.getStructureField("value");
if (valueField != null)
{
PVField[] cols = valueField.getPVFields();
int numCols = cols.length;
types = new ArrayList<Class<?>>(numCols);
names = new ArrayList<String>(numCols);
values = new ArrayList<Object>(numCols);
int maxRowCount = 0;
int nameIndex = 0;
for (PVField pvColumn : valueField.getPVFields())
{
PVScalarArray scalarArray = (PVScalarArray)pvColumn;
types.add(NTUtils.scalarArrayElementClass(scalarArray));
values.add(NTUtils.scalarArrayToList(scalarArray, true));
names.add(labels != null ? labels[nameIndex] : pvColumn.getFieldName());
int len = scalarArray.getLength();
if (len > maxRowCount) maxRowCount = len;
nameIndex++;
}
rowCount = maxRowCount;
}
else
{
names = null;
types = null;
values = null;
rowCount = -1;
}
}
@Override
public int getColumnCount() {
return names.size();
}
@Override
public int getRowCount() {
return rowCount;
}
@Override
public Class<?> getColumnType(int column) {
return types.get(column);
}
@Override
public String getColumnName(int column) {
return names.get(column);
}
@Override
public Object getColumnData(int column) {
return values.get(column);
}
@Override
public String toString() {
return VTypeToString.toString(this);
}
}