/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.vtype.json;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.json.JsonArray;
import javax.json.JsonNumber;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
import org.diirt.util.array.ArrayBoolean;
import org.diirt.util.array.ListBoolean;
import org.diirt.util.array.ListByte;
import org.diirt.util.array.ListDouble;
import org.diirt.util.array.ListFloat;
import org.diirt.util.array.ListInt;
import org.diirt.util.array.ListLong;
import org.diirt.util.array.ListShort;
import org.diirt.vtype.Alarm;
import org.diirt.vtype.AlarmSeverity;
import org.diirt.vtype.Display;
import org.diirt.vtype.Time;
import org.diirt.vtype.ValueFactory;
import static org.diirt.vtype.json.JsonArrays.*;
/**
*
* @author carcassi
*/
class VTypeJsonMapper implements JsonObject {
private final JsonObject json;
public VTypeJsonMapper(JsonObject json) {
this.json = json;
}
public String getTypeName() {
JsonObject type = json.getJsonObject("type");
if (type == null) {
return null;
}
return type.getString("name");
}
public Alarm getAlarm() {
JsonObject alarm = json.getJsonObject("alarm");
if (alarm == null) {
return null;
}
return ValueFactory.newAlarm(AlarmSeverity.valueOf(alarm.getString("severity")), alarm.getString("status"));
}
public Time getTime() {
VTypeJsonMapper time = getJsonObject("time");
if (time == null) {
return null;
}
return ValueFactory.newTime(Instant.ofEpochSecond(time.getInt("unixSec"), time.getInt("nanoSec")), time.getInteger("userTag"), true);
}
public Display getDisplay() {
VTypeJsonMapper display = getJsonObject("display");
if (display == null) {
return null;
}
return ValueFactory.newDisplay(display.getNotNullDouble("lowDisplay"),
display.getNotNullDouble("lowAlarm"),
display.getNotNullDouble("lowWarning"),
display.getString("units"), null,
display.getNotNullDouble("highWarning"),
display.getNotNullDouble("highAlarm"),
display.getNotNullDouble("highDisplay"),
Double.NaN,
Double.NaN);
}
public ListDouble getListDouble(String string) {
JsonArray array = getJsonArray(string);
return toListDouble(array);
}
public ListFloat getListFloat(String string) {
JsonArray array = getJsonArray(string);
return toListFloat(array);
}
public ListLong getListLong(String string) {
JsonArray array = getJsonArray(string);
return toListLong(array);
}
public ListInt getListInt(String string) {
JsonArray array = getJsonArray(string);
return toListInt(array);
}
public ListShort getListShort(String string) {
JsonArray array = getJsonArray(string);
return toListShort(array);
}
public ListByte getListByte(String string) {
JsonArray array = getJsonArray(string);
return toListByte(array);
}
public ListBoolean getListBoolean(String string) {
JsonArray array = getJsonArray(string);
boolean[] values = new boolean[array.size()];
for (int i = 0; i < values.length; i++) {
values[i] = array.getBoolean(i);
}
return new ArrayBoolean(values);
}
public List<String> getListString(String string) {
JsonArray array = getJsonArray(string);
return toListString(array);
}
public List<Class<?>> getColumnTypes(String string) {
JsonArray array = getJsonArray(string);
List<Class<?>> types = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
String type = array.getString(i);
if ("String".equals(type)) {
types.add(String.class);
} else if ("double".equals(type)) {
types.add(double.class);
} else if ("float".equals(type)) {
types.add(float.class);
} else if ("long".equals(type)) {
types.add(long.class);
} else if ("int".equals(type)) {
types.add(int.class);
} else if ("short".equals(type)) {
types.add(short.class);
} else if ("byte".equals(type)) {
types.add(byte.class);
} else if ("Timestamp".equals(type)) {
types.add(Instant.class);
} else {
throw new IllegalArgumentException("Column type " + type + " not supported");
}
}
return types;
}
public List<Object> getColumnValues(String string, List<Class<?>> types) {
JsonArray array = getJsonArray(string);
List<Object> result = new ArrayList<>();
for (int i = 0; i < types.size(); i++) {
Class<?> type = types.get(i);
if (String.class.equals(type)) {
result.add(toListString(array.getJsonArray(i)));
} else if (double.class.equals(type)) {
result.add(toListDouble(array.getJsonArray(i)));
} else if (float.class.equals(type)) {
result.add(toListFloat(array.getJsonArray(i)));
} else if (long.class.equals(type)) {
result.add(toListLong(array.getJsonArray(i)));
} else if (int.class.equals(type)) {
result.add(toListInt(array.getJsonArray(i)));
} else if (short.class.equals(type)) {
result.add(toListShort(array.getJsonArray(i)));
} else if (byte.class.equals(type)) {
result.add(toListByte(array.getJsonArray(i)));
} else if (Instant.class.equals(type)) {
result.add(toListTimestamp(array.getJsonArray(i)));
} else {
throw new IllegalArgumentException("Column type " + type + " not supported");
}
}
return result;
}
public Integer getInteger(String string) {
if (isNull(string)) {
return null;
}
return getInt(string);
}
public Double getNotNullDouble(String string) {
if (isNull(string)) {
return Double.NaN;
}
return getJsonNumber(string).doubleValue();
}
@Override
public JsonArray getJsonArray(String string) {
return json.getJsonArray(string);
}
@Override
public VTypeJsonMapper getJsonObject(String string) {
return new VTypeJsonMapper(json.getJsonObject(string));
}
@Override
public JsonNumber getJsonNumber(String string) {
return json.getJsonNumber(string);
}
@Override
public JsonString getJsonString(String string) {
return json.getJsonString(string);
}
@Override
public String getString(String string) {
return json.getString(string);
}
@Override
public String getString(String string, String string1) {
return json.getString(string, string1);
}
@Override
public int getInt(String string) {
return json.getInt(string);
}
@Override
public int getInt(String string, int i) {
return json.getInt(string, i);
}
@Override
public boolean getBoolean(String string) {
return json.getBoolean(string);
}
@Override
public boolean getBoolean(String string, boolean bln) {
return json.getBoolean(string, bln);
}
@Override
public boolean isNull(String string) {
return json.isNull(string);
}
@Override
public ValueType getValueType() {
return json.getValueType();
}
@Override
public int size() {
return json.size();
}
@Override
public boolean isEmpty() {
return json.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return json.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return json.containsValue(value);
}
@Override
public JsonValue get(Object key) {
return json.get(key);
}
@Override
public JsonValue put(String key, JsonValue value) {
return json.put(key, value);
}
@Override
public JsonValue remove(Object key) {
return json.remove(key);
}
@Override
public void putAll(Map<? extends String, ? extends JsonValue> m) {
json.putAll(m);
}
@Override
public void clear() {
json.clear();
}
@Override
public Set<String> keySet() {
return json.keySet();
}
@Override
public Collection<JsonValue> values() {
return json.values();
}
@Override
public Set<Entry<String, JsonValue>> entrySet() {
return json.entrySet();
}
}