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

org.jscsi.utils.Utils Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation and/or other materials provided with the
 * distribution. * Neither the name of the University of Konstanz nor the names of its contributors may be used to
 * endorse or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.jscsi.utils;


import java.nio.ByteBuffer;

import org.jscsi.exception.InternetSCSIException;


/**
 * This class encapsulate all the needed common constants and methods with are needed by the used classes for the
 * parsing and logging process. There are also common used bit masks for the extraction of the needed field in such a
 * iSCSI message.
 * 
 * @author Volker Wildi, University of Konstanz
 */
public final class Utils {

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    /** Indent for each line (dependent of the level of indent). */
    public static final String LOG_OUT_INDENT = "  ";

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    /** Bit mask to extract the first byte of a 32 bit number. */
    public static final int FIRST_BYTE_MASK = 0xFF000000;

    /** Bit mask to extract the second byte of a 32 bit number. */
    public static final int SECOND_BYTE_MASK = 0x00FF0000;

    /** Bit mask to extract the third byte of a 32 bit number. */
    public static final int THIRD_BYTE_MASK = 0x0000FF00;

    /** Bit mask to extract the fourth byte of a 32 bit number. */
    public static final int FOURTH_BYTE_MASK = 0x000000FF;

    /** The flag mask to convert an integer number to a long number. */
    private static final long INT_FLAG_MASK_LONG = 0x00000000FFFFFFFFL;

    /** The flag mask to convert a short number to a long number. */
    private static final long SHORT_FLAG_MASK_LONG = 0x000000000000FFFFL;

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    /**
     * Method to guarantee that a given field is not zero.
     * 
     * @param field Field to check
     * @throws InternetSCSIException If the field is not reserved, then throw an exception
     */
    public static final void isReserved (final long field) throws InternetSCSIException {

        if (field != 0) { throw new InternetSCSIException("Field is reserved, so it must be zero."); }
    }

    /**
     * Checks for equality of a given value with the expected value.
     * 
     * @param field This value should be equal to the expected value
     * @param expected This is what we expect
     * @throws InternetSCSIException If this comparison failed, this exception will be thrown
     */
    public static final void isExpected (final int field, final int expected) throws InternetSCSIException {

        if (field != expected) { throw new InternetSCSIException("This field does not contain the expected value."); }
    }

    /**
     * Checks with a given int is unequal to zero.
     * 
     * @param num Number to check
     * @return Returns true if the line unequal than zero
     */
    public static final boolean isBitSet (final int num) {

        return num != 0;
    }

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final String fieldValue, final int indent) {

        indent(sb, indent);
        sb.append(fieldName);
        sb.append(": ");
        sb.append(fieldValue);
        sb.append("\n");
    }

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final int fieldValue, final int indent) {

        indent(sb, indent);
        sb.append(fieldName);
        sb.append(": 0x");
        sb.append(Integer.toHexString(fieldValue));
        sb.append("\n");
    }

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final long fieldValue, final int indent) {

        indent(sb, indent);
        sb.append(fieldName);
        sb.append(": 0x");
        sb.append(Long.toHexString(fieldValue));
        sb.append("\n");
    }

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final byte fieldValue, final int indent) {

        printField(sb, fieldName, (int) fieldValue, indent);
    }

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final boolean fieldValue, final int indent) {

        indent(sb, indent);
        sb.append(fieldName);
        sb.append(": ");
        sb.append(fieldValue);
        sb.append("\n");
    }

    /**
     * This methods creates an easy to use interface to print out a logging message of a specific variable.
     * 
     * @param sb StringBuilder to directly write the logging messages in.
     * @param fieldName The name of the variable.
     * @param fieldValue The value of the given variable.
     * @param indent The level of indention.
     */
    public static final void printField (final StringBuilder sb, final String fieldName, final ByteBuffer fieldValue, final int indent) {

        fieldValue.rewind();
        indent(sb, indent);
        sb.append(fieldName);
        sb.append(": ");
        sb.append(fieldValue);
        sb.append("\n");
    }

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    // --------------------------------------------------------------------------

    /**
     * Appends to a given StringBuilder the given indents depending on the indent level.
     * 
     * @param sb StringBuilder to write in.
     * @param indent The number (level) of indents.
     */
    private static final void indent (final StringBuilder sb, final int indent) {

        for (int i = 0; i < indent; i++) {
            sb.append(LOG_OUT_INDENT);
        }
    }

    /**
     * This method converts a byte with the highest (sign) bit set, to an unsigned int value.
     * 
     * @param b The signed byte number.
     * @return The unsigned int number.
     */
    public static final int getUnsignedInt (final byte b) {

        return b & FOURTH_BYTE_MASK;
    }

    /**
     * This method converts an integer with the highest (sign) bit set, to an unsigned long value.
     * 
     * @param i The signed int number.
     * @return The unsigned long number.
     */
    public static final long getUnsignedLong (final int i) {

        return i & INT_FLAG_MASK_LONG;
    }

    /**
     * This method converts an short integer with the highest (sign) bit set, to an unsigned long value.
     * 
     * @param i The signed integer number.
     * @return The unsigned long number.
     */
    public static final long getUnsignedLong (final short i) {

        return i & SHORT_FLAG_MASK_LONG;
    }

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

    /**
     * To disable the creation of such an object, declare the constructor as private.
     */
    private Utils () {

    }

    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------
    // --------------------------------------------------------------------------

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy