package com.ant;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Random;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

public class RandomString extends Task {
	private String len;

	private String property;
	SecureRandom random = new SecureRandom();

	// String
	// randomUrl="http://www.random.org/cgi-bin/randbyte?nbytes=10&format=h";

	@Override
	public void execute() throws BuildException {
		if (len == null || len.equals(""))
			throw new BuildException("Min property not specified");

		int lenInt = Integer.parseInt(len);
		String result = "";

		byte[] bytes = new byte[lenInt];
		random.nextBytes(bytes);

		result = byteArrayToHexString(bytes);
		logInfo("new result: " + result);

		getProject().setNewProperty(property, result);
	}

	long getRandomLong() {
		long seed = random.nextLong();
		logInfo("seed: " + seed);
		return seed;
	}

	/**
	 * Byte array to hex string.
	 * 
	 * @param b
	 *            the b
	 * @return the string
	 */
	public static String byteArrayToHexString(final byte[] b) {
		final StringBuffer sb = new StringBuffer(b.length * 2);

		for (final byte element : b) {
			final int v = element & 0xff;
			if (v < 16) {
				sb.append('0');
			}
			sb.append(Integer.toHexString(v));
		}
		return sb.toString().toUpperCase();
	}

	public void setLen(String len) {
		this.len = len;
	}

	public void setProperty(String property) {
		this.property = property;
	}

	private void logInfo(String message) {
		if (this.getProject() != null) { // we are running in ant, so use ant
											// log
			this.log(message, Project.MSG_INFO);
		} else { // we are running outside of ant, log to System.out
			System.out.println(message);
		}
	}
}