| 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 |