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() {}
}