blob: 1bd84b7a666c8998cf8c5c5fdb23aefb6da62d14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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.jpt.core.internal.platform.base;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.jpt.core.internal.IJpaAnnotationProvider;
import org.eclipse.jpt.core.internal.IJpaFile;
import org.eclipse.jpt.core.internal.IJpaPlatform;
import org.eclipse.jpt.core.internal.IJpaProject;
import org.eclipse.jpt.core.internal.IResourceModel;
import org.eclipse.jpt.core.internal.context.java.IDefaultJavaAttributeMappingProvider;
import org.eclipse.jpt.core.internal.context.java.IJavaAttributeMapping;
import org.eclipse.jpt.core.internal.context.java.IJavaAttributeMappingProvider;
import org.eclipse.jpt.core.internal.context.java.IJavaPersistentAttribute;
import org.eclipse.jpt.core.internal.context.java.IJavaPersistentType;
import org.eclipse.jpt.core.internal.context.java.IJavaTypeMapping;
import org.eclipse.jpt.core.internal.context.java.IJavaTypeMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaBasicMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaEmbeddableProvider;
import org.eclipse.jpt.core.internal.context.java.JavaEmbeddedIdMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaEmbeddedMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaEntityProvider;
import org.eclipse.jpt.core.internal.context.java.JavaIdMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaManyToManyMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaManyToOneMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaMappedSuperclassProvider;
import org.eclipse.jpt.core.internal.context.java.JavaNullAttributeMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaNullTypeMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaOneToManyMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaOneToOneMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaTransientMappingProvider;
import org.eclipse.jpt.core.internal.context.java.JavaVersionMappingProvider;
import org.eclipse.jpt.utility.internal.iterators.CloneIterator;
import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
public abstract class BaseJpaPlatform implements IJpaPlatform
{
private String id;
protected IJpaBaseContextFactory jpaFactory;
protected IJpaAnnotationProvider annotationProvider;
protected Collection<IJavaTypeMappingProvider> javaTypeMappingProviders;
protected Collection<IJavaAttributeMappingProvider> javaAttributeMappingProviders;
protected List<IDefaultJavaAttributeMappingProvider> defaultJavaAttributeMappingProviders;
protected BaseJpaPlatform() {
super();
}
public String getId() {
return this.id;
}
/**
* *************
* * IMPORTANT * For INTERNAL use only !!
* *************
*
* @see IJpaPlatform#setId(String)
*/
public void setId(String theId) {
this.id = theId;
}
// **************** Model construction / updating **************************
public IJpaBaseContextFactory jpaFactory() {
if (this.jpaFactory == null) {
this.jpaFactory = buildJpaFactory();
}
return this.jpaFactory;
}
protected abstract IJpaBaseContextFactory buildJpaFactory();
public IJpaFile buildJpaFile(IJpaProject jpaProject, IFile file) {
if (jpaFactory().hasRelevantContent(file)) {
IResourceModel resourceModel = jpaFactory().buildResourceModel(jpaProject, file);
return jpaFactory().createJpaFile(jpaProject, file, resourceModel);
}
return null;
}
// **************** java annotation support ********************************
public IJpaAnnotationProvider annotationProvider() {
if (this.annotationProvider == null) {
this.annotationProvider = buildAnnotationProvider();
}
return this.annotationProvider;
}
protected abstract IJpaAnnotationProvider buildAnnotationProvider();
// **************** type mapping support ********************************
public IJavaTypeMapping createJavaTypeMappingFromMappingKey(String typeMappingKey, IJavaPersistentType parent) {
return javaTypeMappingProviderFromMappingKey(typeMappingKey).buildMapping(parent, jpaFactory());
}
public IJavaTypeMapping createJavaTypeMappingFromAnnotation(String mappingAnnotationName, IJavaPersistentType parent) {
return javaTypeMappingProviderFromAnnotation(mappingAnnotationName).buildMapping(parent, jpaFactory());
}
public IJavaAttributeMapping createJavaAttributeMappingFromMappingKey(String attributeMappingKey, IJavaPersistentAttribute parent) {
return javaAttributeMappingProviderFromMappingKey(attributeMappingKey).buildMapping(parent, jpaFactory());
}
public IJavaAttributeMapping createJavaAttributeMappingFromAnnotation(String mappingAnnotationName, IJavaPersistentAttribute parent) {
return javaAttributeMappingProviderFromAnnotation(mappingAnnotationName).buildMapping(parent, jpaFactory());
}
public IJavaAttributeMapping createDefaultJavaAttributeMapping(IJavaPersistentAttribute parent) {
return defaultJavaAttributeMappingProvider(parent).buildMapping(parent, jpaFactory());
}
protected Iterator<IJavaTypeMappingProvider> javaTypeMappingProviders() {
if (this.javaTypeMappingProviders == null) {
this.javaTypeMappingProviders = new ArrayList<IJavaTypeMappingProvider>();
this.addJavaTypeMappingProvidersTo(this.javaTypeMappingProviders);
}
return new CloneIterator<IJavaTypeMappingProvider>(this.javaTypeMappingProviders);
}
/**
* Override this to specify more or different type mapping providers.
* The default includes the JPA spec-defined type mappings of
* Entity, MappedSuperclass, and Embeddable
*/
protected void addJavaTypeMappingProvidersTo(Collection<IJavaTypeMappingProvider> providers) {
providers.add(JavaEntityProvider.instance());
providers.add(JavaMappedSuperclassProvider.instance());
providers.add(JavaEmbeddableProvider.instance());
providers.add(JavaNullTypeMappingProvider.instance());
}
protected IJavaTypeMappingProvider javaTypeMappingProviderFromMappingKey(String typeMappingKey) {
for (Iterator<IJavaTypeMappingProvider> i = this.javaTypeMappingProviders(); i.hasNext(); ) {
IJavaTypeMappingProvider provider = i.next();
if (provider.key() == typeMappingKey) {
return provider;
}
}
throw new IllegalArgumentException("Illegal type mapping key: " + typeMappingKey);
}
protected IJavaTypeMappingProvider javaTypeMappingProviderFromAnnotation(String annotationName) {
for (Iterator<IJavaTypeMappingProvider> i = this.javaTypeMappingProviders(); i.hasNext(); ) {
IJavaTypeMappingProvider provider = i.next();
if (provider.annotationName() == annotationName) {
return provider;
}
}
throw new IllegalArgumentException("Illegal annotation name: " + annotationName);
}
protected Iterator<IJavaAttributeMappingProvider> javaAttributeMappingProviders() {
if (this.javaAttributeMappingProviders == null) {
this.javaAttributeMappingProviders = new ArrayList<IJavaAttributeMappingProvider>();
this.addJavaAttributeMappingProvidersTo(this.javaAttributeMappingProviders);
}
return new CloneIterator<IJavaAttributeMappingProvider>(this.javaAttributeMappingProviders);
}
/**
* Override this to specify more or different attribute mapping providers.
* The default includes the JPA spec-defined attribute mappings of
* Basic, Id, Transient OneToOne, OneToMany, ManyToOne, ManyToMany, Embeddable, EmbeddedId, Version.
*/
protected void addJavaAttributeMappingProvidersTo(Collection<IJavaAttributeMappingProvider> providers) {
providers.add(JavaBasicMappingProvider.instance());
providers.add(JavaEmbeddedMappingProvider.instance());
providers.add(JavaEmbeddedIdMappingProvider.instance());
providers.add(JavaIdMappingProvider.instance());
providers.add(JavaManyToManyMappingProvider.instance());
providers.add(JavaManyToOneMappingProvider.instance());
providers.add(JavaOneToManyMappingProvider.instance());
providers.add(JavaOneToOneMappingProvider.instance());
providers.add(JavaTransientMappingProvider.instance());
providers.add(JavaVersionMappingProvider.instance());
}
protected IJavaAttributeMappingProvider javaAttributeMappingProviderFromMappingKey(String attributeMappingKey) {
for (Iterator<IJavaAttributeMappingProvider> i = this.javaAttributeMappingProviders(); i.hasNext(); ) {
IJavaAttributeMappingProvider provider = i.next();
if (provider.key() == attributeMappingKey) {
return provider;
}
}
throw new IllegalArgumentException("Illegal attribute mapping key: " + attributeMappingKey);
}
protected IJavaAttributeMappingProvider javaAttributeMappingProviderFromAnnotation(String annotationName) {
for (Iterator<IJavaAttributeMappingProvider> i = this.javaAttributeMappingProviders(); i.hasNext(); ) {
IJavaAttributeMappingProvider provider = i.next();
if (provider.annotationName() == annotationName) {
return provider;
}
}
throw new IllegalArgumentException("Illegal annotation name: " + annotationName);
}
protected ListIterator<IDefaultJavaAttributeMappingProvider> defaultJavaAttributeMappingProviders() {
if (this.defaultJavaAttributeMappingProviders == null) {
this.defaultJavaAttributeMappingProviders = new ArrayList<IDefaultJavaAttributeMappingProvider>();
this.addDefaultJavaAttributeMappingProvidersTo(this.defaultJavaAttributeMappingProviders);
}
return new CloneListIterator<IDefaultJavaAttributeMappingProvider>(this.defaultJavaAttributeMappingProviders);
}
/**
* Override this to specify more or different default attribute mapping providers.
* The default includes the JPA spec-defined attribute mappings of
* Embedded and Basic.
*/
protected void addDefaultJavaAttributeMappingProvidersTo(List<IDefaultJavaAttributeMappingProvider> providers) {
providers.add(JavaEmbeddedMappingProvider.instance()); //bug 190344 need to test default embedded before basic
providers.add(JavaBasicMappingProvider.instance());
}
protected IJavaAttributeMappingProvider defaultJavaAttributeMappingProvider(IJavaPersistentAttribute persistentAttribute) {
for (Iterator<IDefaultJavaAttributeMappingProvider> i = this.defaultJavaAttributeMappingProviders(); i.hasNext(); ) {
IDefaultJavaAttributeMappingProvider provider = i.next();
if (provider.defaultApplies(persistentAttribute)) {
return provider;
}
}
return nullAttributeMappingProvider();
}
public String defaultJavaAttributeMappingKey(IJavaPersistentAttribute persistentAttribute) {
return defaultJavaAttributeMappingProvider(persistentAttribute).key();
}
/**
* the "null" attribute mapping is used when the attribute is neither
* modified with a mapping annotation nor mapped by a "default" mapping
*/
protected IJavaAttributeMappingProvider nullAttributeMappingProvider() {
return JavaNullAttributeMappingProvider.instance();
}
// **************** Validation *********************************************
public void addToMessages(IJpaProject project, List<IMessage> messages) {
project.addToMessages(messages, null);
}
}