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 import java.util.List;
30 import java.util.ArrayList;
31 import java.util.HashMap;
32 import java.util.Arrays;
33 
34 /**
35  * The <code>Element</code> class represents a pools configuration
36  * element.  The class is an abstract, base class for concrete
37  * implementation elements, such as pool and resource.
38  */
39 public abstract class Element implements Property, PropertyWalk
40 {
41 	/**
42 	 * The configuration to which this element belongs.
43 	 */
44 	protected Configuration _conf;
45 
46         /**
47          * Returns a string representation of this element.
48          *
49          * @return  a string representation of this element.
50          */
toString()51 	public String toString()
52 	{
53 		try {
54 			return (getInformation(1));
55 		} catch (PoolsException pe) {
56 			return (pe.toString());
57 		}
58 	}
59 
60 	/**
61 	 * Returns a descriptive string which describes the element.
62 	 *
63 	 * @param deep Whether the information should contain information about
64 	 * all contained elements.
65 	 * @throws PoolsException If the element cannot be located.
66 	 * @return a descriptive string which describes the element.
67 	 */
getInformation(int deep)68 	public abstract String getInformation(int deep) throws PoolsException;
69 
70 	/**
71 	 * A list of properties that are chosen to be cached.
72 	 */
73 	private static final List cachedProperties
74 			= Arrays.asList(new String[] {"cpu.sys_id",
75 			"pool.default", "pool.sys_id", "pset.default",
76 			"pset.sys_id", "pset.type", "pset.units"});
77 
78         /**
79          * hashmap of property values that are determined readonly
80          */
81         private HashMap readOnlyValues = new HashMap();
82 
83 	/**
84 	 * Get the property with the supplied name.
85 	 *
86 	 * @param name The name of the property to be retrieved.
87 	 * @throws PoolsException If there is an error accessing the property.
88 	 * @return a value containing the property details.
89 	 */
getProperty(String name)90         private Value getProperty(String name) throws PoolsException
91 	{
92             if (readOnlyValues.containsKey(name)) {
93                 Value value = (Value) readOnlyValues.get(name);
94                 return (value);
95             } else {
96                 Value value = new Value(name);
97                 if (PoolInternal.pool_get_property(_conf.getConf(), getElem(),
98                         name, value.getValue()) == PoolInternal.POC_INVAL) {
99                     throw new PoolsException();
100                 } else {
101                     if (cachedProperties.contains(name)) {
102                         value.lock();
103                         readOnlyValues.put(name, value);
104                     }
105                     return (value);
106                 }
107             }
108         }
109 
110 	/**
111 	 * Get the property with the supplied name using the supplied
112 	 * proxy.
113 	 *
114 	 * @param name The name of the property to be retrieved.
115 	 * @param proxy The proxy item used to retrieve the property.
116 	 * @throws PoolsException If there is an error accessing the property.
117 	 * @return a value containing the property details.
118 	 */
getProperty(String name, long proxy)119         protected Value getProperty(String name, long proxy)
120 	    throws PoolsException
121 	{
122             if (readOnlyValues.containsKey(name)) {
123                 Value value = (Value) readOnlyValues.get(name);
124                 return (value);
125             } else {
126                 Value value = new Value(name);
127                 if (PoolInternal.pool_get_property(_conf.getConf(), proxy, name,
128                         value.getValue()) == PoolInternal.POC_INVAL) {
129                     throw new PoolsException();
130                 } else {
131                     if (cachedProperties.contains(name)) {
132                         value.lock();
133                         readOnlyValues.put(name, value);
134                     }
135                     return (value);
136                 }
137             }
138         }
139 
140 	/**
141 	 * Put the supplied value as an element property with the supplied
142 	 * name.
143 	 *
144 	 * @param name The name of the property to be updated.
145 	 * @param value The value of the property to be updated.
146 	 * @throws PoolsException If there is an error accessing the property.
147 	 */
putProperty(String name, Value value)148         public void putProperty(String name, Value value) throws PoolsException
149 	{
150 		if (PoolInternal.pool_put_property(_conf.getConf(), getElem(),
151 			name, value.getValue()) != PoolInternal.PO_SUCCESS)
152 			throw new PoolsException();
153 	}
154 
155 	/**
156 	 * Remove the element property with the supplied name.
157 	 *
158 	 * @param name The name of the property to be removed.
159 	 * @throws PoolsException If there is an error removing the property.
160 	 */
rmProperty(String name)161         public void rmProperty(String name) throws PoolsException
162 	{
163 		if (PoolInternal.pool_rm_property(_conf.getConf(), getElem(),
164 			name) != PoolInternal.PO_SUCCESS)
165 			throw new PoolsException();
166 	}
167 
168 	/**
169 	 * Get a String property.
170 	 *
171 	 * If the type of the property does not match, i.e. it's not a
172 	 * String, or the element does not have such a property then a
173 	 * PoolsException is thrown.
174 	 *
175 	 * @param name The name of the property to be retrieved.
176 	 * @throws PoolsException If getting the String property fails.
177 	 */
getStringProperty(String name)178 	public String getStringProperty(String name) throws PoolsException
179 	{
180 		Value val = getProperty(name);
181 
182 		if (val != null) {
183 			String ret = val.getString();
184 			val.close();
185 			return (ret);
186 		}
187 		throw new PoolsException();
188 	}
189 
190 	/**
191 	 * Get a long property.
192 	 *
193 	 * If the type of the property does not match, i.e. it's not a
194 	 * long, or the element does not have such a property then a
195 	 * PoolsException is thrown.
196 	 *
197 	 * @param name The name of the property to be retrieved.
198 	 * @throws PoolsException If getting the long property fails.
199 	 */
getLongProperty(String name)200 	public long getLongProperty(String name) throws PoolsException
201 	{
202 		Value val = getProperty(name);
203 
204 		if (val != null) {
205 			long ret = val.getLong();
206 			val.close();
207 			return (ret);
208 		}
209 		throw new PoolsException();
210 	}
211 
212 	/**
213 	 * Get a double property.
214 	 *
215 	 * If the type of the property does not match, i.e. it's not a
216 	 * double, or the element does not have such a property then a
217 	 * PoolsException is thrown.
218 	 *
219 	 * @param name The name of the property to be retrieved.
220 	 * @throws PoolsException If getting the double property fails.
221 	 */
getDoubleProperty(String name)222 	public double getDoubleProperty(String name) throws PoolsException
223 	{
224 		Value val = getProperty(name);
225 
226 		if (val != null) {
227 			double ret = val.getDouble();
228 			val.close();
229 			return (ret);
230 		}
231 		throw new PoolsException();
232 	}
233 
234 	/**
235 	 * Get a boolean property.
236 	 *
237 	 * If the type of the property does not match, i.e. it's not a
238 	 * boolean, or the element does not have such a property then
239 	 * a PoolsException is thrown.
240 	 *
241 	 * @param name The name of the property to be retrieved.
242 	 * @throws PoolsException If getting the boolean property fails.
243 	 */
getBoolProperty(String name)244 	public boolean getBoolProperty(String name) throws PoolsException
245 	{
246 		Value val = getProperty(name);
247 
248 		if (val != null) {
249 			boolean ret = val.getBool();
250 			val.close();
251 			return (ret);
252 		}
253 		throw new PoolsException();
254 	}
255 
256 	/**
257 	 * Walk all properties of the invoking object.
258 	 *
259 	 * @param elem The element to whom the property belongs.
260 	 * @param val The value representing the current element.
261 	 * @param user User supplied data, provided when the walk is invoked.
262 	 * @throws PoolsException If there is an error walking the property.
263 	 * @return 0 to continue the walk, anything else to terminate it.
264 	 */
walk(Element elem, Value val, Object user)265 	public int walk(Element elem, Value val, Object user)
266 	    throws PoolsException
267 	{
268 		System.out.println("Property name: " + val.getName() +
269 		    ", value: "+val.toString());
270 		val.close();
271 		return (0);
272 	}
273 
274 	/**
275 	 * Return the pointer to this subtype as an element.
276 	 *
277 	 * @return The pointer to the native subtype which this object wraps.
278 	 * @throws PoolsException If there is an error converting the native
279 	 * subtype pointer to a native elem pointer.
280 	 */
getElem()281 	protected abstract long getElem() throws PoolsException;
282 
283 	/**
284 	 * Walk all the properties of this element.
285 	 *
286 	 * @param handler The object which will receive the callbacks.
287 	 * @param user Data supplied by the user for use in the callback.
288 	 * @return 0 for a successful walk, else 1.
289 	 * @throws PoolsException If there is an error during the walk.
290 	 */
walkProperties(PropertyWalk handler, Object user)291 	public int walkProperties(PropertyWalk handler, Object user)
292 	    throws PoolsException
293 	{
294 		return (walkProps(_conf.getConf(), getElem(), handler, user));
295 	}
296 
297 	/**
298 	 * Walk the properties of the supplied element using the
299 	 * supplied handler.
300 	 *
301 	 * @param conf native reference to the configuration in which
302 	 * the element belongs.
303 	 * @param elem native reference to the element whose
304 	 * properties are to be walked.
305 	 * @param handler a method to be invoked with each property of
306 	 * the elem.
307 	 * @param user a user parameter which is passed to handler on
308 	 * each invocation.
309 	 * @throws PoolsException if there is an error accessing the
310 	 * element properties.
311 	 */
walkProps(long conf, long elem, PropertyWalk handler, Object user)312 	private native int walkProps(long conf, long elem,
313 	    PropertyWalk handler, Object user) throws PoolsException;
314 
315 	/**
316 	 * Return the key of the element.
317 	 */
getKey()318 	abstract String getKey();
319 }
320