1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.microemu.app.util;
28
29 import java.io.InputStream;
30
31 import org.microemu.Injected;
32 import org.microemu.log.Logger;
33 import org.microemu.util.ThreadUtils;
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class MIDletResourceLoader {
48
49
50
51 public static boolean traceResourceLoading = false;
52
53
54
55
56 public static ClassLoader classLoader;
57
58 private static final String FQCN = Injected.class.getName();
59
60 public static InputStream getResourceAsStream(Class origClass, String resourceName) {
61 if (traceResourceLoading) {
62 Logger.debug("Loading MIDlet resource", resourceName);
63 }
64 if (classLoader != origClass.getClassLoader()) {
65
66 String callLocation = ThreadUtils.getCallLocation(FQCN);
67 if (callLocation != null) {
68 Logger.warn("attempt to load resource [" + resourceName + "] using System ClasslLoader from "
69 + callLocation);
70 }
71 }
72 resourceName = resolveName(origClass, resourceName);
73
74 InputStream is = classLoader.getResourceAsStream(resourceName);
75 if (is == null) {
76 Logger.debug("Resource not found ", resourceName);
77 return null;
78 } else {
79 return new MIDletResourceInputStream(is);
80 }
81 }
82
83 private static String resolveName(Class origClass, String name) {
84 if (name == null) {
85 return name;
86 }
87 if (!name.startsWith("/")) {
88 while (origClass.isArray()) {
89 origClass = origClass.getComponentType();
90 }
91 String baseName = origClass.getName();
92 int index = baseName.lastIndexOf('.');
93 if (index != -1) {
94 name = baseName.substring(0, index).replace('.', '/') + "/" + name;
95 }
96 } else {
97 name = name.substring(1);
98 }
99 return name;
100 }
101 }