fix(serialize-xml): name encoding system for wrapper to support names unusable in XML

This commit is contained in:
Johannes Frohnmeyer 2024-04-20 12:33:24 +02:00
parent b8d9b52ab5
commit 615ff12c27
Signed by: Johannes
GPG Key ID: E76429612C2929F4
2 changed files with 35 additions and 7 deletions

View File

@ -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;
}
};
}

View File

@ -38,6 +38,7 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> 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<IOException, XmlReader> 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<IOException, XmlReader> 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<IOException, XmlReader> 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");
};