URef.java

package com.syntifi.casper.sdk.model.uref;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonValue;
import com.syntifi.casper.sdk.annotation.ExcludeFromJacocoGeneratedReport;
import com.syntifi.casper.sdk.exception.DynamicInstanceException;
import com.syntifi.casper.sdk.exception.InvalidByteStringException;
import com.syntifi.casper.sdk.model.clvalue.CLValueURef;
import com.syntifi.casper.sdk.model.clvalue.encdec.StringByteHelper;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.IOException;

/**
 * URef is a tuple that contains the address of the URef and the access rights
 * to that URef. The serialized representation of the URef is 33 bytes long. The
 * first 32 bytes are the byte representation of the URef address, and the last
 * byte contains the bits corresponding to the access rights of the URef.
 *
 * @author Alexandre Carvalho
 * @author Andre Bertolace
 * @see CLValueURef
 * @since 0.0.1
 */
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class URef {

    @JsonIgnore
    byte[] address;

    @JsonIgnore
    URefAccessRight accessRight;

    public static URef fromString(String uref)
            throws IOException, DynamicInstanceException, InvalidByteStringException {
        String[] urefParts = uref.split("-");
        if (!urefParts[0].equals("uref") || urefParts.length != 3) {
            throw new IOException("Not a valid Uref");
        }
        byte[] address = StringByteHelper.hexStringToByteArray(urefParts[1]);
        byte[] accessRightByte = StringByteHelper.hexStringToByteArray(urefParts[2].substring(1));
        URefAccessRight accessRight = URefAccessRight
                .getTypeBySerializationTag(accessRightByte[accessRightByte.length - 1]);
        return new URef(address, accessRight);

    }

    @JsonCreator
    public void createURef(String uref) throws IOException, DynamicInstanceException, InvalidByteStringException {
        URef obj = URef.fromString(uref);
        this.accessRight = obj.getAccessRight();
        this.address = obj.getAddress();
    }

    @JsonValue
    @ExcludeFromJacocoGeneratedReport
    protected String getJsonURef() {
        return "uref-" + StringByteHelper.convertBytesToHex(this.address) + "-0"
                + StringByteHelper.convertBytesToHex(new byte[]{this.accessRight.serializationTag});
    }
}