CompositeResourceResolver.java
001 /*
002  * Copyright 2010-2013 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 
017 package org.codehaus.griffon.runtime.core.resources;
018 
019 import griffon.core.resources.NoSuchResourceException;
020 import griffon.core.resources.ResourceResolver;
021 
022 import java.util.List;
023 import java.util.Locale;
024 
025 /**
026  @author Andres Almiray
027  @since 1.1.0
028  */
029 public class CompositeResourceResolver extends AbstractResourceResolver {
030     private final ResourceResolver[] resourceResolvers;
031 
032     public CompositeResourceResolver(List<ResourceResolver> resourceResolvers) {
033         this(toResourceResolverArray(resourceResolvers));
034     }
035 
036     public CompositeResourceResolver(ResourceResolver[] resourceResolvers) {
037         this.resourceResolvers = resourceResolvers;
038     }
039 
040     private static ResourceResolver[] toResourceResolverArray(List<ResourceResolver> resourceResolvers) {
041         if (null == resourceResolvers || resourceResolvers.isEmpty()) {
042             return new ResourceResolver[0];
043         }
044         return resourceResolvers.toArray(new ResourceResolver[resourceResolvers.size()]);
045     }
046 
047     public Object resolveResource(String key, Object defaultValue) {
048         return resolveResourceInternal(key, EMPTY_OBJECT_ARGS, defaultValue, Locale.getDefault());
049     }
050 
051     public Object resolveResource(String key, Object defaultValue, Locale locale) {
052         return resolveResourceInternal(key, EMPTY_OBJECT_ARGS, defaultValue, locale);
053     }
054 
055     public Object resolveResource(String key, Object[] args, Object defaultValue) {
056         return resolveResourceInternal(key, args, defaultValue, Locale.getDefault());
057     }
058 
059     public Object resolveResource(String key, Object[] args, Object defaultValue, Locale locale) {
060         return resolveResourceInternal(key, args, defaultValue, locale);
061     }
062 
063     public Object resolveResource(String key, List args, Object defaultValue) {
064         return resolveResourceInternal(key, toObjectArray(args), defaultValue, Locale.getDefault());
065     }
066 
067     public Object resolveResource(String key, List args, Object defaultValue, Locale locale) {
068         return resolveResourceInternal(key, toObjectArray(args), defaultValue, locale);
069     }
070 
071     public Object resolveResourceInternal(String key, Locale locale) {
072         if (null == localelocale = Locale.getDefault();
073         for (ResourceResolver resourceResolver : resourceResolvers) {
074             try {
075                 if (resourceResolver instanceof AbstractResourceResolver) {
076                     return ((AbstractResourceResolverresourceResolver).resolveResourceInternal(key, locale);
077                 }
078                 return resourceResolver.resolveResource(key, locale);
079             catch (NoSuchResourceException nsme) {
080                 // ignore
081             }
082         }
083         throw new NoSuchResourceException(key, locale);
084     }
085 
086     private Object resolveResourceInternal(String key, Object[] args, Locale localethrows NoSuchResourceException {
087         if (null == localelocale = Locale.getDefault();
088         for (ResourceResolver resourceResolver : resourceResolvers) {
089             try {
090                 return resourceResolver.resolveResource(key, args, locale);
091             catch (NoSuchResourceException nsme) {
092                 // ignore
093             }
094         }
095         throw new NoSuchResourceException(key, locale);
096     }
097 
098     private Object resolveResourceInternal(String key, Object[] args, Object defaultValue, Locale locale) {
099         try {
100             return resolveResourceInternal(key, args, locale);
101         catch (NoSuchResourceException nsme) {
102             // ignore
103         }
104         return defaultValue;
105     }
106 }