package com.ripple.core.coretypes; import com.ripple.core.fields.Field; import com.ripple.core.fields.STArrayField; import com.ripple.core.fields.Type; import com.ripple.core.serialized.BinaryParser; import com.ripple.core.serialized.BytesSink; import com.ripple.core.serialized.SerializedType; import com.ripple.core.serialized.TypeTranslator; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; public class STArray extends ArrayList<STObject> implements SerializedType { public JSONArray toJSONArray() { JSONArray array = new JSONArray(); for (STObject so : this) { array.put(so.toJSON()); } return array; } @Override public Object toJSON() { return toJSONArray(); } @Override public byte[] toBytes() { return translate.toBytes(this); } @Override public String toHex() { return translate.toHex(this); } @Override public void toBytesSink(BytesSink to) { for (STObject stObject : this) { stObject.toBytesSink(to); } } @Override public Type type() { return Type.STArray; } public static class Translator extends TypeTranslator<STArray> { @Override public STArray fromParser(BinaryParser parser, Integer hint) { STArray stArray = new STArray(); while (!parser.end()) { Field field = parser.readField(); if (field == Field.ArrayEndMarker) { break; } STObject outer = new STObject(); // assert field.getType() == Type.STObject; outer.put(field, STObject.translate.fromParser(parser)); stArray.add(STObject.formatted(outer)); } return stArray; } @Override public JSONArray toJSONArray(STArray obj) { return obj.toJSONArray(); } @Override public STArray fromJSONArray(JSONArray jsonArray) { STArray arr = new STArray(); for (int i = 0; i < jsonArray.length(); i++) { Object o = jsonArray.get(i); arr.add(STObject.fromJSONObject((JSONObject) o)); } return arr; } } static public Translator translate = new Translator(); public STArray(){} public static STArrayField starrayField(final Field f) { return new STArrayField(){ @Override public Field getField() {return f;}}; } static public STArrayField AffectedNodes = starrayField(Field.AffectedNodes); static public STArrayField SigningAccounts = starrayField(Field.SigningAccounts); static public STArrayField TxnSignatures = starrayField(Field.TxnSignatures); static public STArrayField Signatures = starrayField(Field.Signatures); static public STArrayField Template = starrayField(Field.Template); static public STArrayField Necessary = starrayField(Field.Necessary); static public STArrayField Sufficient = starrayField(Field.Sufficient); }