diff --git a/src/main/java/eu/omp/irap/vespa/votable/votabledata/BinaryStreamParser.java b/src/main/java/eu/omp/irap/vespa/votable/votabledata/BinaryStreamParser.java index 4070fcb..91609e9 100644 --- a/src/main/java/eu/omp/irap/vespa/votable/votabledata/BinaryStreamParser.java +++ b/src/main/java/eu/omp/irap/vespa/votable/votabledata/BinaryStreamParser.java @@ -20,6 +20,7 @@ import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; import java.util.logging.Level; import java.util.logging.Logger; @@ -158,10 +159,6 @@ public final class BinaryStreamParser implements DataParser { } else { arraySize = Integer.parseInt(column.getArraysize()) * blockSize; } - if (arraySize != blockSize && !(dataType.equals(DataType.CHAR) - || dataType.equals(DataType.UNICODE_CHAR))) { - throw new UnsupportedOperationException("Numeric data as array are not supported."); - } return arraySize; } @@ -172,16 +169,77 @@ public final class BinaryStreamParser implements DataParser { */ private Object processDataBlock(DataType dataType) { Object dataBlock; + int blockSize = getBlockSize(dataType); if (dataType.equals(DataType.BOOLEAN)) { - dataBlock = new Boolean(stream.getInt() == 0 ? false : true); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(new Boolean(stream.getInt() == 0 ? false : true))); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = new Boolean(stream.getInt() == 0 ? false : true); + } } else if (dataType.equals(DataType.UNSIGNED_BYTE)) { - dataBlock = stream.get(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.get())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.get(); + } } else if (dataType.equals(DataType.SHORT)) { - dataBlock = stream.getShort(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.getShort())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.getShort(); + } } else if (dataType.equals(DataType.INT)) { - dataBlock = stream.getInt(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.getInt())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.getInt(); + } } else if (dataType.equals(DataType.LONG)) { - dataBlock = stream.getLong(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.getLong())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.getLong(); + } } else if (dataType.equals(DataType.CHAR)) { String value = new String(); for (int i = 0; i < rowSize && cursor < stream.capacity() @@ -196,9 +254,33 @@ public final class BinaryStreamParser implements DataParser { } dataBlock = value.trim(); } else if (dataType.equals(DataType.FLOAT)) { - dataBlock = stream.getFloat(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.getFloat())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.getFloat(); + } } else if (dataType.equals(DataType.DOUBLE)) { - dataBlock = stream.getDouble(); + if (rowSize != blockSize) { + int nb = rowSize / blockSize; + if (nb == 0) { dataBlock = ""; } + else { + StringJoiner sj = new StringJoiner(" ", "", ""); + for (int i = 0; i < nb; i++) { + sj.add(String.valueOf(stream.getDouble())); + } + dataBlock = sj.toString(); + } + } else { + dataBlock = stream.getDouble(); + } } else { BinaryStreamParser.LOGGER.warning("Data type " + dataType + " is not supported."); dataBlock = null; -- libgit2 0.21.2