Commit 2c530b054c2b0d4eb9845d294c646bd6840de082
1 parent
1bc7a17a
Exists in
master
bugFix: Parse numeric data correctly.
Showing
1 changed file
with
35 additions
and
39 deletions
Show diff stats
src/main/java/eu/omp/irap/vespa/epntapclient/votable/controller/VOTableDataParser.java
@@ -17,6 +17,7 @@ | @@ -17,6 +17,7 @@ | ||
17 | package eu.omp.irap.vespa.epntapclient.votable.controller; | 17 | package eu.omp.irap.vespa.epntapclient.votable.controller; |
18 | 18 | ||
19 | import java.io.IOException; | 19 | import java.io.IOException; |
20 | +import java.nio.ByteBuffer; | ||
20 | import java.util.ArrayList; | 21 | import java.util.ArrayList; |
21 | import java.util.Base64; | 22 | import java.util.Base64; |
22 | import java.util.HashMap; | 23 | import java.util.HashMap; |
@@ -53,7 +54,7 @@ public class VOTableDataParser { | @@ -53,7 +54,7 @@ public class VOTableDataParser { | ||
53 | private String[] columnsName; | 54 | private String[] columnsName; |
54 | 55 | ||
55 | /** The byte array stored in the VOTable Table stream (if any). */ | 56 | /** The byte array stored in the VOTable Table stream (if any). */ |
56 | - private byte[] bytes; | 57 | + private ByteBuffer stream; |
57 | 58 | ||
58 | /** The index of the current position in the bytes array. */ | 59 | /** The index of the current position in the bytes array. */ |
59 | private int cursor; | 60 | private int cursor; |
@@ -178,19 +179,19 @@ public class VOTableDataParser { | @@ -178,19 +179,19 @@ public class VOTableDataParser { | ||
178 | /** | 179 | /** |
179 | * get the data on its BINARY form. | 180 | * get the data on its BINARY form. |
180 | * | 181 | * |
181 | - * @param stream the data Stream in the VOTable Table. | 182 | + * @param voStream the data Stream in the VOTable Table. |
182 | * @param fields The Fields corresponding to the Table. | 183 | * @param fields The Fields corresponding to the Table. |
183 | * @throws UnsupportedOperationException Data as arrays are not supported yet. | 184 | * @throws UnsupportedOperationException Data as arrays are not supported yet. |
184 | */ | 185 | */ |
185 | - private void parseBinaryStream(Stream stream, List<Field> fields) { | 186 | + private void parseBinaryStream(Stream voStream, List<Field> fields) { |
186 | logger.info("Parsing data in BINARY stream..."); | 187 | logger.info("Parsing data in BINARY stream..."); |
187 | - String strStream = stream.getValue().replaceAll("(\r|\n)", ""); | 188 | + String strStream = voStream.getValue().replaceAll("(\r|\n)", ""); |
188 | 189 | ||
189 | - bytes = Base64.getDecoder().decode(strStream); | 190 | + stream = ByteBuffer.wrap(Base64.getDecoder().decode(strStream)); |
190 | Object[] row = new Object[columnsName.length]; | 191 | Object[] row = new Object[columnsName.length]; |
191 | 192 | ||
192 | int nValue = 0; | 193 | int nValue = 0; |
193 | - while (cursor < bytes.length) { | 194 | + while (stream.hasRemaining()) { |
194 | int nColumn = nValue % columnsName.length; | 195 | int nColumn = nValue % columnsName.length; |
195 | Field column = fields.get(nColumn); | 196 | Field column = fields.get(nColumn); |
196 | DataType dataType = column.getDatatype(); | 197 | DataType dataType = column.getDatatype(); |
@@ -214,39 +215,50 @@ public class VOTableDataParser { | @@ -214,39 +215,50 @@ public class VOTableDataParser { | ||
214 | if (column.getArraysize() == null) { | 215 | if (column.getArraysize() == null) { |
215 | arraySize = blockSize; | 216 | arraySize = blockSize; |
216 | } else if ("*".equals(column.getArraysize())) { | 217 | } else if ("*".equals(column.getArraysize())) { |
217 | - arraySize = getValue(4) * blockSize; | 218 | + arraySize = stream.getInt() * blockSize; |
218 | } else { | 219 | } else { |
219 | arraySize = Integer.parseInt(column.getArraysize()) * blockSize; | 220 | arraySize = Integer.parseInt(column.getArraysize()) * blockSize; |
220 | } | 221 | } |
221 | - | ||
222 | if ((arraySize != blockSize) && !(dataType.equals(DataType.CHAR) | 222 | if ((arraySize != blockSize) && !(dataType.equals(DataType.CHAR) |
223 | || dataType.equals(DataType.UNICODE_CHAR))) { | 223 | || dataType.equals(DataType.UNICODE_CHAR))) { |
224 | - throw new UnsupportedOperationException("Data as arrays are not supported yet."); | 224 | + throw new UnsupportedOperationException("Numeric data as array are not supported."); |
225 | } | 225 | } |
226 | 226 | ||
227 | if (nColumn == 0) { | 227 | if (nColumn == 0) { |
228 | row = new Object[columnsName.length]; | 228 | row = new Object[columnsName.length]; |
229 | } | 229 | } |
230 | 230 | ||
231 | - if (dataType.equals(DataType.CHAR) || dataType.equals(DataType.UNICODE_CHAR)) { | 231 | + if (dataType.equals(DataType.BOOLEAN)) { |
232 | + row[nColumn] = new Boolean(stream.getInt() == 0 ? false : true); | ||
233 | + } else if (dataType.equals(DataType.UNSIGNED_BYTE)) { | ||
234 | + row[nColumn] = stream.get(); | ||
235 | + } else if (dataType.equals(DataType.SHORT)) { | ||
236 | + row[nColumn] = stream.getShort(); | ||
237 | + } else if (dataType.equals(DataType.INT)) { | ||
238 | + row[nColumn] = stream.getInt(); | ||
239 | + } else if (dataType.equals(DataType.LONG)) { | ||
240 | + row[nColumn] = stream.getLong(); | ||
241 | + } else if (dataType.equals(DataType.CHAR)) { | ||
232 | String value = new String(); | 242 | String value = new String(); |
233 | - for (int i = 0; i < arraySize && cursor < bytes.length; i += blockSize) { | ||
234 | - value += (char) getValue(blockSize); | 243 | + for (int i = 0; i < arraySize && cursor < stream.capacity(); i++) { |
244 | + value += (char) stream.get(); | ||
235 | } | 245 | } |
236 | row[nColumn] = value.trim(); | 246 | row[nColumn] = value.trim(); |
237 | - } else if (dataType.equals(DataType.BOOLEAN) || dataType.equals(DataType.BIT)) { | ||
238 | - row[nColumn] = new Boolean(getValue(blockSize) == 0 ? false : true); | ||
239 | - } else if (dataType.equals(DataType.UNSIGNED_BYTE) || dataType.equals(DataType.SHORT)) { | ||
240 | - row[nColumn] = new Short((short) getValue(blockSize)); | ||
241 | - } else if (dataType.equals(DataType.INT)) { | ||
242 | - row[nColumn] = new Integer(getValue(blockSize)); | ||
243 | - } else if (dataType.equals(DataType.LONG)) { | ||
244 | - row[nColumn] = new Long(getValue(blockSize)); | ||
245 | - } else { // float | ||
246 | - row[nColumn] = new Float(getValue(blockSize)); | 247 | + } else if (dataType.equals(DataType.UNICODE_CHAR)) { |
248 | + String value = new String(); | ||
249 | + for (int i = 0; i < arraySize && cursor < stream.capacity(); i += 2) { | ||
250 | + value += stream.getChar(); | ||
251 | + } | ||
252 | + row[nColumn] = value.trim(); | ||
253 | + } else if (dataType.equals(DataType.FLOAT)) { | ||
254 | + row[nColumn] = stream.getFloat(); | ||
255 | + } else if (dataType.equals(DataType.DOUBLE)) { | ||
256 | + row[nColumn] = stream.getDouble(); | ||
257 | + } else { | ||
258 | + logger.warn("Data type " + dataType + " is not supprted."); | ||
247 | } | 259 | } |
248 | 260 | ||
249 | - // logger.debug("**" + columnsName[nColumn] + "**: " + row[nColumn]) | 261 | + // logger.debug(columnsName[nColumn] + ": " + row[nColumn]) |
250 | 262 | ||
251 | row[nColumn] = row[nColumn]; | 263 | row[nColumn] = row[nColumn]; |
252 | if (nColumn == columnsName.length - 1) { | 264 | if (nColumn == columnsName.length - 1) { |
@@ -283,20 +295,4 @@ public class VOTableDataParser { | @@ -283,20 +295,4 @@ public class VOTableDataParser { | ||
283 | logger.info("Parsing data in FITS stream..."); | 295 | logger.info("Parsing data in FITS stream..."); |
284 | // TODO Implement parseFITSStream() | 296 | // TODO Implement parseFITSStream() |
285 | } | 297 | } |
286 | - | ||
287 | - /** | ||
288 | - * Get the integer value of a bytes block. For example, [0x01, 0x05] returns 230, and increment | ||
289 | - * the cursor. | ||
290 | - * | ||
291 | - * @param blockSize The size of the bytes block to get | ||
292 | - * @return The integer value of the bytes block. | ||
293 | - */ | ||
294 | - private int getValue(int blockSize) { | ||
295 | - int intVal = 0; | ||
296 | - for (int i = 0; i < blockSize; i++) { | ||
297 | - intVal += 0xFF & (bytes[cursor + i] << ((blockSize - 1 - i) * 8)); | ||
298 | - } | ||
299 | - cursor += blockSize; | ||
300 | - return intVal; | ||
301 | - } | ||
302 | } | 298 | } |