package com.dubture.getcomposer.core.entities;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import com.dubture.getcomposer.core.collection.JsonArray;
import com.dubture.getcomposer.core.objects.JsonObject;
public class JsonValue {
private Object value;
public JsonValue(Object value) {
this.value = value;
}
public Object toJsonValue() {
if (isArray()) {
if (getAsArray().size() == 0) {
return null;
}
return buildJson(getAsArray());
} else if (isObject()) {
if (getAsObject().size() == 0) {
return null;
}
return buildJson(getAsObject());
} else if (isNumber()) {
return getAsNumber();
} else if (isBoolean()) {
return getAsBoolean();
} else {
return getAsString();
}
}
private Object buildJson(JsonCollection jsonObject) {
try {
Method mtd = JsonEntity.class.getDeclaredMethod("buildJson");
return mtd.invoke(jsonObject);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Returns whether the value is instance of the given type.
*
* @param type the type
* @return <ul>
* <li><code>true</code> property is instance of type</li>
* <li><code>false</code> property is not an instance of type</li>
* </ul>
*/
public boolean is(Type type) {
return value.getClass().isAssignableFrom((Class<?>) type);
}
/**
* Returns whether the value is instance of an array.
*
* @see #getAsArray
* @return <ul>
* <li><code>true</code> property is an array</li>
* <li><code>false</code> property is not an array</li>
* </ul>
*/
public boolean isArray() {
return value instanceof JsonArray;
}
/**
* Returns whether the property is instance of an entity.
*
* @see #getAsEntity
* @return <ul>
* <li><code>true</code> property is an entity</li>
* <li><code>false</code> property is not an entity</li>
* </ul>
*/
public boolean isObject() {
return value instanceof JsonObject;
}
/**
* Returns whether the property is a boolean.
*
* @return <ul>
* <li><code>true</code> property is a boolean</li>
* <li><code>false</code> property is not a boolean</li>
* </ul>
*/
public boolean isBoolean() {
return value instanceof Boolean;
}
/**
* Returns whether the property is a number.
*
* @return <ul>
* <li><code>true</code> property is a number</li>
* <li><code>false</code> property is not a number</li>
* </ul>
*/
public boolean isNumber() {
return value instanceof Number;
}
/**
* Returns the value.
*
* @return the value
*/
public Object getAsRaw() {
return value;
}
/**
* Returns the value as array.
*
* @return the value
*/
public JsonArray getAsArray() {
if (!(value instanceof JsonArray)) {
JsonArray val = new JsonArray();
val.add(value);
value = val;
}
return (JsonArray)value;
}
/**
* Returns the value as string.
*
* @return the value as string
*/
public String getAsString() {
return (String)value;
}
/**
* Returns the value as boolean.
*
* @return the value as boolean
*/
public Boolean getAsBoolean() {
if (value instanceof String) {
return Boolean.parseBoolean((String)value);
}
return (Boolean)value;
}
/**
* Returns the value as integer.
*
* @return the value as integer
*/
public Integer getAsInteger() {
if (value instanceof String) {
return Integer.valueOf((String)value);
} else if (value instanceof Long) {
return ((Long)value).intValue();
}
return (Integer)value;
}
/**
* Returns the value as float.
*
* @return the value as float
*/
public Float getAsFloat() {
return Float.valueOf((String)value);
}
/**
* Returns the value as number.
*
* @return the value as number
*/
public Number getAsNumber() {
return (Number)value;
}
/**
* Returns the value as entity.
*
* @return the value as entity
*/
public JsonObject getAsObject() {
return (JsonObject)value;
}
}