package org.esa.snap.ui.product.metadata; import org.esa.snap.core.datamodel.MetadataAttribute; import org.esa.snap.core.datamodel.MetadataElement; import org.esa.snap.core.datamodel.ProductData; import org.openide.nodes.AbstractNode; import java.util.ArrayList; import java.util.List; import static org.esa.snap.core.datamodel.ProductData.*; /** * @author Tonio Fincke */ public class MetadataTableInnerElement implements MetadataTableElement { private final MetadataElement metadataElement; private final MetadataTableElement[] metadataTableElements; public MetadataTableInnerElement(MetadataElement metadataElement) { this.metadataElement = metadataElement; metadataTableElements = getChildrenElementsFromElement(metadataElement); } @Override public MetadataTableElement[] getMetadataTableElements() { return metadataTableElements; } @Override public String getName() { return metadataElement.getName(); } @Override public AbstractNode createNode() { return new MetadataElementInnerNode(this); } private static MetadataTableElement[] getChildrenElementsFromElement(MetadataElement metadataElement) { MetadataElement[] elements = metadataElement.getElements(); MetadataAttribute[] attributes = metadataElement.getAttributes(); List<MetadataTableElement> metadataTableElementList = new ArrayList<>(); for (MetadataElement element : elements) { metadataTableElementList.add(new MetadataTableInnerElement(element)); } for (MetadataAttribute attribute : attributes) { final long dataElemSize = attribute.getNumDataElems(); if (dataElemSize > 1) { final int dataType = attribute.getDataType(); ProductData data = attribute.getData(); if ((ProductData.isFloatingPointType(dataType) || ProductData.isIntType(dataType)) && !(data instanceof ProductData.UTC)) { addMetadataAttributes(attribute, data, metadataTableElementList); } else { metadataTableElementList.add(new MetadataTableLeaf(attribute)); } } else { metadataTableElementList.add(new MetadataTableLeaf(attribute)); } } return metadataTableElementList.toArray(new MetadataTableElement[metadataTableElementList.size()]); } private static void addMetadataAttributes(MetadataAttribute attribute, ProductData data, List<MetadataTableElement> metadataTableElementList) { final String name = attribute.getName(); final int dataType = attribute.getDataType(); final String unit = attribute.getUnit(); final String description = attribute.getDescription(); for (int j = 0; j < data.getNumElems(); j++) { final MetadataAttribute partAttribute = new MetadataAttribute(name + "." + (j + 1), dataType); try { partAttribute.setDataElems(getDataElemArray(data, j)); } catch (IllegalArgumentException e) { e.printStackTrace(); } partAttribute.setUnit(unit); partAttribute.setDescription(description); metadataTableElementList.add(new MetadataTableLeaf(partAttribute)); } } private static Object getDataElemArray(ProductData data, int index) { switch (data.getType()) { case TYPE_INT8: return new byte[]{(byte)data.getElemIntAt(index)}; case TYPE_INT16: return new short[]{(short)data.getElemIntAt(index)}; case TYPE_INT32: return new int[]{data.getElemIntAt(index)}; case TYPE_UINT8: return new short[]{(short)data.getElemIntAt(index)}; case TYPE_UINT16: return new int[]{data.getElemIntAt(index)}; case TYPE_UINT32: return new long[]{data.getElemUIntAt(index)}; case TYPE_INT64: return new long[]{data.getElemLongAt(index)}; case TYPE_FLOAT32: return new float[]{data.getElemFloatAt(index)}; case TYPE_FLOAT64: return new double[]{data.getElemDoubleAt(index)}; default: return null; } } }