1
2
3
4
5
6
7
8 package org.codehaus.dna.impl;
9
10 import java.util.HashMap;
11 import java.util.Map;
12
13 import org.codehaus.dna.MissingResourceException;
14 import org.codehaus.dna.ResourceLocator;
15
16 /***
17 * ResourceLocator implementation backed by a Map and
18 * optionally delegating to parent ResourceLocators.
19 * The developer should create the DefaultResourceLocator,
20 * associate resources with locator and then invoke
21 * {@link #makeReadOnly()} before passing the Locator to
22 * the client component.
23 *
24 * <p>The implementation will first check for resources
25 * associated with itself and if unable to locate resource
26 * locally it will delegate to parent ResourceLocator.</p>
27 *
28 * @version $Revision: 1.2 $ $Date: 2004/05/01 09:51:48 $
29 */
30 public class DefaultResourceLocator
31 extends AbstractFreezable
32 implements ResourceLocator
33 {
34 /***
35 * parent locator to look into if unable to
36 * find resource in current locator.
37 */
38 private final ResourceLocator m_parent;
39
40 /***
41 * Resources registered with locator.
42 */
43 private final Map m_resources = new HashMap();
44
45 /***
46 * Create a ResourceLocator with no parent.
47 */
48 public DefaultResourceLocator()
49 {
50 this( null );
51 }
52
53 /***
54 * Create a ResourceLocator with specified parent.
55 *
56 * @param parent the parent ResourceLocator
57 */
58 public DefaultResourceLocator( final ResourceLocator parent )
59 {
60 m_parent = parent;
61 }
62
63 /***
64 * Return resource registered with specified key.
65 *
66 * @param key the key
67 * @return the resource
68 * @throws MissingResourceException if unable to locate
69 * resource with specified key
70 */
71 public Object lookup( final String key )
72 throws MissingResourceException
73 {
74 final Object resource = getResourceMap().get( key );
75 if( null != resource )
76 {
77 return resource;
78 }
79
80 final ResourceLocator parent = getParent();
81 if( null != parent )
82 {
83 return parent.lookup( key );
84 }
85 else
86 {
87 final String message = "Unable to locate resource " + key + ".";
88 throw new MissingResourceException( message, key );
89 }
90 }
91
92 /***
93 * Return true if a resource exists with specified key.
94 *
95 * @param key the key
96 * @return true if a resource exists with specified key.
97 */
98 public boolean contains( final String key )
99 {
100 final Object resource = getResourceMap().get( key );
101 if( null != resource )
102 {
103 return true;
104 }
105
106 final ResourceLocator parent = getParent();
107 if( null != parent )
108 {
109 return parent.contains( key );
110 }
111 else
112 {
113 return false;
114 }
115 }
116
117 /***
118 * Add a resource to resource locator.
119 *
120 * @param key the key used to store resource (Must not be null).
121 * @param resource the resource (Must not be null).
122 */
123 public void put( final String key,
124 final Object resource )
125 {
126 if( null == key )
127 {
128 throw new NullPointerException( "key" );
129 }
130 if( null == resource )
131 {
132 throw new NullPointerException( "resource" );
133 }
134 checkWriteable();
135 getResourceMap().put( key, resource );
136 }
137
138 /***
139 * Return the parent ResourceLocator if any.
140 *
141 * @return the parent ResourceLocator if any.
142 */
143 protected final ResourceLocator getParent()
144 {
145 return m_parent;
146 }
147
148 /***
149 * Return the map used to store resources.
150 *
151 * @return the map used to store resources.
152 */
153 protected final Map getResourceMap()
154 {
155 return m_resources;
156 }
157 }