/*
* Copyright (c) 2015 Astron Informatikai Kft.
*
*/
package airportsimulation.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections15.MultiMap;
import org.apache.commons.collections15.multimap.MultiHashMap;
import org.json.simple.parser.ContentHandler;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
/**
*
* @author tothm
*/
public class JsonParser {
public static class JsonParserException extends Exception {
private static final long serialVersionUID = 2170714236026447079L;
public JsonParserException(String message) {
super(message);
}
}
static class Transformer implements ContentHandler {
List<String> keys;
MultiMap<List<String>, String> values;
public Transformer(MultiMap<List<String>, String> values) {
this.values = values;
keys = null;
}
@Override
public void startJSON() throws ParseException, IOException {
keys = new ArrayList<>();
}
@Override
public void endJSON() throws ParseException, IOException {
}
@Override
public boolean primitive(Object value) throws ParseException, IOException {
List<String> clone = new ArrayList<>();
for (String k : keys) {
clone.add(k);
}
values.put(clone, value.toString());
return true;
}
@Override
public boolean startObjectEntry(String key) throws ParseException, IOException {
keys.add(key);
return true;
}
@Override
public boolean endObjectEntry() throws ParseException, IOException {
keys.remove(keys.size() - 1);
return true;
}
@Override
public boolean startObject() throws ParseException, IOException {
return true;
}
@Override
public boolean endObject() throws ParseException, IOException {
return true;
}
@Override
public boolean startArray() throws ParseException, IOException {
return true;
}
@Override
public boolean endArray() throws ParseException, IOException {
return true;
}
}
private final Transformer transformer;
private MultiMap<List<String>, String> values;
MultiMap<List<String>, String> getValues() {
return values;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof JsonParser)) {
return false;
}
return values.equals(((JsonParser) o).values);
}
JsonParser(MultiMap<List<String>, String> inputValue) {
values = inputValue;
transformer = new Transformer(values);
}
public JsonParser(InputStream inputStream) throws JsonParserException {
try {
values = new MultiHashMap<>();
transformer = new Transformer(values);
JSONParser parser = new JSONParser();
parser.parse(new InputStreamReader(inputStream, "ISO-8859-2"), transformer);
} catch (IOException | ParseException ex) {
throw new JsonParserException("Cannot parse json file due to:\n" + ex);
}
}
public Set<String> getKeys() {
Set<String> keys = new HashSet<>();
for (List keyList : values.keySet()) {
String firstKeyAtKeyList = (String) keyList.get(0);
if (!keys.contains(firstKeyAtKeyList)) {
keys.add(firstKeyAtKeyList);
}
}
return keys;
}
public Set<String> getKeys(final String... keys) {
final List<String> keysAsList = Arrays.asList(keys);
Set<String> innerKeys = new HashSet<>();
for (List exsistingKeyList : values.keySet()) {
if (exsistingKeyList.containsAll(keysAsList)) {
if (exsistingKeyList.size() == keysAsList.size()) {
continue;
}
innerKeys.add((String) exsistingKeyList.get(keysAsList.size()));
}
}
return innerKeys;
}
public String get(final String... keys) throws JsonParserException {
final List<String> keyList = Arrays.asList(keys);
if (values.containsKey(keyList)) {
if (values.get(keyList).size() == 1) {
return (String) ((ArrayList) values.get(keyList)).get(0);
}
throw new JsonParserException("Value at key: '" + keyList + "' is an array.");
}
throw new JsonParserException("Key list: '" + keyList + "' is not persent.");
}
public List<String> getArray(final String... keys) throws JsonParserException {
final List<String> keyList = Arrays.asList(keys);
if (values.containsKey(keyList)) {
return (List<String>) values.get(keyList);
}
throw new JsonParserException("Key list: '" + keyList + "' is not persent.");
}
}