root/usr/src/cmd/pools/poold/com/sun/solaris/service/pools/Value.java
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 *
 */

package com.sun.solaris.service.pools;

/**
 * The <code>Value</code> class represents a pools value.
 */
public class Value {

        private long _this;

        /**
         * Constructor. Only for use from native code.
         * @param pointer A pointer to a C value.
         */
        private Value(long pointer)
        {
                _this = pointer;
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name) throws PoolsException
        {
                if ((_this = PoolInternal.pool_value_alloc()) == 0)
                        throw new PoolsException();
                setName(name);
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @param value The value of the value.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name, long value) throws PoolsException
        {
                this(name);
                setValue(value);
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @param value The value of the value.
         * @param s Indicates if the value is signed or not.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name, long value, boolean s) throws PoolsException
        {
                this(name);
                setValue(value, s);
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @param value The value of the value.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name, String value) throws PoolsException
        {
                this(name);
                setValue(value);
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @param value The value of the value.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name, boolean value) throws PoolsException
        {
                this(name);
                setValue(value);
        }

        /**
         * Constructor
         * @param name The name of the value.
         * @param value The value of the value.
         * @throws PoolsException If there is an error whilst
         * allocating the value.
         */
        public Value(String name, double value) throws PoolsException
        {
                this(name);
                setValue(value);
        }


        private boolean _locked = false;

        /**
         * Check whether the value is locked or not
         * @return returns the value of _locked
         */
        public boolean islocked() throws PoolsException
        {
                return (_locked);
        }

        /**
         * Lock the value
         */
        public void lock() throws PoolsException
        {
                _locked = true;
        }

        /**
         * Unlock the value
         */
        public void unlock() throws PoolsException
        {
                _locked = false;
        }

        /**
         * Explicitly reclaim the memory (if not locked)
         * allocated for this value by the C proxy.
         */
        public void close()
        {
                if (_locked == false) {
                        if (_this != 0) {
                                PoolInternal.pool_value_free(_this);
                                _this = 0;
                        }
                }
        }

        /**
         * Reclaim the memory allocated for this value by the C
         * proxy.
         *
         * @throws Throwable If freeing this configuration fails.
         */
        protected void finalize() throws Throwable
        {
                try
                {
                        unlock();
                        close();
                }
                finally
                {
                        super.finalize();
                }
        }

        /**
         * Name this value.
         *
         * @param name The name to set for this value.
         */
        public void setName(String name)
        {
                PoolInternal.pool_value_set_name(_this, name);
        }

        /**
         * Set this value to take the supplied signed long value.
         *
         * @param value The value to which this value should be set.
         */
        public void setValue(long value)
        {
                PoolInternal.pool_value_set_int64(_this, value);
        }

        /**
         * Set this value to take the supplied long value.
         *
         * @param value The value to which this value should be set.
         * @param s Is the value signed or unsigned.
         */
        public void setValue(long value, boolean s)
        {
                if (s)
                        setValue(value);
                PoolInternal.pool_value_set_uint64(_this, value);
        }

        /**
         * Set this value to take the supplied string value.
         *
         * @param value The value to which this value should be set.
         * @throws PoolsException If the setting of the value fails.
         */
        public void setValue(String value) throws PoolsException
        {
                if (PoolInternal.pool_value_set_string(_this, value) !=
                    PoolInternal.PO_SUCCESS)
                        throw new PoolsException();
        }

        /**
         * Set this value to take the supplied boolean value.
         *
         * @param value The value to which this value should be set.
         */
        public void setValue(boolean value)
        {
                if (value == true)
                        PoolInternal.pool_value_set_bool(_this, (short)1);
                else
                        PoolInternal.pool_value_set_bool(_this, (short)0);
        }

        /**
         * Set this value to take the supplied double value.
         *
         * @param value The value to which this value should be set.
         */
        public void setValue(double value)
        {
                PoolInternal.pool_value_set_double(_this, value);
        }

        /**
         * Returns the name of the value.
         *
         * @return the name of the value.
         */
        public String getName()
        {
                return (PoolInternal.pool_value_get_name(_this));
        }

        /**
         * Returns the pointer to the native value represented by this
         * object.
         *
         * @return the pointer to the native value represented by this
         * object.
         */
        public long getValue()
        {
                return (_this);
        }

        /**
         * Returns the type of this object.
         *
         * @return the type of this object.
         */
        public int getType()
        {
                return (PoolInternal.pool_value_get_type(_this));
        }

        /**
         * Returns a string representation of this value.
         *
         * @return a string representation of this value.
         */
        public String toString()
        {
                int type = PoolInternal.pool_value_get_type(_this);

                try {
                        if (type == PoolInternal.POC_INT ||
                            type == PoolInternal.POC_UINT)
                                return (String.valueOf(getLong()));
                        if (type == PoolInternal.POC_STRING)
                                return getString();
                        if (type == PoolInternal.POC_BOOL)
                                return (String.valueOf(getBool()));
                        if (type == PoolInternal.POC_DOUBLE)
                                return (String.valueOf(getDouble()));
                }
                catch (PoolsException pe) {
                        return pe.toString();
                }
                return "";      /* Stop the compiler complaining */
        }

        /**
         * Returns the value as a UnsignedInt64.
         *
         * @return the value as a UnsignedInt64.
         * @throws PoolsException if the value is not an
         * UnsignedInt64.
         */
        public final UnsignedInt64 getUnsignedInt64() throws PoolsException
        {
                return (getUnsignedInt64Value(_this));
        }

        /**
         * Returns the value as a long.
         *
         * @return the value as a long.
         * @throws PoolsException if the value is not a long.
         */
        public final long getLong() throws PoolsException
        {
                return (getLongValue(_this));
        }

        /**
         * Returns the value as a String.
         *
         * @return the value as a String.
         * @throws PoolsException if the value is not a String.
         */
        public final String getString() throws PoolsException
        {
                return (getStringValue(_this));
        }

        /**
         * Returns the value as a boolean.
         *
         * @return the value as a boolean.
         * @throws PoolsException if the value is not a boolean.
         */
        public final boolean getBool() throws PoolsException
        {
                return (getBoolValue(_this));
        }

        /**
         * Returns the value as a double.
         *
         * @return the value as a double.
         * @throws PoolsException if the value is not a double.
         */
        public final double getDouble() throws PoolsException
        {
                return (getDoubleValue(_this));
        }

        /**
         * Returns the value as a UnsignedInt64.
         *
         * @param pointer the native value to be accessed.
         * @return the value as a UnsignedInt64.
         */
        private final static native UnsignedInt64 getUnsignedInt64Value(
            long pointer);

        /**
         * Returns the value as a long.
         *
         * @param pointer the native value to be accessed.
         * @return the value as a long.
         */
        private final static native long getLongValue(long pointer);

        /**
         * Returns the value as a String.
         *
         * @param pointer the native value to be accessed.
         * @return the value as a String.
         */
        private final static native String getStringValue(long pointer);

        /**
         * Returns the value as a boolean.
         *
         * @param pointer the native value to be accessed.
         * @return the value as a boolean.
         */
        private final static native boolean getBoolValue(long pointer);

        /**
         * Returns the value as a double.
         *
         * @param pointer the native value to be accessed.
         * @return the value as a double.
         */
        private final static native double getDoubleValue(long pointer);
}