/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.common;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Locale;
import java.util.Set;
import org.junit.Test;
import org.modeshape.common.annotation.Category;
import org.modeshape.common.annotation.Description;
import org.modeshape.common.annotation.Label;
import org.modeshape.common.i18n.I18n;
/**
* @author John Verhaeg
*/
public abstract class AbstractI18nTest {
private Class<?> i18nClass;
protected AbstractI18nTest( Class<?> i18nClass ) {
this.i18nClass = i18nClass;
}
@Test
public void shouldNotHaveProblems() throws Exception {
for (Field fld : i18nClass.getDeclaredFields()) {
if (fld.getType() == I18n.class && (fld.getModifiers() & Modifier.PUBLIC) == Modifier.PUBLIC
&& (fld.getModifiers() & Modifier.STATIC) == Modifier.STATIC
&& (fld.getModifiers() & Modifier.FINAL) != Modifier.FINAL) {
I18n i18n = (I18n)fld.get(null);
if (i18n.hasProblem()) {
fail(i18n.problem());
}
}
}
// Check for global problems after checking field problems since global problems are detected lazily upon field usage
Set<Locale> locales = I18n.getLocalizationProblemLocales(i18nClass);
if (!locales.isEmpty()) {
for (Locale locale : locales) {
Set<String> problems = I18n.getLocalizationProblems(i18nClass, locale);
try {
assertThat(problems.isEmpty(), is(true));
} catch (AssertionError error) {
fail(problems.iterator().next());
}
}
}
}
protected static final String[] ANNOTATION_NAMES = {"Description", "Category", "Label"};
/**
* Utility method that can be used to verify that an I18n field exists for all of the I18n-related annotations on the supplied
* object. I18n-related annotations include {@link Description}, {@link Label}, and {@link Category}.
*
* @param annotated the object that has field or method annotations
* @throws Exception if there is a problem
*/
protected void verifyI18nForAnnotationsOnObject( Object annotated ) throws Exception {
// Check the known annotations that work with I18ns ...
Class<?> clazz = annotated.getClass();
for (Field field : clazz.getDeclaredFields()) {
for (Annotation annotation : field.getAnnotations()) {
verifyI18nForAnnotation(annotation, field);
}
}
for (Method method : clazz.getDeclaredMethods()) {
for (Annotation annotation : method.getAnnotations()) {
verifyI18nForAnnotation(annotation, method);
}
}
}
protected void verifyI18nForAnnotation( Annotation annotation,
Object annotatedObject ) throws Exception {
String i18nIdentifier;
Class<?> i18nClass;
if (annotation instanceof Category) {
Category cat = (Category)annotation;
i18nClass = cat.i18n();
i18nIdentifier = cat.value();
} else if (annotation instanceof Description) {
Description desc = (Description)annotation;
i18nClass = desc.i18n();
i18nIdentifier = desc.value();
} else if (annotation instanceof Label) {
Label label = (Label)annotation;
i18nClass = label.i18n();
i18nIdentifier = label.value();
} else {
return;
}
assertThat(i18nClass, is(notNullValue()));
assertThat(i18nIdentifier, is(notNullValue()));
try {
Field fld = i18nClass.getField(i18nIdentifier);
assertThat(fld, is(notNullValue()));
// Now check the I18n field ...
if (fld.getType() == I18n.class && (fld.getModifiers() & Modifier.PUBLIC) == Modifier.PUBLIC
&& (fld.getModifiers() & Modifier.STATIC) == Modifier.STATIC
&& (fld.getModifiers() & Modifier.FINAL) != Modifier.FINAL) {
I18n i18n = (I18n)fld.get(null);
if (i18n.hasProblem()) {
fail(i18n.problem());
}
}
} catch (NoSuchFieldException e) {
fail("Missing I18n field on " + i18nClass.getName() + " for " + annotation + " on " + annotatedObject);
}
}
}