# EntityMappingConfigurationWithTable.java

    package org.codefilarete.stalactite.engine.configurer;

    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import javax.annotation.Nullable;

    import org.codefilarete.stalactite.dsl.PolymorphismPolicy;
    import org.codefilarete.stalactite.dsl.embeddable.EmbeddableMappingConfiguration;
    import org.codefilarete.stalactite.dsl.entity.EntityMappingConfiguration;
    import org.codefilarete.stalactite.dsl.entity.EntityMappingConfigurationProvider;
    import org.codefilarete.stalactite.dsl.entity.OptimisticLockOption;
    import org.codefilarete.stalactite.dsl.naming.AssociationTableNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.ColumnNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.ElementCollectionTableNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.ForeignKeyNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.JoinColumnNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.MapEntryTableNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.TableNamingStrategy;
    import org.codefilarete.stalactite.dsl.naming.UniqueConstraintNamingStrategy;
    import org.codefilarete.stalactite.engine.configurer.elementcollection.ElementCollectionRelation;
    import org.codefilarete.stalactite.engine.configurer.manyToOne.ManyToOneRelation;
    import org.codefilarete.stalactite.engine.configurer.manytomany.ManyToManyRelation;
    import org.codefilarete.stalactite.engine.configurer.map.MapRelation;
    import org.codefilarete.stalactite.engine.configurer.onetomany.OneToManyRelation;
    import org.codefilarete.stalactite.engine.configurer.onetoone.OneToOneRelation;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;

    /**
     * A {@link EntityMappingConfiguration} with a determined target {@link Table}.
     * Used when initial configuration has a null one and configurers has determined the target table (by reverse column, inheritance, etc.).
     * We could have also used {@link org.codefilarete.stalactite.engine.configurer.builder.DefaultPersisterBuilder#build(EntityMappingConfigurationProvider)}
     * with an extra table argument, but it complexifies the Builder Pattern.
     *
     * @param <C>
     * @param <I>
     * @author Guillaume Mary
     */
    public class EntityMappingConfigurationWithTable<C, I> implements EntityMappingConfiguration<C, I> {

    	private final EntityMappingConfiguration<C, I> delegate;
    	private final Table table;

    	public EntityMappingConfigurationWithTable(EntityMappingConfiguration<C, I> delegate, Table table) {
    		this.delegate = delegate;
    		this.table = table;
    	}

    	@Nullable
    	public EntityFactoryProvider<C, ?> getEntityFactoryProvider() {
    		return delegate.getEntityFactoryProvider();
    	}

    	@Nullable
    	public Table getTable() {
    		return table;
    	}

    	@Nullable
    	public TableNamingStrategy getTableNamingStrategy() {
    		return delegate.getTableNamingStrategy();
    	}

    	public Iterable<EntityMappingConfiguration<? super C, I>> inheritanceIterable() {
    		return delegate.inheritanceIterable();
    	}

    	public PolymorphismPolicy<C> getPolymorphismPolicy() {
    		return delegate.getPolymorphismPolicy();
    	}

    	@Nullable
    	public ColumnNamingStrategy getColumnNamingStrategy() {
    		return delegate.getColumnNamingStrategy();
    	}

    	public KeyMapping<C, I> getKeyMapping() {
    		return delegate.getKeyMapping();
    	}

    	public EmbeddableMappingConfiguration<C> getPropertiesMapping() {
    		return delegate.getPropertiesMapping();
    	}

    	@Nullable
    	public OptimisticLockOption<C, ?> getOptimisticLockOption() {
    		return delegate.getOptimisticLockOption();
    	}

    	@Nullable
    	public MapEntryTableNamingStrategy getEntryMapTableNamingStrategy() {
    		return delegate.getEntryMapTableNamingStrategy();
    	}

    	@Nullable
    	public InheritanceConfiguration<? super C, I> getInheritanceConfiguration() {
    		return delegate.getInheritanceConfiguration();
    	}

    	@Nullable
    	public ColumnNamingStrategy getIndexColumnNamingStrategy() {
    		return delegate.getIndexColumnNamingStrategy();
    	}

    	@Nullable
    	public ForeignKeyNamingStrategy getForeignKeyNamingStrategy() {
    		return delegate.getForeignKeyNamingStrategy();
    	}

    	@Override
    	public UniqueConstraintNamingStrategy getUniqueConstraintNamingStrategy() {
    		return delegate.getUniqueConstraintNamingStrategy();
    	}

    	@Nullable
    	public AssociationTableNamingStrategy getAssociationTableNamingStrategy() {
    		return delegate.getAssociationTableNamingStrategy();
    	}

    	@Nullable
    	public ElementCollectionTableNamingStrategy getElementCollectionTableNamingStrategy() {
    		return delegate.getElementCollectionTableNamingStrategy();
    	}

    	@Nullable
    	public JoinColumnNamingStrategy getJoinColumnNamingStrategy() {
    		return delegate.getJoinColumnNamingStrategy();
    	}

    	public Class<C> getEntityType() {
    		return delegate.getEntityType();
    	}

    	public <TRGT, TRGTID> List<OneToOneRelation<C, TRGT, TRGTID>> getOneToOnes() {
    		return delegate.getOneToOnes();
    	}

    	public <TRGT, TRGTID> List<OneToManyRelation<C, TRGT, TRGTID, Collection<TRGT>>> getOneToManys() {
    		return delegate.getOneToManys();
    	}

    	public <TRGT, TRGTID> List<ManyToManyRelation<C, TRGT, TRGTID, Collection<TRGT>, Collection<C>>> getManyToManys() {
    		return delegate.getManyToManys();
    	}

    	public <TRGT, TRGTID> List<ManyToOneRelation<C, TRGT, TRGTID, Collection<C>>> getManyToOnes() {
    		return delegate.getManyToOnes();
    	}

    	public <TRGT> List<ElementCollectionRelation<C, TRGT, ? extends Collection<TRGT>>> getElementCollections() {
    		return delegate.getElementCollections();
    	}

    	public List<MapRelation<C, ?, ?, ? extends Map>> getMaps() {
    		return delegate.getMaps();
    	}
    }