1 /** 2 * This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 * 6 * If it is not possible or desirable to put the notice in a particular 7 * file, then You may include the notice in a location (such as a LICENSE 8 * file in a relevant directory) where a recipient would be likely to look 9 * for such a notice. 10 11 * 12 */ 13 14 /* --------------------------------------------------------------------------- 15 * U.S. Government, Department of the Army 16 * Army Materiel Command 17 * Research Development Engineering Command 18 * Communications Electronics Research Development and Engineering Center 19 * --------------------------------------------------------------------------- 20 */ 21 package org.miloss.fgsms.common; 22 23 import java.io.InputStream; 24 import java.util.Enumeration; 25 import java.util.Locale; 26 import java.util.Properties; 27 import java.util.ResourceBundle; 28 29 /** 30 * Loads a properties file from the classpathfrom 31 * http://www.javaworld.com/javaqa/2003-08/01-qa-0808-property.html?page=2 32 * 33 * @author AO 34 */ 35 public abstract class PropertyLoader { 36 37 /** 38 * Looks up a resource named 'name' in the classpath. The resource must map 39 * to a file with .properties extention. The name is assumed to be absolute 40 * and can use either "/" or "." for package segment separation with an 41 * optional leading "/" and optional ".properties" suffix. Thus, the 42 * following names refer to the same resource: 43 * <pre> 44 * some.pkg.Resource 45 * some.pkg.Resource.properties 46 * some/pkg/Resource 47 * some/pkg/Resource.properties 48 * /some/pkg/Resource 49 * /some/pkg/Resource.properties 50 * </pre> 51 * 52 * @param name classpath resource name [may not be null] 53 * @param loader classloader through which to load the resource [null is 54 * equivalent to the application loader] 55 * 56 * @return resource converted to java.util.Properties [may be null if the 57 * resource was not found and THROW_ON_LOAD_FAILURE is false] 58 * @throws IllegalArgumentException if the resource was not found and 59 * THROW_ON_LOAD_FAILURE is true 60 */ 61 public static Properties loadProperties(String name, ClassLoader loader) { 62 if (name == null) { 63 throw new IllegalArgumentException("null input: name"); 64 } 65 66 if (name.startsWith("/")) { 67 name = name.substring(1); 68 } 69 70 if (name.endsWith(SUFFIX)) { 71 name = name.substring(0, name.length() - SUFFIX.length()); 72 } 73 74 Properties result = null; 75 76 InputStream in = null; 77 try { 78 if (loader == null) { 79 loader = ClassLoader.getSystemClassLoader(); 80 } 81 82 if (LOAD_AS_RESOURCE_BUNDLE) { 83 name = name.replace('/', '.'); 84 // Throws MissingResourceException on lookup failures: 85 final ResourceBundle rb = ResourceBundle.getBundle(name, 86 Locale.getDefault(), loader); 87 88 result = new Properties(); 89 for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) { 90 final String key = (String) keys.nextElement(); 91 final String value = rb.getString(key); 92 93 result.put(key, value); 94 } 95 } else { 96 name = name.replace('.', '/'); 97 98 if (!name.endsWith(SUFFIX)) { 99 name = name.concat(SUFFIX); 100 } 101 102 // Returns null on lookup failures: 103 in = loader.getResourceAsStream(name); 104 if (in != null) { 105 result = new Properties(); 106 result.load(in); // Can throw IOException 107 } 108 } 109 } catch (Exception e) { 110 result = null; 111 } finally { 112 if (in != null) { 113 try { 114 in.close(); 115 } catch (Throwable ignore) { 116 } 117 } 118 } 119 120 if (THROW_ON_LOAD_FAILURE && (result == null)) { 121 throw new IllegalArgumentException("could not load [" + name + "]" 122 + " as " + (LOAD_AS_RESOURCE_BUNDLE 123 ? "a resource bundle" 124 : "a classloader resource")); 125 } 126 127 return result; 128 } 129 /* 130 public static String FindFilePath(String name, ClassLoader loader) { 131 if (name == null) { 132 throw new IllegalArgumentException("null input: name"); 133 } 134 135 if (name.startsWith("/")) { 136 name = name.substring(1); 137 } 138 139 if (name.endsWith(SUFFIX)) { 140 name = name.substring(0, name.length() - SUFFIX.length()); 141 } 142 143 Properties result = null; 144 145 InputStream in = null; 146 try { 147 if (loader == null) { 148 loader = ClassLoader.getSystemClassLoader(); 149 } 150 151 if (LOAD_AS_RESOURCE_BUNDLE) { 152 name = name.replace('/', '.'); 153 // Throws MissingResourceException on lookup failures: 154 final ResourceBundle rb = ResourceBundle.getBundle(name, 155 Locale.getDefault(), loader); 156 157 result = new Properties(); 158 for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) { 159 final String key = (String) keys.nextElement(); 160 final String value = rb.getString(key); 161 162 result.put(key, value); 163 } 164 } else { 165 name = name.replace('.', '/'); 166 167 //if (! name.endsWith (SUFFIX)) 168 // name = name.concat (SUFFIX); 169 170 // Returns null on lookup failures: 171 return name; 172 } 173 } catch (Exception e) { 174 result = null; 175 } finally { 176 if (in != null) { 177 try { 178 in.close(); 179 } catch (Throwable ignore) { 180 } 181 } 182 } 183 184 if (THROW_ON_LOAD_FAILURE && (result == null)) { 185 throw new IllegalArgumentException("could not load [" + name + "]" 186 + " as " + (LOAD_AS_RESOURCE_BUNDLE 187 ? "a resource bundle" 188 : "a classloader resource")); 189 } 190 191 return ""; 192 } 193 */ 194 /** 195 * A convenience overload of {@link #loadProperties(String, ClassLoader)} 196 * that uses the current thread's context classloader. 197 */ 198 public static Properties loadProperties(final String name) { 199 return loadProperties(name, 200 Thread.currentThread().getContextClassLoader()); 201 } 202 private static final boolean THROW_ON_LOAD_FAILURE = true; 203 private static final boolean LOAD_AS_RESOURCE_BUNDLE = false; 204 private static final String SUFFIX = ".properties"; 205 } // End of class