/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.test.resourceloading;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
import static org.hibernate.validator.internal.util.CollectionHelper.newHashMap;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
/**
* @author Hardy Ferentschik
*/
public class PlatformResourceBundleLocatorTest {
private static final String BASE_RESOURCE_NAME = "org/hibernate/validator/test/resourceloading/TestMessages";
private PlatformResourceBundleLocator bundleLocator;
@BeforeMethod
public void setUp() {
bundleLocator = new PlatformResourceBundleLocator(
BASE_RESOURCE_NAME, new TestClassLoader( PlatformResourceBundleLocatorTest.class.getClassLoader() ),
true
);
}
@Test
public void multiple_properties_files_can_be_aggregated() {
ResourceBundle resourceBundle = bundleLocator.getResourceBundle( Locale.ROOT );
assertEquals(
resourceBundle.keySet().size(), 2, "There should be two keys since the root bundle is aggregated"
);
assertThat( resourceBundle.keySet() ).containsOnly( "foo", "bar" );
}
@Test
public void aggregation_works_across_bundle_families() {
ResourceBundle resourceBundle = bundleLocator.getResourceBundle( Locale.GERMAN );
assertEquals(
resourceBundle.keySet().size(), 3, "There should be two keys since the bundle is aggregated"
);
assertThat( resourceBundle.keySet() ).containsOnly( "foo", "bar", "snafu" );
}
@Test
public void the_most_specific_key_value_pair_is_returned() {
ResourceBundle resourceBundle = bundleLocator.getResourceBundle( Locale.GERMAN );
assertEquals(
resourceBundle.getString( "foo" ), "123_de",
"The language specific version of the value should be retrieved"
);
}
public class TestClassLoader extends URLClassLoader {
private final Map<String, List<String>> mappedResources;
public TestClassLoader(ClassLoader classLoader) {
super( new URL[] { }, classLoader );
this.mappedResources = newHashMap();
mappedResources.put(
BASE_RESOURCE_NAME + ".properties",
Arrays.asList(
"org/hibernate/validator/test/resourceloading/TestMessages1.properties",
"org/hibernate/validator/test/resourceloading/TestMessages2.properties"
)
);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if ( mappedResources.containsKey( name ) ) {
ArrayList<URL> urls = newArrayList();
for ( String mappedResourceName : mappedResources.get( name ) ) {
URL url = getResource( mappedResourceName );
urls.add( url );
}
return Collections.enumeration( urls );
}
else {
return super.getResources( name );
}
}
}
}