package com.cardshifter.core.username;
import java.util.*;
/**
* Instances of this class are guaranteed to be valid user names
*/
public class UserName {
private static final int MIN_LENGTH = 1;
private static final int MAX_LENGTH = 20;
private static final Collection<String> reservedNames = new HashSet<>(Arrays.asList("Server", "undefined"));
private String name;
private UserName(String name) {
this.name = name;
}
/**
* Try to create a new UserName object
*
* @param name Any string
* @return A UserName guaranteed to be valid
* @throws InvalidUserNameException If the proposed name is not valid
*/
public static UserName create(String name) throws InvalidUserNameException {
if (name.length() < MIN_LENGTH) {
throw new InvalidUserNameException("Too short");
}
if (name.length() > MAX_LENGTH) {
throw new InvalidUserNameException("Too long");
}
if (name.startsWith(" ") || name.endsWith(" ")) {
throw new InvalidUserNameException("Starts or ends with space");
}
if (!name.matches("^[a-zA-Z0-9_ ]*$")) {
throw new InvalidUserNameException("Invalid characters");
}
if (name.matches(".* .*")) {
throw new InvalidUserNameException("More than one consecutive space");
}
if (reservedNames.contains(name)) {
throw new InvalidUserNameException("Reserved");
}
return new UserName(name);
}
public String asString() {
return name;
}
}