ResourceResolver.java
001 /*
002  * Copyright 2008-2015 the original author or authors.
003  *
004  * Licensed under the Apache License, Version 2.0 (the "License");
005  * you may not use this file except in compliance with the License.
006  * You may obtain a copy of the License at
007  *
008  *     http://www.apache.org/licenses/LICENSE-2.0
009  *
010  * Unless required by applicable law or agreed to in writing, software
011  * distributed under the License is distributed on an "AS IS" BASIS,
012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013  * See the License for the specific language governing permissions and
014  * limitations under the License.
015  */
016 package griffon.core.resources;
017 
018 import javax.annotation.Nonnull;
019 import javax.annotation.Nullable;
020 import java.util.List;
021 import java.util.Locale;
022 import java.util.Map;
023 
024 /**
025  * Interface for resolving resources, with support for the parameterization and internationalization of such resources.
026  *
027  @author Andres Almiray
028  @author Alexander Klein
029  @since 2.0.0
030  */
031 public interface ResourceResolver {
032     /**
033      * "@["
034      */
035     String REF_KEY_START = "@[";
036 
037     /**
038      * "]"
039      */
040     String REF_KEY_END = "]";
041 
042     /**
043      * Try to resolve the resource.
044      *
045      @param key Key to lookup, such as 'sample.SampleModel.icon'
046      @return The resolved resource at the given key for the default locale
047      @throws NoSuchResourceException if no resource is found
048      */
049     @Nonnull
050     Object resolveResource(@Nonnull String keythrows NoSuchResourceException;
051 
052     /**
053      * Try to resolve the resource.
054      *
055      @param key    Key to lookup, such as 'sample.SampleModel.icon'
056      @param locale Locale in which to lookup
057      @return The resolved resource at the given key for the given locale
058      @throws NoSuchResourceException if no resource is found
059      */
060     @Nonnull
061     Object resolveResource(@Nonnull String key, @Nonnull Locale localethrows NoSuchResourceException;
062 
063     /**
064      * Try to resolve the resource.
065      *
066      @param key  Key to lookup, such as 'sample.SampleModel.icon'
067      @param args Arguments that will be filled in for params within the resource (params look like "{0}" within a
068      *             resource, but this might differ between implementations), or null if none.
069      @return The resolved resource at the given key for the default locale
070      @throws NoSuchResourceException if no resource is found
071      */
072     @Nonnull
073     Object resolveResource(@Nonnull String key, @Nonnull Object[] argsthrows NoSuchResourceException;
074 
075     /**
076      * Try to resolve the resource.
077      *
078      @param key    Key to lookup, such as 'sample.SampleModel.icon'
079      @param args   Arguments that will be filled in for params within the resource (params look like "{0}" within a
080      *               resource, but this might differ between implementations), or null if none.
081      @param locale Locale in which to lookup
082      @return The resolved resource at the given key for the given locale
083      @throws NoSuchResourceException if no resource is found
084      */
085     @Nonnull
086     Object resolveResource(@Nonnull String key, @Nonnull Object[] args, @Nonnull Locale localethrows NoSuchResourceException;
087 
088     /**
089      * Try to resolve the resource.
090      *
091      @param key  Key to lookup, such as 'sample.SampleModel.icon'
092      @param args Arguments that will be filled in for params within the resource (params look like "{0}" within a
093      *             resource, but this might differ between implementations), or null if none.
094      @return The resolved resource at the given key for the default locale
095      @throws NoSuchResourceException if no resource is found
096      */
097     @Nonnull
098     Object resolveResource(@Nonnull String key, @Nonnull List<?> argsthrows NoSuchResourceException;
099 
100     /**
101      * Try to resolve the resource.
102      *
103      @param key    Key to lookup, such as 'sample.SampleModel.icon'
104      @param args   Arguments that will be filled in for params within the resource (params look like "{0}" within a
105      *               resource, but this might differ between implementations), or null if none.
106      @param locale Locale in which to lookup
107      @return The resolved resource at the given key for the given locale
108      @throws NoSuchResourceException if no resource is found
109      */
110     @Nonnull
111     Object resolveResource(@Nonnull String key, @Nonnull List<?> args, @Nonnull Locale localethrows NoSuchResourceException;
112 
113     /**
114      * Try to resolve the resource. Return default resource if no resource was found.
115      *
116      @param key          Key to lookup, such as 'sample.SampleModel.icon'
117      @param defaultValue Message to return if the lookup fails
118      @return The resolved resource at the given key for the default locale
119      */
120     @Nullable
121     Object resolveResource(@Nonnull String key, @Nullable Object defaultValue);
122 
123     /**
124      * Try to resolve the resource. Return default resource if no resource was found.
125      *
126      @param key          Key to lookup, such as 'sample.SampleModel.icon'
127      @param locale       Locale in which to lookup
128      @param defaultValue Message to return if the lookup fails
129      @return The resolved resource at the given key for the given locale
130      */
131     @Nullable
132     Object resolveResource(@Nonnull String key, @Nonnull Locale locale, @Nullable Object defaultValue);
133 
134     /**
135      * Try to resolve the resource. Return default resource if no resource was found.
136      *
137      @param key          Key to lookup, such as 'sample.SampleModel.icon'
138      @param args         Arguments that will be filled in for params within the resource (params look like "{0}"
139      *                     within a resource, but this might differ between implementations), or null if none.
140      @param defaultValue Message to return if the lookup fails
141      @return The resolved resource at the given key for the default locale
142      */
143     @Nullable
144     Object resolveResource(@Nonnull String key, @Nonnull Object[] args, @Nullable Object defaultValue);
145 
146     /**
147      * Try to resolve the resource. Return default resource if no resource was found.
148      *
149      @param key          Key to lookup, such as 'sample.SampleModel.icon'
150      @param args         Arguments that will be filled in for params within the resource (params look like "{0}"
151      *                     within a resource, but this might differ between implementations), or null if none.
152      @param locale       Locale in which to lookup
153      @param defaultValue Message to return if the lookup fails
154      @return The resolved resource at the given key for the given locale
155      */
156     @Nullable
157     Object resolveResource(@Nonnull String key, @Nonnull Object[] args, @Nonnull Locale locale, @Nullable Object defaultValue);
158 
159     /**
160      * Try to resolve the resource. Return default resource if no resource was found.
161      *
162      @param key          Key to lookup, such as 'sample.SampleModel.icon'
163      @param args         Arguments that will be filled in for params within the resource (params look like "{0}"
164      *                     within a resource, but this might differ between implementations), or null if none.
165      @param defaultValue Message to return if the lookup fails
166      @return The resolved resource at the given key for the default locale
167      */
168     @Nullable
169     Object resolveResource(@Nonnull String key, @Nonnull List<?> args, @Nullable Object defaultValue);
170 
171     /**
172      * Try to resolve the resource. Return default resource if no resource was found.
173      *
174      @param key          Key to lookup, such as 'sample.SampleModel.icon'
175      @param args         Arguments that will be filled in for params within the resource (params look like "{0}"
176      *                     within a resource, but this might differ between implementations), or null if none.
177      @param locale       Locale in which to lookup
178      @param defaultValue Message to return if the lookup fails
179      @return The resolved resource at the given key for the given locale
180      */
181     @Nullable
182     Object resolveResource(@Nonnull String key, @Nonnull List<?> args, @Nonnull Locale locale, @Nullable Object defaultValue);
183 
184     /**
185      * Try to resolve the resource.
186      *
187      @param key  Key to lookup, such as 'sample.SampleModel.icon'
188      @param args Arguments that will be filled in for params within the resource (params look like "{:key}"
189      *             within a resource, but this might differ between implementations), or null if none.
190      @return The resolved resource at the given key for the default locale
191      @throws NoSuchResourceException if no resource is found
192      */
193     @Nonnull
194     Object resolveResource(@Nonnull String key, @Nonnull Map<String, Object> argsthrows NoSuchResourceException;
195 
196     /**
197      * Try to resolve the resource.
198      *
199      @param key    Key to lookup, such as 'sample.SampleModel.icon'
200      @param args   Arguments that will be filled in for params within the resource (params look like "{:key}"
201      *               within a resource, but this might differ between implementations), or null if none.
202      @param locale Locale in which to lookup
203      @return The resolved resource at the given key for the given locale
204      @throws NoSuchResourceException if no resource is found
205      */
206     @Nonnull
207     Object resolveResource(@Nonnull String key, @Nonnull Map<String, Object> args, @Nonnull Locale localethrows NoSuchResourceException;
208 
209     /**
210      * Try to resolve the resource. Return default resource if no resource was found.
211      *
212      @param key          Key to lookup, such as 'sample.SampleModel.icon'
213      @param args         Arguments that will be filled in for params within the resource (params look like "{:key}"
214      *                     within a resource, but this might differ between implementations), or null if none.
215      @param defaultValue Message to return if the lookup fails
216      @return The resolved resource at the given key for the default locale
217      */
218     @Nullable
219     Object resolveResource(@Nonnull String key, @Nonnull Map<String, Object> args, @Nullable Object defaultValue);
220 
221     /**
222      * Try to resolve the resource. Return default resource if no resource was found.
223      *
224      @param key          Key to lookup, such as 'sample.SampleModel.icon'
225      @param args         Arguments that will be filled in for params within the resource (params look like "{:key}"
226      *                     within a resource, but this might differ between implementations), or null if none.
227      @param locale       Locale in which to lookup
228      @param defaultValue Message to return if the lookup fails
229      @return The resolved resource at the given key for the given locale
230      */
231     @Nullable
232     Object resolveResource(@Nonnull String key, @Nonnull Map<String, Object> args, @Nonnull Locale locale, @Nullable Object defaultValue);
233 
234     /**
235      <p>Resolve a resource given a key and a Locale.</p>
236      <p>
237      * This method should use the default Locale if the locale argument is null. The {@code key} argument may refer to
238      * another key if the resolved value results in a {@code CharSequence} that begins with "@[" and ends with "]". In this
239      * case the method will use the enclosed value as the next key to be resolved. For example, given the following key/value
240      * definitions
241      <p/>
242      <pre>
243      *     some.key = Hello {0}
244      *     other.key = @[some.key]
245      </pre>
246      <p/>
247      * Evaluating the keys results in
248      <p/>
249      <pre>
250      *    assert resolveResourceValue('some.key', Locale.default) == 'Hello {0}'
251      *    assert resolveResourceValue('other.key', Locale.default) == 'Hello {0}'
252      </pre>
253      <p/>
254      </p>
255      *
256      @param key    Key to lookup, such as 'sample.SampleModel.icon'
257      @param locale Locale in which to lookup
258      @return the resolved resource value at the given key for the given locale
259      @throws NoSuchResourceException if no message is found
260      */
261     @Nonnull
262     Object resolveResourceValue(@Nonnull String key, @Nonnull Locale localethrows NoSuchResourceException;
263 
264     /**
265      * Formats the given resource using supplied args to substitute placeholders.
266      *
267      @param resource The resource following a predefined format.
268      @param args     Arguments that will be filled in for params within the resource (params look like "{0}"
269      *                 within a resource, but this might differ between implementations), or null if none.
270      @return the formatted resource with all matching placeholders with their substituted values.
271      */
272     @Nonnull
273     String formatResource(@Nonnull String resource, @Nonnull List<?> args);
274 
275     /**
276      * Formats the given resource using supplied args to substitute placeholders.
277      *
278      @param resource The resource following a predefined format.
279      @param args     Arguments that will be filled in for params within the resource (params look like "{0}"
280      *                 within a resource, but this might differ between implementations), or null if none.
281      @return the formatted resource with all matching placeholders with their substituted values.
282      */
283     @Nonnull
284     String formatResource(@Nonnull String resource, @Nonnull Object[] args);
285 
286     /**
287      * Formats the given resource using supplied args to substitute placeholders.
288      *
289      @param resource The resource following a predefined format.
290      @param args     Arguments that will be filled in for params within the resource (params look like "{:key}"
291      *                 within a resource, but this might differ between implementations), or null if none.
292      @return the formatted resource with all matching placeholders with their substituted values.
293      */
294     @Nonnull
295     String formatResource(@Nonnull String resource, @Nonnull Map<String, Object> args);
296 }