package com.connsec.util;
import java.lang.management.ManagementFactory;
import java.security.SecureRandom;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import com.connsec.crypto.Base64Utils;
public class StringGenerator {
private static final int MAX_PID = 65536;
private char[] DEFAULT_CODEC = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
public static final char[] DEFAULT_CODE_NUMBER = "1234567890".toCharArray();
public static final char[] DEFAULT_CODE_LOWERCASE = "abcdefghijklmnopqrstuvwxyz".toCharArray();
public static final char[] DEFAULT_CODE_UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
public static final char[] DEFAULT_CODE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
public static final char[] DEFAULT_CODE_NUMBER_LETTERS = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
public static int processId;
private static final String uuidRegex = "^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$";
private Random random = new SecureRandom();
private int length;
static {
final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
int index = jvmName.indexOf('@');
if (index < 1)
throw new RuntimeException("Could not get PID");
try {
processId= Integer.parseInt(jvmName.substring(0, index)) % MAX_PID;
} catch (NumberFormatException e) {
throw new RuntimeException("Could not get PID");
}
}
/**
* Create a generator with the default length (6).
*/
public StringGenerator() {
this(6);
}
/**
* Create a generator of random strings of the length provided
*
* @param length the length of the strings generated
*/
public StringGenerator(int length) {
this.length = length;
}
public StringGenerator(char[] defaultCode,int length) {
this.DEFAULT_CODEC=defaultCode;
this.length = length;
}
public String randomGenerate() {
byte[] verifierBytes = new byte[length];
random.nextBytes(verifierBytes);
return getString(verifierBytes);
}
public String uuidGenerate() {
return UUID.randomUUID().toString().toLowerCase();
}
public String uniqueGenerate() {
StringBuffer uniqueString=new StringBuffer("");
this.length=9;
String randomString =randomGenerate();
uniqueString.append(randomString.subSequence(0, 4));
Date currentDate=new Date();
DateFormat dateFormat = new SimpleDateFormat("ddMMyyyyHHmmssSSS");
String dateString=Base64Utils.encodeBase64(dateFormat.format(currentDate).getBytes());
dateString=dateString.substring(0, dateString.length()-1);
uniqueString.append(dateString);
uniqueString.append(randomString.subSequence(5, 8));
return uniqueString.toString();
}
/**
* Convert these random bytes to a verifier string. The length of the byte array can be
* {@link #setLength(int) configured}. The default implementation mods the bytes to fit into the
* ASCII letters 1-9, A-Z, a-z .
*
* @param verifierBytes The bytes.
* @return The string.
*/
protected String getString(byte[] verifierBytes) {
char[] chars = new char[verifierBytes.length];
for (int i = 0; i < verifierBytes.length; i++) {
chars[i] = DEFAULT_CODEC[((verifierBytes[i] & 0xFF) % DEFAULT_CODEC.length)];
}
return new String(chars);
}
/**
* The random value generator used to create token secrets.
*
* @param random The random value generator used to create token secrets.
*/
public void setRandom(Random random) {
this.random = random;
}
/**
* The length of string to generate.
*
* @param length the length to set
*/
public void setLength(int length) {
this.length = length;
}
public static boolean uuidMatches(String uuidString) {
return uuidString.matches(uuidRegex);
}
}