blob: 7db6b9674399db45c0904c67da0a01621e60a725 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 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;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jpt.core.EntityGeneratorDatabaseAnnotationNameBuilder;
import org.eclipse.jpt.core.JpaAnnotationProvider;
import org.eclipse.jpt.core.JpaFactory;
import org.eclipse.jpt.core.JpaFile;
import org.eclipse.jpt.core.JpaFileProvider;
import org.eclipse.jpt.core.JpaPlatform;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.core.JptCorePlugin;
import org.eclipse.jpt.core.context.java.DefaultJavaAttributeMappingProvider;
import org.eclipse.jpt.core.context.java.JavaAttributeMapping;
import org.eclipse.jpt.core.context.java.JavaAttributeMappingProvider;
import org.eclipse.jpt.core.context.java.JavaPersistentAttribute;
import org.eclipse.jpt.core.context.java.JavaPersistentType;
import org.eclipse.jpt.core.context.java.JavaTypeMapping;
import org.eclipse.jpt.core.context.java.JavaTypeMappingProvider;
import org.eclipse.jpt.core.context.orm.OrmAttributeMapping;
import org.eclipse.jpt.core.context.orm.OrmAttributeMappingProvider;
import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute;
import org.eclipse.jpt.core.context.orm.OrmTypeMapping;
import org.eclipse.jpt.core.internal.JavaJpaFileProvider;
import org.eclipse.jpt.core.internal.OrmJpaFileProvider;
import org.eclipse.jpt.core.internal.PersistenceJpaFileProvider;
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.core.internal.context.orm.OrmBasicMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmEmbeddedIdMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmEmbeddedMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmIdMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmManyToManyMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmManyToOneMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmNullAttributeMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmOneToManyMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmOneToOneMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmTransientMappingProvider;
import org.eclipse.jpt.core.internal.context.orm.OrmVersionMappingProvider;
import org.eclipse.jpt.core.resource.orm.XmlAttributeMapping;
import org.eclipse.jpt.db.ConnectionProfileFactory;
import org.eclipse.jpt.db.DatabaseFinder;
import org.eclipse.jpt.db.JptDbPlugin;
/**
*
*/
public class GenericJpaPlatform
implements JpaPlatform
{
public static final String ID = "generic"; //$NON-NLS-1$
private String id;
private JpaFactory jpaFactory;
private JpaAnnotationProvider annotationProvider;
private JpaFileProvider[] jpaFileProviders;
private JavaTypeMappingProvider[] javaTypeMappingProviders;
private JavaAttributeMappingProvider[] javaAttributeMappingProviders;
private DefaultJavaAttributeMappingProvider[] defaultJavaAttributeMappingProviders;
private OrmAttributeMappingProvider[] ormAttributeMappingProviders;
/**
* zero-argument constructor
*/
public GenericJpaPlatform() {
super();
}
public String getId() {
return this.id;
}
/**
* For INTERNAL use only!!
*/
public void setId(String id) {
this.id = id;
}
// ********** factory **********
public synchronized JpaFactory getJpaFactory() {
if (this.jpaFactory == null) {
this.jpaFactory = this.buildJpaFactory();
}
return this.jpaFactory;
}
protected JpaFactory buildJpaFactory() {
return new GenericJpaFactory();
}
// ********** JPA files **********
public JpaFile buildJpaFile(JpaProject jpaProject, IFile file) {
String contentTypeId = this.getContentTypeId(file);
return (contentTypeId == null) ? null : this.buildJpaFileForContentTypeId(jpaProject, file, contentTypeId);
}
protected JpaFile buildJpaFileForContentTypeId(JpaProject jpaProject, IFile file, String contentTypeID) {
JpaFileProvider provider = this.getJpaFileProviderForContentTypeId(contentTypeID);
return (provider == null) ? null : provider.buildJpaFile(jpaProject, file, this.getJpaFactory());
}
/**
* Return null if we don't have a provider for the specified content
* (since we don't have control over the possible content IDs).
* Also, use #equals(Object) for the same reason.
*/
protected JpaFileProvider getJpaFileProviderForContentTypeId(String contentTypeID) {
for (JpaFileProvider provider : this.getJpaFileProviders()) {
if (provider.getContentId().equals(contentTypeID)) {
return provider;
}
}
return null;
}
protected synchronized JpaFileProvider[] getJpaFileProviders() {
if (this.jpaFileProviders == null) {
this.jpaFileProviders = this.buildJpaFileProviders();
}
return this.jpaFileProviders;
}
protected JpaFileProvider[] buildJpaFileProviders() {
ArrayList<JpaFileProvider> providers = new ArrayList<JpaFileProvider>();
this.addJpaFileProvidersTo(providers);
return providers.toArray(new JpaFileProvider[providers.size()]);
}
/**
* Override this to specify more or different JPA file providers.
* The default includes support for Java, persistence.xml, and orm.xml
* files
*/
protected void addJpaFileProvidersTo(List<JpaFileProvider> providers) {
providers.add(JavaJpaFileProvider.instance());
providers.add(PersistenceJpaFileProvider.instance());
providers.add(OrmJpaFileProvider.instance());
}
protected String getContentTypeId(IFile file) {
IContentType contentType = this.getContentType(file);
return (contentType == null) ? null : contentType.getId();
}
protected IContentType getContentType(IFile file) {
InputStream inputStream = null;
try {
inputStream = file.getContents();
} catch (CoreException ex) {
JptCorePlugin.log(ex);
return null; // cannot find the file
}
IContentType contentType = null;
try {
contentType = Platform.getContentTypeManager().findContentTypeFor(inputStream, file.getName());
} catch (IOException ex) {
JptCorePlugin.log(ex);
} finally {
try {
inputStream.close();
} catch (IOException ex) {
JptCorePlugin.log(ex);
}
}
return contentType;
}
// ********** Java annotations **********
public synchronized JpaAnnotationProvider getAnnotationProvider() {
if (this.annotationProvider == null) {
this.annotationProvider = this.buildAnnotationProvider();
}
return this.annotationProvider;
}
protected JpaAnnotationProvider buildAnnotationProvider() {
return new GenericJpaAnnotationProvider();
}
// ********** Java type mappings **********
public JavaTypeMapping buildJavaTypeMappingFromMappingKey(String key, JavaPersistentType type) {
return this.getJavaTypeMappingProviderForMappingKey(key).buildMapping(type, this.getJpaFactory());
}
public JavaTypeMapping buildJavaTypeMappingFromAnnotation(String annotationName, JavaPersistentType type) {
return this.getJavaTypeMappingProviderForAnnotation(annotationName).buildMapping(type, this.getJpaFactory());
}
protected synchronized JavaTypeMappingProvider[] getJavaTypeMappingProviders() {
if (this.javaTypeMappingProviders == null) {
this.javaTypeMappingProviders = this.buildJavaTypeMappingProviders();
}
return this.javaTypeMappingProviders;
}
protected JavaTypeMappingProvider[] buildJavaTypeMappingProviders() {
ArrayList<JavaTypeMappingProvider> providers = new ArrayList<JavaTypeMappingProvider>();
this.addJavaTypeMappingProvidersTo(providers);
return providers.toArray(new JavaTypeMappingProvider[providers.size()]);
}
/**
* 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(List<JavaTypeMappingProvider> providers) {
providers.add(JavaEntityProvider.instance());
providers.add(JavaMappedSuperclassProvider.instance());
providers.add(JavaEmbeddableProvider.instance());
providers.add(JavaNullTypeMappingProvider.instance());
}
protected JavaTypeMappingProvider getJavaTypeMappingProviderForMappingKey(String key) {
for (JavaTypeMappingProvider provider : this.getJavaTypeMappingProviders()) {
if (provider.getKey() == key) {
return provider;
}
}
throw new IllegalArgumentException("Illegal type mapping key: " + key); //$NON-NLS-1$
}
protected JavaTypeMappingProvider getJavaTypeMappingProviderForAnnotation(String annotationName) {
for (JavaTypeMappingProvider provider : this.getJavaTypeMappingProviders()) {
if (provider.getAnnotationName() == annotationName) {
return provider;
}
}
throw new IllegalArgumentException("Illegal annotation name: " + annotationName); //$NON-NLS-1$
}
// ********** Java attribute mappings **********
public JavaAttributeMapping buildJavaAttributeMappingFromMappingKey(String key, JavaPersistentAttribute attribute) {
return this.getJavaAttributeMappingProviderForMappingKey(key).buildMapping(attribute, this.getJpaFactory());
}
public JavaAttributeMapping buildJavaAttributeMappingFromAnnotation(String annotationName, JavaPersistentAttribute attribute) {
return this.getJavaAttributeMappingProviderForAnnotation(annotationName).buildMapping(attribute, this.getJpaFactory());
}
public JavaAttributeMapping buildDefaultJavaAttributeMapping(JavaPersistentAttribute attribute) {
return this.getDefaultJavaAttributeMappingProvider(attribute).buildMapping(attribute, this.getJpaFactory());
}
protected synchronized JavaAttributeMappingProvider[] getJavaAttributeMappingProviders() {
if (this.javaAttributeMappingProviders == null) {
this.javaAttributeMappingProviders = this.buildJavaAttributeMappingProviders();
}
return this.javaAttributeMappingProviders;
}
protected JavaAttributeMappingProvider[] buildJavaAttributeMappingProviders() {
ArrayList<JavaAttributeMappingProvider> providers = new ArrayList<JavaAttributeMappingProvider>();
this.addJavaAttributeMappingProvidersTo(providers);
return providers.toArray(new JavaAttributeMappingProvider[providers.size()]);
}
/**
* 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(List<JavaAttributeMappingProvider> 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 JavaAttributeMappingProvider getJavaAttributeMappingProviderForMappingKey(String key) {
for (JavaAttributeMappingProvider provider : this.getJavaAttributeMappingProviders()) {
if (provider.getKey() == key) {
return provider;
}
}
throw new IllegalArgumentException("Illegal attribute mapping key: " + key); //$NON-NLS-1$
}
protected JavaAttributeMappingProvider getJavaAttributeMappingProviderForAnnotation(String annotationName) {
for (JavaAttributeMappingProvider provider : this.getJavaAttributeMappingProviders()) {
if (provider.getAnnotationName() == annotationName) {
return provider;
}
}
throw new IllegalArgumentException("Illegal annotation name: " + annotationName); //$NON-NLS-1$
}
protected synchronized DefaultJavaAttributeMappingProvider[] getDefaultJavaAttributeMappingProviders() {
if (this.defaultJavaAttributeMappingProviders == null) {
this.defaultJavaAttributeMappingProviders = this.buildDefaultJavaAttributeMappingProviders();
}
return this.defaultJavaAttributeMappingProviders;
}
protected DefaultJavaAttributeMappingProvider[] buildDefaultJavaAttributeMappingProviders() {
ArrayList<DefaultJavaAttributeMappingProvider> providers = new ArrayList<DefaultJavaAttributeMappingProvider>();
this.addDefaultJavaAttributeMappingProvidersTo(providers);
return providers.toArray(new DefaultJavaAttributeMappingProvider[providers.size()]);
}
/**
* 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<DefaultJavaAttributeMappingProvider> providers) {
providers.add(JavaEmbeddedMappingProvider.instance()); // bug 190344 need to test default embedded before basic
providers.add(JavaBasicMappingProvider.instance());
}
protected JavaAttributeMappingProvider getDefaultJavaAttributeMappingProvider(JavaPersistentAttribute attribute) {
for (DefaultJavaAttributeMappingProvider provider : this.getDefaultJavaAttributeMappingProviders()) {
if (provider.defaultApplies(attribute)) {
return provider;
}
}
return this.getNullAttributeMappingProvider();
}
public String getDefaultJavaAttributeMappingKey(JavaPersistentAttribute attribute) {
return this.getDefaultJavaAttributeMappingProvider(attribute).getKey();
}
/**
* the "null" attribute mapping is used when the attribute is neither
* modified with a mapping annotation nor mapped by a "default" mapping
*/
protected JavaAttributeMappingProvider getNullAttributeMappingProvider() {
return JavaNullAttributeMappingProvider.instance();
}
// ********** ORM attribute mappings **********
public OrmAttributeMapping buildOrmAttributeMappingFromMappingKey(String key, OrmPersistentAttribute attribute) {
return this.getOrmAttributeMappingProviderForMappingKey(key).buildMapping(attribute, this.getJpaFactory());
}
public XmlAttributeMapping buildVirtualOrmResourceMappingFromMappingKey(String key, OrmTypeMapping ormTypeMapping, JavaAttributeMapping javaAttributeMapping) {
return this.getOrmAttributeMappingProviderForMappingKey(key).buildVirtualResourceMapping(ormTypeMapping, javaAttributeMapping, this.getJpaFactory());
}
protected synchronized OrmAttributeMappingProvider[] getOrmAttributeMappingProviders() {
if (this.ormAttributeMappingProviders == null) {
this.ormAttributeMappingProviders = this.buildOrmAttributeMappingProviders();
}
return this.ormAttributeMappingProviders;
}
protected OrmAttributeMappingProvider[] buildOrmAttributeMappingProviders() {
ArrayList<OrmAttributeMappingProvider> providers = new ArrayList<OrmAttributeMappingProvider>();
this.addOrmAttributeMappingProvidersTo(providers);
return providers.toArray(new OrmAttributeMappingProvider[providers.size()]);
}
/**
* 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 addOrmAttributeMappingProvidersTo(List<OrmAttributeMappingProvider> providers) {
providers.add(OrmEmbeddedMappingProvider.instance()); //bug 190344 need to test default embedded before basic
providers.add(OrmBasicMappingProvider.instance());
providers.add(OrmTransientMappingProvider.instance());
providers.add(OrmIdMappingProvider.instance());
providers.add(OrmManyToManyMappingProvider.instance());
providers.add(OrmOneToManyMappingProvider.instance());
providers.add(OrmManyToOneMappingProvider.instance());
providers.add(OrmOneToOneMappingProvider.instance());
providers.add(OrmVersionMappingProvider.instance());
providers.add(OrmEmbeddedIdMappingProvider.instance());
}
protected OrmAttributeMappingProvider getOrmAttributeMappingProviderForMappingKey(String key) {
for (OrmAttributeMappingProvider provider : this.getOrmAttributeMappingProviders()) {
if (provider.getKey() == key) {
return provider;
}
}
return OrmNullAttributeMappingProvider.instance();
}
// ********** database **********
public ConnectionProfileFactory getConnectionProfileFactory() {
return JptDbPlugin.instance().getConnectionProfileFactory();
}
public EntityGeneratorDatabaseAnnotationNameBuilder getEntityGeneratorDatabaseAnnotationNameBuilder() {
return GenericEntityGeneratorDatabaseAnnotationNameBuilder.instance();
}
public DatabaseFinder getDatabaseFinder() {
return DatabaseFinder.Default.instance();
}
}