/*******************************************************************************
 * Copyright (c) 2009 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt2_0.core.internal.platform;

import org.eclipse.jpt.core.context.MappingFile;
import org.eclipse.jpt.core.context.PersistentType;
import org.eclipse.jpt.core.context.XmlContextNode;
import org.eclipse.jpt.core.context.PersistentType.Owner;
import org.eclipse.jpt.core.context.java.JavaAttributeMapping;
import org.eclipse.jpt.core.context.java.JavaBasicMapping;
import org.eclipse.jpt.core.context.java.JavaEmbeddable;
import org.eclipse.jpt.core.context.java.JavaEmbeddedIdMapping;
import org.eclipse.jpt.core.context.java.JavaEmbeddedMapping;
import org.eclipse.jpt.core.context.java.JavaIdMapping;
import org.eclipse.jpt.core.context.java.JavaJpaContextNode;
import org.eclipse.jpt.core.context.java.JavaManyToManyMapping;
import org.eclipse.jpt.core.context.java.JavaManyToOneMapping;
import org.eclipse.jpt.core.context.java.JavaOneToManyMapping;
import org.eclipse.jpt.core.context.java.JavaOneToOneMapping;
import org.eclipse.jpt.core.context.java.JavaPersistentAttribute;
import org.eclipse.jpt.core.context.java.JavaPersistentType;
import org.eclipse.jpt.core.context.java.JavaSequenceGenerator;
import org.eclipse.jpt.core.context.java.JavaTransientMapping;
import org.eclipse.jpt.core.context.java.JavaVersionMapping;
import org.eclipse.jpt.core.context.orm.EntityMappings;
import org.eclipse.jpt.core.context.orm.OrmAttributeMapping;
import org.eclipse.jpt.core.context.orm.OrmBasicMapping;
import org.eclipse.jpt.core.context.orm.OrmEmbeddable;
import org.eclipse.jpt.core.context.orm.OrmEmbeddedIdMapping;
import org.eclipse.jpt.core.context.orm.OrmEmbeddedMapping;
import org.eclipse.jpt.core.context.orm.OrmEntity;
import org.eclipse.jpt.core.context.orm.OrmIdMapping;
import org.eclipse.jpt.core.context.orm.OrmManyToManyMapping;
import org.eclipse.jpt.core.context.orm.OrmManyToOneMapping;
import org.eclipse.jpt.core.context.orm.OrmMappedSuperclass;
import org.eclipse.jpt.core.context.orm.OrmOneToManyMapping;
import org.eclipse.jpt.core.context.orm.OrmOneToOneMapping;
import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute;
import org.eclipse.jpt.core.context.orm.OrmPersistentType;
import org.eclipse.jpt.core.context.orm.OrmSequenceGenerator;
import org.eclipse.jpt.core.context.orm.OrmTransientMapping;
import org.eclipse.jpt.core.context.orm.OrmTypeMapping;
import org.eclipse.jpt.core.context.orm.OrmVersionMapping;
import org.eclipse.jpt.core.context.orm.PersistenceUnitMetadata;
import org.eclipse.jpt.core.context.persistence.MappingFileRef;
import org.eclipse.jpt.core.internal.platform.GenericJpaFactory;
import org.eclipse.jpt.core.resource.java.JavaResourcePersistentAttribute;
import org.eclipse.jpt.core.resource.java.JavaResourcePersistentType;
import org.eclipse.jpt.core.resource.orm.XmlNullAttributeMapping;
import org.eclipse.jpt.core.resource.orm.XmlSequenceGenerator;
import org.eclipse.jpt.core.resource.orm.XmlTypeMapping;
import org.eclipse.jpt.core.resource.xml.JpaXmlResource;
import org.eclipse.jpt2_0.core.internal.context.java.Generic2_0JavaEmbeddable;
import org.eclipse.jpt2_0.core.internal.context.java.Generic2_0JavaPersistentAttribute;
import org.eclipse.jpt2_0.core.internal.context.java.Generic2_0JavaPersistentType;
import org.eclipse.jpt2_0.core.internal.context.java.Generic2_0JavaSequenceGenerator;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0EntityMappings;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0OrmEmbeddable;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0OrmPersistentAttribute;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0OrmPersistentType;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0OrmSequenceGenerator;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0OrmXml;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0PersistenceUnitMetadata;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlBasic;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlEmbedded;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlEmbeddedId;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlId;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlManyToMany;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlManyToOne;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlNullAttributeMapping;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlOneToMany;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlOneToOne;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlTransient;
import org.eclipse.jpt2_0.core.internal.context.orm.Generic2_0VirtualXmlVersion;
import org.eclipse.jpt2_0.core.resource.orm.XmlAttributeMapping;
import org.eclipse.jpt2_0.core.resource.orm.XmlBasic;
import org.eclipse.jpt2_0.core.resource.orm.XmlEmbeddable;
import org.eclipse.jpt2_0.core.resource.orm.XmlEmbedded;
import org.eclipse.jpt2_0.core.resource.orm.XmlEmbeddedId;
import org.eclipse.jpt2_0.core.resource.orm.XmlEntity;
import org.eclipse.jpt2_0.core.resource.orm.XmlEntityMappings;
import org.eclipse.jpt2_0.core.resource.orm.XmlId;
import org.eclipse.jpt2_0.core.resource.orm.XmlManyToMany;
import org.eclipse.jpt2_0.core.resource.orm.XmlManyToOne;
import org.eclipse.jpt2_0.core.resource.orm.XmlMappedSuperclass;
import org.eclipse.jpt2_0.core.resource.orm.XmlOneToMany;
import org.eclipse.jpt2_0.core.resource.orm.XmlOneToOne;
import org.eclipse.jpt2_0.core.resource.orm.XmlTransient;
import org.eclipse.jpt2_0.core.resource.orm.XmlVersion;

/**
 * Central class that allows extenders to easily replace implementations of
 * various Dali interfaces.
 */
