All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.engine.jdbc.env.internal.QualifiedObjectNameFormatterStandardImpl Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * 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 .
 */
package org.hibernate.engine.jdbc.env.internal;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.QualifiedName;
import org.hibernate.boot.model.relational.QualifiedSequenceName;
import org.hibernate.boot.model.relational.QualifiedTableName;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport;
import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter;

/**
 * Standard implementation of QualifiedObjectNameFormatter which uses information reported
 * by {@link java.sql.DatabaseMetaData} to render qualified names.
 *
 * @author Steve Ebersole
 */
public class QualifiedObjectNameFormatterStandardImpl implements QualifiedObjectNameFormatter {
	private final Format format;

	public QualifiedObjectNameFormatterStandardImpl(
			NameQualifierSupport nameQualifierSupport,
			String catalogSeparator,
			boolean catalogAtEnd) {
		this.format = buildFormat( nameQualifierSupport, catalogSeparator, catalogAtEnd );
	}

	private Format buildFormat(
			NameQualifierSupport nameQualifierSupport,
			String catalogSeparator,
			boolean catalogAtEnd) {
		switch ( nameQualifierSupport ) {
			case NONE: {
				return NoQualifierSupportFormat.INSTANCE;
			}
			case CATALOG: {
				return catalogAtEnd
						? new NameCatalogFormat( catalogSeparator )
						: new CatalogNameFormat( catalogSeparator );
			}
			case SCHEMA: {
				return SchemaNameFormat.INSTANCE;
			}
			default: {
				return catalogAtEnd
						? new SchemaNameCatalogFormat( catalogSeparator )
						: new CatalogSchemaNameFormat( catalogSeparator );
			}
		}
	}

	public QualifiedObjectNameFormatterStandardImpl(NameQualifierSupport nameQualifierSupport) {
		// most dbs simply do ..
		this( nameQualifierSupport, ".", false );
	}

	public QualifiedObjectNameFormatterStandardImpl(
			NameQualifierSupport nameQualifierSupport,
			DatabaseMetaData databaseMetaData) throws SQLException {
		this(
				nameQualifierSupport,
				databaseMetaData.getCatalogSeparator(),
				!databaseMetaData.isCatalogAtStart()
		);
	}

	@Override
	public String format(QualifiedTableName qualifiedTableName, Dialect dialect) {
		return format.format(
				qualifiedTableName.getCatalogName(),
				qualifiedTableName.getSchemaName(),
				qualifiedTableName.getTableName(),
				dialect
		);
	}

	private static String render(Identifier identifier, Dialect dialect) {
		if ( identifier == null ) {
			return null;
		}

		return identifier.render( dialect );
	}

	@Override
	public String format(QualifiedSequenceName qualifiedSequenceName, Dialect dialect) {
		return format.format(
				qualifiedSequenceName.getCatalogName(),
				qualifiedSequenceName.getSchemaName(),
				qualifiedSequenceName.getSequenceName(),
				dialect
		);
	}

	@Override
	public String format(QualifiedName qualifiedName, Dialect dialect) {
		return format.format(
				qualifiedName.getCatalogName(),
				qualifiedName.getSchemaName(),
				qualifiedName.getObjectName(),
				dialect
		);
	}

	private static interface Format {
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect);
	}

	private static class NoQualifierSupportFormat implements Format {
		/**
		 * Singleton access
		 */
		public static final NoQualifierSupportFormat INSTANCE = new NoQualifierSupportFormat();

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			return render( name, dialect );
		}
	}

	private static class SchemaNameCatalogFormat implements Format {
		private final String catalogSeparator;

		public SchemaNameCatalogFormat(String catalogSeparator) {
			this.catalogSeparator = catalogSeparator;
		}

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			StringBuilder buff = new StringBuilder();
			if ( schema != null ) {
				buff.append( render( schema, dialect ) ).append( '.' );
			}

			buff.append( render( name, dialect ) );

			if ( catalog != null ) {
				buff.append( catalogSeparator ).append( render( catalog, dialect ) );
			}

			return buff.toString();
		}
	}

	private static class CatalogSchemaNameFormat implements Format {
		private final String catalogSeparator;

		public CatalogSchemaNameFormat(String catalogSeparator) {
			this.catalogSeparator = catalogSeparator;
		}

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			StringBuilder buff = new StringBuilder();

			if ( catalog != null ) {
				buff.append( render( catalog, dialect ) ).append( catalogSeparator );
			}

			if ( schema != null ) {
				buff.append( render( schema, dialect ) ).append( '.' );
			}

			buff.append( render( name, dialect ) );

			return buff.toString();
		}
	}

	private static class NameCatalogFormat implements Format {
		private final String catalogSeparator;

		public NameCatalogFormat(String catalogSeparator) {
			this.catalogSeparator = catalogSeparator;
		}

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			StringBuilder buff = new StringBuilder();

			buff.append( render( name, dialect ) );

			if ( catalog != null ) {
				buff.append( catalogSeparator ).append( render( catalog, dialect ) );
			}

			return buff.toString();
		}
	}

	private static class CatalogNameFormat implements Format {
		private final String catalogSeparator;

		public CatalogNameFormat(String catalogSeparator) {
			this.catalogSeparator = catalogSeparator;
		}

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			StringBuilder buff = new StringBuilder();

			if ( catalog != null ) {
				buff.append( render( catalog, dialect ) ).append( catalogSeparator );
			}

			buff.append( render( name, dialect ) );

			return buff.toString();
		}
	}

	private static class SchemaNameFormat implements Format {
		/**
		 * Singleton access
		 */
		public static final SchemaNameFormat INSTANCE = new SchemaNameFormat();

		@Override
		public String format(Identifier catalog, Identifier schema, Identifier name, Dialect dialect) {
			StringBuilder buff = new StringBuilder();

			if ( schema != null ) {
				buff.append( render( schema, dialect ) ).append( '.' );
			}

			buff.append( render( name, dialect ) );

			return buff.toString();
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy