001 package resource.util;
002
003 import java.net.*;
004 import java.util.*;
005
006 /**
007 * The global manager for all resources. The ResourceManager is responsible for managing all binary resources
008 * of the framework. This can be images, videos, text ...<br>
009 * <br>
010 * Resources are managed as follows:<br>
011 * <br>
012 * The root directory is a directory ending with the name "resource". Here it is just the directory
013 * "resource". Starting from this directory all resources are given back relative to this path.<br>
014 * <br>
015 * There can be multiple resouces to manage: gif-images, jpeg-images, text and others.<br>
016 * For all of these resources there should exist one resource module.<br>
017 * There is already one module for {@link #RESOURCE_GIF gif-resources}.<br>
018 * </br>
019 * Resources are requested as follows:<br>
020 * <CODE>URL url = ResourceManager.getInstance().getResource (String type, String path);</CODE></br>
021 * The "type" is the name of the resource module. The path string is the path relative to the directory
022 * of the requested type and is separated with a dot.
023 * </br>
024 * Example:</br>
025 * </br>
026 * An icon of the size 16x16 should be requested. It is located in the directory "resource/gif/icon".<br>
027 * The icon's name is "document.gif".
028 * So the call is:<br>
029 * <CODE>URL url = ResourceManager.getInstance().getResource (RESOURCE_GIF, "icon.document");</CODE>
030 *
031 * @author Thomas Medack
032 * @version 1.0
033 */
034 public class ResourceManager {
035
036 /**
037 * Interface for a resource module.
038 */
039 public static interface ResourceModul {
040 /**
041 * Returns the path relative to the current resource path.
042 *
043 * @return the path.
044 */
045 public String getPath();
046
047 /**
048 * Returns the file extension of the resource, e.g. "gif".
049 *
050 * @return the file extension
051 */
052 public String getExtension();
053
054 /**
055 * Returns the type name of the module. This is the name by which the resources are requested.
056 *
057 * @return the type name
058 */
059 public String getTypeName();
060 }
061
062 /**
063 * Map of all resource modules.
064 */
065 private HashMap moduls = new HashMap();
066
067 /**
068 * The root path of all resources.
069 */
070 protected String resourceRootPath = "";
071
072 /**
073 * The singleton instance of the resource manager.
074 */
075 private static ResourceManager instance = null;
076
077 /**
078 * Creates a new instance of ResourceManager.
079 */
080 protected ResourceManager() {
081 // add resource module
082 addResourceModul(new ResourceModulGIF());
083
084 // root path is package "resource"
085 resourceRootPath = "resource";
086 }
087
088 /**
089 * Returns the singleton instance of the ResourceManager.
090 *
091 * @return the singleton instance.
092 */
093 public static ResourceManager getInstance() {
094 if (instance == null) {
095 instance = new ResourceManager();
096
097 }
098 return instance;
099 }
100
101 /**
102 * Adds a resource module to the ResourceManager.
103 *
104 * @param rm the resource module to be added.
105 */
106 public void addResourceModul(ResourceModul rm) {
107 moduls.put(rm.getTypeName(), rm);
108 }
109
110 /**
111 * Removes a resource module from the ResourceManager.
112 *
113 * @param rm the resource module to be removed.
114 */
115 public void removeResourceModul(ResourceModul rm) {
116 moduls.remove(rm.getTypeName());
117 }
118
119 /**
120 * Returns a resource as URL. Therefor the logical name of the resource module and the relative path
121 * starting from it have to be specified.<br>
122 * </br>
123 * Example:</br>
124 * </br>
125 * logical name of the gif-module: "RESOURCE_GIF". The absolute path of this module is
126 * "org/eit/ui/resource/gif". The requested resource is "document.gif".<br>
127 * Therefore the call is: <CODE>getResource ("RESOURCE_GIF", "icon.16x16.document)</CODE>
128 * (without file extension).
129 *
130 * @param type the logical type name
131 * @param path der relative path + file name without extension
132 * @return the resource's URL.
133 */
134 public URL getResource(String type, String path) {
135 //changed from ClassLoader.getSystemClassLoader() to this.getClass().getClassLoader()
136 //because the first version does not work with Java Web Start
137 //return ClassLoader.getSystemClassLoader().getResource(getFullPath(type, path));
138 return this.getClass().getClassLoader().getResource(getFullPath(type, path));
139 }
140
141 /**
142 * Returns the full path of a resource..
143 *
144 * @param type the logical type name
145 * @param path der relative path + file name without extension
146 * @return the resource's full path as String.
147 */
148 public String getFullPath(String type, String path) {
149 ResourceModul rm = (ResourceModul)moduls.get(type);
150 String p = resourceRootPath + "/" + rm.getPath();
151
152 if (rm != null) {
153 // construct path
154 StringTokenizer st = new StringTokenizer(path, ".");
155 while (st.hasMoreTokens()) {
156 p = p + "/" + st.nextToken();
157 }
158 // append extension
159 p = p + "." + rm.getExtension();
160
161 return p;
162 }
163
164 return "";
165 }
166
167 /**
168 * Type name for resource module: GIF
169 */
170 public static final String RESOURCE_GIF = "gif";
171
172 /**
173 * Predefined module for .gif-resources.
174 */
175 private static final class ResourceModulGIF implements ResourceModul {
176
177 /**
178 * Returns the resource's file extension: "gif".
179 *
180 * @return the file extension
181 */
182 public String getExtension() {
183 return "gif";
184 }
185
186 /**
187 * Returns the path relative to the current resource path.
188 *
189 * @return the path.
190 */
191 public String getPath() {
192 return "gif";
193 }
194
195 /**
196 * Returns the type name of the module. This is the name by which the resources are requested.
197 *
198 * @return the type name
199 */
200 public String getTypeName() {
201 return RESOURCE_GIF;
202 }
203 }
204 }