public class Generic2_0JpaFactory extends GenericJpaFactory
{
	public Generic2_0JpaFactory() {
		super();
	}
	
	@Override
	public JavaEmbeddable buildJavaEmbeddable(JavaPersistentType parent) {
		return new Generic2_0JavaEmbeddable(parent);
	}
	
	// ********** Context Nodes **********
	
	public MappingFile build2_0MappingFile(MappingFileRef parent, JpaXmlResource resource) {
		return build2_0OrmXml(parent, resource);
	}
	
	protected Generic2_0OrmXml build2_0OrmXml(MappingFileRef parent, JpaXmlResource resource) {
		return new Generic2_0OrmXml(parent, resource);
	}

	// ********** Generic 2.0-specific ORM Context Model **********
	
	public EntityMappings build2_0EntityMappings(Generic2_0OrmXml parent, XmlEntityMappings xmlEntityMappings) {
		return new Generic2_0EntityMappings(parent, xmlEntityMappings);
	}
	
	public PersistenceUnitMetadata build2_0PersistenceUnitMetadata(Generic2_0EntityMappings parent, XmlEntityMappings xmlEntityMappings) {
		return new Generic2_0PersistenceUnitMetadata(parent, xmlEntityMappings);
	}
	
	public OrmPersistentType build2_0OrmPersistentType(EntityMappings parent, XmlTypeMapping resourceMapping) {
		return new Generic2_0OrmPersistentType(parent, resourceMapping);
	}

	public OrmEmbeddable build2_0OrmEmbeddable(OrmPersistentType parent, XmlEmbeddable resourceMapping) {
		return new Generic2_0OrmEmbeddable(parent, resourceMapping);
	}

	public OrmEntity build2_0OrmEntity(OrmPersistentType parent, XmlEntity resourceMapping) {
		return buildOrmEntity(parent, resourceMapping);
	}

	public OrmMappedSuperclass build2_0OrmMappedSuperclass(OrmPersistentType parent, XmlMappedSuperclass resourceMapping) {
		return buildOrmMappedSuperclass(parent, resourceMapping);
	}
	
	public OrmPersistentAttribute build2_0OrmPersistentAttribute(OrmPersistentType parent, OrmPersistentAttribute.Owner owner, XmlAttributeMapping resourceMapping) {
		return new Generic2_0OrmPersistentAttribute(parent, owner, resourceMapping);
	}
	
	public OrmBasicMapping build2_0OrmBasicMapping(OrmPersistentAttribute parent, XmlBasic resourceMapping) {
		return buildOrmBasicMapping(parent, resourceMapping);
	}
	
	public OrmEmbeddedMapping build2_0OrmEmbeddedMapping(OrmPersistentAttribute parent, XmlEmbedded resourceMapping) {
		return buildOrmEmbeddedMapping(parent, resourceMapping);
	}
	
	public OrmEmbeddedIdMapping build2_0OrmEmbeddedIdMapping(OrmPersistentAttribute parent, XmlEmbeddedId resourceMapping) {
		return buildOrmEmbeddedIdMapping(parent, resourceMapping);
	}
	
	public OrmIdMapping build2_0OrmIdMapping(OrmPersistentAttribute parent, XmlId resourceMapping) {
		return buildOrmIdMapping(parent, resourceMapping);
	}
	
	public OrmManyToManyMapping build2_0OrmManyToManyMapping(OrmPersistentAttribute parent, XmlManyToMany resourceMapping) {
		return buildOrmManyToManyMapping(parent, resourceMapping);
	}
	
	public OrmManyToOneMapping build2_0OrmManyToOneMapping(OrmPersistentAttribute parent, XmlManyToOne resourceMapping) {
		return buildOrmManyToOneMapping(parent, resourceMapping);
	}
	
	public OrmOneToManyMapping build2_0OrmOneToManyMapping(OrmPersistentAttribute parent, XmlOneToMany resourceMapping) {
		return buildOrmOneToManyMapping(parent, resourceMapping);
	}
	
