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 String[] pathNames = new String[32];
private int[] pathIndices = new int[32]; private int[] pathIndices = new int[32];
private Heuristics heuristics = Heuristics.DEFAULT; private Heuristics heuristics = Heuristics.DEFAULT;
private NameEncoding nameEncoding = NameEncoding.DEFAULT;
private String nextTagNamePath = null; private String nextTagNamePath = null;
private String nextTagName = null; private String nextTagName = null;
@ -83,6 +84,15 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
return heuristics; return heuristics;
} }
public XmlReader setNameEncoding(NameEncoding nameEncoding) {
this.nameEncoding = Objects.requireNonNull(nameEncoding);
return this;
}
public NameEncoding getNameEncoding() {
return nameEncoding;
}
@Override @Override
public XmlReader beginArray() throws IOException { public XmlReader beginArray() throws IOException {
int p = peeked; int p = peeked;
@ -263,15 +273,15 @@ public class XmlReader extends SerializeReader<IOException, XmlReader> implement
} }
return switch (p) { return switch (p) {
case PEEKED_NAME_ATT -> { case PEEKED_NAME_ATT -> {
String res = reader.nextAttributeName(); String result = reader.nextAttributeName();
peeked = PEEKED_NONE; peeked = PEEKED_NONE;
yield res; yield nameEncoding.decode(result);
} }
case PEEKED_NAME_TAG -> { case PEEKED_NAME_TAG -> {
String res = nextTagName; String result = nextTagName;
if (res == null) throw unexpectedTokenError("a name"); if (result == null) throw unexpectedTokenError("a name");
peeked = PEEKED_NONE; peeked = PEEKED_NONE;
yield res; yield nameEncoding.decode(result);
} }
case PEEKED_NAME_VIRTUAL_TEXT -> { case PEEKED_NAME_VIRTUAL_TEXT -> {
String result = heuristics.guessElementName(reader.getPath(), XmlToken.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 -> { case PEEKED_NAME_BEGIN_OBJECT -> {
peeked = PEEKED_BEGIN_OBJECT; peeked = PEEKED_BEGIN_OBJECT;
yield nextTagName; yield nameEncoding.decode(nextTagName);
} }
case PEEKED_NAME_BEGIN_ARRAY -> { case PEEKED_NAME_BEGIN_ARRAY -> {
peeked = PEEKED_BEGIN_ARRAY; peeked = PEEKED_BEGIN_ARRAY;
yield nextTagName; yield nameEncoding.decode(nextTagName);
} }
default -> throw unexpectedTokenError("a name"); default -> throw unexpectedTokenError("a name");
}; };