blob: f531033845b0eb48fef582dabc33a5276c99d4b4 [file]
diff --git a/z_e b/z_e
index 8d8786f..7888356 100644
--- a/z_e
+++ b/z_e
@@ -20,6 +20,7 @@
package org.jsonschema2pojo.util;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -36,76 +37,81 @@
private static final Pattern UNDERSCORE_PATTERN_1 = Pattern.compile("([A-Z]+)([A-Z][a-z])");
private static final Pattern UNDERSCORE_PATTERN_2 = Pattern.compile("([a-z\\d])([A-Z])");
- private List<RuleAndReplacement> plurals = new ArrayList<RuleAndReplacement>();
- private List<RuleAndReplacement> singulars = new ArrayList<RuleAndReplacement>();
- private List<String> uncountables = new ArrayList<String>();
+ private final List<RuleAndReplacement> plurals;
+ private final List<RuleAndReplacement> singulars;
+ private final List<String> uncountables;
- private static Inflector instance = new Inflector();
+ private static Inflector instance = createDefaultBuilder().build();
- private Inflector() {
- // Woo, you can't touch me.
-
- initialize();
+ private Inflector(Builder builder) {
+ plurals = Collections.unmodifiableList(builder.plurals);
+ singulars = Collections.unmodifiableList(builder.singulars);
+ uncountables = Collections.unmodifiableList(builder.uncountables);
}
- private void initialize() {
- plural("$", "s");
- plural("s$", "s");
- plural("(ax|test)is$", "$1es");
- plural("(octop|vir)us$", "$1i");
- plural("(alias|status)$", "$1es");
- plural("(bu)s$", "$1es");
- plural("(buffal|tomat)o$", "$1oes");
- plural("([ti])um$", "$1a");
- plural("sis$", "ses");
- plural("(?:([^f])fe|([lr])f)$", "$1$2ves");
- plural("(hive)$", "$1s");
- plural("([^aeiouy]|qu)y$", "$1ies");
- plural("([^aeiouy]|qu)ies$", "$1y");
- plural("(x|ch|ss|sh)$", "$1es");
- plural("(matr|vert|ind)ix|ex$", "$1ices");
- plural("([m|l])ouse$", "$1ice");
- plural("(ox)$", "$1en");
- plural("(quiz)$", "$1zes");
+ public static Inflector.Builder createDefaultBuilder()
+ {
+ Builder builder = builder();
- singular("s$", "");
- singular("(n)ews$", "$1ews");
- singular("([ti])a$", "$1um");
- singular("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "$1$2sis");
- singular("(^analy)ses$", "$1sis");
- singular("([^f])ves$", "$1fe");
- singular("(hive)s$", "$1");
- singular("(tive)s$", "$1");
- singular("([lr])ves$", "$1f");
- singular("([^aeiouy]|qu)ies$", "$1y");
- singular("(s)eries$", "$1eries");
- singular("(m)ovies$", "$1ovie");
- singular("(x|ch|ss|sh)es$", "$1");
- singular("([m|l])ice$", "$1ouse");
- singular("(bus)es$", "$1");
- singular("(o)es$", "$1");
- singular("(shoe)s$", "$1");
- singular("(cris|ax|test)es$", "$1is");
- singular("([octop|vir])i$", "$1us");
- singular("(alias|status)es$", "$1");
- singular("^(ox)en", "$1");
- singular("(vert|ind)ices$", "$1ex");
- singular("(matr)ices$", "$1ix");
- singular("(quiz)zes$", "$1");
- singular("(ess)$", "$1");
+ builder.plural("$", "s")
+ .plural("s$", "s")
+ .plural("(ax|test)is$", "$1es")
+ .plural("(octop|vir)us$", "$1i")
+ .plural("(alias|status)$", "$1es")
+ .plural("(bu)s$", "$1es")
+ .plural("(buffal|tomat)o$", "$1oes")
+ .plural("([ti])um$", "$1a")
+ .plural("sis$", "ses")
+ .plural("(?:([^f])fe|([lr])f)$", "$1$2ves")
+ .plural("(hive)$", "$1s")
+ .plural("([^aeiouy]|qu)y$", "$1ies")
+ .plural("([^aeiouy]|qu)ies$", "$1y")
+ .plural("(x|ch|ss|sh)$", "$1es")
+ .plural("(matr|vert|ind)ix|ex$", "$1ices")
+ .plural("([m|l])ouse$", "$1ice")
+ .plural("(ox)$", "$1en")
+ .plural("(quiz)$", "$1zes");
- singular("men$", "man");
- plural("man$", "men");
+ builder.singular("s$", "")
+ .singular("(n)ews$", "$1ews")
+ .singular("([ti])a$", "$1um")
+ .singular("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "$1$2sis")
+ .singular("(^analy)ses$", "$1sis")
+ .singular("([^f])ves$", "$1fe")
+ .singular("(hive)s$", "$1")
+ .singular("(tive)s$", "$1")
+ .singular("([lr])ves$", "$1f")
+ .singular("([^aeiouy]|qu)ies$", "$1y")
+ .singular("(s)eries$", "$1eries")
+ .singular("(m)ovies$", "$1ovie")
+ .singular("(x|ch|ss|sh)es$", "$1")
+ .singular("([m|l])ice$", "$1ouse")
+ .singular("(bus)es$", "$1")
+ .singular("(o)es$", "$1")
+ .singular("(shoe)s$", "$1")
+ .singular("(cris|ax|test)es$", "$1is")
+ .singular("([octop|vir])i$", "$1us")
+ .singular("(alias|status)es$", "$1")
+ .singular("^(ox)en", "$1")
+ .singular("(vert|ind)ices$", "$1ex")
+ .singular("(matr)ices$", "$1ix")
+ .singular("(quiz)zes$", "$1")
+ .singular("(ess)$", "$1");
- irregular("curve", "curves");
- irregular("leaf", "leaves");
- irregular("roof", "rooves");
- irregular("person", "people");
- irregular("child", "children");
- irregular("sex", "sexes");
- irregular("move", "moves");
+ builder.singular("men$", "man")
+ .plural("man$", "men");
- uncountable(new String[] { "equipment", "information", "rice", "money", "species", "series", "fish", "sheep", "s" });
+ builder.irregular("curve", "curves")
+ .irregular("leaf", "leaves")
+ .irregular("roof", "rooves")
+ .irregular("person", "people")
+ .irregular("child", "children")
+ .irregular("sex", "sexes")
+ .irregular("move", "moves");
+
+ builder.uncountable(new String[] { "equipment", "information", "rice", "money", "species", "series", "fish", "sheep", "s" });
+
+ return builder;
}
public static Inflector getInstance() {
@@ -122,28 +128,27 @@
return underscoredWord;
}
- public synchronized String pluralize(String word) {
+ public String pluralize(String word) {
if (uncountables.contains(word.toLowerCase())) {
return word;
}
return replaceWithFirstRule(word, plurals);
}
- public synchronized String singularize(String word) {
+ public String singularize(String word) {
if (uncountables.contains(word.toLowerCase())) {
return word;
}
return replaceWithFirstRule(word, singulars);
}
- private String replaceWithFirstRule(String word, List<RuleAndReplacement> ruleAndReplacements) {
+ private static String replaceWithFirstRule(String word, List<RuleAndReplacement> ruleAndReplacements) {
for (RuleAndReplacement rar : ruleAndReplacements) {
- String rule = rar.getRule();
String replacement = rar.getReplacement();
// Return if we find a match.
- Matcher matcher = Pattern.compile(rule, Pattern.CASE_INSENSITIVE).matcher(word);
+ Matcher matcher = rar.getPattern().matcher(word);
if (matcher.find()) {
return matcher.replaceAll(replacement);
}
@@ -161,49 +166,68 @@
return tableize(className);
}
- private void plural(String rule, String replacement) {
- plurals.add(0, new RuleAndReplacement(rule, replacement));
+ public static Builder builder()
+ {
+ return new Builder();
}
- private void singular(String rule, String replacement) {
- singulars.add(0, new RuleAndReplacement(rule, replacement));
+ // Ugh, no open structs in Java (not-natively at least).
+ private static class RuleAndReplacement {
+ private final String rule;
+ private final String replacement;
+ private final Pattern pattern;
+
+ public RuleAndReplacement(String rule, String replacement) {
+ this.rule = rule;
+ this.replacement = replacement;
+ this.pattern = Pattern.compile(rule, Pattern.CASE_INSENSITIVE);
+ }
+
+ public String getReplacement() {
+ return replacement;
+ }
+
+ public String getRule() {
+ return rule;
+ }
+
+ public Pattern getPattern() {
+ return pattern;
+ }
}
- private void irregular(String singular, String plural) {
- plural(singular, plural);
- singular(plural, singular);
- }
+ public static class Builder
+ {
+ private List<RuleAndReplacement> plurals = new ArrayList<RuleAndReplacement>();
+ private List<RuleAndReplacement> singulars = new ArrayList<RuleAndReplacement>();
+ private List<String> uncountables = new ArrayList<String>();
- private void uncountable(String... words) {
- for (String word : words) {
- uncountables.add(word);
+ public Builder plural(String rule, String replacement) {
+ plurals.add(0, new RuleAndReplacement(rule, replacement));
+ return this;
+ }
+
+ public Builder singular(String rule, String replacement) {
+ singulars.add(0, new RuleAndReplacement(rule, replacement));
+ return this;
+ }
+
+ public Builder irregular(String singular, String plural) {
+ plural(singular, plural);
+ singular(plural, singular);
+ return this;
+ }
+
+ public Builder uncountable(String... words) {
+ for (String word : words) {
+ uncountables.add(word);
+ }
+ return this;
+ }
+
+ public Inflector build()
+ {
+ return new Inflector(this);
}
}
}
-
-// Ugh, no open structs in Java (not-natively at least).
-class RuleAndReplacement {
- private String rule;
- private String replacement;
-
- public RuleAndReplacement(String rule, String replacement) {
- this.rule = rule;
- this.replacement = replacement;
- }
-
- public String getReplacement() {
- return replacement;
- }
-
- public void setReplacement(String replacement) {
- this.replacement = replacement;
- }
-
- public String getRule() {
- return rule;
- }
-
- public void setRule(String rule) {
- this.rule = rule;
- }
-}
\ No newline at end of file