/*******************************************************************************
 * Copyright (c) 2012 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation
 *
 ******************************************************************************/
package org.eclipse.jpt.jpa.eclipselink.core.jpql.spi;

import org.eclipse.jpt.jpa.core.context.AttributeMapping;
import org.eclipse.jpt.jpa.core.context.Embeddable;
import org.eclipse.jpt.jpa.core.context.Entity;
import org.eclipse.jpt.jpa.core.context.MappedSuperclass;
import org.eclipse.jpt.jpa.core.context.PersistentType;
import org.eclipse.jpt.jpa.core.jpql.spi.IManagedTypeBuilder;
import org.eclipse.jpt.jpa.core.jpql.spi.JpaEmbeddable;
import org.eclipse.jpt.jpa.core.jpql.spi.JpaEntity;
import org.eclipse.jpt.jpa.core.jpql.spi.JpaManagedTypeBuilder;
import org.eclipse.jpt.jpa.core.jpql.spi.JpaManagedTypeProvider;
import org.eclipse.jpt.jpa.core.jpql.spi.JpaMappedSuperclass;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkOrmPersistentType;
import org.eclipse.persistence.jpa.jpql.spi.IEmbeddable;
import org.eclipse.persistence.jpa.jpql.spi.IEntity;
import org.eclipse.persistence.jpa.jpql.spi.IMappedSuperclass;
import org.eclipse.persistence.jpa.jpql.spi.IMappingBuilder;

/**
 * This implementation of {@link IManagedTypeBuilder} adds support for dynamic managed types.
 *
 * @version 3.2
 * @since 3.2
 * @author Pascal Filion
 */
public class EclipseLinkManagedTypeBuilder implements IManagedTypeBuilder {

	/**
	 * This builder is used to create the default implementation of an {@link org.eclipse.persistence.
	 * jpa.jpql.spi.IManagedType IManagedType} which is only wrapped if the managed type is dynamic.
	 */
	private JpaManagedTypeBuilder builder;

	/**
	 * Creates a new <code>EclipseLinkManagedTypeBuilder</code>.
	 */
	public EclipseLinkManagedTypeBuilder() {
		super();
		builder = new JpaManagedTypeBuilder();
	}

	/**
	 * {@inheritDoc}
	 */
	public IEmbeddable buildEmbeddable(JpaManagedTypeProvider provider,
	                                   Embeddable mappedClass,
	                                   IMappingBuilder<AttributeMapping> mappingBuilder) {

		JpaEmbeddable embeddable = (JpaEmbeddable) builder.buildEmbeddable(
			provider,
			mappedClass,
			mappingBuilder
		);

		PersistentType persistentType = mappedClass.getPersistentType();

		if (persistentType instanceof EclipseLinkOrmPersistentType) {
			EclipseLinkOrmPersistentType ormPersistentType = (EclipseLinkOrmPersistentType) persistentType;
			if (ormPersistentType.isDynamic()) {
				return new EclipseLinkDynamicEmbeddable(provider, embeddable);
			}
		}

		return embeddable;
	}

	/**
	 * {@inheritDoc}
	 */
	public IEntity buildEntity(JpaManagedTypeProvider provider,
	                           Entity mappedClass,
	                           IMappingBuilder<AttributeMapping> mappingBuilder) {

		JpaEntity entity = (JpaEntity) builder.buildEntity(provider, mappedClass, mappingBuilder);
		PersistentType persistentType = mappedClass.getPersistentType();

		if (persistentType instanceof EclipseLinkOrmPersistentType) {
			EclipseLinkOrmPersistentType ormPersistentType = (EclipseLinkOrmPersistentType) persistentType;
			if (ormPersistentType.isDynamic()) {
				return new EclipseLinkDynamicEntity(provider, entity);
			}
		}

		return entity;
	}

	/**
	 * {@inheritDoc}
	 */
	public IMappedSuperclass buildMappedSuperclass(JpaManagedTypeProvider provider,
	                                               MappedSuperclass mappedClass,
	                                               IMappingBuilder<AttributeMapping> mappingBuilder) {

		JpaMappedSuperclass mappedSuperclass = (JpaMappedSuperclass) builder.buildMappedSuperclass(
			provider,
			mappedClass,
			mappingBuilder
		);

		PersistentType persistentType = mappedClass.getPersistentType();

		if (persistentType instanceof EclipseLinkOrmPersistentType) {
			EclipseLinkOrmPersistentType ormPersistentType = (EclipseLinkOrmPersistentType) persistentType;
			if (ormPersistentType.isDynamic()) {
				return new EclipseLinkDynamicMappedSuperclass(provider, mappedSuperclass);
			}
		}

		return mappedSuperclass;
	}
}