X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2FImporter.java;h=84fb5aae5742f49bcf68cd915906a2b7322a399b;hb=a359464fcf59af8abc6f69ae0e88e42adc6018df;hp=61093f754e158642e82a63ec27da598b17a6e929;hpb=8c8da42a501ff223ee1340ab71d03df481649e78;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/Importer.java b/src/be/nikiroo/utils/serial/Importer.java index 61093f7..84fb5aa 100644 --- a/src/be/nikiroo/utils/serial/Importer.java +++ b/src/be/nikiroo/utils/serial/Importer.java @@ -26,6 +26,9 @@ public class Importer { private String currentFieldName; + /** + * Create a new {@link Importer}. + */ public Importer() { map = new HashMap(); map.put("NULL", null); @@ -53,26 +56,42 @@ 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) */ public Importer read(String data) throws NoSuchFieldException, - NoSuchMethodException, ClassNotFoundException { + NoSuchMethodException, ClassNotFoundException, IOException { + Scanner scan = new Scanner(data); 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())); + try { + line = StringUtils.unbase64s( + line.substring("ZIP:".length()), true); + } catch (IOException e) { + throw new IOException( + "Internal error when decoding ZIP content: input may be corrupt"); + } + read(line); + } else if (line.startsWith("B64:")) { + try { + line = StringUtils.unbase64s( + line.substring("B64:".length()), false); + } catch (IOException e) { + throw new IOException( + "Internal error when decoding B64 content: input may be corrupt"); + } + read(line); + } else { + processLine(line); } - processLine(line); - } + } finally { scan.close(); - } catch (IOException e) { - throw new NoSuchMethodException( - "Internal error when decoding ZIP content: input may be corrupt"); } return this; @@ -95,9 +114,11 @@ 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 { + NoSuchMethodException, ClassNotFoundException, IOException { // Defer to latest child if any if (child != null) { if (child.processLine(line)) { @@ -118,18 +139,34 @@ public class Importer { } else if (line.equals("}")) { // STOP: report self to parent return true; } else if (line.startsWith("REF ")) { // REF: create/link self - String ref = line.substring(4).split("@")[1]; + String[] tab = line.substring("REF ".length()).split("@"); + String type = tab[0]; + tab = tab[1].split(":"); + String ref = tab[0]; + link = map.containsKey(ref); if (link) { me = map.get(ref); } else { - me = SerialUtils.createObject(line.substring(4).split("@")[0]); + if (line.endsWith(":")) { + // construct + me = SerialUtils.createObject(type); + } else { + // direct value + int pos = line.indexOf(":"); + String encodedValue = line.substring(pos + 1); + me = SerialUtils.decode(encodedValue); + } map.put(ref, me); } - } else { // FIELD: new field + } else { // FIELD: new field *or* direct simple value if (line.endsWith(":")) { // field value is compound currentFieldName = line.substring(0, line.length() - 1); + } else if (line.startsWith(":") || !line.contains(":") + || line.startsWith("\"") || CustomSerializer.isCustom(line)) { + // not a field value but a direct value + me = SerialUtils.decode(line); } else { // field value is direct int pos = line.indexOf(":");