	public OrmOneToOneMapping build2_0OrmOneToOneMapping(OrmPersistentAttribute parent, XmlOneToOne resourceMapping) {
		return buildOrmOneToOneMapping(parent, resourceMapping);
	}
	
	public OrmTransientMapping build2_0OrmTransientMapping(OrmPersistentAttribute parent, XmlTransient resourceMapping) {
		return buildOrmTransientMapping(parent, resourceMapping);
	}
	
	public OrmVersionMapping build2_0OrmVersionMapping(OrmPersistentAttribute parent, XmlVersion resourceMapping) {
		return buildOrmVersionMapping(parent, resourceMapping);
	}
	
	public OrmAttributeMapping build2_0OrmNullAttributeMapping(OrmPersistentAttribute parent, XmlNullAttributeMapping resourceMapping) {
		return buildOrmNullAttributeMapping(parent, resourceMapping);
	}
	
	public XmlBasic build2_0VirtualXmlBasic(OrmTypeMapping ormTypeMapping, JavaBasicMapping javaBasicMapping) {
		return new Generic2_0VirtualXmlBasic(ormTypeMapping, javaBasicMapping);
	}
	
	public XmlId build2_0VirtualXmlId(OrmTypeMapping ormTypeMapping, JavaIdMapping javaIdMapping) {
		return new Generic2_0VirtualXmlId(ormTypeMapping, javaIdMapping);
	}
	
	public XmlEmbeddedId build2_0VirtualXmlEmbeddedId(OrmTypeMapping ormTypeMapping, JavaEmbeddedIdMapping javaEmbeddedIdMapping) {
		return new Generic2_0VirtualXmlEmbeddedId(ormTypeMapping, javaEmbeddedIdMapping);
	}
	
	public XmlEmbedded build2_0VirtualXmlEmbedded(OrmTypeMapping ormTypeMapping, JavaEmbeddedMapping javaEmbeddedMapping) {
		return new Generic2_0VirtualXmlEmbedded(ormTypeMapping, javaEmbeddedMapping);
	}
	
	public XmlManyToMany build2_0VirtualXmlManyToMany(OrmTypeMapping ormTypeMapping, JavaManyToManyMapping javaManyToManyMapping) {
		return new Generic2_0VirtualXmlManyToMany(ormTypeMapping, javaManyToManyMapping);
	}
	
	public XmlManyToOne build2_0VirtualXmlManyToOne(OrmTypeMapping ormTypeMapping, JavaManyToOneMapping javaManyToOneMapping) {
		return new Generic2_0VirtualXmlManyToOne(ormTypeMapping, javaManyToOneMapping);
	}
	
	public XmlOneToMany build2_0VirtualXmlOneToMany(OrmTypeMapping ormTypeMapping, JavaOneToManyMapping javaOneToManyMapping) {
		return new Generic2_0VirtualXmlOneToMany(ormTypeMapping, javaOneToManyMapping);
	}
	
	public XmlOneToOne build2_0VirtualXmlOneToOne(OrmTypeMapping ormTypeMapping, JavaOneToOneMapping javaOneToOneMapping) {
		return new Generic2_0VirtualXmlOneToOne(ormTypeMapping, javaOneToOneMapping);
	}
	
	public XmlTransient build2_0VirtualXmlTransient(OrmTypeMapping ormTypeMapping, JavaTransientMapping javaTransientMapping) {
		return new Generic2_0VirtualXmlTransient(ormTypeMapping, javaTransientMapping);
	}
	
	public XmlVersion build2_0VirtualXmlVersion(OrmTypeMapping ormTypeMapping, JavaVersionMapping javaVersionMapping) {
		return new Generic2_0VirtualXmlVersion(ormTypeMapping, javaVersionMapping);
	}
	
	public XmlNullAttributeMapping build2_0VirtualXmlNullAttributeMapping(OrmTypeMapping ormTypeMapping, JavaAttributeMapping javaAttributeMapping) {
		return new Generic2_0VirtualXmlNullAttributeMapping(ormTypeMapping, javaAttributeMapping);
	}

	@Override
	public OrmSequenceGenerator buildOrmSequenceGenerator(XmlContextNode parent, XmlSequenceGenerator resourceSequenceGenerator) {
		return new Generic2_0OrmSequenceGenerator(
							parent, 
							(org.eclipse.jpt2_0.core.resource.orm.XmlSequenceGenerator) resourceSequenceGenerator);
	}

	// ********** Java Context Model **********

	@Override
	public JavaPersistentAttribute buildJavaPersistentAttribute(PersistentType parent, JavaResourcePersistentAttribute jrpa) {
		return new Generic2_0JavaPersistentAttribute(parent, jrpa);
	}
	
	@Override
	public JavaPersistentType buildJavaPersistentType(Owner owner, JavaResourcePersistentType jrpt) {
		return new Generic2_0JavaPersistentType(owner, jrpt);
	}

	@Override
	public JavaSequenceGenerator buildJavaSequenceGenerator(JavaJpaContextNode parent) {
		return new Generic2_0JavaSequenceGenerator(parent);
	}

}
