ResourceUtil.java |
1 /** 2 * Distribution License: 3 * JSword is free software; you can redistribute it and/or modify it under 4 * the terms of the GNU Lesser General Public License, version 2.1 or later 5 * as published by the Free Software Foundation. This program is distributed 6 * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 7 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 8 * See the GNU Lesser General Public License for more details. 9 * 10 * The License is available on the internet at: 11 * http://www.gnu.org/copyleft/lgpl.html 12 * or by writing to: 13 * Free Software Foundation, Inc. 14 * 59 Temple Place - Suite 330 15 * Boston, MA 02111-1307, USA 16 * 17 * © CrossWire Bible Society, 2005 - 2016 18 * 19 */ 20 package org.crosswire.common.util; 21 22 import java.io.IOException; 23 import java.io.InputStream; 24 import java.net.URL; 25 import java.util.MissingResourceException; 26 27 import org.crosswire.jsword.JSOtherMsg; 28 29 /** 30 * Better implementations of the getResource methods with less ambiguity and 31 * that are less dependent on the specific class loader situation. 32 * 33 * @see gnu.lgpl.License The GNU Lesser General Public License for details. 34 * @author Joe Walker 35 * @author DM Smith 36 */ 37 public final class ResourceUtil { 38 /** 39 * Prevent Instantiation 40 */ 41 private ResourceUtil() { 42 } 43 44 /** 45 * Generic resource URL fetcher. One way or the other we'll find it! Either 46 * as a relative or an absolute reference. 47 * 48 * @param search 49 * The name of the resource (without a leading /) to find 50 * @return The requested resource 51 * @throws MissingResourceException 52 * if the resource can not be found 53 */ 54 public static URL getResource(String search) throws MissingResourceException { 55 return getResource(CallContext.getCallingClass(), search); 56 } 57 58 /** 59 * Generic resource URL fetcher. One way or the other we'll find it! Either 60 * as a relative or an absolute reference. 61 * 62 * @param <T> the type of the resource 63 * @param clazz the basis to search for the resource first. 64 * @param resourceName 65 * The resource to find 66 * @return The requested resource 67 * @throws MissingResourceException 68 * if the resource can not be found 69 */ 70 public static <T> URL getResource(Class<T> clazz, String resourceName) throws MissingResourceException { 71 URL resource = CWClassLoader.instance(clazz).findResource(resourceName); 72 73 if (resource == null) { 74 throw new MissingResourceException(JSOtherMsg.lookupText("Cannot find resource: {0}", resourceName), clazz.getName(), resourceName); 75 } 76 77 return resource; 78 } 79 80 /** 81 * Generic resource URL fetcher 82 * 83 * @param search 84 * The name of the resource (without a leading /) to find 85 * @return The requested resource 86 * @throws IOException 87 * if there is a problem reading the file 88 * @throws MissingResourceException 89 * if the resource can not be found 90 */ 91 public static InputStream getResourceAsStream(String search) throws IOException, MissingResourceException { 92 return getResourceAsStream(CallContext.getCallingClass(), search); 93 } 94 95 /** 96 * Generic resource URL fetcher 97 * 98 * @param <T> the type of the resource 99 * @param clazz the basis to search for the resource first. 100 * @param search 101 * The name of the resource (without a leading /) to find 102 * @return The requested resource 103 * @throws IOException 104 * if there is a problem reading the file 105 * @throws MissingResourceException 106 * if the resource can not be found 107 */ 108 public static <T> InputStream getResourceAsStream(Class<T> clazz, String search) throws IOException, MissingResourceException { 109 return ResourceUtil.getResource(clazz, search).openStream(); 110 } 111 112 /** 113 * Get and load a properties file from the writable area or if that fails 114 * from the classpath (where a default ought to be stored) 115 * 116 * @param subject 117 * The name of the desired resource (without any extension) 118 * @return The found and loaded properties file 119 * @throws IOException 120 * if the resource can not be loaded 121 */ 122 public static PropertyMap getProperties(String subject) throws IOException { 123 return getProperties(CallContext.getCallingClass(), subject); 124 } 125 126 /** 127 * Get and load a properties file from the writable area or if that fails 128 * from the classpath (where a default ought to be stored) 129 * 130 * @param <T> the type of the resource 131 * @param clazz 132 * The name of the desired resource 133 * @return The found and loaded properties file 134 * @throws IOException 135 * if the resource can not be loaded 136 */ 137 public static <T> PropertyMap getProperties(Class<T> clazz) throws IOException { 138 return getProperties(clazz, ClassUtil.getShortClassName(clazz)); 139 } 140 141 /** 142 * Get and load a properties file from the writable area or if that fails 143 * from the classpath (where a default ought to be stored) 144 * 145 * @param <T> the type of the resource 146 * @param clazz 147 * The name of the desired resource 148 * @param subject 149 * The name of the desired resource (without any extension) 150 * @return The found and loaded properties file 151 * @throws IOException 152 * if the resource can not be loaded 153 */ 154 private static <T> PropertyMap getProperties(Class<T> clazz, String subject) throws IOException { 155 try { 156 String lookup = subject + FileUtil.EXTENSION_PROPERTIES; 157 InputStream in = getResourceAsStream(clazz, lookup); 158 159 PropertyMap prop = new PropertyMap(); 160 prop.load(in); 161 return prop; 162 } catch (MissingResourceException e) { 163 return new PropertyMap(); 164 } 165 } 166 } 167