From d9c6b332090c90e4d4840e62fe3eb45c834b2e14 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Fri, 31 Jan 2014 19:18:15 +0900 Subject: [PATCH] Add null check to KeySpecParser Change-Id: Ic37db8cbf8f83f753d7381e1edba8eac1ef1ceb1 --- .../keyboard/internal/KeySpecParser.java | 17 +++++++++++++++++ .../keyboard/internal/MoreKeySpec.java | 3 +++ .../keyboard/internal/KeySpecParserTests.java | 12 ++++++++++++ .../internal/KeySpecParserTestsBase.java | 4 ---- .../keyboard/internal/MoreKeySpecTests.java | 11 +++++++++++ 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index 292bf35cb..2a0dad678 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -120,6 +120,10 @@ public final class KeySpecParser { } public static String getLabel(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return null; + } if (hasIcon(keySpec)) { return null; } @@ -140,6 +144,10 @@ public final class KeySpecParser { } public static String getOutputText(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return null; + } final int labelEnd = indexOfLabelEnd(keySpec); if (hasCode(keySpec, labelEnd)) { return null; @@ -165,6 +173,10 @@ public final class KeySpecParser { } public static int getCode(final String keySpec, final KeyboardCodesSet codesSet) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return CODE_UNSPECIFIED; + } final int labelEnd = indexOfLabelEnd(keySpec); if (hasCode(keySpec, labelEnd)) { checkDoubleLabelEnd(keySpec, labelEnd); @@ -187,6 +199,7 @@ public final class KeySpecParser { return (StringUtils.codePointCount(label) == 1) ? label.codePointAt(0) : CODE_OUTPUT_TEXT; } + // TODO: Make this method private once Key.code attribute is removed. public static int parseCode(final String text, final KeyboardCodesSet codesSet, final int defCode) { if (text == null) { @@ -202,6 +215,10 @@ public final class KeySpecParser { } public static int getIconId(final String keySpec) { + if (keySpec == null) { + // TODO: Throw {@link KeySpecParserError} once Key.keyLabel attribute becomes mandatory. + return KeyboardIconsSet.ICON_UNDEFINED; + } if (!hasIcon(keySpec)) { return KeyboardIconsSet.ICON_UNDEFINED; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java index d3bc0c2b2..0551e9e98 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java +++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java @@ -46,6 +46,9 @@ public final class MoreKeySpec { public MoreKeySpec(final String moreKeySpec, boolean needsToUpperCase, final Locale locale, final KeyboardCodesSet codesSet) { + if (TextUtils.isEmpty(moreKeySpec)) { + throw new KeySpecParser.KeySpecParserError("Empty more key spec"); + } mLabel = StringUtils.toUpperCaseOfStringForLocale( KeySpecParser.getLabel(moreKeySpec), needsToUpperCase, locale); final int code = StringUtils.toUpperCaseOfCodeForLocale( diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java index 9b6c46200..9e43bd4d2 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java @@ -16,6 +16,9 @@ package com.android.inputmethod.keyboard.internal; +import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED; +import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED; + import android.test.suitebuilder.annotation.SmallTest; import com.android.inputmethod.latin.Constants; @@ -40,4 +43,13 @@ public final class KeySpecParserTests extends KeySpecParserTestsBase { Constants.printableCode(expectedCode), Constants.printableCode(actualCode)); } + + // TODO: Remove this method. + // These should throw {@link KeySpecParserError} when Key.keyLabel attribute become mandatory. + public void testEmptySpec() { + assertParser("Null spec", null, + null, null, ICON_UNDEFINED, CODE_UNSPECIFIED); + assertParser("Empty spec", "", + null, null, ICON_UNDEFINED, CODE_UNSPECIFIED); + } } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java index 04b7008ef..a02d40299 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java @@ -251,10 +251,6 @@ abstract class KeySpecParserTestsBase extends AndroidTestCase { } public void testFormatError() { - assertParserError("Null spec", null, null, - null, ICON_UNDEFINED, CODE_UNSPECIFIED); - assertParserError("Empty spec", "", null, - null, ICON_UNDEFINED, CODE_UNSPECIFIED); assertParserError("Single bar", "|", "|", null, ICON_UNDEFINED, '|'); assertParserError("Empty label with outputText", "|a", diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java index e49c62461..ea25bcf37 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecTests.java @@ -16,6 +16,9 @@ package com.android.inputmethod.keyboard.internal; +import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED; +import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED; + import android.test.suitebuilder.annotation.SmallTest; import com.android.inputmethod.latin.Constants; @@ -42,6 +45,14 @@ public final class MoreKeySpecTests extends KeySpecParserTestsBase { Constants.printableCode(spec.mCode)); } + // TODO: Move this method to {@link KeySpecParserBase}. + public void testEmptySpec() { + assertParserError("Null spec", null, + null, null, ICON_UNDEFINED, CODE_UNSPECIFIED); + assertParserError("Empty spec", "", + null, null, ICON_UNDEFINED, CODE_UNSPECIFIED); + } + private static void assertArrayEquals(final String message, final Object[] expected, final Object[] actual) { if (expected == actual) {