X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2FImporter.java;h=6531cdba99f420c8778b3c2d990854b667b7d387;hb=4d31956549a05df6dca42d58a1150a348a58dcd1;hp=a159ddedf4763859aefe8fc51ac82479d567ce0f;hpb=f157aed840bdd5b8ef04902d2326d916f71139da;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/Importer.java b/src/be/nikiroo/utils/serial/Importer.java index a159dde..6531cdb 100644 --- a/src/be/nikiroo/utils/serial/Importer.java +++ b/src/be/nikiroo/utils/serial/Importer.java @@ -1,11 +1,14 @@ package be.nikiroo.utils.serial; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; -import java.util.Scanner; +import be.nikiroo.utils.IOUtils; +import be.nikiroo.utils.NextableInputStream; +import be.nikiroo.utils.NextableInputStreamStep; import be.nikiroo.utils.StringUtils; /** @@ -56,27 +59,45 @@ public class Importer { * because it is not compatible with this code * @throws ClassNotFoundException * if a class described in the serialised data cannot be found + * @throws IOException + * if the content cannot be read (for instance, corrupt data) + * @throws NullPointerException + * if the stream is empty */ - public Importer read(String data) throws NoSuchFieldException, - NoSuchMethodException, ClassNotFoundException { + public Importer read(InputStream in) throws NoSuchFieldException, + NoSuchMethodException, ClassNotFoundException, IOException, + NullPointerException { + + NextableInputStream stream = new NextableInputStream(in, + new NextableInputStreamStep('\n')); try { - Scanner scan = new Scanner(data); - scan.useDelimiter("\n"); - while (scan.hasNext()) { - String line = scan.next(); - - if (line.startsWith("ZIP:")) { - line = StringUtils.unzip64(line.substring("ZIP:".length())); - read(line); + if (in == null) { + throw new NullPointerException("InputStream is null"); + } + if (stream.eof()) { + throw new NullPointerException("InputStream is empty"); + } + + while (stream.next()) { + boolean zip = stream.startsWiths("ZIP:"); + boolean b64 = stream.startsWiths("B64:"); + + if (zip || b64) { + stream.skip("XXX:".length()); + InputStream decoded = StringUtils.unbase64(stream.open(), + zip); + try { + read(decoded); + } finally { + decoded.close(); + } } else { - processLine(line); + processLine(stream); } } - scan.close(); - } catch (IOException e) { - throw new NoSuchMethodException( - "Internal error when decoding ZIP content: input may be corrupt"); + } finally { + stream.close(false); } return this; @@ -99,12 +120,15 @@ public class Importer { * because it is not compatible with this code * @throws ClassNotFoundException * if a class described in the serialised data cannot be found + * @throws IOException + * if the content cannot be read (for instance, corrupt data) */ - private boolean processLine(String line) throws NoSuchFieldException, - NoSuchMethodException, ClassNotFoundException { + private boolean processLine(InputStream in) throws NoSuchFieldException, + NoSuchMethodException, ClassNotFoundException, IOException { + // Defer to latest child if any if (child != null) { - if (child.processLine(line)) { + if (child.processLine(in)) { if (currentFieldName != null) { setField(currentFieldName, child.getValue()); currentFieldName = null; @@ -115,6 +139,9 @@ public class Importer { return false; } + // TODO use the stream, Luke + String line = IOUtils.readSmallStream(in); + if (line.equals("{")) { // START: new child if needed if (link != null) { child = new Importer(map); @@ -146,7 +173,8 @@ public class Importer { if (line.endsWith(":")) { // field value is compound currentFieldName = line.substring(0, line.length() - 1); - } else if (line.startsWith(":") || !line.contains(":")) { + } else if (line.startsWith(":") || !line.contains(":") + || line.startsWith("\"") || CustomSerializer.isCustom(line)) { // not a field value but a direct value me = SerialUtils.decode(line); } else {