/* * Copyright (C) 2012 The Android Open Source Project * * Licensed 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 com.motorola.studio.android.db.wizards.model; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS; /** * An abstraction of a database table. * */ public class Table { private String tableName = null; private final List<Field> fields = new ArrayList<Field>(); @Override public String toString() { String query = "("; //$NON-NLS-1$ String primaryKey = " , PRIMARY KEY ("; //$NON-NLS-1$ boolean hasPrimary = false; Iterator<Field> it = fields.iterator(); Field fie; while (it.hasNext()) { fie = it.next(); query += fie.getName() + " " //$NON-NLS-1$ + fie.getType() + " " //$NON-NLS-1$ + ((!(fie.getDefaultValue().equals("") || fie.isPrimary())) //$NON-NLS-1$ ? " default \'" : "") //$NON-NLS-1$ //$NON-NLS-2$ + fie.getDefaultValue() + ((!(fie.getDefaultValue().equals("") || fie.isPrimary())) ? "\' " //$NON-NLS-1$ //$NON-NLS-2$ : ""); //$NON-NLS-1$ if (fie.isPrimary()) { hasPrimary = true; primaryKey += fie.getName() + fie.getKeyBehaviourQuery() + " )"; //$NON-NLS-1$ } if (it.hasNext()) { query += " , "; //$NON-NLS-1$ } } query += (hasPrimary ? primaryKey : "") + " )"; //$NON-NLS-1$ //$NON-NLS-2$ return query; } public List<Field> getFields() { return fields; } public void setFields(List<Field> fields) { this.fields.clear(); if (fields != null) { for (Field field : fields) { this.fields.add(field); } } } /** * Add {@code field} to the table. * */ public void addField(Field field) { fields.add(field); } /** * Remove {@code field} from the table. * */ public void removeField(Field obj) { fields.remove(obj); } /** * @return If this table has some error in its fields, like unnamed columns, a string describing the error is returned. * */ public String getErrorMessage() { Iterator<Field> it = fields.iterator(); String msg = null; while (it.hasNext() && (msg == null)) { Field field = it.next(); msg = field.getErrorMessage(); if ((msg == null) && field.getName().trim().contains(" ")) //$NON-NLS-1$ { msg = CodeUtilsNLS.Table_ErrorUnamedColumns; } else if (msg == null) { Iterator<Field> iterator = fields.iterator(); while (iterator.hasNext() && (msg == null)) { Field testField = iterator.next(); if (field != testField) { if (field.getName().equalsIgnoreCase(testField.getName())) { msg = CodeUtilsNLS.Table_ErrorConflictingNames + field.getName() + ", " //$NON-NLS-2$ + testField.getName(); } else if (field.isPrimary() && testField.isPrimary()) { msg = CodeUtilsNLS.Table_ErrorMoreThanOnePrimaryKey + field.getName() + ", " + testField.getName(); //$NON-NLS-1$ } } } } } return msg; } /** * Validates the name to be different from SQLite keywords. * Reference: http://www.sqlite.org/lang_keywords.html * * @param name * The table name * @return True is a valid table name, false otherwise */ public static boolean validateName(String name) { boolean isValid = true; String[] keywords = { "ABORT", "ACTION", "ADD", "AFTER", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "ATTACH", "AUTOINCREMENT", "BEFORE", "BEGIN", "BETWEEN", "BY", "CASCADE", "CASE", "CAST", "CHECK", "COLLATE", "COLUMN", "COMMIT", "CONFLICT", "CONSTRAINT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DATABASE", "DEFAULT", "DEFERRABLE", "DEFERRED", "DELETE", "DESC", "DETACH", "DISTINCT", "DROP", "EACH", "ELSE", "END", "ESCAPE", "EXCEPT", "EXCLUSIVE", "EXISTS", "EXPLAIN", "FAIL", "FOR", "FOREIGN", "FROM", "FULL", "GLOB", "GROUP", "HAVING", "IF", "IGNORE", "IMMEDIATE", "IN", "INDEX", "INDEXED", "INITIALLY", "INNER", "INSERT", "INSTEAD", "INTERSECT", "INTO", "IS", "ISNULL", "JOIN", "KEY", "LEFT", "LIKE", "LIMIT", "MATCH", "NATURAL", "NO", "NOT", "NOTNULL", "NULL", "OF", "OFFSET", "ON", "OR", "ORDER", "OUTER", "PLAN", "PRAGMA", "PRIMARY", "QUERY", "RAISE", "REFERENCES", "REGEXP", "REINDEX", "RELEASE", "RENAME", "REPLACE", "RESTRICT", "RIGHT", "ROLLBACK", "ROW", "SAVEPOINT", "SELECT", "SET", "TABLE", "TEMP", "TEMPORARY", "THEN", "TO", "TRANSACTION", "TRIGGER", "UNION", "UNIQUE", "UPDATE", "USING", "VACUUM", "VALUES", "VIEW", "VIRTUAL", "WHEN", "WHERE" }; for (String keyword : keywords) { // Found. It is a keyword if (keyword.toLowerCase().compareTo(name.toLowerCase()) == 0) { isValid = false; } } return isValid; } /** * @return the tableName */ public String getTableName() { return tableName; } /** * @param tableName the tableName to set */ public void setTableName(String tableName) { this.tableName = tableName == null ? null : tableName.trim(); } }