package org.ripple.power.password;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
public class PasswordGeneratorArray {
private StringBuffer temp = new StringBuffer();
private long wordCount = 0;
private int wordLenght;
private int maxWordLength;
private ArrayList<String> alphabet;
private final long MAX_WORDS;
private boolean isUpper = false;
private long skip = 1;
private final int RADIX;
private char flag = (char) -1;
private boolean not_repeat;
public PasswordGeneratorArray(int startLength, int maxWordLength,
ArrayList<String> alphabet) {
this.wordLenght = startLength;
this.maxWordLength = maxWordLength;
this.alphabet = new ArrayList<String>(alphabet);
this.RADIX = alphabet.size();
System.out.println(RADIX);
this.MAX_WORDS = (long) Math.pow(RADIX, wordLenght);
}
public long getSkip() {
return skip;
}
public void setSkip(long skip) {
this.skip = skip;
}
public PasswordGeneratorArray(int startLength, int maxWordLength,
String filename) throws IOException {
alphabet = new ArrayList<String>(10000);
HashSet<String> caches = new HashSet<String>(10000);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(filename), "utf-8"));
String text = null;
for (; (text = reader.readLine()) != null;) {
String tmp = text.trim();
if (caches.add(tmp)) {
alphabet.add(tmp);
}
}
reader.close();
this.wordLenght = startLength;
this.maxWordLength = maxWordLength;
this.alphabet = new ArrayList<String>(alphabet);
this.RADIX = alphabet.size();
this.MAX_WORDS = (long) Math.pow(RADIX, wordLenght);
}
public String generateNextWord() {
int[] indices = convertToRadix(RADIX, wordCount, wordLenght);
temp.delete(0, temp.length());
for (int k = 0; k < wordLenght; k++) {
String result = alphabet.get(indices[k]);
if (isUpper) {
result = result.substring(0, 1).toUpperCase()
+ result.substring(1, result.length());
}
if (not_repeat) {
if (temp.indexOf(result) == -1) {
temp.append(result);
}
} else {
temp.append(result);
}
if (flag != -1) {
temp.append(flag);
}
}
if (flag != -1) {
temp.delete(temp.length() - 1, temp.length());
}
wordCount += skip;
if (wordCount > MAX_WORDS) {
wordCount = 1;
wordLenght++;
if (wordLenght > maxWordLength) {
return null;
}
}
return temp.toString();
}
public long getNextCount() {
return wordCount;
}
public void setNextCount(long val) {
this.wordCount = val;
}
public void setWordLenght(int val) {
this.wordLenght = val;
}
public int getWordLength() {
return this.wordLenght;
}
private static int[] convertToRadix(int radix, long number, int wordlength) {
int[] indices = new int[wordlength];
for (int i = wordlength - 1; i >= 0; i--) {
if (number > 0) {
int rest = (int) (number % radix);
number /= radix;
indices[i] = rest;
} else {
indices[i] = 0;
}
}
return indices;
}
public char getFlag() {
return flag;
}
public void setFlag(char flag) {
this.flag = flag;
}
public boolean isNot_repeat() {
return not_repeat;
}
public void setNot_repeat(boolean not_repeat) {
this.not_repeat = not_repeat;
}
}