/*******************************************************************************
* Copyright 2013 SAP AG
*
* 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 com.sap.core.odata.testutil.helper;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import com.sap.core.odata.api.exception.MessageReference;
/**
* This class is a helper for writing proper error messages.
* Please use the static method {@link #TestClass(Class)} to
* test whether all fields of type {@link MessageReference} of
* the tested (Exception) class are provided in the <b>i18n.properties</b> file.
*
* @author SAP AG
*/
public class ODataMessageTextVerifier {
/**
* Same as define in {@link MessageService}
*/
private static final String BUNDLE_NAME = "i18n"; //$NON-NLS-1$
private static final Locale locale = Locale.ROOT;
public ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, locale);
private final List<Throwable> errorCollector;
public ODataMessageTextVerifier() {
errorCollector = new ArrayList<Throwable>();
}
private void failCollector(final String text) {
try {
fail(text);
} catch (final AssertionError ae) {
errorCollector.add(ae);
}
}
private String getMessage(final MessageReference msgRef) {
try {
final String key = msgRef.getKey();
final String value = resourceBundle.getString(key);
return value;
} catch (final MissingResourceException e) {
failCollector("Error-->Messagetext for key:\"" + msgRef.getKey() + "\" missing");
}
return null;
}
private void assertExistMessage(final MessageReference msgRef) {
final String text = getMessage(msgRef);
if (text == null) {
return; // checked in getMessage
}
if (text.length() == 0) {
failCollector("Error-->Messagetext for key:\"" + msgRef.getKey() + "\" empty");
}
}
public void CheckMessagesOfClass(final Class<? extends Exception> exceptionClassToBeTested) {
final Class<? extends Exception> testClass = exceptionClassToBeTested;
for (final Field field : testClass.getDeclaredFields()) {
// if field from type MessageReference
if (field.getType().isAssignableFrom(MessageReference.class)) {
final int modifiers = field.getModifiers();
if (!Modifier.isStatic(modifiers)) {
continue;
}
// field should be public
assertTrue("MsgRef Error--> Error: field should be public.", Modifier.isPublic(modifiers));
// field should be final
assertTrue("MsgRef Error--> Error: field should be final.", Modifier.isFinal(modifiers));
MessageReference msgRef = null;
try {
msgRef = (MessageReference) field.get(null);
} catch (final IllegalArgumentException e) {
failCollector("MsgRef Error--> Error: MsgRef " + field.getName() + " of class \"" + testClass.getSimpleName() + "\"");
break;
} catch (final IllegalAccessException e) {
failCollector("MsgRef Error--> Not public: MsgRef " + field.getName() + " of class \"" + testClass.getSimpleName() + "\"");
break;
}
if (msgRef == null) {
failCollector("MsgRef Error--> Not assigned: MsgRef " + field.getName() + " of class \"" + testClass.getSimpleName() + "\"");
break;
}
assertExistMessage(msgRef);
}
}
}
public List<Throwable> getErrorCollector() {
return errorCollector;
}
static public void TestClass(final Class<? extends Exception> exceptionClassToBeTested) {
final ODataMessageTextVerifier tool = new ODataMessageTextVerifier();
tool.CheckMessagesOfClass(exceptionClassToBeTested);
for (final Throwable throwable : tool.getErrorCollector()) {
fail(throwable.getMessage());
}
}
}