// find next quote
for (int i = continueIndex + 1; i < errorNodes.size(); i++) {
if (isNodeType(i, errorNodes, Type.Quote)) {
// build string
Node newNode = convertToString(errorNodes.get(continueIndex), errorNodes.get(i));
reparsedNodes.add(errorNodes.get(continueIndex));
reparsedNodes.add(newNode);
reparsedNodes.add(errorNodes.get(i));
continueIndex = i + 1;
stringBuilt = true;
break;
}
}
} else if (errorNodes.size() >= continueIndex + 3){
reparsedNodes.addAll(errorNodes.subList(continueIndex, continueIndex + 3));
continueIndex += 3;
stringBuilt = true;
}
if (stringBuilt && continueIndex == errorNodes.size()) {
JsonNode newJsonNode = new JsonNode(null, reparsedNodes.get(1), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
break;
}
if (stringBuilt && isNodeType(continueIndex, errorNodes, Type.Comma)) {
JsonNode newJsonNode = new JsonNode(null, reparsedNodes.get(1), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
reparsedNodes.add(errorNodes.get(continueIndex));
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
continue;
}
if (stringBuilt && isNodeType(continueIndex, errorNodes, Type.CloseArray, Type.CloseObject)) {
JsonNode newJsonNode = new JsonNode(null, reparsedNodes.get(1), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
JsonNode endNode = new JsonNode(null, errorNodes.get(continueIndex), JsonType.End);
reparsedJsonNodes.add(endNode);
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
JsonNode parent = (objectArrayStack.size() > 0) ? objectArrayStack.remove(0) : null;
if (parent != null) {
errorNodes.get(continueIndex).setOwner(parent);
}
reparsedNodes.add(errorNodes.get(continueIndex));
if (errorNodes.size() > continueIndex + 1 && isNodeType(continueIndex + 1, errorNodes, Type.Comma)) {
if (parent != null) { errorNodes.get(continueIndex + 1).setOwner(parent); }
reparsedNodes.add(errorNodes.get(continueIndex + 1));
continueIndex++;
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
continue;
}
if (stringBuilt && isNodeType(continueIndex, errorNodes, Type.Colon)) {
if (errorNodes.size() > continueIndex + 1 &&
isNodeType(continueIndex + 1, errorNodes, Type.False, Type.Null, Type.Number, Type.True, Type.OpenArray, Type.OpenObject)) {
JsonType jsonType = nodeTypeToJsonType(errorNodes.get(continueIndex + 1).getType());
JsonNode newJsonNode = new JsonNode(reparsedNodes.get(1), errorNodes.get(continueIndex + 1) , jsonType);
reparsedJsonNodes.add(newJsonNode);
reparsedNodes.add(errorNodes.get(continueIndex));
reparsedNodes.add(errorNodes.get(continueIndex + 1));
continueIndex++;
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
if (jsonType == JsonType.Array || jsonType == JsonType.Object) {
objectArrayStack.add(0, newJsonNode);
}
continue;
}
if (continueIndex + 2 < errorNodes.size()) {
if (isNodeType(continueIndex + 1, errorNodes, Type.Quote)) {
if (!isNodeType(continueIndex + 2, errorNodes, Type.String)) {
// find next quote
for (int i = continueIndex + 2; i < errorNodes.size(); i++) {
if (isNodeType(i, errorNodes, Type.Quote)) {
// build string
Node newNode = convertToString(errorNodes.get(continueIndex + 1), errorNodes.get(i));
reparsedNodes.add(errorNodes.get(continueIndex));
reparsedNodes.add(errorNodes.get(continueIndex + 1));
reparsedNodes.add(newNode);
reparsedNodes.add(errorNodes.get(i));
continueIndex = i + 1;
stringBuilt = true;
break;
}
}
} else if (errorNodes.size() >= continueIndex + 4){
reparsedNodes.addAll(errorNodes.subList(continueIndex, continueIndex + 4));
continueIndex += 4;
stringBuilt = true;
}
}
}
// We've managed to rebuild the node into a string, can it be merged into the string next to it?
else if (continueIndex + 1 == errorNodes.size()) {
if (jsonNodes.size() > 0) {
JsonNode headNode = jsonNodes.get(jsonNodes.size()-1);
if (headNode.getJsonType() == JsonType.String && headNode.getKey() == null) {
headNode.setKey(reparsedNodes.get(1));
reparsedNodes.add(errorNodes.get(continueIndex));
for(Node node : reparsedNodes) {
node.setOwner(headNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
break;
}
}
}
if (stringBuilt && continueIndex == errorNodes.size()) {
JsonNode newJsonNode = new JsonNode(reparsedNodes.get(1), reparsedNodes.get(5), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
break;
}
if (stringBuilt && isNodeType(continueIndex, errorNodes, Type.Comma)) {
JsonNode newJsonNode = new JsonNode(reparsedNodes.get(1), reparsedNodes.get(5), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
reparsedNodes.add(errorNodes.get(continueIndex));
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
continue;
}
if (stringBuilt && isNodeType(continueIndex, errorNodes, Type.CloseArray, Type.CloseObject)) {
JsonNode newJsonNode = new JsonNode(reparsedNodes.get(1), reparsedNodes.get(5), JsonType.String);
reparsedJsonNodes.add(newJsonNode);
JsonNode endNode = new JsonNode(null, errorNodes.get(continueIndex), JsonType.End);
reparsedJsonNodes.add(endNode);
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
JsonNode parent = (objectArrayStack.size() > 0) ? objectArrayStack.remove(0) : null;
if (parent != null) {
errorNodes.get(continueIndex).setOwner(parent);
}
reparsedNodes.add(errorNodes.get(continueIndex));
if (errorNodes.size() > continueIndex + 1 && isNodeType(continueIndex + 1, errorNodes, Type.Comma)) {
if (parent != null) { errorNodes.get(continueIndex + 1).setOwner(parent); }
reparsedNodes.add(errorNodes.get(continueIndex + 1));
continueIndex++;
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex + 1));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
continue;
}
}
}
if (reparsedJsonNodes.size() > 0 && reparsedJsonNodes.get(reparsedJsonNodes.size() - 1).getJsonType() != JsonType.Error) {
if (isNodeType(continueIndex, errorNodes, Type.CloseArray, Type.CloseObject)) {
JsonNode endNode = new JsonNode(null, errorNodes.get(continueIndex), JsonType.End);
reparsedJsonNodes.add(endNode);
JsonNode parent = (objectArrayStack.size() > 0) ? objectArrayStack.remove(0) : null;
if (parent != null) {
errorNodes.get(continueIndex).setOwner(parent);
}
if (errorNodes.size() > continueIndex + 1 && isNodeType(continueIndex + 1, errorNodes, Type.Comma)) {
if (parent != null) { errorNodes.get(continueIndex + 1).setOwner(parent); }
continueIndex++;
}
continue;
}
if (isNodeType(continueIndex, errorNodes, Type.OpenArray, Type.OpenObject)) {
JsonType jsonType = errorNodes.get(continueIndex).getType() == Type.OpenArray ? JsonType.Array : JsonType.Object;
JsonNode openNode = new JsonNode(null, errorNodes.get(continueIndex), jsonType);
reparsedJsonNodes.add(openNode);
objectArrayStack.add(0, openNode);
errorNodes.get(continueIndex).setOwner(openNode);
continue;
}
}
if (reparsedJsonNodes.size() > 0 && reparsedJsonNodes.get(reparsedJsonNodes.size() - 1).getJsonType() == JsonType.Array) {
if (isNodeType(continueIndex, errorNodes, Type.OpenArray, Type.OpenObject)) {
JsonType jsonType = errorNodes.get(continueIndex).getType() == Type.OpenArray ? JsonType.Array : JsonType.Object;
JsonNode openNode = new JsonNode(null, errorNodes.get(continueIndex), jsonType);
reparsedJsonNodes.add(openNode);
objectArrayStack.add(0, openNode);
errorNodes.get(continueIndex).setOwner(openNode);
continue;
}
}
if (reparsedJsonNodes.size() > 0 && reparsedJsonNodes.get(reparsedJsonNodes.size() - 1).getJsonType() == JsonType.Error) {
JsonNode jsonNode = reparsedJsonNodes.get(reparsedJsonNodes.size() - 1);
Node node = errorNodes.get(startIndex);
jsonNode.getValue().setLength(node.getEnd() - jsonNode.getValue().getStart());
Node mergedNode = jsonNode.getValue();
mergedNode.setValue(mergedNode.getValue() + node.getValue());
//nodes.remove(node);
node.setOwner(jsonNode);
} else {
if (reparsedNodes.size() > 0) {
StringBuilder strBuilder = new StringBuilder();
for (Node node : reparsedNodes) {
strBuilder.append(node.getValue());
}
Node mergedNode = new Node(Type.Error);
mergedNode.setValue(strBuilder.toString());
mergedNode.setStart(reparsedNodes.get(0).getStart());
mergedNode.setLength(reparsedNodes.get(reparsedNodes.size()-1).getEnd() - mergedNode.getStart());
JsonNode newJsonNode = new JsonNode(null, mergedNode, JsonType.Error);
reparsedJsonNodes.add(newJsonNode);
for(Node node : reparsedNodes) {
node.setOwner(newJsonNode);
}
int nodesPos = nodes.indexOf(errorNodes.get(startIndex));
nodes.removeAll(errorNodes.subList(startIndex, continueIndex));
nodes.addAll(nodesPos, reparsedNodes);
reparsedNodes.clear();
} else {
Node node = errorNodes.get(startIndex);
JsonNode newJsonNode = new JsonNode(null, node, JsonType.Error);
reparsedJsonNodes.add(newJsonNode);
node.setOwner(newJsonNode);
}
}
}