blob: 3931c3d619eb8831ca72314b625b920d4143f4b9 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.entity.model;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.entity.Delegator;
import org.apache.ofbiz.entity.GenericEntityException;
/**
* Generic Entity - Entity Definition Checker
*
*/
public class ModelEntityChecker {
public static final String module = ModelEntityChecker.class.getName();
public static void checkEntities(Delegator delegator, List<String> warningList) throws GenericEntityException {
ModelReader reader = delegator.getModelReader();
Set<String> reservedWords = new HashSet<String>();
if (Debug.infoOn()) {
Debug.logInfo("[initReservedWords] array length = " + rwArray.length, module);
}
for (int i = 0; i < rwArray.length; i++) {
reservedWords.add(rwArray[i]);
}
Map<String, Set<String>> packages = new HashMap<String, Set<String>>();
Set<String> packageNames = new TreeSet<String>();
Set<String> tableNames = new HashSet<String>();
//put the entityNames TreeSets in a HashMap by packageName
Collection<String> ec = reader.getEntityNames();
Set<String> entityNames = new HashSet<String>(ec);
for (String eName: ec) {
ModelEntity ent = reader.getModelEntity(eName);
//make sure the table name is in the list of all table names, if
// not null
if (UtilValidate.isNotEmpty(ent.getPlainTableName()))
tableNames.add(ent.getPlainTableName());
Set<String> entities = packages.get(ent.getPackageName());
if (entities == null) {
entities = new TreeSet<String>();
packages.put(ent.getPackageName(), entities);
packageNames.add(ent.getPackageName());
}
entities.add(eName);
}
Set<String> fkNames = new HashSet<String>();
Set<String> indexNames = new HashSet<String>();
for (String pName: packageNames) {
Set<String> entities = packages.get(pName);
for (String entityName: entities) {
String helperName = delegator.getEntityHelperName(entityName);
String groupName = delegator.getEntityGroupName(entityName);
ModelEntity entity = reader.getModelEntity(entityName);
if (helperName == null) {
//only show group name warning if helper name not found
if (UtilValidate.isEmpty(groupName)) {
warningList.add("[GroupNotFound] No Group Name found for entity " + entity.getEntityName() + ".");
} else {
warningList.add("[HelperNotFound] No Helper (DataSource) definition found for entity [" + entity.getEntityName() + "] because there is no helper (datasource) configured for the entity group it is in: [" + groupName + "]");
}
}
if (entity.getPlainTableName() != null && entity.getPlainTableName().length() > 30) {
warningList.add("[TableNameGT30] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName() + " is longer than 30 characters.");
}
if (entity.getPlainTableName() != null && reservedWords.contains(entity.getPlainTableName().toUpperCase())) {
warningList.add("[TableNameRW] Table name [" + entity.getPlainTableName() + "] of entity " + entity.getEntityName() + " is a reserved word.");
}
// don't check columns/relations/keys when never-check is set to "true"
if (entity.getNeverCheck()) {
continue;
}
Set<String> ufields = new HashSet<String>();
Iterator<ModelField> fieldIter = entity.getFieldsIterator();
while (fieldIter.hasNext()) {
ModelField field = fieldIter.next();
ModelFieldType type = delegator.getEntityFieldType(entity,field.getType());
if (ufields.contains(field.getName())) {
warningList.add("[FieldNotUnique] Field [" + field.getName() + " of entity " + entity.getEntityName() + " is not unique for that entity.");
} else {
ufields.add(field.getName());
}
if (field.getColName().length() > 30 && !(entity instanceof ModelViewEntity)) {
warningList.add("[FieldNameGT30] Column name [" + field.getColName() + "] of entity " + entity.getEntityName() + " is longer than 30 characters.");
}
if (field.getColName().length() == 0) {
warningList.add("[FieldNameEQ0] Column name for field name \"" + field.getName() + "\" of entity " + entity.getEntityName() + " is empty (zero length).");
}
if (reservedWords.contains(field.getColName().toUpperCase()))
warningList.add("[FieldNameRW] Column name " + field.getColName() + " of entity " + entity.getEntityName() + " is a reserved word.");
if (type == null) {
StringBuilder warningMsg = new StringBuilder();
warningMsg.append("[FieldTypeNotFound] Field type " + field.getType() + " of entity " + entity.getEntityName() + " not found in field type definitions");
if (helperName == null) {
warningMsg.append(" (no helper definition found)");
}
warningMsg.append(".");
warningList.add(warningMsg.toString());
}
}
if (entity.getRelationsSize() > 0) {
Iterator<ModelIndex> indexIter = entity.getIndexesIterator();
while (indexIter.hasNext()) {
ModelIndex index = indexIter.next();
if (indexNames.contains(index.getName())) {
warningList.add("[IndexDuplicateName] Index on entity "
+ entity.getEntityName() + " has a duplicate index-name \""
+ index.getName() + "\".");
} else {
indexNames.add(index.getName());
}
if (tableNames.contains(index.getName())) {
warningList.add("[IndexTableDupName] Index on entity "
+ entity.getEntityName() + " has an index-name \""
+ index.getName() + "\" that is also being used as a table name.");
}
if (fkNames.contains(index.getName())) {
warningList.add("[IndexFKDupName] Index on entity "
+ entity.getEntityName()
+ " has an index-name \""
+ index.getName()
+ "\" that is also being used as a Foreign Key name.");
}
// make sure all names are <= 18 characters
if (index.getName().length() > 18) {
warningList.add("[IndexNameGT18] The index name " + index.getName() + " (length:" + index.getName().length()
+ ") was greater than 18 characters in length for entity " + entity.getEntityName() + ".");
}
}
Set<String> relations = new HashSet<String>();
for (int r = 0; r < entity.getRelationsSize(); r++) {
ModelRelation relation = entity.getRelation(r);
if (!entityNames.contains(relation.getRelEntityName())) {
warningList.add("[RelatedEntityNotFound] Related entity " + relation.getRelEntityName()
+ " of entity " + entity.getEntityName() + " not found.");
}
if (relations.contains(relation.getTitle() + relation.getRelEntityName())) {
warningList.add("[RelationNameNotUnique] Relation " + relation.getTitle() + relation.getRelEntityName()
+ " of entity "+ entity.getEntityName() + " is not unique for that entity.");
} else {
relations.add(relation.getTitle() + relation.getRelEntityName());
}
if (relation.getFkName().length() > 0) {
if (fkNames.contains(relation.getFkName())) {
warningList.add("[RelationFkDuplicate] Relation to "+ relation.getRelEntityName()
+ " from entity " + entity.getEntityName() + " has a duplicate fk-name \""
+ relation.getFkName() + "\".");
} else {
fkNames.add(relation.getFkName());
}
if (tableNames.contains(relation.getFkName())) {
warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity "
+ entity.getEntityName() + " has an fk-name \""
+ relation.getFkName() + "\" that is also being used as a table name.");
}
if (indexNames.contains(relation.getFkName())) {
warningList.add("[RelationFkTableDup] Relation to " + relation.getRelEntityName() + " from entity "
+ entity.getEntityName() + " has an fk-name \""
+ relation.getFkName() + "\" that is also being used as an index name.");
}
}
// make sure all FK names are <= 18 characters
if (relation.getFkName().length() > 18) {
warningList.add("[RelFKNameGT18] The foreign key named " + relation.getFkName()
+ " (length:" + relation.getFkName().length()
+ ") was greater than 18 characters in length for relation " + relation.getTitle() + relation.getRelEntityName()
+ " of entity " + entity.getEntityName() + ".");
}
ModelEntity relatedEntity = null;
try {
relatedEntity = reader.getModelEntity(relation.getRelEntityName());
} catch (GenericEntityException e) {
Debug.logInfo("Entity referred to in relation is not defined: " + relation.getRelEntityName(), module);
}
if (relatedEntity != null) {
//if relation is of type one, make sure keyMaps
// match the PK of the relatedEntity
if ("one".equals(relation.getType()) || "one-nofk".equals(relation.getType())) {
if (relatedEntity.getPksSize() != relation.getKeyMaps().size())
warningList.add("[RelatedOneKeyMapsWrongSize] The number of primary keys (" + relatedEntity.getPksSize()
+ ") of related entity " + relation.getRelEntityName()
+ " does not match the number of keymaps (" + relation.getKeyMaps().size()
+ ") for relation of type one \"" + relation.getTitle() + relation.getRelEntityName()
+ "\" of entity " + entity.getEntityName() + ".");
Iterator<ModelField> pksIter = relatedEntity.getPksIterator();
while (pksIter.hasNext()) {
ModelField pk = pksIter.next();
if (relation.findKeyMapByRelated(pk.getName()) == null) {
warningList.add("[RelationOneRelatedPrimaryKeyMissing] The primary key \"" + pk.getName()
+ "\" of related entity " + relation.getRelEntityName()
+ " is missing in the keymaps for relation of type one " + relation.getTitle() + relation.getRelEntityName()
+ " of entity " + entity.getEntityName() + ".");
}
}
}
}
//make sure all keyMap 'fieldName's match fields of
// this entity
//make sure all keyMap 'relFieldName's match fields of
// the relatedEntity
for (ModelKeyMap keyMap : relation.getKeyMaps()) {
ModelField field = entity.getField(keyMap.getFieldName());
ModelField rfield = null;
if (relatedEntity != null) {
rfield = relatedEntity.getField(keyMap.getRelFieldName());
}
if (rfield == null) {
warningList.add("[RelationRelatedFieldNotFound] The field \"" + keyMap.getRelFieldName()
+ "\" of related entity " + relation.getRelEntityName()
+ " was specified in the keymaps but is not found for relation " + relation.getTitle() + relation.getRelEntityName()
+ " of entity " + entity.getEntityName() + ".");
}
if (field == null) {
warningList.add("[RelationFieldNotFound] The field " + keyMap.getFieldName()
+ " was specified in the keymaps but is not found for relation " + relation.getTitle() + relation.getRelEntityName()
+ " of entity " + entity.getEntityName() + ".");
}
if (field != null && rfield != null) {
//this was the old check, now more constrained
// to keep things cleaner:
// if (!field.getType().equals(rfield.getType())
// &&
// !field.getType().startsWith(rfield.getType())
// &&
// !rfield.getType().startsWith(field.getType()))
// {
if (!field.getType().equals(rfield.getType()) && !field.getType().equals(rfield.getType() + "-ne") && !rfield.getType().equals(field.getType() + "-ne")) {
warningList.add("[RelationFieldTypesDifferent] The field type ("+ field.getType()
+ ") of " + field.getName() + " of entity " + entity.getEntityName()
+ " is not the same as field type (" + rfield.getType() + ") of "
+ rfield.getName() + " of entity " + relation.getRelEntityName() + " for relation "
+ relation.getTitle() + relation.getRelEntityName() + ".");
}
}
}
}
}
}
}
}
public static final String[] rwArray = { "ABORT", "ABS", "ABSOLUTE",
"ACCEPT", "ACCES", "ACCESS", "ACS", "ACTION", "ACTIVATE", "ADD", "ADDFORM",
"ADMIN", "AFTER", "AGGREGATE", "ALIAS", "ALL", "ALLOCATE", "ALTER",
"ANALYZE", "AND", "ANDFILENAME", "ANY", "ANYFINISH", "APPEND",
"ARCHIVE", "ARE", "ARRAY", "AS", "ASC", "ASCENDING", "ASCII",
"ASSERT", "ASSERTION", "ASSIGN", "AT", "ATTRIBUTE", "ATTRIBUTES",
"AUDIT", "AUTHID", "AUTHORIZATION", "AUTONEXT", "AUTO_INCREMENT",
"AVERAGE", "AVG", "AVGU", "AVG_ROW_LENGTH",
"BACKOUT", "BACKUP", "BEFORE", "BEGIN", "BEGINLOAD", "BEGINMODIFY",
"BEGINNING", "BEGWORK", "BETWEEN", "BETWEENBY", "BINARY",
"BINARY_INTEGER", "BIT", "BIT_LENGTH", "BLOB", "BODY", "BOOLEAN",
"BORDER", "BOTH", "BOTTOM", "BREADTH", "BREAK", "BREAKDISPLAY",
"BROWSE", "BUFERED", "BUFFER", "BUFFERED", "BULK", "BY", "BYTE",
"CALL", "CANCEL", "CASCADE", "CASCADED", "CASE", "CAST", "CATALOG",
"CHANGE", "CHAR", "CHAR_LENGTH", "CHAR_BASE", "CHARACTER",
"CHARACTER_LENGTH", "CHAR_CONVERT", "CHECK", "CHECKPOINT",
"CHECKSUM", "CHR2FL", "CHR2FLO", "CHR2FLOA", "CHR2FLOAT",
"CHR2INT", "CLASS", "CLEAR", "CLEARROW", "CLIPPED", "CLOB",
"CLOSE", "CLUSTER", "CLUSTERED", "CLUSTERING", "COALESCE", "COBOL",
"COLD", "COLLATE", "COLLATION", "COLLECT", "COLUMN", "COLUMNS",
"COMMAND", "COMMENT", "COMMIT", "COMMITTED", "COMPLETION",
"COMPRESS", "COMPUTE", "CONCAT", "COND", "CONDITION", "CONFIG",
"CONFIRM", "CONNECT", "CONNECTION", "CONSTANT", "CONSTRAINT",
"CONSTRAINTS", "CONSTRUCT", "CONSTRUCTOR", "CONTAIN", "CONTAINS",
"CONTAINSTABLE", "CONTINUE", "CONTROLROW", "CONVERT", "COPY",
"CORRESPONDING", "COUNT", "COUNTU", "COUNTUCREATE", "CRASH",
"CREATE", "CROSS", "CUBE", "CURRENT", "CURRENT_DATE",
"CURRENT_PATH", "CURRENT_ROLE", "CURRENT_SESSION", "CURRENT_TIME",
"CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "CURVAL", "CYCLE",
"DATA", "DATALINK", "DATABASE", "DATABASES", "DATAPAGES",
"DATA_PGS", "DATE", "DATETIME", "DAY", "DAY_HOUR", "DAY_MINUTE",
"DAY_SECOND", "DAYNUM", "DAYOFMONTH", "DAYOFWEEK", "DAYOFYEAR",
"DBA", "DBCC", "DBE", "DBEFILE", "DBEFILEO", "DBEFILESET",
"DBSPACE", "DBYTE", "DEALLOCATE", "DEC", "DECENDING", "DECIMAL",
"DECLARE", "DEFAULT", "DEFAULTS", "DEFER", "DEFERRABLE", "DEFINE",
"DEFINITION", "DELAY_KEY_WRITE", "DELAYED", "DELETE", "DELETEROW",
"DENY", "DEPTH", "DEREF", "DESC", "DESCENDING", "DESCENDNG",
"DESCRIBE", "DESCRIPTOR", "DESTPOS", "DESTROY", "DEVICE",
"DEVSPACE", "DIAGNOSTICS", "DICTIONARY", "DIRECT", "DIRTY",
"DISCONNECT", "DISK", "DISPLACE", "DISPLAY", "DISTINCT",
"DISTINCTROW", "DISTRIBUTED", "DISTRIBUTION", "DIV", "DO", "DOES",
"DOMAIN", "DOUBLE", "DOWN", "DROP", "DUAL", "DUMMY", "DUMP",
"DUPLICATES",
"EACH", "EBCDIC", "EDITADD", "EDITUPDATE", "ED_STRING", "ELSE",
"ELSEIF", "ELSIF", "ENCLOSED", "END", "ENDDATA", "ENDDISPLAY",
"ENDFORMS", "ENDIF", "ENDING", "ENDLOAD", "ENDLOOP", "ENDMODIFY",
"ENDPOS", "ENDRETRIEVE", "ENDSELECT", "ENDWHILE", "END_ERROR",
"END_EXEC", "END_FETCH", "END_FOR", "END_GET", "END_MODIFY",
"END_PLACE", "END_SEGMENT_S", "END_SEGMENT_STRING", "END_STORE",
"END_STREAM", "ENUM", "EQ", "EQUALS", "ERASE", "ERROR", "ERRLVL",
"ERROREXIT", "ESCAPE", "ESCAPED", "EVALUATE", "EVALUATING",
"EVERY", "EXCEPT", "EXCEPTION", "EXCLUSIVE", "EXEC", "EXECUTE",
"EXISTS", "EXIT", "EXPAND", "EXPANDING", "EXPLAIN", "EXPLICIT",
"EXTEND", "EXTENDS", "EXTENT", "EXTERNAL", "EXTRACT",
"FALSE", "FETCH", "FIELD", "FIELDS", "FILE", "FILENAME",
"FILLFACTOR", "FINALISE", "FINALIZE", "FINDSTR", "FINISH", "FIRST",
"FIRSTPOS", "FIXED", "FL", "FLOAT", "FLOAT4", "FLOAT8", "FLUSH",
"FOR", "FORALL", "FOREACH", "FOREIGN", "FORMAT", "FORMDATA",
"FORMINIT", "FORMS", "FORTRAN", "FOUND", "FRANT", "FRAPHIC",
"FREE", "FREETEXT", "FREETEXTTABLE", "FROM", "FRS", "FULL",
"FUNCTION",
"GE", "GENERAL", "GET", "GETFORM", "GETOPER", "GETROW", "GLOBAL",
"GLOBALS", "GO", "GOTO", "GRANT", "GRANTS", "GRAPHIC", "GROUP",
"GROUPING", "GT",
"HANDLER", "HASH", "HAVING", "HEAP", "HEADER", "HELP", "HELPFILE",
"HELP_FRS", "HIGH_PRIORITY", "HOLD", "HOLDLOCK", "HOSTS", "HOUR",
"HOUR_MINUTE", "HOUR_SECOND",
"IDENTIFIED", "IDENTIFIELD", "IDENTITY", "IDENTITY_INSERT", "IF",
"IFDEF", "IGNORE", "IMAGE", "IMMEDIATE", "IMMIDIATE", "IMPLICIT",
"IN", "INCLUDE", "INCREMENT", "INDEX", "INDEXED", "INDEXNAME",
"INDEXPAGES", "INDICATOR", "INFIELD", "INFILE", "INFO", "INGRES",
"INIT", "INITIAL", "INITIALISE", "INITIALIZE", "INITIALLY",
"INITTABLE", "INNER", "INOUT", "INPUT", "INQUIRE_EQUEL",
"INQUIRE_FRS", "INQUIRE_INGRES", "INQUIR_FRS", "INSERT",
"INSERT_ID", "INSERTROW", "INSTRUCTIONS", "INT", "INT1", "INT2CHR",
"INT2", "INT3", "INT4", "INT8", "INTEGER", "INTEGRITY",
"INTERESECT", "INTERFACE", "INTERRUPT", "INTERSECT", "INTERVAL",
"INTO", "INTSCHR", "INVOKE", "IS", "ISAM", "ISOLATION", "ITERATE",
"JAVA", "JOIN", "JOURNALING",
"KEY", "KEYS", "KILL",
"LABEL", "LANGUAGE", "LARGE", "LAST", "LAST_INSERT_ID", "LASTPOS",
"LATERAL", "LE", "LEADING", "LEAVE", "LEFT", "LENGTH", "LENSTR",
"LESS", "LET", "LEVEL", "LIKE", "LIKEPROCEDURETP", "LIMIT",
"LIMITED", "LINE", "LINENO", "LINES", "LINK", "LIST", "LISTEN",
"LOAD", "LOADTABLE", "LOADTABLERESUME", "LOCAL", "LOCALTIME",
"LOCALTIMESTAMP", "LOCATION", "LOCATOR", "LOCK", "LOCKING", "LOG",
"LOGS", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY",
"LOWER", "LPAD", "LT",
"MAIN", "MANUITEM", "MARGIN", "MATCH", "MATCHES", "MATCHING",
"MAX", "MAX_ROWS", "MAXEXTENTS", "MAXPUBLICUNION", "MAXRECLEN",
"MDY", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MEETS", "MENU",
"MENUITEM", "MENUITEMSCREEN", "MESSAGE", "MESSAGERELOCATE",
"MESSAGESCROLL", "MFETCH", "MIDDLEINT", "MIN", "MIN_ROWS",
"MINRECLEN", "MINRETURNUNTIL", "MINUS", "MINUTE", "MINUTE_SECOND",
"MIRROREXIT", "MISLABEL", "MISSING", "MIXED", "MOD", "MODE",
"MODIFIES", "MODIFY", "MODIFYREVOKEUPDATE", "MODULE", "MONEY",
"MONITOR", "MONTH", "MONTHNAME", "MOVE", "MULTI", "MYISAM",
"NAME", "NAMES", "NATIONAL", "NATURAL", "NATURALN", "NCHAR",
"NCLOB", "NE", "NEED", "NEW", "NEWLOG", "NEXT", "NEXTSCROLLDOWN",
"NEXTVAL", "NO", "NOAUDIT", "NOCHECK", "NOCOMPRESS", "NOCOPY",
"NOCR", "NOJOURNALING", "NOLIST", "NOLOG", "NONCLUSTERED", "NONE",
"NORMAL", "NORMALIZE", "NOSYSSORT", "NOT", "NOTFFOUND", "NOTFOUND",
"NOTIFY", "NOTRANS", "NOTRIM", "NOTRIMSCROLLUP", "NOTROLLBACKUSER",
"NOWAIT", "NULL", "NULLIF", "NULLIFY", "NULLSAVEUSING", "NULLVAL",
"NUMBER", "NUMBER_BASE", "NUMERIC", "NXFIELD",
"OBJECT", "OCIROWID", "OCTET_LENGTH", "OF", "OFF", "OFFLINE",
"OFFSET", "OFFSETS", "OFSAVEPOINTVALUES", "OLD", "ON", "ONCE",
"ONLINE", "ONLY", "ONSELECTWHERE", "ONTO", "OPAQUE", "OPEN",
"OPENDATASOURCE", "OPENQUERY", "OPENROWSET", "OPENXML",
"OPENSETWHILE", "OPENSLEEP", "OPERATION", "OPERATOR", "OPTIMIZE",
"OPTION", "OPTIONALLY", "OPTIONS", "OR", "ORDER", "ORDERSQLWORK",
"ORDINALITY", "ORGANIZATION", "ORSOMEWITH", "ORSORT", "OTHERS",
"OTHERWISE", "OUT", "OUTER", "OUTFILE", "OUTPUT", "OUTPUT_PAGE",
"OUTSTOP", "OVER", "OVERLAPS", "OWNER", "OWNERSHIP",
"PACK_KEYS", "PACKAGE", "PAD", "PAGE", "PAGENO", "PAGES", "PARAM",
"PARAMETER", "PARAMETERS", "PARTIAL", "PARTITION", "PASCAL",
"PASSWORD", "PATH", "PATHNAME", "PATTERN", "PAUSE", "PCTFREE",
"PERCENT", "PERIOD", "PERM", "PERMANENT", "PERMIT", "PERMITSUM",
"PIPE", "PLACE", "PLAN", "PLI", "PLS_INTEGER", "POS", "POSITION",
"POSITIVE", "POSITIVEN", "POSTFIX", "POWER", "PRAGMA", "PRECEDES",
"PRECISION", "PREFIX", "PREORDER", "PREPARE", "PREPARETABLE",
"PRESERVE", "PREV", "PREVIOUS", "PREVISION", "PRIMARY", "PRINT",
"PRINTER", "PRINTSCREEN", "PRINTSCREENSCROLL", "PRINTSUBMENU",
"PRINTSUMU", "PRIOR", "PRIV", "PRIVATE", "PRIVILAGES",
"PRIVILAGESTHEN", "PRIVILEGES", "PROC", "PROCEDURE", "PROCESS",
"PROCESSEXIT", "PROCESSLIST", "PROGRAM", "PROGUSAGE", "PROMPT",
"PROMPTSCROLLDOWN", "PROMPTTABLEDATA", "PROTECT", "PSECT",
"PUBLIC", "PUBLICREAD", "PUT", "PUTFORM", "PUTFORMSCROLLUP",
"PUTFORMUNLOADTABLE", "PUTOPER", "PUTOPERSLEEP", "PUTROW",
"PUTROWSUBMENU", "PUTROWUP",
"QUERY", "QUICK", "QUIT",
"RAISERROR", "RANGE", "RANGETO", "RAW", "RDB$DB_KEY", "RDB$LENGTH",
"RDB$MISSING", "RDB$VALUE", "RDB4DB_KEY", "RDB4LENGTH",
"RDB4MISSING", "RDB4VALUE", "READ", "READS", "READONLY",
"READPASS", "READTEXT", "READWRITE", "READY", "READ_ONLY",
"READ_WRITE", "REAL", "RECONFIGURE", "RECONNECT", "RECORD",
"RECOVER", "RECURSIVE", "REDISPLAY", "REDISPLAYTABLEDATA",
"REDISPLAYVALIDATE", "REDO", "REDUCED", "REF", "REFERENCES",
"REFERENCING", "REGEXP", "REGISTER", "REGISTERUNLOADDATA",
"REGISTERVALIDROW", "REJECT", "RELATIVE", "RELEASE", "RELOAD",
"RELOCATE", "RELOCATEUNIQUE", "REMOVE", "REMOVEUPRELOCATEV",
"REMOVEVALIDATE", "REMOVEWHENEVER", "RENAME", "REPEAT",
"REPEATABLE", "REPEATED", "REPEATVALIDROW", "REPLACE",
"REPLACEUNTIL", "REPLICATION", "REPLSTR", "REPORT",
"REQUEST_HANDLE", "RESERVED_PGS", "RESERVING", "RESET", "RESIGNAL",
"RESOURCE", "REST", "RESTART", "RESTORE", "RESTRICT", "RESULT",
"RESUME", "RETRIEVE", "RETRIEVEUPDATE", "RETURN", "RETURNS",
"RETURNING", "REVERSE", "REVOKE", "RIGHT", "RLIKE", "ROLE",
"ROLLBACK", "ROLLFORWARD", "ROLLBACK", "ROLLUP", "ROUND",
"ROUTINE", "ROW", "ROWCNT", "ROWCOUNT", "ROWGUID_COL", "ROWID",
"ROWLABEL", "ROWNUM", "ROWS", "ROWTYPE", "RPAD", "RULE", "RUN",
"RUNTIME",
"SAMPLSTDEV", "SAVE", "SAVEPOINT", "SAVEPOINTWHERE", "SAVEVIEW",
"SCHEMA", "SCOPE", "SCREEN", "SCROLL", "SCROLLDOWN", "SCROLLUP",
"SEARCH", "SECOND", "SECTION", "SEGMENT", "SEL", "SELE", "SELEC",
"SELECT", "SELUPD", "SEPERATE", "SEQUENCE", "SERIAL", "SESSION",
"SESSION_USER", "SET", "SETOF", "SETS", "SETWITH", "SET_EQUEL",
"SET_FRS", "SET_INGRES", "SETUSER", "SHARE", "SHARED", "SHORT",
"SHOW", "SHUTDOWN", "SIGNAL", "SIZE", "SKIP", "SLEEP",
"SMALLFLOAT", "SMALLINT", "SOME", "SONAME", "SORT", "SORTERD",
"SOUNDS", "SOURCEPOS", "SPACE", "SPACES", "SPECIFIC",
"SPECIFICTYPE", "SQL", "SQL_BIG_RESULT", "SQL_BIG_SELECTS",
"SQL_BIG_TABLES", "SQL_LOG_OFF", "SQL_LOG_UPDATE",
"SQL_LOW_PRIORITY_UPDATES", "SQL_SELECT_LIMIT", "SQL_SMALL_RESULT",
"SQL_WARNINGS", "SQLCODE", "SQLDA", "SQLERRM", "SQLERROR",
"SQLEXCEPTION", "SQLEXEPTION", "SQLEXPLAIN", "SQLNOTFOUND",
"SQLSTATE", "SQLWARNING", "SQRT", "STABILITY", "START", "STARTING",
"STARTPOS", "START_SEGMENT", "START_SEGMENTED_?", "START_STREAM",
"START_TRANSACTION", "STATE", "STATIC", "STATISTICS", "STATUS",
"STDDEV", "STDEV", "STEP", "STOP", "STORE", "STRAIGHT_JOIN",
"STRING", "STRUCTURE", "SUBMENU", "SUBSTR", "SUBSTRING", "SUBTYPE",
"SUCCEEDS", "SUCCESFULL", "SUCCESSFULL", "SUCCESSFUL", "SUM", "SUMU", "SUPERDBA",
"SYB_TERMINATE", "SYNONYM", "SYSDATE", "SYSSORT", "SYSTEM_USER",
"TABLE", "TABLEDATA", "TABLES", "TEMP", "TEMPORARY", "TERMINATE",
"TERMINATED", "TEXT", "TEXTSIZE", "THAN", "THEN", "THROUGH",
"THRU", "TID", "TIME", "TIMESTAMP", "TIMEZONE_HOUR",
"TIMEZONE_MINUTE", "TINYBLOB", "TINYINT", "TINYTEXT", "TO",
"TODAY", "TOLOWER", "TOP", "TOTAL", "TOUPPER", "TP", "TRAILER",
"TRAILING", "TRAN", "TRANS", "TRANSACTION", "TRANSACTION_HANDLE",
"TRANSFER", "TRANSLATE", "TRANSLATION", "TREAT", "TRIGGER",
"TRING", "TRUE", "TRUNC", "TRUNCATE", "TSEQUAL", "TYPE",
"UID", "UNBUFFERED", "UNDER", "UNDO", "UNION", "UNIQUE", "UNKNOWN",
"UNLISTEN", "UNLOAD", "UNLOADDATA", "UNLOADTABLE", "UNLOCK",
"UNTIL", "UP", "UPDATE", "UPDATETEXT", "UPPER", "USAGE", "USE",
"USED_PGS", "USER", "USING", "UTC_TIME",
"VACUUM", "VALIDATE", "VALIDROW", "VALUE", "VALUES", "VARBINARY",
"VARC", "VARCH", "VARCHA", "VARCHAR", "VARGRAPHIC", "VARIABLE",
"VARIABLES", "VARIANCE", "VARYING", "VERB_TIME", "VERBOSE",
"VERIFY", "VERSION", "VIEW",
"WAIT", "WAITFOR", "WAITING", "WARNING", "WEEKDAY", "WHEN",
"WHENEVER", "WHERE", "WHILE", "WINDOW", "WITH", "WITHOUT", "WORK",
"WRAP", "WRITE", "WRITEPASS", "WRITETEXT",
"YEAR", "YEARS",
"ZEROFILL", "ZONE" };
private ModelEntityChecker() {}
}