1 package com.zmicer.utils;
2
3 import com.zmicer.utils.junit.ZmicerTestUtils;
4 import org.apache.log4j.Logger;
5
6 import java.io.File;
7 import java.net.URL;
8 import java.util.List;
9 import java.util.Locale;
10 import java.util.MissingResourceException;
11 import java.util.ResourceBundle;
12
13
14
15
16
17
18
19
20 public class ResourceUtils
21 {
22
23
24
25 final public static Logger LOG = Logger.getLogger(ZmicerUtilsConstants.LoggingCategory.OBTAIN_RESOURCES.toString());
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public static ResourceBundle getResourceBundle(final String resourceName)
42 {
43 InputArgumentUtils.checkStrings(true, resourceName);
44
45 LoggingUtils.debug(LOG, ResourceUtils.class, "Trying to obtain resource [" + resourceName + "] using classloaders.");
46 final Locale defaultLocale = Locale.getDefault();
47 final List<ClassLoader> loaders = ClassLoaderUtils.retrieveActualClassLoaders();
48 int counter = 0;
49 for (final ClassLoader loader : loaders)
50 {
51 try
52 {
53 final ResourceBundle resourceBundle = ResourceBundle.getBundle(resourceName, defaultLocale, loader);
54
55 if (null != resourceBundle)
56 {
57 final ClassLoaderUtils.ClassLoaderTypes type = ClassLoaderUtils.ClassLoaderTypes.getTypeByOrdNumber(counter);
58 LoggingUtils.debug(LOG, ResourceUtils.class, "The ResourceBundle with the name [" + resourceName +
59 ((null != type) ? "] was obtained via the ClassLoader [" + type.toString() : "] (the name is a base name)"));
60 return resourceBundle;
61 }
62 }
63 catch (MissingResourceException ex)
64 {
65
66 }
67 counter++;
68 }
69 LoggingUtils.debug(LOG, ResourceUtils.class, "Can not obtain resource [" + resourceName + "] using classloaders.");
70
71 ResourceBundle result = FileUtils.getResourceBundleViaFile(resourceName);
72 if (null != result)
73 {
74 return result;
75 }
76
77
78
79 final String testDataFolderName = ZmicerTestUtils.getFolderWithTestData();
80 if (null == testDataFolderName)
81 {
82 return null;
83 }
84 final String testDataFolderBaseName = FileUtils.getFolderBaseName(testDataFolderName);
85 if (!resourceName.contains(testDataFolderBaseName))
86 {
87
88 return getResourceBundle(testDataFolderBaseName + File.separator + resourceName.replace(".", File.separator));
89 }
90
91
92 if (!resourceName.contains(testDataFolderName))
93 {
94
95
96 final int index = resourceName.indexOf(testDataFolderBaseName);
97 String newResourceName = resourceName;
98 if (index == 0)
99 {
100 newResourceName = resourceName.substring(testDataFolderBaseName.length() + 1);
101 }
102
103 return getResourceBundle(testDataFolderName + File.separator + newResourceName.replace(".", File.separator));
104 }
105
106
107
108
109 String newResourceName = resourceName;
110 if (resourceName.indexOf(testDataFolderBaseName) == 0)
111 {
112 newResourceName = resourceName.substring(testDataFolderBaseName.length() + 1);
113 }
114 else if (resourceName.indexOf(testDataFolderName) == 0)
115 {
116 newResourceName = resourceName.substring(testDataFolderName.length() + 1);
117 }
118 result = FileUtils.getResourceBundleViaFile(
119 FileUtils.constructPath(ZmicerTestUtils.getFolderWithCommonTestData(), newResourceName));
120 if (null != result)
121 {
122 return result;
123 }
124
125 LoggingUtils.debug(LOG, ResourceUtils.class, "Can not retrive the ResourceBundle with the base name [" + resourceName + "] using all the possible classloaders and " +
126 "FileInputStream - the name doesn't specify the correct ResourceName");
127 return null;
128 }
129
130
131
132
133
134
135
136
137
138
139
140 public static URL getResource(final String name)
141 {
142 InputArgumentUtils.checkStrings(true, name);
143
144 LoggingUtils.debug(LOG, ResourceUtils.class, "Trying to obtain resource [" + name + "] using classloaders.");
145 final List<ClassLoader> loaders = ClassLoaderUtils.retrieveActualClassLoaders();
146 int counter = 0;
147 for (final ClassLoader loader : loaders)
148 {
149 try
150 {
151
152
153 final URL url = loader.getResource(name.replace(File.separator, "/"));
154
155 if (null != url)
156 {
157 final ClassLoaderUtils.ClassLoaderTypes type = ClassLoaderUtils.ClassLoaderTypes.getTypeByOrdNumber(counter);
158 LoggingUtils.debug(LOG, ResourceUtils.class, "The resource with the name [" + name +
159 ((null != url) ? "] was found via the ClassLoader [" + type.toString() : "]"));
160 return url;
161 }
162 }
163 catch (MissingResourceException ex)
164 {
165
166 }
167 counter++;
168 }
169 LoggingUtils.debug(LOG, ResourceUtils.class, "Can not obtain resource [" + name + "] using classloaders.");
170
171
172 LoggingUtils.debug(LOG, ResourceUtils.class, "Trying to obtain resource [" + name + "] using File class facility");
173 final File resourceFile = new File(name);
174 if (resourceFile.isFile())
175 {
176 try
177 {
178 LoggingUtils.debug(LOG, ResourceUtils.class, "The Resource with the name [" + name +
179 "] was obtained via the File class");
180 return resourceFile.toURL();
181 }
182 catch (Exception ex)
183 {
184
185 }
186 }
187 LoggingUtils.debug(LOG, ResourceUtils.class, "Can not obtain resource [" + name + "] using File class facility.");
188
189
190
191 if (null == ZmicerTestUtils.getFolderWithTestData())
192 {
193 return null;
194 }
195 final String testDataFolderBaseName = FileUtils.getFolderBaseName(ZmicerTestUtils.getFolderWithTestData());
196 if (!name.contains(testDataFolderBaseName))
197 {
198
199 return getResource(testDataFolderBaseName + File.separator + name);
200 }
201
202
203 if (!name.contains(ZmicerTestUtils.getFolderWithTestData()))
204 {
205
206
207 final int index = name.indexOf(testDataFolderBaseName);
208 String newResourceName = name;
209 if (index == 0)
210 {
211 newResourceName = name.substring(testDataFolderBaseName.length() + 1);
212 }
213
214
215 return getResource(ZmicerTestUtils.getFolderWithTestData() + File.separator + newResourceName);
216 }
217
218 LoggingUtils.debug(LOG, ResourceUtils.class, "Can not retrieve the resource with the name [" + name + "] using all the possible " +
219 "classloaders and File class facilities");
220 return null;
221 }
222 }