String format = (String)STRING_SERIALIZER.deserialize(input);
int version = (Integer)INTEGER_SERIALIZER.deserialize(input);
@SuppressWarnings("unchecked")
- TreeMap<String,Variant> metadata = (TreeMap<String,Variant>)METADATA_SERIALIZER.deserialize(input);
+ TreeMap<String,Variant> metadata = (TreeMap<String,Variant>)METADATA_SERIALIZER.deserialize(input);
return new DataContainer(format, version, metadata, null);
}
-
+
/**
* Consumes a header from a given stream and checks that the header satisfies the given format and version.
* Returns the obtained header if the check fails and null on success.
* @throws IOException
*/
public static DataContainer requireHeader(DataInput input, String format, int version) {
- try {
- DataContainer header = readHeader(input);
- if(!format.equals(header.format) || version != header.version)
- return header;
- else return null;
- } catch (Throwable t) {
- return new DataContainer("unknown", 0, null, null);
- }
+ try {
+ DataContainer header = readHeader(input);
+ if(!format.equals(header.format) || version != header.version)
+ return header;
+ else return null;
+ } catch (Throwable t) {
+ return new DataContainer("unknown", 0, null, null);
+ }
}
/**
* @throws IOException
*/
public static DataContainer validateHeader(File file, String format, int version) throws IOException {
-
- InputStream stream = new FileInputStream( file );
- try {
- return DataContainers.requireHeader(new DataInputStream(stream), format, version);
- } finally {
- stream.close();
- }
-
+ try (InputStream stream = new FileInputStream( file )) {
+ return DataContainers.requireHeader(new DataInputStream(stream), format, version);
+ }
}
/**
* @throws IOException
*/
public static DataContainer validateHeader(File file, String... allowedFormatStrings) throws IOException {
-
- InputStream stream = new FileInputStream( file );
- try {
+ try (InputStream stream = new FileInputStream( file )) {
return DataContainers.requireHeader(new DataInputStream(stream), allowedFormatStrings);
- } finally {
- stream.close();
}
-
}
/**
* @throws IOException
*/
public static DataContainer readHeader(File input) throws IOException {
- BinaryFile rf = new BinaryFile( input, "r" );
- try {
+ try (BinaryFile rf = new BinaryFile( input, "r" )) {
return readHeader(rf);
- } finally {
- rf.close();
- }
+ }
}
-
+
/**
* Reads a data container including the content data.
* @throws IOException
return result;
}
+ /**
+ * Reads a data container including the content data.
+ * @throws IOException
+ */
+ public static DataContainer readFile(DataInput input, Binding expectedBinding) throws IOException, DataFormatException {
+ DataContainer result = readHeader(input);
+ Datatype contentType = (Datatype) DATATYPE_SERIALIZER.deserialize(input);
+ if (!expectedBinding.type().equals(contentType))
+ throw new DataFormatException(
+ "Content type didn't match the type expected for the binding " + expectedBinding
+ + ":\nexpected type: " + expectedBinding.type()
+ + "\nactual type: " + contentType);
+ Object value = Bindings.getSerializerUnchecked(expectedBinding).deserialize(input);
+ result.content = new Variant(expectedBinding, value);
+ return result;
+ }
+
/**
* Process a data container using a format handler matching the format and version
* of the file.
*/
public static <T> T readFile(DataInput input, Map<String, FormatHandler<T>> handlers) throws Exception {
DataContainer result = readHeader(input);
-
+
FormatHandler<T> handler = handlers.get(result.format + ":" + result.version);
if(handler == null)
throw new DataFormatException("Unknown data format " + result.format + " version " + result.version + ".");
Binding binding = handler.getBinding();
-
+
Datatype contentType = (Datatype)DATATYPE_SERIALIZER.deserialize(input);
if(!binding.type().equals(contentType))
throw new DataFormatException("Content type didn't match the type expected for the format " + result.format + " version " + result.version + ".");
-
+
Object value = Bindings.getSerializerUnchecked(binding).deserialize(input);
-
+
result.content = new Variant(binding, value);
return handler.process(result);
}
-
+
/**
* Reads a data container including the content data.
* @throws IOException
*/
public static DataContainer readFile(File input) throws IOException {
- BinaryFile rf = new BinaryFile( input, "r" );
- try {
+ try (BinaryFile rf = new BinaryFile( input, "r" )) {
return readFile(rf);
- } finally {
- rf.close();
- }
+ }
+ }
+
+ /**
+ * Reads a data container including the content data.
+ * @throws IOException
+ * @throws DataFormatException
+ */
+ public static DataContainer readFile(File input, Binding expectedBinding) throws IOException, DataFormatException {
+ try (BinaryFile rf = new BinaryFile( input, "r" )) {
+ return readFile(rf, expectedBinding);
+ }
}
-
+
/**
* Process a data container using a format handler matching the format and version
* of the file.
* @param handlers Map of handlers. Keys are strings of form "format:version".
*/
public static <T> T readFile(File input, Map<String, FormatHandler<T>> handlers) throws Exception {
- BinaryFile rf = new BinaryFile( input, "r" );
- try {
+ try (BinaryFile rf = new BinaryFile( input, "r" )) {
return readFile(rf, handlers);
- } finally {
- rf.close();
- }
+ }
}
-
+
/**
* Writes header fields of a container to the given output. Content field is
* ignored.
INTEGER_SERIALIZER.serialize(output, container.version);
METADATA_SERIALIZER.serialize(output, container.metadata);
}
-
+
/**
* Writes a data container to the given output.
* @throws IOException
writeHeader(output, container);
VARIANT_SERIALIZER.serialize(output, container.content);
}
-
+
/**
* Writes a data container to the given file
* @throws IOException
*/
public static void writeFile(File output, DataContainer container) throws IOException {
- BinaryFile wf = new BinaryFile( output);
- try {
+ try (BinaryFile wf = new BinaryFile(output)) {
writeFile(wf, container);
- } finally {
- wf.close();
- }
+ wf.setLength(wf.position());
+ }
}
-
+
public static byte[] writeFile(DataContainer container) throws IOException {
return DATA_CONTAINER_SERIALIZER.serialize(container);
}
+
}