package org.quaere.expressions; import java.util.UUID; /** * Represents a textual identifier used for variables and other named references. */ public class Identifier extends Expression { /** * Gets the textual identifier. */ public final String name; /** * Creates a new @see Identifier. * * @param identifier The name of the identifier. * @throws IllegalArgumentException The identifier is not a valid Java identifier. */ public Identifier(String identifier) throws IllegalArgumentException { validateIdentifier(identifier); this.name = identifier; } private void validateIdentifier(String text) throws IllegalArgumentException { if (text == null || text.equals("")) { throw new IllegalArgumentException("The identifier cannot be null or an empty string."); } if (!Character.isJavaIdentifierStart(text.charAt(0))) { throw new IllegalArgumentException("The identifier must start with a Java identifier start character."); } for (int i = 1; i < text.length(); i++) { if (!Character.isJavaIdentifierPart(text.charAt(i))) { throw new IllegalArgumentException("The identifier can only contain Java identifier part characters."); } } } /** * Gets a textual representation of the @see Identifier. * * @return A textual representation of the @see Identifier. */ @Override public String toString() { return name; } /** * Creates a new, uniquely named @see identifier. * * @return A new, uniquely named @see identifier. */ public static Identifier createUniqueIdentfier() { return new Identifier("Id_" + UUID.randomUUID().toString().replace("-", "")); } // --------------------- Interface ExpressionTreeNode --------------------- public void accept(ExpressionTreeVisitor visitor) { visitor.visit(this); } }