// If you don't need any file initialization or postprocessing, you only need this one routine public CheckCLDR handleCheck( String path, String fullPath, String value, Options options, List<CheckStatus> result) { // it helps performance to have a quick reject of most paths if (fullPath == null) return this; // skip paths that we don't have if (fullPath.indexOf("casing") < 0) return this; // pick up the casing attributes from the full path parts.set(fullPath); Case caseTest = Case.mixed; for (int i = 0; i < parts.size(); ++i) { String casingValue = parts.getAttributeValue(i, "casing"); if (casingValue == null) { continue; } caseTest = Case.forString(casingValue); if (caseTest == Case.verbatim) { return this; // we're done } } String newValue = value; switch (caseTest) { case lowercase_words: newValue = UCharacter.toLowerCase(uLocale, value); break; case titlecase_words: newValue = UCharacter.toTitleCase(uLocale, value, null); break; case titlecase_firstword: newValue = TitleCaseFirst(uLocale, value); break; default: break; } if (!newValue.equals(value)) { // the following is how you signal an error or warning (or add a demo....) result.add( new CheckStatus() .setCause(this) .setMainType(CheckStatus.errorType) .setSubtype(Subtype.incorrectCasing) // typically warningType or errorType .setMessage( "Casing incorrect: either should have casing=\"verbatim\" or be <{0}>", new Object[] {newValue})); // the message; can be MessageFormat with arguments } return this; }