1 /*** 2 * Redistribution and use of this software and associated documentation 3 * ("Software"), with or without modification, are permitted provided 4 * that the following conditions are met: 5 * 6 * 1. Redistributions of source code must retain copyright 7 * statements and notices. Redistributions must also contain a 8 * copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the 11 * above copyright notice, this list of conditions and the 12 * following disclaimer in the documentation and/or other 13 * materials provided with the distribution. 14 * 15 * 3. The name "Exolab" must not be used to endorse or promote 16 * products derived from this Software without prior written 17 * permission of Exoffice Technologies. For written permission, 18 * please contact info@exolab.org. 19 * 20 * 4. Products derived from this Software may not be called "Exolab" 21 * nor may "Exolab" appear in their names without prior written 22 * permission of Exoffice Technologies. Exolab is a registered 23 * trademark of Exoffice Technologies. 24 * 25 * 5. Due credit should be given to the Exolab Project 26 * (http://www.exolab.org/). 27 * 28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Copyright 2005 (C) Exoffice Technologies Inc. All Rights Reserved. 42 * 43 * $Id: Properties.java,v 1.2 2005/05/03 13:45:59 tanderson Exp $ 44 */ 45 46 package org.exolab.jms.net.util; 47 48 import java.util.Map; 49 import java.util.HashMap; 50 51 import org.exolab.jms.net.connector.ResourceException; 52 import org.exolab.jms.net.uri.InvalidURIException; 53 import org.exolab.jms.net.uri.URI; 54 import org.exolab.jms.net.uri.URIHelper; 55 56 57 /*** 58 * Helper class for manipulating string property maps. 59 * 60 * @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a> 61 * @version $Revision: 1.2 $ $Date: 2005/05/03 13:45:59 $ 62 */ 63 public final class Properties { 64 65 /*** 66 * The properties. 67 */ 68 private final Map _properties; 69 70 /*** 71 * The property prefix. If non-null, this is prepended to unqualified 72 * property names. 73 */ 74 private final String _prefix; 75 76 77 /*** 78 * Construct a new <code>Properties</code>. 79 * 80 * @param prefix the property name prefix. If non-null, this is 81 * prepended to unqualified property names. 82 */ 83 public Properties(String prefix) { 84 this(null, prefix); 85 } 86 87 /*** 88 * Construct a new <code>Properties</code>. 89 * 90 * @param properties the properties to use. May be <code>null</code> 91 * @param prefix the property name prefix. If non-null, this is 92 * prepended to property names before performing lookups 93 */ 94 public Properties(Map properties, String prefix) { 95 _properties = (properties != null) ? properties : new HashMap(); 96 _prefix = prefix; 97 } 98 99 /*** 100 * Adds a property to the underlying map. 101 * If the property already exists, it will be replaced. 102 * 103 * @param name the property name 104 * @param value the property value. May be <code>null</code> 105 */ 106 public void set(String name, String value) { 107 _properties.put(getName(name), value); 108 } 109 110 /*** 111 * Adds a property to the underlying map, iff its value is non-null. 112 * If the non-null, and the property already exists, it will be replaced. 113 * 114 * @param name the property name 115 * @param value the property value 116 */ 117 public void setNonNull(String name, String value) { 118 if (value != null) { 119 _properties.put(getName(name), value); 120 } 121 } 122 123 /*** 124 * Adds a boolean property to the underlying map, as a String. 125 * If the property already exists, it will be replaced. 126 * 127 * @param name the property name 128 * @param value the property value 129 */ 130 public void set(String name, boolean value) { 131 Boolean bool = (value) ? Boolean.TRUE : Boolean.FALSE; 132 set(name, bool.toString()); 133 } 134 135 /*** 136 * Adds an integer property to the underlying map, as a String. 137 * If the property already exists, it will be replaced. 138 * 139 * @param name the property name 140 * @param value the property value 141 */ 142 public void set(String name, int value) { 143 set(name, Integer.toString(value)); 144 } 145 146 /*** 147 * Adds an object property to the underlying map, as a String. 148 * If the property already exists, it will be replaced. 149 * 150 * @param name the property name 151 * @param value the property value 152 */ 153 public void set(String name, Object value) { 154 if (value != null) { 155 set(name, value.toString()); 156 } else { 157 set(name, null); 158 } 159 } 160 161 /*** 162 * Adds an object property to the underlying map, as a String, 163 * iff its value is non-null. 164 * If non-null, and the property already exists, it will be replaced. 165 * 166 * @param name the property name 167 * @param value the property value 168 */ 169 public void setNonNull(String name, Object value) { 170 if (value != null) { 171 set(name, value.toString()); 172 } 173 } 174 175 /*** 176 * Returns the value of a property. 177 * 178 * @param name the property name 179 * @return the corresponding value, or <code>null</code> if none can be 180 * found 181 * @throws ResourceException if the property isn't a string 182 */ 183 public String get(String name) throws ResourceException { 184 Object result = null; 185 name = getName(name); 186 result = _properties.get(name); 187 if (result != null && !(result instanceof String)) { 188 throw new ResourceException("Invalid type for property=" + name); 189 } 190 return (String) result; 191 } 192 193 /*** 194 * Returns the value of a boolean property. 195 * 196 * @param name the property name 197 * @param defaultValue the value to return if the property doesn't exist. 198 * @return the corresponding value, or <code>defaultValue</code> if none can 199 * be found 200 * @throws ResourceException if the property isn't a valid boolean 201 */ 202 public boolean getBoolean(String name, boolean defaultValue) 203 throws ResourceException { 204 boolean result = defaultValue; 205 String value = get(name); 206 if (value != null) { 207 if (value.equalsIgnoreCase("true")) { 208 result = true; 209 } else if (value.equalsIgnoreCase("false")) { 210 result = false; 211 } else { 212 throw new ResourceException("Invalid boolean for property=" 213 + getName(name) 214 + ": " + value); 215 } 216 } 217 return result; 218 } 219 220 /*** 221 * Returns the value of an integer property. 222 * 223 * @param name the property name 224 * @param defaultValue the value to return if the property doesn't exist. 225 * @return the corresponding value, or <code>defaultValue</code> if none can 226 * be found 227 * @throws ResourceException if the property isn't a valid integer 228 */ 229 public int getInt(String name, int defaultValue) 230 throws ResourceException { 231 int result = defaultValue; 232 String value = get(name); 233 if (value != null) { 234 try { 235 result = Integer.parseInt(value); 236 } catch (NumberFormatException exception) { 237 throw new ResourceException("Invalid int for property=" 238 + getName(name) 239 + ": " + value); 240 } 241 } 242 return result; 243 } 244 245 /*** 246 * Returns the value of an URI property. 247 * 248 * @param name the property name 249 * @return the corresponding URI, or <code>null</code> if none can be found 250 * @throws ResourceException if the URI is invalid 251 */ 252 public URI getURI(String name) throws ResourceException { 253 URI result = null; 254 String uri = get(name); 255 if (uri != null) { 256 try { 257 result = URIHelper.parse(uri); 258 } catch (InvalidURIException exception) { 259 throw new ResourceException("Invalid URI for property=" 260 + getName(name) 261 + ": " + uri); 262 } 263 } 264 return result; 265 } 266 267 /*** 268 * Returns the underlying properties. 269 * 270 * @return the underlying properties 271 */ 272 public Map getProperties() { 273 return _properties; 274 } 275 276 /*** 277 * Prepends the supplied name with the property prefix, if it is 278 * unqualified (i.e, contains no "."). If the prefix is null, returns the 279 * name unchanged. 280 * 281 * @param name the property name 282 * @return the fully qualified property name. 283 */ 284 private String getName(String name) { 285 String result; 286 if (_prefix != null && name.indexOf('.') == -1) { 287 result = _prefix + name; 288 } else { 289 result = name; 290 } 291 return result; 292 } 293 294 }