package org.springframework.roo.model;
import java.util.Collections;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
/**
* Provides all reserved words.
*
* @author Ben Alex
*/
public final class ReservedWords {
private static final String[] JAVA_KEYWORDS = { "abstract", "assert",
"boolean", "break", "byte", "case", "catch", "char", "class",
"const", "continue", "default", "do", "double", "else", "enum",
"extends", "false", "final", "finally", "float", "for", "goto",
"if", "implements", "import", "instanceof", "int", "interface",
"long", "native", "new", "null", "package", "private", "protected",
"public", "return", "short", "static", "strictfp", "super",
"switch", "synchronized", "this", "throw", "throws", "transient",
"true", "try", "void", "volatile", "while" };
private final static String[] SQL_KEYWORDS = { "ABSOLUTE", "ACTION", "ADD",
"AFTER", "ALL", "ALLOCATE", "ALTER", "AND", "ANY", "ARE", "ARRAY",
"AS", "ASC", "ASENSITIVE", "ASSERTION", "ASYMMETRIC", "AT",
"ATOMIC", "AUTHORIZATION", "AVG", "BEFORE", "BEGIN", "BETWEEN",
"BIGINT", "BINARY", "BIT", "BIT_LENGTH", "BLOB", "BOOLEAN", "BOTH",
"BREADTH", "BY", "CALL", "CALLED", "CASCADE", "CASCADED", "CASE",
"CAST", "CATALOG", "CHAR", "CHARACTER", "CHARACTER_LENGTH",
"CHAR_LENGTH", "CHECK", "CLOB", "CLOSE", "COALESCE", "COLLATE",
"COLLATION", "COLUMN", "COMMIT", "CONDITION", "CONNECT",
"CONNECTION", "CONSTRAINT", "CONSTRAINTS", "CONSTRUCTOR",
"CONTAINS", "CONTINUE", "CONVERT", "CORRESPONDING", "COUNT",
"CREATE", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE",
"CURRENT_DEFAULT_TRANSFORM_GROUP", "CURRENT_PATH", "CURRENT_ROLE",
"CURRENT_TIME", "CURRENT_TIMESTAMP",
"CURRENT_TRANSFORM_GROUP_FOR_TYPE", "CURRENT_USER", "CURSOR",
"CYCLE", "DATA", "DATE", "DAY", "DEALLOCATE", "DEC", "DECIMAL",
"DECLARE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DEPTH",
"DEREF", "DESC", "DESCRIBE", "DESCRIPTOR", "DETERMINISTIC",
"DIAGNOSTICS", "DISCONNECT", "DISTINCT", "DO", "DOMAIN", "DOUBLE",
"DROP", "DYNAMIC", "EACH", "ELEMENT", "ELSE", "ELSEIF", "END",
"EQUALS", "ESCAPE", "EXCEPT", "EXCEPTION", "EXEC", "EXECUTE",
"EXISTS", "EXIT", "EXTERNAL", "EXTRACT", "FALSE", "FETCH",
"FILTER", "FIRST", "FLOAT", "FOR", "FOREIGN", "FOUND", "FREE",
"FROM", "FULL", "FUNCTION", "GENERAL", "GET", "GLOBAL", "GO",
"GOTO", "GRANT", "GROUP", "GROUPING", "HANDLER", "HAVING", "HOLD",
"HOUR", "IDENTITY", "IF", "IMMEDIATE", "IN", "INDEX", "INDICATOR",
"INITIALLY", "INNER", "INOUT", "INPUT", "INSENSITIVE", "INSERT",
"INT", "INTEGER", "INTERSECT", "INTERVAL", "INTO", "IS",
"ISOLATION", "ITERATE", "JOIN", "KEY", "LANGUAGE", "LARGE", "LAST",
"LATERAL", "LEADING", "LEAVE", "LEFT", "LEVEL", "LIKE", "LOCAL",
"LOCALTIME", "LOCALTIMESTAMP", "LOCATOR", "LOOP", "LOWER", "MAP",
"MATCH", "MAX", "MEMBER", "MERGE", "METHOD", "MIN", "MINUTE",
"MODIFIES", "MODULE", "MONTH", "MULTISET", "NAMES", "NATIONAL",
"NATURAL", "NCHAR", "NCLOB", "NEW", "NEXT", "NO", "NONE", "NOT",
"NULL", "NULLIF", "NUMBER", "NUMERIC", "OBJECT", "OCTET_LENGTH",
"OF", "OLD", "ON", "ONLY", "OPEN", "OPTION", "OR", "ORDER",
"ORDINALITY", "OUT", "OUTER", "OUTPUT", "OVER", "OVERLAPS", "PAD",
"PARAMETER", "PARTIAL", "PARTITION", "PATH", "POSITION",
"PRECISION", "PREPARE", "PRESERVE", "PRIMARY", "PRIOR",
"PRIVILEGES", "PROCEDURE", "PUBLIC", "RANGE", "READ", "READS",
"REAL", "RECURSIVE", "REF", "REFERENCES", "REFERENCING",
"RELATIVE", "RELEASE", "REPEAT", "RESIGNAL", "RESTRICT", "RESULT",
"RETURN", "RETURNS", "REVOKE", "RIGHT", "ROLE", "ROLLBACK",
"ROLLUP", "ROUTINE", "ROW", "ROWS", "SAVEPOINT", "SCHEMA", "SCOPE",
"SCROLL", "SEARCH", "SECOND", "SECTION", "SELECT", "SENSITIVE",
"SESSION", "SESSION_USER", "SET", "SETS", "SIGNAL", "SIMILAR",
"SIZE", "SMALLINT", "SOME", "SPACE", "SPECIFIC", "SPECIFICTYPE",
"SQL", "SQLCODE", "SQLERROR", "SQLEXCEPTION", "SQLSTATE",
"SQLWARNING", "START", "STATE", "STATIC", "SUBMULTISET",
"SUBSTRING", "SUM", "SYMMETRIC", "SYSTEM", "SYSTEM_USER", "TABLE",
"TABLESAMPLE", "TEMPORARY", "THEN", "TIME", "TIMESTAMP",
"TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TO", "TRAILING",
"TRANSACTION", "TRANSLATE", "TRANSLATION", "TREAT", "TRIGGER",
"TRIM", "TRUE", "UNDER", "UNDO", "UNION", "UNIQUE", "UNKNOWN",
"UNNEST", "UNTIL", "UPDATE", "UPPER", "USAGE", "USER", "USING",
"VALUE", "VALUES", "VARCHAR", "VARYING", "VIEW", "WHEN",
"WHENEVER", "WHERE", "WHILE", "WINDOW", "WITH", "WITHIN",
"WITHOUT", "WORK", "WRITE", "YEAR", "ZONE" };
/**
* Represents an unmodifiable set of lowercase reserved words in Java.
*/
public static final Set<String> RESERVED_JAVA_KEYWORDS = arrayToSet(JAVA_KEYWORDS);
/**
* Represents an unmodifiable set of lowercase reserved words in SQL.
*/
public static final Set<String> RESERVED_SQL_KEYWORDS = arrayToSet(SQL_KEYWORDS);
public static void verifyReservedJavaKeywordsNotPresent(
final JavaSymbolName javaSymbolName) {
Validate.notNull(javaSymbolName, "Java symbol required");
if (RESERVED_JAVA_KEYWORDS.contains(javaSymbolName.getSymbolName())) {
throw new IllegalStateException("Reserved Java keyword '"
+ javaSymbolName.getSymbolName()
+ "' is not permitted as symbol name");
}
}
public static void verifyReservedJavaKeywordsNotPresent(
final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
for (final String s : javaType.getFullyQualifiedTypeName().split("\\.")) {
if (RESERVED_JAVA_KEYWORDS.contains(s)) {
throw new IllegalStateException("Reserved Java keyword '" + s
+ "' is not permitted within fully qualified type name");
}
}
}
public static void verifyReservedJavaKeywordsNotPresent(final String string) {
Validate.notNull(string, "String required");
if (RESERVED_JAVA_KEYWORDS.contains(string.toLowerCase())) {
throw new IllegalStateException("Reserved Java keyword '"
+ string.toLowerCase() + "' is not permitted");
}
}
public static void verifyReservedSqlKeywordsNotPresent(
final JavaSymbolName javaSymbolName) {
Validate.notNull(javaSymbolName, "Java symbol required");
if (RESERVED_SQL_KEYWORDS.contains(javaSymbolName.getSymbolName()
.toLowerCase())) {
throw new IllegalStateException("Reserved SQL keyword '"
+ javaSymbolName.getSymbolName()
+ "' is not permitted as symbol name");
}
}
public static void verifyReservedSqlKeywordsNotPresent(
final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
if (RESERVED_SQL_KEYWORDS.contains(javaType.getSimpleTypeName()
.toLowerCase())) {
throw new IllegalStateException("Reserved SQL keyword '"
+ javaType.getSimpleTypeName()
+ "' is not permitted as simple type name");
}
}
public static void verifyReservedSqlKeywordsNotPresent(final String string) {
Validate.notNull(string, "String required");
if (RESERVED_JAVA_KEYWORDS.contains(string.toLowerCase())) {
throw new IllegalStateException("Reserved SQL keyword '"
+ string.toLowerCase() + "' is not permitted");
}
}
public static void verifyReservedWordsNotPresent(
final JavaSymbolName javaSymbolName) {
verifyReservedJavaKeywordsNotPresent(javaSymbolName);
verifyReservedSqlKeywordsNotPresent(javaSymbolName);
}
public static void verifyReservedWordsNotPresent(final JavaType javaType) {
verifyReservedJavaKeywordsNotPresent(javaType);
verifyReservedSqlKeywordsNotPresent(javaType);
}
public static void verifyReservedWordsNotPresent(final String string) {
verifyReservedJavaKeywordsNotPresent(string);
verifyReservedSqlKeywordsNotPresent(string);
}
private static Set<String> arrayToSet(String... tokens) {
SortedSet<String> setOfTokens = new TreeSet<String>();
for (String token : tokens) {
if (StringUtils.isNotBlank(token)) {
setOfTokens.add(token.toLowerCase());
}
}
return Collections.unmodifiableSet(setOfTokens);
}
/**
* Constructor is private to prevent instantiation
*/
private ReservedWords() {
}
}