Commit 1e34598bbfafca0889beb9d5db32b66edac0af10
1 parent
419d9682
Exists in
master
and in
1 other branch
Allow to parse array for datatype other than char and charUnicode
Showing
1 changed file
with
93 additions
and
11 deletions
Show diff stats
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; |
... | ... |