Commit 1e34598bbfafca0889beb9d5db32b66edac0af10

Authored by Mickael Boiziot
1 parent 419d9682
Exists in master and in 1 other branch b6.0.X

Allow to parse array for datatype other than char and charUnicode

src/main/java/eu/omp/irap/vespa/votable/votabledata/BinaryStreamParser.java
... ... @@ -20,6 +20,7 @@ import java.nio.BufferUnderflowException;
20 20 import java.nio.ByteBuffer;
21 21 import java.util.ArrayList;
22 22 import java.util.List;
  23 +import java.util.StringJoiner;
23 24 import java.util.logging.Level;
24 25 import java.util.logging.Logger;
25 26  
... ... @@ -158,10 +159,6 @@ public final class BinaryStreamParser implements DataParser {
158 159 } else {
159 160 arraySize = Integer.parseInt(column.getArraysize()) * blockSize;
160 161 }
161   - if (arraySize != blockSize && !(dataType.equals(DataType.CHAR)
162   - || dataType.equals(DataType.UNICODE_CHAR))) {
163   - throw new UnsupportedOperationException("Numeric data as array are not supported.");
164   - }
165 162 return arraySize;
166 163 }
167 164  
... ... @@ -172,16 +169,77 @@ public final class BinaryStreamParser implements DataParser {
172 169 */
173 170 private Object processDataBlock(DataType dataType) {
174 171 Object dataBlock;
  172 + int blockSize = getBlockSize(dataType);
175 173 if (dataType.equals(DataType.BOOLEAN)) {
176   - dataBlock = new Boolean(stream.getInt() == 0 ? false : true);
  174 + if (rowSize != blockSize) {
  175 + int nb = rowSize / blockSize;
  176 + if (nb == 0) { dataBlock = ""; }
  177 + else {
  178 + StringJoiner sj = new StringJoiner(" ", "", "");
  179 + for (int i = 0; i < nb; i++) {
  180 + sj.add(String.valueOf(new Boolean(stream.getInt() == 0 ? false : true)));
  181 + }
  182 + dataBlock = sj.toString();
  183 + }
  184 + } else {
  185 + dataBlock = new Boolean(stream.getInt() == 0 ? false : true);
  186 + }
177 187 } else if (dataType.equals(DataType.UNSIGNED_BYTE)) {
178   - dataBlock = stream.get();
  188 + if (rowSize != blockSize) {
  189 + int nb = rowSize / blockSize;
  190 + if (nb == 0) { dataBlock = ""; }
  191 + else {
  192 + StringJoiner sj = new StringJoiner(" ", "", "");
  193 + for (int i = 0; i < nb; i++) {
  194 + sj.add(String.valueOf(stream.get()));
  195 + }
  196 + dataBlock = sj.toString();
  197 + }
  198 + } else {
  199 + dataBlock = stream.get();
  200 + }
179 201 } else if (dataType.equals(DataType.SHORT)) {
180   - dataBlock = stream.getShort();
  202 + if (rowSize != blockSize) {
  203 + int nb = rowSize / blockSize;
  204 + if (nb == 0) { dataBlock = ""; }
  205 + else {
  206 + StringJoiner sj = new StringJoiner(" ", "", "");
  207 + for (int i = 0; i < nb; i++) {
  208 + sj.add(String.valueOf(stream.getShort()));
  209 + }
  210 + dataBlock = sj.toString();
  211 + }
  212 + } else {
  213 + dataBlock = stream.getShort();
  214 + }
181 215 } else if (dataType.equals(DataType.INT)) {
182   - dataBlock = stream.getInt();
  216 + if (rowSize != blockSize) {
  217 + int nb = rowSize / blockSize;
  218 + if (nb == 0) { dataBlock = ""; }
  219 + else {
  220 + StringJoiner sj = new StringJoiner(" ", "", "");
  221 + for (int i = 0; i < nb; i++) {
  222 + sj.add(String.valueOf(stream.getInt()));
  223 + }
  224 + dataBlock = sj.toString();
  225 + }
  226 + } else {
  227 + dataBlock = stream.getInt();
  228 + }
183 229 } else if (dataType.equals(DataType.LONG)) {
184   - dataBlock = stream.getLong();
  230 + if (rowSize != blockSize) {
  231 + int nb = rowSize / blockSize;
  232 + if (nb == 0) { dataBlock = ""; }
  233 + else {
  234 + StringJoiner sj = new StringJoiner(" ", "", "");
  235 + for (int i = 0; i < nb; i++) {
  236 + sj.add(String.valueOf(stream.getLong()));
  237 + }
  238 + dataBlock = sj.toString();
  239 + }
  240 + } else {
  241 + dataBlock = stream.getLong();
  242 + }
185 243 } else if (dataType.equals(DataType.CHAR)) {
186 244 String value = new String();
187 245 for (int i = 0; i < rowSize && cursor < stream.capacity()
... ... @@ -196,9 +254,33 @@ public final class BinaryStreamParser implements DataParser {
196 254 }
197 255 dataBlock = value.trim();
198 256 } else if (dataType.equals(DataType.FLOAT)) {
199   - dataBlock = stream.getFloat();
  257 + if (rowSize != blockSize) {
  258 + int nb = rowSize / blockSize;
  259 + if (nb == 0) { dataBlock = ""; }
  260 + else {
  261 + StringJoiner sj = new StringJoiner(" ", "", "");
  262 + for (int i = 0; i < nb; i++) {
  263 + sj.add(String.valueOf(stream.getFloat()));
  264 + }
  265 + dataBlock = sj.toString();
  266 + }
  267 + } else {
  268 + dataBlock = stream.getFloat();
  269 + }
200 270 } else if (dataType.equals(DataType.DOUBLE)) {
201   - dataBlock = stream.getDouble();
  271 + if (rowSize != blockSize) {
  272 + int nb = rowSize / blockSize;
  273 + if (nb == 0) { dataBlock = ""; }
  274 + else {
  275 + StringJoiner sj = new StringJoiner(" ", "", "");
  276 + for (int i = 0; i < nb; i++) {
  277 + sj.add(String.valueOf(stream.getDouble()));
  278 + }
  279 + dataBlock = sj.toString();
  280 + }
  281 + } else {
  282 + dataBlock = stream.getDouble();
  283 + }
202 284 } else {
203 285 BinaryStreamParser.LOGGER.warning("Data type " + dataType + " is not supported.");
204 286 dataBlock = null;
... ...