content: /**
   * Copyright (C) 2012 the original author or authors.
   *
   * 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.
   */
  //$Id: NamingStrategy.java 9874 2006-05-04 15:10:22Z epbernard $
  package co.jirm.mapper.definition;
  
  /**
   * A set of rules for determining the physical column
   * and table names given the information in the mapping
   * document. May be used to implement project-scoped
   * naming standards for database objects.
   *
   * #propertyToTableName(String, String) should be replaced by
   * {@link #collectionTableName(String,String,String,String,String)}
   *
   * @see DefaultNamingStrategy
   * @see ImprovedNamingStrategy
   * @author Gavin King
   * @author Emmanuel Bernard
   */
  public interface NamingStrategy {
  	/**
  	 * Return a table name for an entity class
  	 * @param className the fully-qualified class name
  	 * @return a table name
  	 */
  	public String classToTableName(String className);
  	/**
  	 * Return a column name for a property path expression
  	 * @param propertyName a property path
  	 * @return a column name
  	 */
  	public String propertyToColumnName(String propertyName);
  	/**
  	 * Alter the table name given in the mapping document
  	 * @param tableName a table name
  	 * @return a table name
  	 */
  	public String tableName(String tableName);
  	/**
  	 * Alter the column name given in the mapping document
  	 * @param columnName a column name
  	 * @return a column name
  	 */
  	public String columnName(String columnName);
  	/**
  	 * Return a collection table name ie an association having a join table
  	 *
  	 * @param ownerEntity
  	 * @param ownerEntityTable owner side table name
  	 * @param associatedEntity
  	 * @param associatedEntityTable reverse side table name if any
  	 * @param propertyName collection role
  	 */
  	public String collectionTableName(
  			String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
  			String propertyName
  	);
  	/**
  	 * Return the join key column name ie a FK column used in a JOINED strategy or for a secondary table
  	 *
  	 * @param joinedColumn joined column name (logical one) used to join with
  	 * @param joinedTable joined table name (ie the referenced table) used to join with
  	 */
  	public String joinKeyColumnName(String joinedColumn, String joinedTable);
  	/**
  	 * Return the foreign key column name for the given parameters
  	 * @param propertyName the property name involved
  	 * @param propertyEntityName
  	 * @param propertyTableName the property table name involved (logical one)
  	 * @param referencedColumnName the referenced column name involved (logical one)
  	 */
  	public String foreignKeyColumnName(
  			String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
  	);
  	/**
  	 * Return the logical column name used to refer to a column in the metadata
  	 * (like index, unique constraints etc)
  	 * A full bijection is required between logicalNames and physical ones
  	 * logicalName have to be case insersitively unique for a given table
  	 *
  	 * @param columnName given column name if any
  	 * @param propertyName property name of this column
  	 */
  	public String logicalColumnName(String columnName, String propertyName);
  	/**
  	 * Returns the logical collection table name used to refer to a table in the mapping metadata
  	 *
  	 * @param tableName the metadata explicit name
  	 * @param ownerEntityTable owner table entity table name (logical one)
  	 * @param associatedEntityTable reverse side table name if any (logical one)
  	 * @param propertyName collection role
  	 */
  	public String logicalCollectionTableName(String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName);
  
  	/**
  	 * Returns the logical foreign key column name used to refer to this column in the mapping metadata
  	 *
  	 * @param columnName given column name in the metadata if any
  	 * @param propertyName property name
  	 * @param referencedColumn referenced column name (logical one) in the join
  	 */
  	public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn);
  }