1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  *
25  */
26 
27 package com.sun.solaris.service.pools;
28 
29 /**
30  * The <code>Value</code> class represents a pools value.
31  */
32 public class Value {
33 
34 	private long _this;
35 
36 	/**
37 	 * Constructor. Only for use from native code.
38 	 * @param pointer A pointer to a C value.
39 	 */
Value(long pointer)40 	private Value(long pointer)
41 	{
42 		_this = pointer;
43 	}
44 
45 	/**
46 	 * Constructor
47 	 * @param name The name of the value.
48 	 * @throws PoolsException If there is an error whilst
49 	 * allocating the value.
50 	 */
Value(String name)51 	public Value(String name) throws PoolsException
52 	{
53 		if ((_this = PoolInternal.pool_value_alloc()) == 0)
54 			throw new PoolsException();
55 		setName(name);
56 	}
57 
58 	/**
59 	 * Constructor
60 	 * @param name The name of the value.
61 	 * @param value The value of the value.
62 	 * @throws PoolsException If there is an error whilst
63 	 * allocating the value.
64 	 */
Value(String name, long value)65 	public Value(String name, long value) throws PoolsException
66 	{
67 		this(name);
68 		setValue(value);
69 	}
70 
71 	/**
72 	 * Constructor
73 	 * @param name The name of the value.
74 	 * @param value The value of the value.
75 	 * @param s Indicates if the value is signed or not.
76 	 * @throws PoolsException If there is an error whilst
77 	 * allocating the value.
78 	 */
Value(String name, long value, boolean s)79 	public Value(String name, long value, boolean s) throws PoolsException
80 	{
81 		this(name);
82 		setValue(value, s);
83 	}
84 
85 	/**
86 	 * Constructor
87 	 * @param name The name of the value.
88 	 * @param value The value of the value.
89 	 * @throws PoolsException If there is an error whilst
90 	 * allocating the value.
91 	 */
Value(String name, String value)92 	public Value(String name, String value) throws PoolsException
93 	{
94 		this(name);
95 		setValue(value);
96 	}
97 
98 	/**
99 	 * Constructor
100 	 * @param name The name of the value.
101 	 * @param value The value of the value.
102 	 * @throws PoolsException If there is an error whilst
103 	 * allocating the value.
104 	 */
Value(String name, boolean value)105 	public Value(String name, boolean value) throws PoolsException
106 	{
107 		this(name);
108 		setValue(value);
109 	}
110 
111 	/**
112 	 * Constructor
113 	 * @param name The name of the value.
114 	 * @param value The value of the value.
115 	 * @throws PoolsException If there is an error whilst
116 	 * allocating the value.
117 	 */
Value(String name, double value)118 	public Value(String name, double value) throws PoolsException
119 	{
120 		this(name);
121 		setValue(value);
122 	}
123 
124 
125 	private boolean _locked = false;
126 
127 	/**
128 	 * Check whether the value is locked or not
129 	 * @return returns the value of _locked
130 	 */
islocked()131 	public boolean islocked() throws PoolsException
132         {
133                 return (_locked);
134         }
135 
136 	/**
137 	 * Lock the value
138 	 */
lock()139 	public void lock() throws PoolsException
140 	{
141 		_locked = true;
142 	}
143 
144 	/**
145 	 * Unlock the value
146 	 */
unlock()147 	public void unlock() throws PoolsException
148 	{
149 		_locked = false;
150 	}
151 
152 	/**
153 	 * Explicitly reclaim the memory (if not locked)
154 	 * allocated for this value by the C proxy.
155 	 */
close()156 	public void close()
157 	{
158 		if (_locked == false) {
159 			if (_this != 0) {
160 				PoolInternal.pool_value_free(_this);
161 				_this = 0;
162 			}
163 		}
164 	}
165 
166 	/**
167 	 * Reclaim the memory allocated for this value by the C
168 	 * proxy.
169 	 *
170 	 * @throws Throwable If freeing this configuration fails.
171 	 */
finalize()172 	protected void finalize() throws Throwable
173 	{
174 		try
175 		{
176 			unlock();
177 			close();
178 		}
179 		finally
180 		{
181 			super.finalize();
182 		}
183 	}
184 
185 	/**
186 	 * Name this value.
187 	 *
188 	 * @param name The name to set for this value.
189 	 */
setName(String name)190 	public void setName(String name)
191 	{
192 		PoolInternal.pool_value_set_name(_this, name);
193 	}
194 
195 	/**
196 	 * Set this value to take the supplied signed long value.
197 	 *
198 	 * @param value The value to which this value should be set.
199 	 */
setValue(long value)200 	public void setValue(long value)
201 	{
202 		PoolInternal.pool_value_set_int64(_this, value);
203 	}
204 
205 	/**
206 	 * Set this value to take the supplied long value.
207 	 *
208 	 * @param value The value to which this value should be set.
209 	 * @param s Is the value signed or unsigned.
210 	 */
setValue(long value, boolean s)211 	public void setValue(long value, boolean s)
212 	{
213 		if (s)
214 			setValue(value);
215 		PoolInternal.pool_value_set_uint64(_this, value);
216 	}
217 
218 	/**
219 	 * Set this value to take the supplied string value.
220 	 *
221 	 * @param value The value to which this value should be set.
222 	 * @throws PoolsException If the setting of the value fails.
223 	 */
setValue(String value)224 	public void setValue(String value) throws PoolsException
225 	{
226 		if (PoolInternal.pool_value_set_string(_this, value) !=
227 		    PoolInternal.PO_SUCCESS)
228 			throw new PoolsException();
229 	}
230 
231 	/**
232 	 * Set this value to take the supplied boolean value.
233 	 *
234 	 * @param value The value to which this value should be set.
235 	 */
setValue(boolean value)236 	public void setValue(boolean value)
237 	{
238 		if (value == true)
239 			PoolInternal.pool_value_set_bool(_this, (short)1);
240 		else
241 			PoolInternal.pool_value_set_bool(_this, (short)0);
242 	}
243 
244 	/**
245 	 * Set this value to take the supplied double value.
246 	 *
247 	 * @param value The value to which this value should be set.
248 	 */
setValue(double value)249 	public void setValue(double value)
250 	{
251 		PoolInternal.pool_value_set_double(_this, value);
252 	}
253 
254 	/**
255 	 * Returns the name of the value.
256 	 *
257 	 * @return the name of the value.
258 	 */
getName()259 	public String getName()
260 	{
261 		return (PoolInternal.pool_value_get_name(_this));
262 	}
263 
264 	/**
265 	 * Returns the pointer to the native value represented by this
266 	 * object.
267 	 *
268 	 * @return the pointer to the native value represented by this
269 	 * object.
270 	 */
getValue()271 	public long getValue()
272 	{
273 		return (_this);
274 	}
275 
276 	/**
277 	 * Returns the type of this object.
278 	 *
279 	 * @return the type of this object.
280 	 */
getType()281 	public int getType()
282 	{
283 		return (PoolInternal.pool_value_get_type(_this));
284 	}
285 
286 	/**
287 	 * Returns a string representation of this value.
288 	 *
289 	 * @return a string representation of this value.
290 	 */
toString()291 	public String toString()
292 	{
293 		int type = PoolInternal.pool_value_get_type(_this);
294 
295 		try {
296 			if (type == PoolInternal.POC_INT ||
297 			    type == PoolInternal.POC_UINT)
298 				return (String.valueOf(getLong()));
299 			if (type == PoolInternal.POC_STRING)
300 				return getString();
301 			if (type == PoolInternal.POC_BOOL)
302 				return (String.valueOf(getBool()));
303 			if (type == PoolInternal.POC_DOUBLE)
304 				return (String.valueOf(getDouble()));
305 		}
306 		catch (PoolsException pe) {
307 			return pe.toString();
308 		}
309 		return "";	/* Stop the compiler complaining */
310 	}
311 
312         /**
313          * Returns the value as a UnsignedInt64.
314          *
315          * @return the value as a UnsignedInt64.
316          * @throws PoolsException if the value is not an
317          * UnsignedInt64.
318          */
getUnsignedInt64()319 	public final UnsignedInt64 getUnsignedInt64() throws PoolsException
320 	{
321 		return (getUnsignedInt64Value(_this));
322 	}
323 
324         /**
325          * Returns the value as a long.
326          *
327          * @return the value as a long.
328          * @throws PoolsException if the value is not a long.
329          */
getLong()330 	public final long getLong() throws PoolsException
331 	{
332 		return (getLongValue(_this));
333 	}
334 
335         /**
336          * Returns the value as a String.
337          *
338          * @return the value as a String.
339          * @throws PoolsException if the value is not a String.
340          */
getString()341 	public final String getString() throws PoolsException
342 	{
343 		return (getStringValue(_this));
344 	}
345 
346         /**
347          * Returns the value as a boolean.
348          *
349          * @return the value as a boolean.
350          * @throws PoolsException if the value is not a boolean.
351          */
getBool()352 	public final boolean getBool() throws PoolsException
353 	{
354 		return (getBoolValue(_this));
355 	}
356 
357         /**
358          * Returns the value as a double.
359          *
360          * @return the value as a double.
361          * @throws PoolsException if the value is not a double.
362          */
getDouble()363 	public final double getDouble() throws PoolsException
364 	{
365 		return (getDoubleValue(_this));
366 	}
367 
368         /**
369          * Returns the value as a UnsignedInt64.
370          *
371          * @param pointer the native value to be accessed.
372          * @return the value as a UnsignedInt64.
373          */
getUnsignedInt64Value( long pointer)374 	private final static native UnsignedInt64 getUnsignedInt64Value(
375 	    long pointer);
376 
377         /**
378          * Returns the value as a long.
379          *
380          * @param pointer the native value to be accessed.
381          * @return the value as a long.
382          */
getLongValue(long pointer)383 	private final static native long getLongValue(long pointer);
384 
385         /**
386          * Returns the value as a String.
387          *
388          * @param pointer the native value to be accessed.
389          * @return the value as a String.
390          */
getStringValue(long pointer)391 	private final static native String getStringValue(long pointer);
392 
393         /**
394          * Returns the value as a boolean.
395          *
396          * @param pointer the native value to be accessed.
397          * @return the value as a boolean.
398          */
getBoolValue(long pointer)399 	private final static native boolean getBoolValue(long pointer);
400 
401         /**
402          * Returns the value as a double.
403          *
404          * @param pointer the native value to be accessed.
405          * @return the value as a double.
406          */
getDoubleValue(long pointer)407 	private final static native double getDoubleValue(long pointer);
408 }
409