/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2008 Sun Microsystems, Inc.
*/
package org.opends.server.types;
import org.opends.messages.Message;
import java.util.Random;
import java.util.SortedSet;
import org.opends.server.config.ConfigException;
import static org.opends.messages.UtilityMessages.*;
import static org.opends.server.util.StaticUtils.*;
/**
* This class provides a data structure that makes it possible to
* associate a name with a given set of characters. The name must
* consist only of ASCII alphabetic characters.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.VOLATILE,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
public final class NamedCharacterSet
{
// The characters contained in this character set.
private char[] characters;
// The random number generator to use with this character set.
private Random random;
// The name assigned to this character set.
private String name;
/**
* Creates a new named character set with the provided information.
*
* @param name The name for this character set.
* @param characters The characters to include in this character
* set.
*
* @throws ConfigException If the provided name contains one or
* more illegal characters.
*/
public NamedCharacterSet(String name, char[] characters)
throws ConfigException
{
this.name = name;
this.characters = characters;
random = new Random();
if ((name == null) || (name.length() == 0))
{
Message message = ERR_CHARSET_CONSTRUCTOR_NO_NAME.get();
throw new ConfigException(message);
}
for (int i=0; i < name.length(); i++)
{
if (! isAlpha(name.charAt(i)))
{
Message message = ERR_CHARSET_CONSTRUCTOR_INVALID_NAME_CHAR.
get(String.valueOf(name.charAt(i)), i);
throw new ConfigException(message);
}
}
}
/**
* Creates a new named character set with the provided information.
*
* @param name The name for this character set.
* @param characters The characters to include in this character
* set.
* @param random The random number generator to use with this
* character set.
*
* @throws ConfigException If the provided name contains one or
* more illegal characters.
*/
public NamedCharacterSet(String name, char[] characters,
Random random)
throws ConfigException
{
this.name = name;
this.characters = characters;
this.random = random;
if ((name == null) || (name.length() == 0))
{
Message message = ERR_CHARSET_CONSTRUCTOR_NO_NAME.get();
throw new ConfigException(message);
}
for (int i=0; i < name.length(); i++)
{
if (! isAlpha(name.charAt(i)))
{
Message message = ERR_CHARSET_CONSTRUCTOR_INVALID_NAME_CHAR.
get(String.valueOf(name.charAt(i)), i);
throw new ConfigException(message);
}
}
}
/**
* Retrieves the name for this character set.
*
* @return The name for this character set.
*/
public String getName()
{
return name;
}
/**
* Retrieves the characters included in this character set.
*
* @return The characters included in this character set.
*/
public char[] getCharacters()
{
return characters;
}
/**
* Retrieves a character at random from this named character set.
*
* @return The randomly-selected character from this named
* character set;
*/
public char getRandomCharacter()
{
if ((characters == null) || (characters.length == 0))
{
return 0;
}
return characters[random.nextInt(characters.length)];
}
/**
* Appends the specified number of characters chosen at random from
* this character set to the provided buffer.
*
* @param buffer The buffer to which the characters should be
* appended.
* @param count The number of characters to append to the
* provided buffer.
*/
public void getRandomCharacters(StringBuilder buffer, int count)
{
if ((characters == null) || (characters.length == 0))
{
return;
}
for (int i=0; i < count; i++)
{
buffer.append(characters[random.nextInt(characters.length)]);
}
}
/**
* Encodes this character set to a form suitable for use in the
* value of a configuration attribute.
*
* @return The encoded character set in a form suitable for use in
* the value of a configuration attribute.
*/
public String encode()
{
return name + ":" + new String(characters);
}
/**
* Decodes the values of the provided configuration attribute as a
* set of character set definitions.
*
* @param values The set of encoded character set values to
* decode.
*
* @return The decoded character set definitions.
*
* @throws ConfigException If a problem occurs while attempting to
* decode the character set definitions.
*/
public static NamedCharacterSet[]
decodeCharacterSets(SortedSet<String> values)
throws ConfigException
{
NamedCharacterSet[] sets = new NamedCharacterSet[values.size()];
int i = 0 ;
for (String value : values)
{
int colonPos = value.indexOf(':');
if (colonPos < 0)
{
Message message =
ERR_CHARSET_NO_COLON.get(String.valueOf(value));
throw new ConfigException(message);
}
else if (colonPos == 0)
{
Message message =
ERR_CHARSET_NO_NAME.get(String.valueOf(value));
throw new ConfigException(message);
}
else if (colonPos == (value.length() - 1))
{
Message message =
ERR_CHARSET_NO_CHARS.get(String.valueOf(value));
throw new ConfigException(message);
}
else
{
String name = value.substring(0, colonPos);
char[] characters = value.substring(colonPos+1).toCharArray();
sets[i] = new NamedCharacterSet(name, characters);
}
i++;
}
return sets;
}
}