001 package org.shiftone.jrat.util.io; 002 003 004 import org.shiftone.jrat.core.JRatException; 005 import org.shiftone.jrat.util.Assert; 006 import org.shiftone.jrat.util.log.Logger; 007 008 import java.io.*; 009 import java.util.Hashtable; 010 import java.util.Map; 011 import java.util.Properties; 012 013 014 /** 015 * Class ResourceUtil 016 * 017 * @author jeff@shiftone.org (Jeff Drost) 018 */ 019 public class ResourceUtil { 020 021 private static final Logger LOG = Logger.getLogger(ResourceUtil.class); 022 private static ClassLoader CLASS_LOADER = ResourceUtil.class.getClassLoader(); 023 private static Map resourceCache = new Hashtable(); 024 025 static { 026 if (CLASS_LOADER == null) { 027 CLASS_LOADER = Class.class.getClassLoader(); 028 } 029 } 030 031 public static Object newInstance(String className) { 032 033 Class klass = null; 034 Object instance = null; 035 036 Assert.assertNotNull("className", className); 037 LOG.debug("newInstance(" + className + ")"); 038 039 try { 040 klass = CLASS_LOADER.loadClass(className); 041 } 042 catch (Exception e) { 043 throw new JRatException("unable to getPreferences class '" + className + "'", e); 044 } 045 046 try { 047 instance = klass.newInstance(); 048 } 049 catch (Exception e) { 050 throw new JRatException("unable to instantiate '" + className + "'", e); 051 } 052 053 return instance; 054 } 055 056 057 public static InputStream loadResourceAsStream(String resourceName) { 058 059 InputStream inputStream = null; 060 061 LOG.info("getPreferences resource : " + resourceName); 062 Assert.assertNotNull("resourceName", resourceName); 063 064 inputStream = CLASS_LOADER.getResourceAsStream(resourceName); 065 066 if (inputStream == null) { 067 LOG.info("resource not found on classpath, trying to open as file"); 068 069 try { 070 inputStream = new FileInputStream(resourceName); 071 072 LOG.debug("resource opened as file"); 073 } 074 catch (Exception e) { 075 throw new JRatException("unable to locate resource : " + resourceName); 076 } 077 } else { 078 LOG.debug("resource opened from classpath"); 079 } 080 081 return inputStream; 082 } 083 084 085 public static byte[] loadResourceAsBytes(String resourceName) { 086 087 InputStream inputStream = loadResourceAsStream(resourceName); 088 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 089 090 try { 091 IOUtil.copy(inputStream, outputStream); 092 } 093 finally { 094 IOUtil.close(inputStream); 095 } 096 097 return outputStream.toByteArray(); 098 } 099 100 101 private static String fetchResource(String name) { 102 103 Reader reader = null; 104 StringBuffer sb = null; 105 InputStream inputStream = null; 106 int c = 0; 107 char[] buffer = new char[1025 * 1]; 108 109 Assert.assertNotNull("name", name); 110 LOG.debug("fetchResource : " + name); 111 112 inputStream = loadResourceAsStream(name); 113 reader = new InputStreamReader(inputStream); 114 sb = new StringBuffer(); 115 116 try { 117 for (c = 0; c >= 0; c = reader.read(buffer)) { 118 sb.append(buffer, 0, c); 119 } 120 } 121 catch (IOException e) { 122 throw new JRatException("unable to read resource data : " + name, e); 123 } 124 125 return sb.toString(); 126 } 127 128 129 public static String loadResource(String name) { 130 131 String resource = null; 132 133 Assert.assertNotNull("name", name); 134 135 resource = (String) resourceCache.get(name); 136 137 if (resource == null) { 138 LOG.info("loading and caching resource : " + name); 139 140 resource = fetchResource(name); 141 142 resourceCache.put(name, resource); 143 } 144 145 return resource; 146 } 147 148 149 public static Properties getResourceAsProperties(String name) { 150 151 InputStream inputStream = null; 152 Properties props = null; 153 154 Assert.assertNotNull("name", name); 155 LOG.debug("getResourceAsProperties : " + name); 156 157 inputStream = loadResourceAsStream(name); 158 props = new Properties(); 159 160 try { 161 props.load(inputStream); 162 } 163 catch (Exception e) { 164 throw new JRatException("unable to getPreferences properties from resource : " + name, e); 165 } 166 167 return props; 168 } 169 }