29
29
import io .jhdf .object .datatype .FixedPoint ;
30
30
import io .jhdf .object .datatype .FloatingPoint ;
31
31
import io .jhdf .object .datatype .StringData ;
32
+ import io .jhdf .object .datatype .ArrayDataType ;
32
33
33
34
/**
34
35
* <p>
@@ -66,7 +67,7 @@ public static Object readDataset(DataType type, ByteBuffer buffer, int[] dimensi
66
67
// Scalar dataset
67
68
data = Array .newInstance (javaType , 1 );
68
69
isScalar = true ;
69
- dimensions = new int [] { 1 }; // Fake the dimensions
70
+ dimensions = new int []{ 1 }; // Fake the dimensions
70
71
} else {
71
72
data = Array .newInstance (javaType , dimensions );
72
73
isScalar = false ;
@@ -77,60 +78,72 @@ public static Object readDataset(DataType type, ByteBuffer buffer, int[] dimensi
77
78
ByteOrder byteOrder = fixedPoint .getByteOrder ();
78
79
if (fixedPoint .isSigned ()) {
79
80
switch (fixedPoint .getSize ()) {
80
- case 1 :
81
- fillData (data , dimensions , buffer .order (byteOrder ));
82
- break ;
83
- case 2 :
84
- fillData (data , dimensions , buffer .order (byteOrder ).asShortBuffer ());
85
- break ;
86
- case 4 :
87
- fillData (data , dimensions , buffer .order (byteOrder ).asIntBuffer ());
88
- break ;
89
- case 8 :
90
- fillData (data , dimensions , buffer .order (byteOrder ).asLongBuffer ());
91
- break ;
92
- default :
93
- throw new HdfTypeException (
94
- "Unsupported signed integer type size " + fixedPoint .getSize () + " bytes" );
81
+ case 1 :
82
+ fillData (data , dimensions , buffer .order (byteOrder ));
83
+ break ;
84
+ case 2 :
85
+ fillData (data , dimensions , buffer .order (byteOrder ).asShortBuffer ());
86
+ break ;
87
+ case 4 :
88
+ fillData (data , dimensions , buffer .order (byteOrder ).asIntBuffer ());
89
+ break ;
90
+ case 8 :
91
+ fillData (data , dimensions , buffer .order (byteOrder ).asLongBuffer ());
92
+ break ;
93
+ default :
94
+ throw new HdfTypeException (
95
+ "Unsupported signed integer type size " + fixedPoint .getSize () + " bytes" );
95
96
}
96
97
} else { // Unsigned
97
98
switch (fixedPoint .getSize ()) {
98
- case 1 :
99
- fillDataUnsigned (data , dimensions , buffer .order (byteOrder ));
100
- break ;
101
- case 2 :
102
- fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asShortBuffer ());
103
- break ;
104
- case 4 :
105
- fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asIntBuffer ());
106
- break ;
107
- case 8 :
108
- fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asLongBuffer ());
109
- break ;
110
- default :
111
- throw new HdfTypeException (
112
- "Unsupported signed integer type size " + fixedPoint .getSize () + " bytes" );
99
+ case 1 :
100
+ fillDataUnsigned (data , dimensions , buffer .order (byteOrder ));
101
+ break ;
102
+ case 2 :
103
+ fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asShortBuffer ());
104
+ break ;
105
+ case 4 :
106
+ fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asIntBuffer ());
107
+ break ;
108
+ case 8 :
109
+ fillDataUnsigned (data , dimensions , buffer .order (byteOrder ).asLongBuffer ());
110
+ break ;
111
+ default :
112
+ throw new HdfTypeException (
113
+ "Unsupported signed integer type size " + fixedPoint .getSize () + " bytes" );
113
114
}
114
115
}
115
116
} else if (type instanceof FloatingPoint ) {
116
117
FloatingPoint floatingPoint = (FloatingPoint ) type ;
117
118
ByteOrder byteOrder = floatingPoint .getByteOrder ();
118
119
119
120
switch (floatingPoint .getSize ()) {
120
- case 4 :
121
- fillData (data , dimensions , buffer .order (byteOrder ).asFloatBuffer ());
122
- break ;
123
- case 8 :
124
- fillData (data , dimensions , buffer .order (byteOrder ).asDoubleBuffer ());
125
- break ;
126
- default :
127
- throw new HdfTypeException (
128
- "Unsupported floating point type size " + floatingPoint .getSize () + " bytes" );
121
+ case 4 :
122
+ fillData (data , dimensions , buffer .order (byteOrder ).asFloatBuffer ());
123
+ break ;
124
+ case 8 :
125
+ fillData (data , dimensions , buffer .order (byteOrder ).asDoubleBuffer ());
126
+ break ;
127
+ default :
128
+ throw new HdfTypeException (
129
+ "Unsupported floating point type size " + floatingPoint .getSize () + " bytes" );
129
130
}
130
131
} else if (type instanceof StringData ) {
131
132
int stringLength = type .getSize ();
132
133
fillFixedLengthStringData (data , dimensions , buffer , stringLength );
133
- } else {
134
+ } else if (type instanceof ArrayDataType ) {
135
+ final ArrayDataType arrayType = (ArrayDataType ) type ;
136
+ if (dimensions .length !=1 ) {
137
+ throw new HdfException ("Multi dimension array data types are not supported" );
138
+ }
139
+
140
+ for (int i = 0 ; i < dimensions [0 ]; i ++) {
141
+ // Need to position the buffer ready for the read
142
+ buffer .position (i * arrayType .getBaseType ().getSize () * arrayType .getDimensions ()[0 ]);
143
+ Object elementDataset = readDataset (arrayType .getBaseType (), buffer , arrayType .getDimensions ());
144
+ Array .set (data , i , elementDataset );
145
+ }
146
+ }else {
134
147
throw new HdfException (
135
148
"DatasetReader was passed a type it cant fill. Type: " + type .getClass ().getCanonicalName ());
136
149
}
0 commit comments