Author: ggregory
Date: Wed Jul 27 19:47:48 2011
New Revision: 1151603
URL: http://svn.apache.org/viewvc?rev=1151603&view=rev
Log:
Fix failing test "gna":
org.apache.commons.codec.language.bm.BeiderMorseEncoderTest.testEncodeGna()
Modified:
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/Rule.java
commons/proper/codec/trunk/src/test/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java
Modified:
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
URL:
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java?rev=1151603&r1=1151602&r2=1151603&view=diff
==============================================================================
---
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
(original)
+++
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
Wed Jul 27 19:47:48 2011
@@ -145,9 +145,11 @@ public class PhoneticEngine {
* @return a phonetic representation of the input; a String containing
'-'-separated phonetic representations of the input
*/
public String phoneticUtf8(String input, final Set<String> languageSet) {
- List<Rule> rules = Rule.instance(this.nameType, RuleType.RULES,
languageSet);
- List<Rule> finalRules1 = Rule.instance(this.nameType, this.ruleType,
"common");
- List<Rule> finalRules2 = Rule.instance(this.nameType, this.ruleType,
languageSet);
+ final List<Rule> rules = Rule.instance(this.nameType, RuleType.RULES,
languageSet);
+ final List<Rule> finalRules1 = Rule.instance(this.nameType,
this.ruleType, "common");
+ final List<Rule> finalRules2 = Rule.instance(this.nameType,
this.ruleType, languageSet);
+ // System.err.println("Languages: " + languageSet);
+ // System.err.println("Rules: " + rules);
// tidy the input
// lower case is a locale-dependent operation
@@ -345,6 +347,11 @@ public class PhoneticEngine {
String prefix = phonetic.substring(0, altStart);
altStart++;
int altEnd = phonetic.indexOf(')');
+
+ if (altEnd < altStart) {
+ throw new IllegalArgumentException("Phonetic string has a
close-bracket before the first open-bracket");
+ }
+
String altString = phonetic.substring(altStart, altEnd);
altEnd++;
String suffix = phonetic.substring(altEnd);
Modified:
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/Rule.java
URL:
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/Rule.java?rev=1151603&r1=1151602&r2=1151603&view=diff
==============================================================================
---
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/Rule.java
(original)
+++
commons/proper/codec/trunk/src/java/org/apache/commons/codec/language/bm/Rule.java
Wed Jul 27 19:47:48 2011
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
+import java.util.Stack;
import java.util.regex.Pattern;
/**
@@ -77,10 +78,10 @@ import java.util.regex.Pattern;
* @since 2.0
*/
public class Rule {
- private static final String DOUBLE_QUOTE = "\"";
-
public static final String ALL = "ALL";
+ private static final String DOUBLE_QUOTE = "\"";
+
private static final String HASH_INCLUDE = "#include";
private static final Map<NameType, Map<RuleType, Map<String, List<Rule>>>>
RULES = new EnumMap<NameType, Map<RuleType, Map<String, List<Rule>>>>(
@@ -95,10 +96,14 @@ public class Rule {
Languages ls = Languages.instance(s);
for (String l : ls.getLanguages()) {
- rs.put(l, parseRules(mkScanner(s, rt, l)));
+ try {
+ rs.put(l, parseRules(createScanner(s, rt, l)));
+ } catch (IllegalStateException e) {
+ throw new IllegalStateException("Problem processing "
+ createResourceName(s, rt, l), e);
+ }
}
if (!rt.equals(RuleType.RULES)) {
- rs.put("common", parseRules(mkScanner(s, rt, "common")));
+ rs.put("common", parseRules(createScanner(s, rt,
"common")));
}
rts.put(rt, Collections.unmodifiableMap(rs));
@@ -108,6 +113,32 @@ public class Rule {
}
}
+ private static String createResourceName(NameType nameType, RuleType rt,
String lang) {
+ return
String.format("org/apache/commons/codec/language/bm/%s_%s_%s.txt",
nameType.getName(), rt.getName(), lang);
+ }
+
+ private static Scanner createScanner(NameType nameType, RuleType rt,
String lang) {
+ String resName = createResourceName(nameType, rt, lang);
+ InputStream rulesIS =
Languages.class.getClassLoader().getResourceAsStream(resName);
+
+ if (rulesIS == null) {
+ throw new IllegalArgumentException("Unable to load resource: " +
resName);
+ }
+
+ return new Scanner(rulesIS, ResourceConstants.ENCODING);
+ }
+
+ private static Scanner createScanner(String lang) {
+ String resName =
String.format("org/apache/commons/codec/language/bm/%s.txt", lang);
+ InputStream rulesIS =
Languages.class.getClassLoader().getResourceAsStream(resName);
+
+ if (rulesIS == null) {
+ throw new IllegalArgumentException("Unable to load resource: " +
resName);
+ }
+
+ return new Scanner(rulesIS, ResourceConstants.ENCODING);
+ }
+
/**
* Gets rules for a combination of name type, rule type and languages.
*
@@ -148,33 +179,13 @@ public class Rule {
return rules;
}
- private static Scanner mkScanner(NameType nameType, RuleType rt, String
lang) {
- String resName =
String.format("org/apache/commons/codec/language/bm/%s_%s_%s.txt",
nameType.getName(), rt.getName(), lang);
- InputStream rulesIS =
Languages.class.getClassLoader().getResourceAsStream(resName);
-
- if (rulesIS == null) {
- throw new IllegalArgumentException("Unable to load resource: " +
resName);
- }
-
- return new Scanner(rulesIS, ResourceConstants.ENCODING);
- }
-
- private static Scanner mkScanner(String lang) {
- String resName =
String.format("org/apache/commons/codec/language/bm/%s.txt", lang);
- InputStream rulesIS =
Languages.class.getClassLoader().getResourceAsStream(resName);
-
- if (rulesIS == null) {
- throw new IllegalArgumentException("Unable to load resource: " +
resName);
- }
-
- return new Scanner(rulesIS, ResourceConstants.ENCODING);
- }
-
private static List<Rule> parseRules(Scanner scanner) {
List<Rule> lines = new ArrayList<Rule>();
+ int currentLine = 0;
boolean inMultilineComment = false;
while (scanner.hasNextLine()) {
+ currentLine++;
String rawLine = scanner.nextLine();
String line = rawLine;
@@ -206,7 +217,7 @@ public class Rule {
if (incl.contains(" ")) {
System.err.println("Warining: malformed import
statement: " + rawLine);
} else {
- lines.addAll(parseRules(mkScanner(incl)));
+ lines.addAll(parseRules(createScanner(incl)));
}
} else {
// rule
@@ -218,6 +229,11 @@ public class Rule {
String lCon = stripQuotes(parts[1]);
String rCon = stripQuotes(parts[2]);
String ph = stripQuotes(parts[3]);
+ try {
+ validatePhenome(ph);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalStateException("Problem
parsing line " + currentLine, e);
+ }
Rule r = new Rule(pat, lCon, rCon, ph,
Collections.<String> emptySet(), ""); // guessing last 2 parameters
lines.add(r);
}
@@ -241,6 +257,40 @@ public class Rule {
return str;
}
+ private static void validatePhenome(CharSequence ph) {
+ Stack<Character> stack = new Stack<Character>();
+ for (int i = 0; i < ph.length(); i++) {
+ switch (ph.charAt(i)) {
+ case '(':
+ stack.push('(');
+ break;
+ case '[':
+ stack.push('[');
+ break;
+ case ')': {
+ if (stack.isEmpty())
+ throw new IllegalArgumentException("Closing ')' at " + i +
" without an opening '('" + " in " + ph);
+ char c = stack.pop();
+ if (c != '(')
+ throw new IllegalArgumentException("Closing ')' does not
pair with opening '" + c + "' at " + i + " in " + ph);
+ break;
+ }
+ case ']': {
+ if (stack.isEmpty())
+ throw new IllegalArgumentException("Closing ']' at " + i +
" without an opening '['" + " in " + ph);
+ char c = stack.pop();
+ if (c != '[')
+ throw new IllegalArgumentException("Closing ']' does not
pair with opening '" + c + "' at " + i + " in " + ph);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ if (!stack.isEmpty())
+ throw new IllegalArgumentException("Bracket(s) opened without
corresponding closes: " + stack + " in " + ph);
+ }
+
private final Set<String> languages;
private final Pattern lContext;
Modified:
commons/proper/codec/trunk/src/test/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java?rev=1151603&r1=1151602&r2=1151603&view=diff
==============================================================================
---
commons/proper/codec/trunk/src/test/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java
(original)
+++
commons/proper/codec/trunk/src/test/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java
Wed Jul 27 19:47:48 2011
@@ -46,7 +46,7 @@ public class BeiderMorseEncoderTest exte
*
* @throws EncoderException
*/
- @Ignore
+ // @Ignore
@Test
public void testEncodeGna() throws EncoderException {
BeiderMorseEncoder bmpm = new BeiderMorseEncoder();
@@ -71,7 +71,7 @@ public class BeiderMorseEncoderTest exte
}
@Ignore
- @Test
+ @Test(timeout = 10000L)
public void testLongestEnglishSurname() throws EncoderException {
BeiderMorseEncoder bmpm = new BeiderMorseEncoder();
bmpm.setNameType(NameType.GENERIC);
@@ -113,7 +113,7 @@ public class BeiderMorseEncoderTest exte
}
@Ignore
- @Test
+ @Test(timeout = 10000L)
public void testSpeedCheck() throws EncoderException {
char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'o', 'u' };
BeiderMorseEncoder bmpm = new BeiderMorseEncoder();