<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: java code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 07:56:48 GMT</pubDate>
    <description>DZone Snippets: java code</description>
    <item>
      <title>Java inflections</title>
      <link>http://snippets.dzone.com/posts/show/4110</link>
      <description>&lt;code&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.regex.Matcher;&lt;br /&gt;import java.util.regex.Pattern;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Transforms words (from singular to plural, from camelCase to under_score, etc.). I got bored of doing Real Work...&lt;br /&gt; * &lt;br /&gt; * @author chuyeow&lt;br /&gt; */&lt;br /&gt;public class Inflector {&lt;br /&gt;&lt;br /&gt;    // Pfft, can't think of a better name, but this is needed to avoid the price of initializing the pattern on each call.&lt;br /&gt;    private static final Pattern UNDERSCORE_PATTERN_1 = Pattern.compile("([A-Z]+)([A-Z][a-z])");&lt;br /&gt;    private static final Pattern UNDERSCORE_PATTERN_2 = Pattern.compile("([a-z\\d])([A-Z])");&lt;br /&gt;&lt;br /&gt;    private static List&lt;RuleAndReplacement&gt; plurals = new ArrayList&lt;RuleAndReplacement&gt;();&lt;br /&gt;    private static List&lt;RuleAndReplacement&gt; singulars = new ArrayList&lt;RuleAndReplacement&gt;();&lt;br /&gt;    private static List&lt;String&gt; uncountables = new ArrayList&lt;String&gt;();&lt;br /&gt;&lt;br /&gt;    private static Inflector instance; // (Pseudo-)Singleton instance.&lt;br /&gt;&lt;br /&gt;    private Inflector() {&lt;br /&gt;        // Woo, you can't touch me.&lt;br /&gt;        &lt;br /&gt;        initialize();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void initialize() {&lt;br /&gt;        plural("$", "s");&lt;br /&gt;        plural("s$", "s");&lt;br /&gt;        plural("(ax|test)is$", "$1es");&lt;br /&gt;        plural("(octop|vir)us$", "$1i");&lt;br /&gt;        plural("(alias|status)$", "$1es");&lt;br /&gt;        plural("(bu)s$", "$1es");&lt;br /&gt;        plural("(buffal|tomat)o$", "$1oes");&lt;br /&gt;        plural("([ti])um$", "$1a");&lt;br /&gt;        plural("sis$", "ses");&lt;br /&gt;        plural("(?:([^f])fe|([lr])f)$", "$1$2ves");&lt;br /&gt;        plural("(hive)$", "$1s");&lt;br /&gt;        plural("([^aeiouy]|qu)y$", "$1ies");&lt;br /&gt;        plural("([^aeiouy]|qu)ies$", "$1y");&lt;br /&gt;        plural("(x|ch|ss|sh)$", "$1es");&lt;br /&gt;        plural("(matr|vert|ind)ix|ex$", "$1ices");&lt;br /&gt;        plural("([m|l])ouse$", "$1ice");&lt;br /&gt;        plural("(ox)$", "$1en");&lt;br /&gt;        plural("(quiz)$", "$1zes");&lt;br /&gt;&lt;br /&gt;        singular("s$", "");&lt;br /&gt;        singular("(n)ews$", "$1ews");&lt;br /&gt;        singular("([ti])a$", "$1um");&lt;br /&gt;        singular("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "$1$2sis");&lt;br /&gt;        singular("(^analy)ses$", "$1sis");&lt;br /&gt;        singular("([^f])ves$", "$1fe");&lt;br /&gt;        singular("(hive)s$", "$1");&lt;br /&gt;        singular("(tive)s$", "$1");&lt;br /&gt;        singular("([lr])ves$", "$1f");&lt;br /&gt;        singular("([^aeiouy]|qu)ies$", "$1y");&lt;br /&gt;        singular("(s)eries$", "$1eries");&lt;br /&gt;        singular("(m)ovies$", "$1ovie");&lt;br /&gt;        singular("(x|ch|ss|sh)es$", "$1");&lt;br /&gt;        singular("([m|l])ice$", "$1ouse");&lt;br /&gt;        singular("(bus)es$", "$1");&lt;br /&gt;        singular("(o)es$", "$1");&lt;br /&gt;        singular("(shoe)s$", "$1");&lt;br /&gt;        singular("(cris|ax|test)es$", "$1is");&lt;br /&gt;        singular("([octop|vir])i$", "$1us");&lt;br /&gt;        singular("(alias|status)es$", "$1");&lt;br /&gt;        singular("^(ox)en", "$1");&lt;br /&gt;        singular("(vert|ind)ices$", "$1ex");&lt;br /&gt;        singular("(matr)ices$", "$1ix");&lt;br /&gt;        singular("(quiz)zes$", "$1");&lt;br /&gt;&lt;br /&gt;        irregular("person", "people");&lt;br /&gt;        irregular("man", "men");&lt;br /&gt;        irregular("child", "children");&lt;br /&gt;        irregular("sex", "sexes");&lt;br /&gt;        irregular("move", "moves");&lt;br /&gt;&lt;br /&gt;        uncountable(new String[] {"equipment", "information", "rice", "money", "species", "series", "fish", "sheep"});&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static Inflector getInstance() {&lt;br /&gt;        if (instance == null) {&lt;br /&gt;            instance = new Inflector();&lt;br /&gt;        }&lt;br /&gt;        return instance;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String underscore(String camelCasedWord) {&lt;br /&gt;&lt;br /&gt;        // Regexes in Java are fucking stupid...&lt;br /&gt;        String underscoredWord = UNDERSCORE_PATTERN_1.matcher(camelCasedWord).replaceAll("$1_$2");&lt;br /&gt;        underscoredWord = UNDERSCORE_PATTERN_2.matcher(underscoredWord).replaceAll("$1_$2");&lt;br /&gt;        underscoredWord = underscoredWord.replace('-', '_').toLowerCase();&lt;br /&gt;&lt;br /&gt;        return underscoredWord;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String pluralize(String word) {&lt;br /&gt;        if (uncountables.contains(word.toLowerCase())) {&lt;br /&gt;            return word;&lt;br /&gt;        }&lt;br /&gt;        return replaceWithFirstRule(word, plurals);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String singularize(String word) {&lt;br /&gt;        if (uncountables.contains(word.toLowerCase())) {&lt;br /&gt;            return word;&lt;br /&gt;        }&lt;br /&gt;        return replaceWithFirstRule(word, singulars);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private String replaceWithFirstRule(String word, List&lt;RuleAndReplacement&gt; ruleAndReplacements) {&lt;br /&gt;&lt;br /&gt;        for (RuleAndReplacement rar : ruleAndReplacements) {&lt;br /&gt;            String rule = rar.getRule();&lt;br /&gt;            String replacement = rar.getReplacement();&lt;br /&gt;&lt;br /&gt;            // Return if we find a match.&lt;br /&gt;            Matcher matcher = Pattern.compile(rule, Pattern.CASE_INSENSITIVE).matcher(word);&lt;br /&gt;            if (matcher.find()) {&lt;br /&gt;                return matcher.replaceAll(replacement);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return word;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String tableize(String className) {&lt;br /&gt;        return pluralize(underscore(className));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public String tableize(Class klass) {&lt;br /&gt;        // Strip away package name - we only want the 'base' class name.&lt;br /&gt;        String className = klass.getName().replace(klass.getPackage().getName()+".", "");&lt;br /&gt;        return tableize(className);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void plural(String rule, String replacement) {&lt;br /&gt;        plurals.add(0, new RuleAndReplacement(rule, replacement));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void singular(String rule, String replacement) {&lt;br /&gt;        singulars.add(0, new RuleAndReplacement(rule, replacement));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void irregular(String singular, String plural) {&lt;br /&gt;        plural(singular, plural);&lt;br /&gt;        singular(plural, singular);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void uncountable(String... words) {&lt;br /&gt;        for (String word : words) {&lt;br /&gt;            uncountables.add(word);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Ugh, no open structs in Java (not-natively at least).&lt;br /&gt;class RuleAndReplacement {&lt;br /&gt;    private String rule;&lt;br /&gt;    private String replacement;&lt;br /&gt;    public RuleAndReplacement(String rule, String replacement) {&lt;br /&gt;        this.rule = rule;&lt;br /&gt;        this.replacement = replacement;&lt;br /&gt;    }&lt;br /&gt;    public String getReplacement() {&lt;br /&gt;        return replacement;&lt;br /&gt;    }&lt;br /&gt;    public void setReplacement(String replacement) {&lt;br /&gt;        this.replacement = replacement;&lt;br /&gt;    }&lt;br /&gt;    public String getRule() {&lt;br /&gt;        return rule;&lt;br /&gt;    }&lt;br /&gt;    public void setRule(String rule) {&lt;br /&gt;        this.rule = rule;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 07 Jun 2007 06:24:16 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4110</guid>
      <author>chuyeow (Chu Yeow)</author>
    </item>
    <item>
      <title>JBossCache - unmarshalling cached objects across JVMs</title>
      <link>http://snippets.dzone.com/posts/show/2582</link>
      <description>JBossCache doesn't natively allow you to put and get objects across classloaders, so we need to marshal and unmarshal the objects with org.jboss.invocation.MarshalledValue.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private TreeCacheMBean cache;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void put(String path, Object key, Object value) throws Exception {&lt;br /&gt;  cache.put(path, key, getMarshalledValue(value));&lt;br /&gt;&lt;br /&gt;Object get(String path, Object key) throws Exception {&lt;br /&gt;  return getUnMarshalledValue(cache.get(path, key));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private Object getUnMarshalledValue(Object value) throws IOException, ClassNotFoundException {&lt;br /&gt;  return ((MarshalledValue) value).get();&lt;br /&gt;}&lt;br /&gt;    &lt;br /&gt;private Object getMarshalledValue(Object value) throws IOException {&lt;br /&gt;  return new MarshalledValue(value);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 11 Sep 2006 06:20:19 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2582</guid>
      <author>chuyeow (Chu Yeow)</author>
    </item>
  </channel>
</rss>
