All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.co.real_logic.artio.binary_entrypoint.BinaryEntryPointStorage Maven / Gradle / Ivy

The newest version!
package uk.co.real_logic.artio.binary_entrypoint;

import org.agrona.concurrent.AtomicBuffer;
import uk.co.real_logic.artio.fixp.AbstractFixPStorage;
import uk.co.real_logic.artio.fixp.FixPKey;
import uk.co.real_logic.artio.fixp.InternalFixPContext;

import java.nio.ByteOrder;

import static org.agrona.BitUtil.SIZE_OF_LONG;
import static org.agrona.BitUtil.SIZE_OF_SHORT;

public class BinaryEntryPointStorage extends AbstractFixPStorage
{
    private static final short SHORT_TRUE = (short)1;
    private static final short SHORT_FALSE = (short)0;

    private static final int SESSION_ID_OFFSET = 0;
    private static final int SESSION_ID_LENGTH = SIZE_OF_LONG;
    private static final int SESSION_VER_ID_OFFSET = SESSION_ID_OFFSET + SESSION_ID_LENGTH;
    private static final int SESSION_VER_ID_LENGTH = SIZE_OF_LONG;
    private static final int TIMESTAMP_OFFSET = SESSION_VER_ID_OFFSET + SESSION_VER_ID_LENGTH;
    private static final int TIMESTAMP_LENGTH = SIZE_OF_LONG;
    private static final int ENTERING_FIRM_OFFSET = TIMESTAMP_OFFSET + TIMESTAMP_LENGTH;
    private static final int ENTERING_FIRM_LENGTH = SIZE_OF_LONG;
    private static final int ENDED_OFFSET = ENTERING_FIRM_OFFSET + ENTERING_FIRM_LENGTH;
    private static final int ENDED_LENGTH = SIZE_OF_SHORT;
    private static final int FROM_NEGOTIATE_OFFSET = ENDED_OFFSET + ENDED_LENGTH;
    private static final int FROM_NEGOTIATE_LENGTH = SIZE_OF_SHORT;
    private static final int ENTRY_LENGTH = FROM_NEGOTIATE_OFFSET + FROM_NEGOTIATE_LENGTH;

    public BinaryEntryPointStorage()
    {
    }

    public BinaryEntryPointContext newInitiatorContext(
        final FixPKey key, final int offset)
    {
        throw new UnsupportedOperationException();
    }

    public BinaryEntryPointContext loadContext(
        final AtomicBuffer buffer, final int offset, final int fileVersion)
    {
        final long sessionId = buffer.getLong(offset + SESSION_ID_OFFSET);
        final long sessionVerId = buffer.getLong(offset + SESSION_VER_ID_OFFSET);
        final long timestamp = buffer.getLong(offset + TIMESTAMP_OFFSET);
        final long enteringFirm = buffer.getLong(offset + ENTERING_FIRM_OFFSET);
        final boolean ended = buffer.getShort(offset + ENDED_OFFSET) == SHORT_TRUE;
        final boolean fromNegotiate = buffer.getShort(offset + FROM_NEGOTIATE_OFFSET) == SHORT_TRUE;

        final BinaryEntryPointContext context = new BinaryEntryPointContext(
            sessionId, sessionVerId, timestamp, enteringFirm, fromNegotiate, "", "", "", "");
        context.ended(ended);
        context.offset(offset);
        return context;
    }

    public int saveContext(
        final InternalFixPContext fixPContext, final AtomicBuffer buffer, final int offset, final int fileVersion)
    {
        final BinaryEntryPointContext context = (BinaryEntryPointContext)fixPContext;
        context.offset(offset);

        buffer.putLong(offset + SESSION_ID_OFFSET, context.sessionID(), ByteOrder.LITTLE_ENDIAN);
        putSessionVerId(buffer, context, offset);
        putTimestamp(buffer, context, offset);
        buffer.putLong(offset + ENTERING_FIRM_OFFSET, context.enteringFirm(), ByteOrder.LITTLE_ENDIAN);
        putEnded(buffer, context, offset + ENDED_OFFSET);
        putShort(buffer, offset + FROM_NEGOTIATE_OFFSET, context.fromNegotiate());

        return ENTRY_LENGTH;
    }

    public void updateContext(
        final InternalFixPContext fixPContext, final AtomicBuffer buffer)
    {
        final BinaryEntryPointContext context = (BinaryEntryPointContext)fixPContext;
        final int offset = context.offset();

        putSessionVerId(buffer, context, offset);
        putTimestamp(buffer, context, offset);
        putEnded(buffer, context, offset + ENDED_OFFSET);
    }

    private void putEnded(final AtomicBuffer buffer, final BinaryEntryPointContext context, final int offset)
    {
        putShort(buffer, offset, context.ended());
    }

    private void putShort(final AtomicBuffer buffer, final int offset, final boolean value)
    {
        buffer.putShort(offset, value ? SHORT_TRUE : SHORT_FALSE, ByteOrder.LITTLE_ENDIAN);
    }

    private void putTimestamp(final AtomicBuffer buffer, final BinaryEntryPointContext context, final int offset)
    {
        buffer.putLong(offset + TIMESTAMP_OFFSET, context.requestTimestampInNs(), ByteOrder.LITTLE_ENDIAN);
    }

    private void putSessionVerId(final AtomicBuffer buffer, final BinaryEntryPointContext context, final int offset)
    {
        buffer.putLong(offset + SESSION_VER_ID_OFFSET, context.sessionVerID(), ByteOrder.LITTLE_ENDIAN);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy