/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.core.joran.spi; import java.util.ArrayList; import java.util.List; public class CaseCombinator { List<String> combinations(String in) { int length = in.length(); List<String> permutationsList = new ArrayList<String>(); int totalCombinations = computeTotalNumerOfCombinations(in, length); for (int j = 0; j < totalCombinations; j++) { StringBuilder newCombination = new StringBuilder(); int pos = 0; for (int i = 0; i < length; i++) { char c = in.charAt(i); if (isEnglishLetter(c)) { c = permute(c, j, pos); pos++; } newCombination.append(c); } permutationsList.add(newCombination.toString()); } return permutationsList; } private char permute(char c, int permutation, int position) { int mask = 1 << position; boolean shouldBeInUpperCase = (permutation & mask) != 0; boolean isEffectivelyUpperCase = isUpperCase(c); if (shouldBeInUpperCase && !isEffectivelyUpperCase) return toUpperCase(c); if (!shouldBeInUpperCase && isEffectivelyUpperCase) return toLowerCase(c); return c; } private int computeTotalNumerOfCombinations(String in, int length) { int count = 0; for (int i = 0; i < length; i++) { char c = in.charAt(i); if (isEnglishLetter(c)) count++; } // return 2^count (2 to the power of count) return (1 << count); } private char toUpperCase(char c) { if ('A' <= c && c <= 'Z') { return c; } if ('a' <= c && c <= 'z') { return (char) ((int) c + 'A' - 'a'); } // code should never reach this point return c; } private char toLowerCase(char c) { if ('a' <= c && c <= 'z') { return c; } if ('A' <= c && c <= 'Z') { return (char) ((int) c + 'a' - 'A'); } // code should never reach this point return c; } private boolean isEnglishLetter(char c) { if ('a' <= c && c <= 'z') return true; if ('A' <= c && c <= 'Z') return true; return false; } private boolean isUpperCase(char c) { return ('A' <= c && c <= 'Z'); } }