diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/vendor/AbstractVendor.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/vendor/AbstractVendor.java | 304 |
1 files changed, 0 insertions, 304 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/vendor/AbstractVendor.java b/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/vendor/AbstractVendor.java deleted file mode 100644 index 62a08c232d..0000000000 --- a/jpa/plugins/org.eclipse.jpt.db/src/org/eclipse/jpt/db/internal/vendor/AbstractVendor.java +++ /dev/null @@ -1,304 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 Oracle. All rights reserved. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0, which accompanies this distribution - * and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Contributors: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.db.internal.vendor; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.eclipse.datatools.modelbase.sql.schema.Catalog; -import org.eclipse.datatools.modelbase.sql.schema.Database; -import org.eclipse.datatools.modelbase.sql.schema.Schema; -import org.eclipse.jpt.utility.internal.ArrayTools; -import org.eclipse.jpt.utility.internal.StringTools; - -/** - * Consolidate the behavior common to the typical vendors. - * - * @see UnrecognizedVendor - */ -abstract class AbstractVendor - implements Vendor -{ - AbstractVendor() { - super(); - } - - public abstract String getDTPVendorName(); - - - // ********** catalog and schema support ********** - - abstract CatalogStrategy getCatalogStrategy(); - - public boolean supportsCatalogs(Database database) { - return this.getCatalogStrategy().supportsCatalogs(database); - } - - public List<Catalog> getCatalogs(Database database) { - return this.getCatalogStrategy().getCatalogs(database); - } - - public List<Schema> getSchemas(Database database) { - try { - return this.getCatalogStrategy().getSchemas(database); - } catch (Exception ex) { - throw new RuntimeException("vendor: " + this, ex); //$NON-NLS-1$ - } - } - - /** - * Typically, the name of the default catalog is the user name. - */ - public final Iterable<String> getDefaultCatalogNames(Database database, String userName) { - if ( ! this.supportsCatalogs(database)) { - return Collections.emptyList(); - } - ArrayList<String> names = new ArrayList<String>(); - this.addDefaultCatalogNamesTo(database, userName, names); - return names; - } - - /** - * See comment at - * {@link #addDefaultSchemaNamesTo(Database, String, ArrayList)}. - */ - void addDefaultCatalogNamesTo(@SuppressWarnings("unused") Database database, String userName, ArrayList<String> names) { - names.add(this.convertIdentifierToName(userName)); - } - - /** - * Typically, the name of the default schema is the user name. - */ - public final Iterable<String> getDefaultSchemaNames(Database database, String userName) { - ArrayList<String> names = new ArrayList<String>(); - this.addDefaultSchemaNamesTo(database, userName, names); - return names; - } - - /** - * The user name passed in here was retrieved from DTP. - * DTP stores the user name that was passed to it during the connection - * to the database. As a result, this user name is an <em>identifier</em> - * not a <em>name</em>. - * If the user name were retrieved from the JDBC connection it would probably - * be a <em>name</em>. For example, you can connect to an Oracle database with the - * user name "scott", but that identifer is folded to the actual user name - * "SCOTT". DTP stores the original string "scott", while the Oracle JDBC - * driver stores the folded string "SCOTT". - */ - void addDefaultSchemaNamesTo(@SuppressWarnings("unused") Database database, String userName, ArrayList<String> names) { - names.add(this.convertIdentifierToName(userName)); - } - - - // ********** folding strategy used to convert names and identifiers ********** - - /** - * The SQL spec says a <em>regular</em> (non-delimited) identifier should be - * folded to uppercase; but some databases do otherwise (e.g. Sybase). - */ - abstract FoldingStrategy getFoldingStrategy(); - - - // ********** name -> identifier ********** - - public String convertNameToIdentifier(String name, String defaultName) { - return this.nameRequiresDelimiters(name) ? - this.delimitName(name) : - this.regularNamesMatch(name, defaultName) ? null : name; - } - - public String convertNameToIdentifier(String name) { - return this.nameRequiresDelimiters(name) ? this.delimitName(name) : name; - } - - /** - * Return whether the specified database object name must be delimited - * when used in an SQL statement. - * If the name has any "special" characters (as opposed to letters, - * digits, and other allowed characters [e.g. underscores]), it requires - * delimiters. - * If the name is mixed case and the database folds undelimited names - * (to either uppercase or lowercase), it requires delimiters. - */ - boolean nameRequiresDelimiters(String name) { - return (name.length() == 0) // an empty string must be delimited(?) - || this.nameContainsAnySpecialCharacters(name) - || this.nameIsNotFolded(name); - } - - /** - * Return whether the specified name contains any "special" characters - * that require the name to be delimited. - * Pre-condition: the specified name is not empty - */ - boolean nameContainsAnySpecialCharacters(String name) { - char[] string = name.toCharArray(); - if (this.characterIsNonRegularNameStart(string[0])) { - return true; - } - for (int i = string.length; i-- > 1; ) { // note: stop at 1 - if (this.characterIsNonRegularNamePart(string[i])) { - return true; - } - } - return false; - } - - /** - * Return whether the specified character is "non-regular" for the first - * character of a name. - * Typically, databases are more restrictive about what characters can - * be used to <em>start</em> an identifier (as opposed to the characters - * allowed for the remainder of the identifier). - */ - boolean characterIsNonRegularNameStart(char c) { - return ! this.characterIsRegularNameStart(c); - } - - /** - * Return whether the specified character is <em>regular</em> for the first - * character of a name. - * The first character of an identifier can be:<ul> - * <li>a letter - * <li>any of the extended, vendor-specific, <em>regular</em> start characters - * </ul> - */ - boolean characterIsRegularNameStart(char c) { - // all vendors allow a letter - return Character.isLetter(c) - || this.characterIsExtendedRegularNameStart(c); - } - - boolean characterIsExtendedRegularNameStart(char c) { - return arrayContains(this.getExtendedRegularNameStartCharacters(), c); - } - - /** - * Return the <em>regular</em> characters, beyond letters, for the - * first character of a name. - * Return null if there are no "extended" characters. - */ - char[] getExtendedRegularNameStartCharacters() { - return null; - } - - /** - * Return whether the specified character is "non-regular" for the second - * and subsequent characters of a name. - */ - boolean characterIsNonRegularNamePart(char c) { - return ! this.characterIsRegularNamePart(c); - } - - /** - * Return whether the specified character is <em>regular</em> for the second and - * subsequent characters of a name. - * The second and subsequent characters of a <em>regular</em> name can be:<ul> - * <li>a letter - * <li>a digit - * <li>an underscore - * <li>any of the extended, vendor-specific, <em>regular</em> start characters - * <li>any of the extended, vendor-specific, <em>regular</em> part characters - * </ul> - */ - boolean characterIsRegularNamePart(char c) { - // all vendors allow a letter or digit - return Character.isLetterOrDigit(c) || - (c == '_') || - this.characterIsExtendedRegularNameStart(c) || - this.characterIsExtendedRegularNamePart(c); - } - - boolean characterIsExtendedRegularNamePart(char c) { - return arrayContains(this.getExtendedRegularNamePartCharacters(), c); - } - - /** - * Return the <em>regular</em> characters, beyond letters and digits and the - * <em>regular</em> first characters, for the second and subsequent characters - * of an identifier. Return <code>null</code> if there are no additional characters. - */ - char[] getExtendedRegularNamePartCharacters() { - return null; - } - - /** - * Return whether the specified name is not folded to the database's - * case, requiring it to be delimited. - */ - boolean nameIsNotFolded(String name) { - return ! this.getFoldingStrategy().nameIsFolded(name); - } - - /** - * Return whether the specified <em>regular</em> names match. - */ - boolean regularNamesMatch(String name1, String name2) { - return this.regularIdentifiersAreCaseSensitive() ? - name1.equals(name2) : - name1.equalsIgnoreCase(name2); - } - - /** - * Typically, <em>regular</em> identifiers are case-insensitive. - */ - boolean regularIdentifiersAreCaseSensitive() { - return this.getFoldingStrategy().regularIdentifiersAreCaseSensitive(); - } - - /** - * Wrap the specified name in delimiters (typically double-quotes), - * converting it to an identifier. - */ - String delimitName(String name) { - return StringTools.quote(name); - } - - - // ********** identifier -> name ********** - - // not sure how to handle an empty string: - // both "" and "\"\"" are converted to "" ... - // convert "" to 'null' since empty strings must be delimited? - public String convertIdentifierToName(String identifier) { - return (identifier == null) ? - null : - this.identifierIsDelimited(identifier) ? - StringTools.undelimit(identifier) : - this.getFoldingStrategy().fold(identifier); - } - - /** - * Return whether the specified identifier is <em>delimited</em>. - * The SQL-92 spec says identifiers should be delimited by - * double-quotes; but some databases allow otherwise (e.g. Sybase). - */ - boolean identifierIsDelimited(String identifier) { - return StringTools.stringIsQuoted(identifier); - } - - - // ********** misc ********** - - @Override - public String toString() { - return this.getDTPVendorName(); - } - - /** - * static convenience method - array null check - */ - static boolean arrayContains(char[] array, char c) { - return (array != null) && ArrayTools.contains(array, c); - } - -} |