Java tutorial
/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.boot.model.naming; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.internal.util.StringHelper; /** * Provides centralized normalization of how database object names are handled. * * @author Steve Ebersole */ public abstract class ObjectNameNormalizer { private Database database; /** * Normalizes the quoting of identifiers. * <p/> * This implements the rules set forth in JPA 2 (section "2.13 Naming of Database Objects") which * states that the double-quote (") is the character which should be used to denote a <tt>quoted * identifier</tt>. Here, we handle recognizing that and converting it to the more elegant * bactick (`) approach used in Hibernate.. Additionally we account for applying what JPA2 terms * "globally quoted identifiers". * * @param identifierText The identifier to be quoting-normalized. * @return The identifier accounting for any quoting that need be applied. */ public Identifier normalizeIdentifierQuoting(String identifierText) { return database().toIdentifier(identifierText); } protected Database database() { if (database == null) { database = getBuildingContext().getMetadataCollector().getDatabase(); } return database; } public Identifier normalizeIdentifierQuoting(Identifier identifier) { return getBuildingContext().getMetadataCollector().getDatabase().getJdbcEnvironment().getIdentifierHelper() .normalizeQuoting(identifier); } /** * Normalizes the quoting of identifiers. This form returns a String rather than an Identifier * to better work with the legacy code in {@link org.hibernate.mapping} * * @param identifierText The identifier to be quoting-normalized. * @return The identifier accounting for any quoting that need be applied. */ public String normalizeIdentifierQuotingAsString(String identifierText) { final Identifier identifier = normalizeIdentifierQuoting(identifierText); if (identifier == null) { return null; } return identifier.render(database().getDialect()); } public String toDatabaseIdentifierText(String identifierText) { return database().getDialect().quote(normalizeIdentifierQuotingAsString(identifierText)); } /** * Determine the logical name give a (potentially {@code null}/empty) explicit name. * * @param explicitName The explicit, user-supplied name * @param namingStrategyHelper The naming strategy helper. * * @return The logical name */ public Identifier determineLogicalName(String explicitName, NamingStrategyHelper namingStrategyHelper) { Identifier logicalName; if (StringHelper.isEmpty(explicitName)) { logicalName = namingStrategyHelper.determineImplicitName(getBuildingContext()); } else { logicalName = namingStrategyHelper.handleExplicitName(explicitName, getBuildingContext()); } logicalName = getBuildingContext().getMetadataCollector().getDatabase().getJdbcEnvironment() .getIdentifierHelper().normalizeQuoting(logicalName); return logicalName; } /** * Intended only for use in handling quoting requirements for {@code column-definition} * as defined by {@link javax.persistence.Column#columnDefinition()}, * {@link javax.persistence.JoinColumn#columnDefinition}, etc. This method should not * be called in any other scenario. * * @param text The specified column definition * * @return The name with global quoting applied */ public String applyGlobalQuoting(String text) { return database().getJdbcEnvironment().getIdentifierHelper().applyGlobalQuoting(text) .render(database().getDialect()); } /** * Access the contextual information related to the current process of building metadata. Here, * that typically might be needed for accessing:<ul> * <li>{@link org.hibernate.boot.model.naming.ImplicitNamingStrategy}</li> * <li>{@link org.hibernate.boot.model.naming.PhysicalNamingStrategy}</li> * <li>{@link org.hibernate.boot.model.relational.Database}</li> * </ul> * * @return The current building context */ protected abstract MetadataBuildingContext getBuildingContext(); }