graphenej/graphenej/src/main/java/cy/agorise/graphenej/Asset.java

187 lines
5.9 KiB
Java

package cy.agorise.graphenej;
import com.google.common.primitives.UnsignedLong;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
/**
* Created by nelson on 11/9/16.
*/
public class Asset extends GrapheneObject {
public final static String TAG = "Asset";
public static final String KEY_ID = "id";
public static final String KEY_SYMBOL = "symbol";
public static final String KEY_PRECISION = "precision";
public static final String KEY_ISSUER = "issuer";
public static final String KEY_OPTIONS = "options";
public static final String KEY_MAX_SUPPLY = "max_supply";
public static final String KEY_MARKET_FEE_PERCENT = "market_fee_percent";
public static final String KEY_MARKET_FEE = "max_market_fee";
public static final String KEY_ISSUER_PERMISSIONS = "issuer_permissions";
public static final String KEY_FLAGS = "flags";
public static final String KEY_CORE_EXCHANGE_RATE = "core_exchange_rate";
public static final String KEY_DESCRIPTION = "description";
public static final String KEY_DYNAMIC_ASSET_DATA_ID = "dynamic_asset_data_id";
public static final String KEY_BITASSET_DATA_ID = "bitasset_data_id";
/**
* Enum type used to represent the possible types an asset can be classified into.
*/
public enum AssetType {
CORE_ASSET,
UIA,
SMART_COIN,
PREDICTION_MARKET
}
private String symbol;
private int precision = -1;
private String issuer;
private String description;
private String dynamic_asset_data_id;
private AssetOptions options;
private String bitasset_data_id;
private AssetType mAssetType;
/**
* Simple constructor
* @param id
*/
public Asset(String id) {
super(id);
}
/**
* Constructor
* @param id: The graphene object id.
* @param symbol: The asset symbol.
* @param precision: The asset precision.
*/
public Asset(String id, String symbol, int precision){
super(id);
this.symbol = symbol;
this.precision = precision;
}
/**
* Constructor
* @param id: The graphene object id.
* @param symbol: The asset symbol.
* @param precision: The asset precision.
* @param issuer: Graphene object id of the issuer.
*/
public Asset(String id, String symbol, int precision, String issuer){
super(id);
this.symbol = symbol;
this.precision = precision;
this.issuer = issuer;
}
public String getSymbol(){
return this.symbol;
}
public void setSymbol(String symbol){
this.symbol = symbol;
}
public void setPrecision(int precision){
this.precision = precision;
}
public int getPrecision(){
return this.precision;
}
public void setIssuer(String issuer){ this.issuer = issuer; }
public String getIssuer() { return this.issuer; }
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void setAssetOptions(AssetOptions options){
this.options = options;
}
public AssetOptions getAssetOptions(){
return this.options;
}
public String getBitassetId(){
return this.bitasset_data_id;
}
public void setBitassetDataId(String id){
this.bitasset_data_id = id;
}
public AssetType getAssetType() {
return mAssetType;
}
public void setAssetType(AssetType mAssetType) {
this.mAssetType = mAssetType;
}
@Override
public int hashCode() {
return this.getObjectId() == null ? 0 : this.getObjectId().hashCode();
}
@Override
public boolean equals(Object other) {
if(other instanceof Asset){
return this.getObjectId().equals(((Asset)other).getObjectId());
}else{
return false;
}
}
/**
* Custom deserializer used to instantiate a simple version of the Asset class from the response of the
* 'lookup_asset_symbols' API call.
*/
public static class AssetDeserializer implements JsonDeserializer<Asset> {
@Override
public Asset deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject object = json.getAsJsonObject();
String id = object.get(KEY_ID).getAsString();
String symbol = object.get(KEY_SYMBOL).getAsString();
int precision = object.get(KEY_PRECISION).getAsInt();
String issuer = object.get(KEY_ISSUER).getAsString();
JsonObject optionsJson = object.get(KEY_OPTIONS).getAsJsonObject();
JsonElement bitassetDataId = object.get(KEY_BITASSET_DATA_ID);
// Deserializing asset options
AssetOptions options = new AssetOptions();
options.setMaxSupply(UnsignedLong.valueOf(optionsJson.get(KEY_MAX_SUPPLY).getAsString()));
options.setMarketFeePercent(optionsJson.get(KEY_MARKET_FEE_PERCENT).getAsInt());
options.setMaxMarketFee(UnsignedLong.valueOf(optionsJson.get(KEY_MARKET_FEE).getAsString()));
options.setIssuerPermissions(optionsJson.get(KEY_ISSUER_PERMISSIONS).getAsLong());
options.setFlags(optionsJson.get(KEY_FLAGS).getAsInt());
if(optionsJson.has(KEY_DESCRIPTION))
options.setDescription(optionsJson.get(KEY_DESCRIPTION).getAsString());
//TODO: Deserialize core_exchange_rate field
Asset asset = new Asset(id, symbol, precision, issuer);
asset.setAssetOptions(options);
if(bitassetDataId != null){
asset.setBitassetDataId(bitassetDataId.getAsString());
}
return asset;
}
}
}