Skip to content

Commit ba374df

Browse files
authored
Merge pull request #10624 from tkvw/3.2.x-i18n
Added method to retrieve the codes of a specific bundle.
2 parents a0ed7ef + 2c2c84f commit ba374df

File tree

2 files changed

+85
-4
lines changed

2 files changed

+85
-4
lines changed

grails-core/src/main/groovy/org/grails/spring/context/support/ReloadableResourceBundleMessageSource.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
import java.io.InputStream;
2424
import java.io.InputStreamReader;
2525
import java.text.MessageFormat;
26-
import java.util.ArrayList;
27-
import java.util.List;
28-
import java.util.Locale;
29-
import java.util.Properties;
26+
import java.util.*;
3027
import java.util.concurrent.Callable;
3128
import java.util.concurrent.ConcurrentHashMap;
3229
import java.util.concurrent.ConcurrentMap;
@@ -153,6 +150,41 @@ public void setBasename(String basename) {
153150
setBasenames(basename);
154151
}
155152

153+
/**
154+
* Retrieves all codes from one or multiple basenames
155+
* @param locale the locale
156+
* @param basenames the basenames of the bundle
157+
* @return a list with all codes from valid registered bundles
158+
*/
159+
public Set<String> getBundleCodes(Locale locale,String...basenames){
160+
List<String> validBaseNames = getValidBasenames(basenames);
161+
162+
Set<String> codes = new HashSet<>();
163+
for(String basename: validBaseNames){
164+
List<Pair<String, Resource>> filenamesAndResources = calculateAllFilenames(basename,locale);
165+
for (Pair<String, Resource> filenameAndResource : filenamesAndResources) {
166+
if(filenameAndResource.getbValue() != null) {
167+
PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue());
168+
codes.addAll(propHolder.getProperties().stringPropertyNames());
169+
}
170+
}
171+
}
172+
return codes;
173+
}
174+
175+
protected List<String> getValidBasenames(String[] basenames){
176+
List<String> validBaseNames = new LinkedList<>();
177+
for(String basename:basenames){
178+
for(int i=0;i<this.basenames.length;i++){
179+
if(basenames[i].equals(basename)){
180+
validBaseNames.add(basename);
181+
break;
182+
}
183+
}
184+
}
185+
return validBaseNames;
186+
}
187+
156188
/**
157189
* Set an array of basenames, each following the basic ResourceBundle convention
158190
* of not specifying file extension or language codes, but in contrast to
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.grails.spring.context
2+
3+
import org.grails.spring.context.support.ReloadableResourceBundleMessageSource
4+
import org.springframework.core.io.ByteArrayResource
5+
import org.springframework.core.io.DefaultResourceLoader
6+
import org.springframework.core.io.Resource
7+
import spock.lang.Specification
8+
9+
class ResourceBundleMessageSourceSpec extends Specification {
10+
Resource messages
11+
Resource other
12+
void setup(){
13+
messages = new TestResource('messages.properties','''\
14+
foo=bar
15+
'''.stripIndent().getBytes('UTF-8'))
16+
17+
other = new TestResource('other.properties','''\
18+
bar=foo
19+
'''.stripIndent().getBytes('UTF-8'))
20+
}
21+
22+
void 'Check method to retrieve bundle codes per messagebundle'(){
23+
given:
24+
def messageSource = new ReloadableResourceBundleMessageSource(
25+
resourceLoader: new DefaultResourceLoader(){
26+
Resource getResourceByPath(String path){
27+
path.startsWith('messages') ? messages:other
28+
}
29+
}
30+
)
31+
messageSource.setBasenames('messages','other')
32+
def locale = Locale.default
33+
expect:
34+
messageSource.getBundleCodes(locale,'messages') == (['foo'] as Set)
35+
messageSource.getBundleCodes(locale,'other') == (['bar'] as Set)
36+
messageSource.getBundleCodes(locale,'messages','other') == (['foo','bar'] as Set)
37+
}
38+
39+
class TestResource extends ByteArrayResource{
40+
String filename
41+
42+
TestResource(String filename, byte[] byteArray) {
43+
super(byteArray)
44+
this.filename=filename
45+
}
46+
47+
}
48+
49+
}

0 commit comments

Comments
 (0)