/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.test.helpers;
import java.util.ArrayList;
import java.util.List;
/**
* It is generator of possible combinations. Currently supports only text.
*
* @author wypych
* @since JDK 1.7 update 74
* @version Robot Framework 2.9 alpha 2
*
*/
public class CombinationGenerator {
/**
* Note: this method do not use recursion to generate all possibilities
*
* @param text
* concatenated letters, numbers, special chars and whitespace
* @return possible combinations base on idea that letters can be presented
* as upper, lower case format
*/
public List<String> combinations(String text) {
List<String> possibilities = new ArrayList<>();
if (text != null && !text.isEmpty()) {
List<StringBuilder> temp = new ArrayList<>();
char[] chars = text.toCharArray();
List<char[]> lowerUpperCaseArray = buildUpperLowerCaseTemplateList(chars);
// initialization of temp list with possible elements
// the first element from lowerUpperCaseArray list will be removed
// to not duplicate element
setTheFirstCharRepeatnessInList(temp, lowerUpperCaseArray);
for (char[] cc : lowerUpperCaseArray) {
// getting current size of list before adding next possible
// elements to every current element
int iterNumber = temp.size();
// we extending temp list by adding to each current element next
// possibilities
// ///////////////-> element_next_0
// element_1
// ///////////////-> element_next_1
// it will be element_1, element_next_0
// it will be element_1, element_next_1
for (int i = 0; i < iterNumber; i++) {
if (cc.length == 1) {
temp.get(i).append(cc[0]);
} else if (cc.length == 2) {
char theFirst = cc[0];
char theSecond = cc[1];
StringBuilder current = temp.get(i * 2);
StringBuilder newDuplicated = new StringBuilder(current);
current.append(theFirst);
newDuplicated.append(theSecond);
temp.add(i * 2, newDuplicated);
}
}
}
possibilities = convertTo(temp);
// for GC help
temp = null;
lowerUpperCaseArray = null;
}
return possibilities;
}
private void setTheFirstCharRepeatnessInList(List<StringBuilder> temp,
List<char[]> lowerUpperCaseArray) {
if (!lowerUpperCaseArray.isEmpty()) {
char[] theFirstCharArray = lowerUpperCaseArray.get(0);
for (char c : theFirstCharArray) {
temp.add(new StringBuilder().append(c));
}
lowerUpperCaseArray.remove(0);
}
}
private List<char[]> buildUpperLowerCaseTemplateList(char[] chars) {
List<char[]> lowerUpperCaseArray = new ArrayList<>();
for (char c : chars) {
if (Character.isLetter(c)) {
lowerUpperCaseArray.add(new char[] { Character.toLowerCase(c),
Character.toUpperCase(c) });
} else {
// whitespace and other not letter chars couldn't take two way
// forms [upper, lower] case sensitive
lowerUpperCaseArray.add(new char[] { c });
}
}
return lowerUpperCaseArray;
}
public List<String> convertTo(List<StringBuilder> temp) {
List<String> converted = new ArrayList<>();
for (StringBuilder strBuilder : temp) {
converted.add(strBuilder.toString());
}
return converted;
}
}