code: public static List<String> parseName(String sourceName, char separator) {
  		List<String> result = new ArrayList<String>();
  		if (sourceName != null) {
  			StringBuilder currentWord = new StringBuilder();
  			boolean lastIsLower = false;
  			for (int index = 0, length = sourceName.length(); index < length; ++index) {
  				char curChar = sourceName.charAt(index);
  				if (Character.isUpperCase(curChar) || (!lastIsLower && Character.isDigit(curChar)) || curChar == separator) {
  					if (lastIsLower && currentWord.length() > 1 || curChar == separator && currentWord.length() > 0) {
  						result.add(currentWord.toString());
  						currentWord = new StringBuilder();
  					}
  					lastIsLower = false;
  				} else {
  					if (!lastIsLower) {
  						int currentWordLength = currentWord.length();
  						if (currentWordLength > 1) {
  							char lastChar = currentWord.charAt(--currentWordLength);
  							currentWord.setLength(currentWordLength);
  							result.add(currentWord.toString());
  							currentWord = new StringBuilder();
  							currentWord.append(lastChar);
  						}
  					}
  					lastIsLower = true;
  				}
  
  				if (curChar != separator) {
  					currentWord.append(curChar);
  				}
  			}
  
  			result.add(currentWord.toString());
  		}
  		return result;
  	}
docs: This method breaks sourceName into words delimited by separator and/or mixed-case naming.