All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.young.word.cage.RandomTokenGenerator Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2011 Király Attila
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.young.word.cage;

import java.util.Random;

/**
 * A simple random String generator that can be used to generate tokens for the
 * captcha images.
 * 
 * In its default mode instances of this class generate words from English lower
 * cased letters where vowels and consonants are alternating.
 * 
 * @author akiraly
 */
public class RandomTokenGenerator implements IGenerator {

	/**
	 * Default minimum length of token.
	 */
	protected static final int DEFAULT_TOKEN_LEN_MIN = 8;

	/**
	 * Default maximum length of token is {@link #DEFAULT_TOKEN_LEN_MIN} +
	 * {@value #DEFAULT_TOKEN_LEN_DELTA}.
	 */
	protected static final int DEFAULT_TOKEN_LEN_DELTA = 2;

	private final IGeneratorFactory characterGeneratorFactory;
	private final int minLength;
	private final int delta;
	private final Random rnd;

	/**
	 * Constructor.
	 */
	public RandomTokenGenerator() {
		this(null);
	}

	/**
	 * Constructor.
	 * 
	 * @param rnd
	 *            random generator to be used, can be null
	 */
	public RandomTokenGenerator(Random rnd) {
		this(rnd, DEFAULT_TOKEN_LEN_MIN, DEFAULT_TOKEN_LEN_DELTA);
	}

	/**
	 * Constructor.
	 * 
	 * @param length
	 *            the length of the generated words
	 * @param rnd
	 *            random generator to be used, can be null
	 */
	public RandomTokenGenerator(Random rnd, int length) {
		this(rnd, length, 0);
	}

	/**
	 * Constructor.
	 * 
	 * @param rnd
	 *            random generator to be used, can be null
	 * @param minLength
	 *            the minimum length of the generated words
	 * @param delta
	 *            minLength + delta is the maximum length of the generated
	 *            words
	 */
	public RandomTokenGenerator(Random rnd, int minLength, int delta) {
		this(rnd, new RandomCharacterGeneratorFactory(rnd != null ? rnd
				: new Random()), minLength, delta);
	}

	/**
	 * Constructor.
	 * 
	 * @param rnd
	 *            random generator to be used, can be null
	 * @param characterGeneratorFactory
	 *            character generator factory to be used for the actual
	 *            character creation, can be null
	 * @param minLength
	 *            the minimum length of the generated words,
	 * @param delta
	 *            minLength + delta is the maximum length of the generated
	 *            words
	 */
	public RandomTokenGenerator(Random rnd,
			IGeneratorFactory characterGeneratorFactory,
			int minLength, int delta) {
		this.characterGeneratorFactory = characterGeneratorFactory != null ? characterGeneratorFactory
				: new RandomCharacterGeneratorFactory();
		this.minLength = Math.abs(minLength);
		this.delta = Math.abs(delta);
		this.rnd = rnd != null ? rnd : new Random();
	}

	@Override
	public String next() {
		final int length = (delta <= 1 ? 0 : rnd.nextInt(delta) + 1)
				+ minLength;
		final char[] word = new char[length];
		final IGenerator generator = characterGeneratorFactory
				.next();

		for (int fi = 0; fi < word.length; fi++)
			word[fi] = generator.next();

		return new String(word);
	}

	/**
	 * @return character generator factory used by this class, not null
	 */
	public IGeneratorFactory getCharacterGeneratorFactory() {
		return characterGeneratorFactory;
	}

	/**
	 * @return minimum length of generated tokens
	 */
	public int getMinLength() {
		return minLength;
	}

	/**
	 * @return maximum length difference to add to the minimum length
	 */
	public int getDelta() {
		return delta;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy