org.codingmatters.poom.ci.dependency.api.repositorygetresponse.json.Status404Reader Maven / Gradle / Ivy
package org.codingmatters.poom.ci.dependency.api.repositorygetresponse.json;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.IOException;
import java.lang.FunctionalInterface;
import java.lang.String;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.codingmatters.poom.ci.dependency.api.repositorygetresponse.Status404;
import org.codingmatters.poom.ci.dependency.api.repositorygetresponse.Status404.Builder;
import org.codingmatters.poom.ci.dependency.api.types.json.ErrorReader;
public class Status404Reader {
public Status404 read(JsonParser parser) throws IOException {
if(parser.getCurrentToken() == null) {
parser.nextToken();
}
if(parser.currentToken() == JsonToken.VALUE_NULL) return null;
if(parser.currentToken() != JsonToken.START_OBJECT) {
throw new IOException(
String.format("reading a %s object, was expecting %s, but was %s",
Status404.class.getName(), JsonToken.START_OBJECT, parser.currentToken()
)
);
}
Status404.Builder builder = Status404.builder();
while (parser.nextToken() != JsonToken.END_OBJECT) {
Token token = Token.from(parser.getCurrentName());
if(token != null) {
switch (token) {
case PAYLOAD: {
parser.nextToken();
builder.payload(new ErrorReader().read(parser));
break;
}
default: {
this.consumeUnexpectedProperty(parser);
}
}
} else {
this.consumeUnexpectedProperty(parser);
}
}
return builder.build();
}
public Status404[] readArray(JsonParser parser) throws IOException {
parser.nextToken();
if (parser.currentToken() == JsonToken.VALUE_NULL) return null;
if (parser.currentToken() == JsonToken.START_ARRAY) {
LinkedList listValue = new LinkedList<>();
while (parser.nextToken() != JsonToken.END_ARRAY) {
if(parser.currentToken() == JsonToken.VALUE_NULL) {
listValue.add(null);
} else {
listValue.add(this.read(parser));
}
}
return listValue.toArray(new Status404[listValue.size()]);
}
throw new IOException(String.format("failed reading org.codingmatters.poom.ci.dependency.api.repositorygetresponse.Status404 array, current token was %s", parser.currentToken()));
}
private T readValue(JsonParser parser, Reader reader, String propertyName, Set expectedTokens) throws IOException {
parser.nextToken();
if (parser.currentToken() == JsonToken.VALUE_NULL) return null;
if (expectedTokens.contains(parser.currentToken())) return reader.read(parser);
throw new IOException(
String.format("reading property %s, was expecting %s, but was %s",
propertyName, expectedTokens, parser.currentToken()
)
);
}
private List readListValue(JsonParser parser, Reader reader, String propertyName) throws IOException {
parser.nextToken();
if (parser.currentToken() == JsonToken.VALUE_NULL) return null;
if (parser.currentToken() == JsonToken.START_ARRAY) {
LinkedList listValue = new LinkedList<>();
while (parser.nextToken() != JsonToken.END_ARRAY) {
if(parser.currentToken() == JsonToken.VALUE_NULL) {
listValue.add(null);
} else {
listValue.add(reader.read(parser));
}
}
return listValue;
}
throw new IOException(
String.format("reading property %s, was expecting %s, but was %s",
propertyName, JsonToken.START_ARRAY, parser.currentToken()
)
);
}
private void consumeUnexpectedProperty(JsonParser parser) throws IOException {
parser.nextToken();
if(parser.currentToken().isStructStart()) {
int level = 1;
do {
parser.nextToken();
if (parser.currentToken().isStructStart()) {
level++;
} if (parser.currentToken().isStructEnd()) {
level--;
}
} while(level > 0);
}
}
@FunctionalInterface
private interface Reader {
T read(JsonParser parser) throws IOException;
}
enum Token {
__UNKNOWN__("__UNKNOWN__", "__UNKNOWN__"),
PAYLOAD("payload", "payload");
private final String name;
private final String rawName;
Token(String name, String rawName) {
this.name = name;
this.rawName = rawName;
}
private static String normalizeFieldName(String fieldName) {
if(fieldName == null) return null;
if(fieldName.trim().equals("")) return "";
fieldName = Arrays.stream(fieldName.split("(\\s|-)+")).map(s -> s.substring(0, 1).toUpperCase() + s.substring(1)).collect(Collectors.joining());
fieldName = fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1);
return fieldName;
}
public static Token from(String str) {
for(Token token : Token.values()) {
if(token.name.equals(str)) {
return token;
} else if(token.rawName.equals(str)) {
return token;
} else if(token.name.equals(normalizeFieldName(str))) {
return token;
} else if(token.rawName.equals(normalizeFieldName(str))) {
return token;
}
}
return __UNKNOWN__;
}
}
}