/* * Copyright (C) 2014 Intel Corporation * All rights reserved. */ package com.intel.mtwilson.jackson; import com.fasterxml.jackson.databind.PropertyNamingStrategy; /** * Abstraction of LowercaseWithUnderscoresStrategy to allow a different separator, * for example a hyphen for xml-elements-like-this. * * @author jbuhacoff */ public abstract class LowercaseWithSeparatorStrategy extends PropertyNamingStrategy.PropertyNamingStrategyBase { private char separator = '-'; protected void setSeparator(char separator) { this.separator = separator; } @Override public String translate(String input) { if (input == null) { return input; // garbage in, garbage out } int length = input.length(); StringBuilder result = new StringBuilder(length * 2); int resultLength = 0; boolean wasPrevTranslated = false; for (int i = 0; i < length; i++) { char c = input.charAt(i); if (i > 0 || c != separator) // skip first starting underscore { if (Character.isUpperCase(c)) { if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != separator) { result.append(separator); resultLength++; } c = Character.toLowerCase(c); wasPrevTranslated = true; } else { wasPrevTranslated = false; } result.append(c); resultLength++; } } return resultLength > 0 ? result.toString() : input; } }