fix(serialize-xml): name encoding system for wrapper to support names unusable in XML
This commit is contained in:
parent
b8d9b52ab5
commit
615ff12c27
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
|
@ -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");
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue