blob: 236e5dde519694c630f1f32746263c65bc1a08f2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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.jpt.eclipselink.ui.internal.platform;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.core.JpaStructureNode;
import org.eclipse.jpt.core.context.AttributeMapping;
import org.eclipse.jpt.core.context.PersistentAttribute;
import org.eclipse.jpt.core.context.TypeMapping;
import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute;
import org.eclipse.jpt.core.context.orm.OrmStructureNode;
import org.eclipse.jpt.eclipselink.core.resource.orm.EclipseLinkOrmXmlResource;
import org.eclipse.jpt.eclipselink.ui.internal.EclipseLinkJpaUiFactory;
import org.eclipse.jpt.eclipselink.ui.internal.ddlgen.EclipseLinkDDLGeneratorUi;
import org.eclipse.jpt.eclipselink.ui.internal.java.details.DefaultOneToManyMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.java.details.DefaultOneToOneMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.java.details.DefaultVariableOneToOneMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.mappings.details.EclipseLinkBasicCollectionMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.mappings.details.EclipseLinkBasicMapMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.mappings.details.EclipseLinkTransformationMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.mappings.details.EclipseLinkVariableOneToOneMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmBasicMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkEntityMappingsDetailsProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmEmbeddableUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmEntityUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmIdMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmManyToManyMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmManyToOneMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmMappedSuperclassUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmOneToManyMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmOneToOneMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmPersistentAttributeDetailsProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmPersistentTypeDetailsProvider;
import org.eclipse.jpt.eclipselink.ui.internal.orm.details.EclipseLinkOrmVersionMappingUiProvider;
import org.eclipse.jpt.eclipselink.ui.internal.structure.EclipseLinkOrmResourceModelStructureProvider;
import org.eclipse.jpt.eclipselink.ui.internal.structure.EclipseLinkPersistenceResourceModelStructureProvider;
import org.eclipse.jpt.ui.details.AttributeMappingUiProvider;
import org.eclipse.jpt.ui.details.DefaultAttributeMappingUiProvider;
import org.eclipse.jpt.ui.details.JpaDetailsProvider;
import org.eclipse.jpt.ui.details.TypeMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaBasicMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaEmbeddedIdMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaEmbeddedMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaIdMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaManyToManyMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaManyToOneMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaOneToManyMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaOneToOneMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaTransientMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.JavaVersionMappingUiProvider;
import org.eclipse.jpt.ui.internal.java.details.NullAttributeMappingUiProvider;
import org.eclipse.jpt.ui.internal.orm.details.OrmEmbeddedIdMappingUiProvider;
import org.eclipse.jpt.ui.internal.orm.details.OrmEmbeddedMappingUiProvider;
import org.eclipse.jpt.ui.internal.orm.details.OrmTransientMappingUiProvider;
import org.eclipse.jpt.ui.internal.platform.base.BaseJpaPlatformUi;
import org.eclipse.jpt.ui.navigator.JpaNavigatorProvider;
import org.eclipse.jpt.ui.structure.JpaStructureProvider;
import org.eclipse.jpt.utility.internal.iterators.ArrayListIterator;
import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
public class EclipseLinkJpaPlatformUi
extends BaseJpaPlatformUi
{
private TypeMappingUiProvider<? extends TypeMapping>[] eclipseLinkOrmTypeMappingUiProviders;
private AttributeMappingUiProvider<? extends AttributeMapping>[] eclipseLinkOrmAttributeMappingUiProviders;
private JpaDetailsProvider[] eclipseLinkDetailsProviders;
public EclipseLinkJpaPlatformUi() {
super();
}
// ********** factory **********
@Override
protected EclipseLinkJpaUiFactory buildJpaUiFactory() {
return new EclipseLinkJpaUiFactory();
}
// ********** details providers **********
@Override
//EclipseLink has to be able to build UI for both the orm.xml and the eclipselink-orm.xml so we can't
//just override the ormDetailsProviders and replace them with EclipseLink, we have to instead determine
//which details providers we need based on the selected structurenode. Need to find a better way to do this
protected synchronized JpaDetailsProvider[] getDetailsProviders(JpaStructureNode structureNode) {
// TODO - overhaul this class hierarchy!
//it's getting better, but still an instanceof here - KFB
if (structureNode instanceof OrmStructureNode) {
if (((OrmStructureNode) structureNode).getOrmType() == EclipseLinkOrmXmlResource.TYPE) {
return getEclipseLinkDetailsProviders();
}
}
return super.getDetailsProviders(structureNode);
}
protected synchronized JpaDetailsProvider[] getEclipseLinkDetailsProviders() {
if (this.eclipseLinkDetailsProviders == null) {
this.eclipseLinkDetailsProviders = this.buildEclipseLinkDetailsProviders();
}
return this.eclipseLinkDetailsProviders;
}
protected JpaDetailsProvider[] buildEclipseLinkDetailsProviders() {
ArrayList<JpaDetailsProvider> providers = new ArrayList<JpaDetailsProvider>();
this.addEclipseLinkDetailsProvidersTo(providers);
return providers.toArray(new JpaDetailsProvider[providers.size()]);
}
protected void addEclipseLinkDetailsProvidersTo(List<JpaDetailsProvider> providers) {
providers.add(EclipseLinkEntityMappingsDetailsProvider.instance());
providers.add(EclipseLinkOrmPersistentTypeDetailsProvider.instance());
providers.add(EclipseLinkOrmPersistentAttributeDetailsProvider.instance());
}
// ********** Java attribute mapping UI providers **********
@Override
protected void addJavaAttributeMappingUiProvidersTo(List<AttributeMappingUiProvider<? extends AttributeMapping>> providers) {
providers.add(JavaIdMappingUiProvider.instance());
providers.add(JavaEmbeddedIdMappingUiProvider.instance());
providers.add(JavaBasicMappingUiProvider.instance());
providers.add(EclipseLinkBasicCollectionMappingUiProvider.instance());
providers.add(EclipseLinkBasicMapMappingUiProvider.instance());
providers.add(JavaVersionMappingUiProvider.instance());
providers.add(JavaManyToOneMappingUiProvider.instance());
providers.add(JavaOneToManyMappingUiProvider.instance());
providers.add(JavaOneToOneMappingUiProvider.instance());
providers.add(EclipseLinkVariableOneToOneMappingUiProvider.instance());
providers.add(JavaManyToManyMappingUiProvider.instance());
providers.add(JavaEmbeddedMappingUiProvider.instance());
providers.add(EclipseLinkTransformationMappingUiProvider.instance());
providers.add(JavaTransientMappingUiProvider.instance());
providers.add(NullAttributeMappingUiProvider.instance());
}
// ********** default Java attribute mapping UI providers **********
@Override
protected void addDefaultJavaAttributeMappingUiProvidersTo(List<DefaultAttributeMappingUiProvider<? extends AttributeMapping>> providers) {
super.addDefaultJavaAttributeMappingUiProvidersTo(providers);
providers.add(DefaultOneToOneMappingUiProvider.instance());
providers.add(DefaultOneToManyMappingUiProvider.instance());
providers.add(DefaultVariableOneToOneMappingUiProvider.instance());
}
// ********** structure providers **********
@Override
protected void addJpaStructureProvidersTo(List<JpaStructureProvider> providers) {
super.addJpaStructureProvidersTo(providers);
providers.add(EclipseLinkOrmResourceModelStructureProvider.instance());
providers.add(EclipseLinkPersistenceResourceModelStructureProvider.instance());
}
// ********** navigator provider **********
public JpaNavigatorProvider buildNavigatorProvider() {
return new EclipseLinkNavigatorProvider();
}
// ********** DDL generation **********
public void generateDDL(JpaProject project, IStructuredSelection selection) {
EclipseLinkDDLGeneratorUi.generate(project);
}
// ********** ORM attribute mapping UI providers **********
@Override
public Iterator<AttributeMappingUiProvider<? extends AttributeMapping>> attributeMappingUiProviders(PersistentAttribute attribute) {
if ((attribute instanceof OrmPersistentAttribute)
&& ((OrmPersistentAttribute) attribute).getOrmType() == EclipseLinkOrmXmlResource.TYPE) {
return eclipseLinkOrmAttributeMappingUiProviders();
}
return super.attributeMappingUiProviders(attribute);
}
public Iterator<AttributeMappingUiProvider<? extends AttributeMapping>> eclipseLinkOrmAttributeMappingUiProviders() {
if (this.eclipseLinkOrmAttributeMappingUiProviders == null) {
this.eclipseLinkOrmAttributeMappingUiProviders = this.buildEclipseLinkOrmAttributeMappingUiProviders();
}
return new ArrayListIterator<AttributeMappingUiProvider<? extends AttributeMapping>>(this.eclipseLinkOrmAttributeMappingUiProviders);
}
protected AttributeMappingUiProvider<? extends AttributeMapping>[] buildEclipseLinkOrmAttributeMappingUiProviders() {
ArrayList<AttributeMappingUiProvider<? extends AttributeMapping>> providers = new ArrayList<AttributeMappingUiProvider<? extends AttributeMapping>>();
this.addEclipseLinkOrmAttributeMappingUiProvidersTo(providers);
@SuppressWarnings("unchecked")
AttributeMappingUiProvider<? extends AttributeMapping>[] providerArray = providers.toArray(new AttributeMappingUiProvider[providers.size()]);
return providerArray;
}
protected void addEclipseLinkOrmAttributeMappingUiProvidersTo(List<AttributeMappingUiProvider<? extends AttributeMapping>> providers) {
providers.add(EclipseLinkOrmIdMappingUiProvider.instance());
providers.add(OrmEmbeddedIdMappingUiProvider.instance());
providers.add(EclipseLinkOrmBasicMappingUiProvider.instance());
providers.add(EclipseLinkBasicCollectionMappingUiProvider.instance());
providers.add(EclipseLinkBasicMapMappingUiProvider.instance());
providers.add(EclipseLinkOrmVersionMappingUiProvider.instance());
providers.add(EclipseLinkOrmManyToOneMappingUiProvider.instance());
providers.add(EclipseLinkOrmOneToManyMappingUiProvider.instance());
providers.add(EclipseLinkOrmOneToOneMappingUiProvider.instance());
providers.add(EclipseLinkVariableOneToOneMappingUiProvider.instance());
providers.add(EclipseLinkOrmManyToManyMappingUiProvider.instance());
providers.add(OrmEmbeddedMappingUiProvider.instance());
providers.add(EclipseLinkTransformationMappingUiProvider.instance());
providers.add(OrmTransientMappingUiProvider.instance());
}
public Iterator<DefaultAttributeMappingUiProvider<? extends AttributeMapping>> defaultEclipseLinkOrmAttributeMappingUiProviders() {
return EmptyIterator.instance();
}
public Iterator<TypeMappingUiProvider<? extends TypeMapping>> eclipseLinkOrmTypeMappingUiProviders() {
if (this.eclipseLinkOrmTypeMappingUiProviders == null) {
this.eclipseLinkOrmTypeMappingUiProviders = this.buildEclipseLinkOrmTypeMappingUiProviders();
}
return new ArrayListIterator<TypeMappingUiProvider<? extends TypeMapping>>(this.eclipseLinkOrmTypeMappingUiProviders);
}
protected TypeMappingUiProvider<? extends TypeMapping>[] buildEclipseLinkOrmTypeMappingUiProviders() {
ArrayList<TypeMappingUiProvider<? extends TypeMapping>> providers = new ArrayList<TypeMappingUiProvider<? extends TypeMapping>>();
this.addEclipseLinkOrmTypeMappingUiProvidersTo(providers);
@SuppressWarnings("unchecked")
TypeMappingUiProvider<? extends TypeMapping>[] providerArray = providers.toArray(new TypeMappingUiProvider[providers.size()]);
return providerArray;
}
protected void addEclipseLinkOrmTypeMappingUiProvidersTo(List<TypeMappingUiProvider<? extends TypeMapping>> providers) {
providers.add(EclipseLinkOrmEntityUiProvider.instance());
providers.add(EclipseLinkOrmMappedSuperclassUiProvider.instance());
providers.add(EclipseLinkOrmEmbeddableUiProvider.instance());
}
}