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

org.vertexium.inmemory.security.ArrayByteSequence Maven / Gradle / Ivy

There is a newer version: 4.10.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.vertexium.inmemory.security;

import java.io.Serializable;
import java.nio.ByteBuffer;

/**
 * An implementation of {@link ByteSequence} that uses a backing byte array.
 */
class ArrayByteSequence extends ByteSequence implements Serializable {

    private static final long serialVersionUID = 1L;

    protected byte data[];
    protected int offset;
    protected int length;

    /**
     * Creates a new sequence. The given byte array is used directly as the
     * backing array, so later changes made to the array reflect into the new
     * sequence.
     *
     * @param data byte data
     */
    public ArrayByteSequence(byte data[]) {
        this.data = data;
        this.offset = 0;
        this.length = data.length;
    }

    /**
     * Creates a new sequence from a subsequence of the given byte array. The
     * given byte array is used directly as the backing array, so later changes
     * made to the (relevant portion of the) array reflect into the new sequence.
     *
     * @param data   byte data
     * @param offset starting offset in byte array (inclusive)
     * @param length number of bytes to include in sequence
     * @throws IllegalArgumentException if the offset or length are out of bounds
     *                                  for the given byte array
     */
    public ArrayByteSequence(byte data[], int offset, int length) {

        if (offset < 0 || offset > data.length || length < 0 || (offset + length) > data.length) {
            throw new IllegalArgumentException(" Bad offset and/or length data.length = " + data.length + " offset = " + offset + " length = " + length);
        }

        this.data = data;
        this.offset = offset;
        this.length = length;

    }

    /**
     * Creates a new sequence from the given string. The bytes are determined from
     * the string using the default platform encoding.
     *
     * @param s string to represent as bytes
     */
    public ArrayByteSequence(String s) {
        this(s.getBytes(Constants.UTF8));
    }

    /**
     * Creates a new sequence based on a byte buffer. If the byte buffer has an
     * array, that array (and the buffer's offset and limit) are used; otherwise,
     * a new backing array is created and a relative bulk get is performed to
     * transfer the buffer's contents (starting at its current position and
     * not beyond its limit).
     *
     * @param buffer byte buffer
     */
    public ArrayByteSequence(ByteBuffer buffer) {
        if (buffer.hasArray()) {
            this.data = buffer.array();
            this.offset = buffer.arrayOffset();
            this.length = buffer.limit();
        } else {
            this.data = new byte[buffer.remaining()];
            this.offset = 0;
            buffer.get(data);
        }
    }

    @Override
    public byte byteAt(int i) {

        if (i < 0) {
            throw new IllegalArgumentException("i < 0, " + i);
        }

        if (i >= length) {
            throw new IllegalArgumentException("i >= length, " + i + " >= " + length);
        }

        return data[offset + i];
    }

    @Override
    public byte[] getBackingArray() {
        return data;
    }

    @Override
    public boolean isBackedByArray() {
        return true;
    }

    @Override
    public int length() {
        return length;
    }

    @Override
    public int offset() {
        return offset;
    }

    @Override
    public ByteSequence subSequence(int start, int end) {

        if (start > end || start < 0 || end > length) {
            throw new IllegalArgumentException("Bad start and/end start = " + start + " end=" + end + " offset=" + offset + " length=" + length);
        }

        return new ArrayByteSequence(data, offset + start, end - start);
    }

    @Override
    public byte[] toArray() {
        if (offset == 0 && length == data.length)
            return data;

        byte[] copy = new byte[length];
        System.arraycopy(data, offset, copy, 0, length);
        return copy;
    }

    public String toString() {
        return new String(data, offset, length, Constants.UTF8);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy