From 615ff12c27c4d51f39716fa1a78e8a75ffc17ebd Mon Sep 17 00:00:00 2001 From: JFronny Date: Sat, 20 Apr 2024 12:33:24 +0200 Subject: [PATCH] fix(serialize-xml): name encoding system for wrapper to support names unusable in XML --- .../serialize/xml/wrapper/NameEncoding.java | 18 ++++++++++++++ .../serialize/xml/wrapper/XmlReader.java | 24 +++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/NameEncoding.java diff --git a/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/NameEncoding.java b/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/NameEncoding.java new file mode 100644 index 0000000..d72af2e --- /dev/null +++ b/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/NameEncoding.java @@ -0,0 +1,18 @@ +package io.gitlab.jfronny.commons.serialize.xml.wrapper; + +public interface NameEncoding { + String encode(String name); + String decode(String name); + + NameEncoding DEFAULT = new NameEncoding() { + @Override + public String encode(String name) { + return name; + } + + @Override + public String decode(String name) { + return name; + } + }; +} diff --git a/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/XmlReader.java b/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/XmlReader.java index 59bb820..4243ad4 100644 --- a/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/XmlReader.java +++ b/commons-serialize-xml/src/main/java/io/gitlab/jfronny/commons/serialize/xml/wrapper/XmlReader.java @@ -38,6 +38,7 @@ public class XmlReader extends SerializeReader implement private String[] pathNames = new String[32]; private int[] pathIndices = new int[32]; private Heuristics heuristics = Heuristics.DEFAULT; + private NameEncoding nameEncoding = NameEncoding.DEFAULT; private String nextTagNamePath = null; private String nextTagName = null; @@ -83,6 +84,15 @@ public class XmlReader extends SerializeReader implement return heuristics; } + public XmlReader setNameEncoding(NameEncoding nameEncoding) { + this.nameEncoding = Objects.requireNonNull(nameEncoding); + return this; + } + + public NameEncoding getNameEncoding() { + return nameEncoding; + } + @Override public XmlReader beginArray() throws IOException { int p = peeked; @@ -263,15 +273,15 @@ public class XmlReader extends SerializeReader implement } return switch (p) { case PEEKED_NAME_ATT -> { - String res = reader.nextAttributeName(); + String result = reader.nextAttributeName(); peeked = PEEKED_NONE; - yield res; + yield nameEncoding.decode(result); } case PEEKED_NAME_TAG -> { - String res = nextTagName; - if (res == null) throw unexpectedTokenError("a name"); + String result = nextTagName; + if (result == null) throw unexpectedTokenError("a name"); peeked = PEEKED_NONE; - yield res; + yield nameEncoding.decode(result); } case PEEKED_NAME_VIRTUAL_TEXT -> { String result = heuristics.guessElementName(reader.getPath(), XmlToken.TEXT); @@ -285,11 +295,11 @@ public class XmlReader extends SerializeReader implement } case PEEKED_NAME_BEGIN_OBJECT -> { peeked = PEEKED_BEGIN_OBJECT; - yield nextTagName; + yield nameEncoding.decode(nextTagName); } case PEEKED_NAME_BEGIN_ARRAY -> { peeked = PEEKED_BEGIN_ARRAY; - yield nextTagName; + yield nameEncoding.decode(nextTagName); } default -> throw unexpectedTokenError("a name"); };