blob: e72e20ad68e07ba4c027ebdc5ad10e697dac6905 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2011 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.jpa.eclipselink.core.internal.context.orm;
import java.util.List;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.common.utility.internal.iterables.CompositeIterable;
import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable;
import org.eclipse.jpt.common.utility.internal.iterables.EmptyListIterable;
import org.eclipse.jpt.common.utility.internal.iterables.ListIterable;
import org.eclipse.jpt.common.utility.internal.iterables.LiveCloneListIterable;
import org.eclipse.jpt.common.utility.internal.iterables.SuperListIterableWrapper;
import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
import org.eclipse.jpt.jpa.core.context.DiscriminatorType;
import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedDiscriminatorColumn;
import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
import org.eclipse.jpt.jpa.core.context.orm.OrmTypeMapping;
import org.eclipse.jpt.jpa.core.context.orm.OrmXml;
import org.eclipse.jpt.jpa.core.internal.context.JptValidator;
import org.eclipse.jpt.jpa.core.internal.context.NamedColumnTextRangeResolver;
import org.eclipse.jpt.jpa.core.internal.context.orm.AbstractEntityMappings;
import org.eclipse.jpt.jpa.db.Table;
import org.eclipse.jpt.jpa.eclipselink.core.JptJpaEclipseLinkCorePlugin;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeMapping;
import org.eclipse.jpt.jpa.eclipselink.core.context.ReadOnlyTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkEntityMappings;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmEclipseLinkConverterContainer;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmReadOnlyTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.OrmVirtualTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.persistence.EclipseLinkPersistenceUnit;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlEntityMappings;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTenantDiscriminatorColumn;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_3.XmlTenantDiscriminatorColumn_2_3;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
public class EclipseLinkEntityMappingsImpl
extends AbstractEntityMappings
implements EclipseLinkEntityMappings
{
protected final OrmEclipseLinkConverterContainer converterContainer;
protected final ContextListContainer<OrmTenantDiscriminatorColumn2_3, XmlTenantDiscriminatorColumn_2_3> specifiedTenantDiscriminatorColumnContainer;
protected final OrmReadOnlyTenantDiscriminatorColumn2_3.Owner tenantDiscriminatorColumnOwner;
protected final ContextListContainer<OrmVirtualTenantDiscriminatorColumn2_3, ReadOnlyTenantDiscriminatorColumn2_3> defaultTenantDiscriminatorColumnContainer;
public EclipseLinkEntityMappingsImpl(OrmXml parent, XmlEntityMappings resource) {
super(parent, resource);
this.converterContainer = this.buildConverterContainer();
this.tenantDiscriminatorColumnOwner = this.buildTenantDiscriminatorColumnOwner();
this.specifiedTenantDiscriminatorColumnContainer = this.buildSpecifiedTenantDiscriminatorColumnContainer();
this.defaultTenantDiscriminatorColumnContainer = this.buildDefaultTenantDiscriminatorColumnContainer();
}
// ********** synchronize/update **********
@Override
public void synchronizeWithResourceModel() {
super.synchronizeWithResourceModel();
this.converterContainer.synchronizeWithResourceModel();
this.syncSpecifiedTenantDiscriminatorColumns();
}
@Override
public void update() {
super.update();
this.converterContainer.update();
this.updateNodes(this.getSpecifiedTenantDiscriminatorColumns());
this.updateDefaultTenantDiscriminatorColumns();
}
@Override
public XmlEntityMappings getXmlEntityMappings() {
return (XmlEntityMappings) super.getXmlEntityMappings();
}
// ********** converter container **********
public OrmEclipseLinkConverterContainer getConverterContainer() {
return this.converterContainer;
}
protected OrmEclipseLinkConverterContainer buildConverterContainer() {
return new OrmEclipseLinkConverterContainerImpl(this, (XmlEntityMappings) this.xmlEntityMappings);
}
@SuppressWarnings("unchecked")
public Iterable<EclipseLinkConverter> getMappingFileConverters() {
return new CompositeIterable<EclipseLinkConverter>(
this.converterContainer.getConverters(),
this.getTypeMappingConverters()
);
}
protected Iterable<EclipseLinkConverter> getTypeMappingConverters() {
return new CompositeIterable<EclipseLinkConverter>(this.getTypeMappingConverterLists());
}
protected Iterable<Iterable<EclipseLinkConverter>> getTypeMappingConverterLists() {
return new TransformationIterable<OrmTypeMapping, Iterable<EclipseLinkConverter>>(this.getTypeMappings()) {
@Override
protected Iterable<EclipseLinkConverter> transform(OrmTypeMapping typeMapping) {
return ((EclipseLinkTypeMapping) typeMapping).getConverters();
}
};
}
// ********** tenant discriminator columns **********
public ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getTenantDiscriminatorColumns() {
return this.hasSpecifiedTenantDiscriminatorColumns() ?
this.getReadOnlySpecifiedTenantDiscriminatorColumns() :
this.getReadOnlyDefaultTenantDiscriminatorColumns();
}
public int getTenantDiscriminatorColumnsSize() {
return this.hasSpecifiedTenantDiscriminatorColumns() ?
this.getSpecifiedTenantDiscriminatorColumnsSize() :
this.getDefaultTenantDiscriminatorColumnsSize();
}
// ********** specified tenant discriminator columns **********
public ListIterable<OrmTenantDiscriminatorColumn2_3> getSpecifiedTenantDiscriminatorColumns() {
return this.specifiedTenantDiscriminatorColumnContainer.getContextElements();
}
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getReadOnlySpecifiedTenantDiscriminatorColumns() {
return new SuperListIterableWrapper<ReadOnlyTenantDiscriminatorColumn2_3>(this.getSpecifiedTenantDiscriminatorColumns());
}
public int getSpecifiedTenantDiscriminatorColumnsSize() {
return this.specifiedTenantDiscriminatorColumnContainer.getContextElementsSize();
}
public boolean hasSpecifiedTenantDiscriminatorColumns() {
return this.getSpecifiedTenantDiscriminatorColumnsSize() != 0;
}
public OrmTenantDiscriminatorColumn2_3 getSpecifiedTenantDiscriminatorColumn(int index) {
return this.specifiedTenantDiscriminatorColumnContainer.getContextElement(index);
}
public OrmTenantDiscriminatorColumn2_3 addSpecifiedTenantDiscriminatorColumn() {
return this.addSpecifiedTenantDiscriminatorColumn(this.getSpecifiedTenantDiscriminatorColumnsSize());
}
public OrmTenantDiscriminatorColumn2_3 addSpecifiedTenantDiscriminatorColumn(int index) {
XmlTenantDiscriminatorColumn xmlJoinColumn = this.buildXmlTenantDiscriminatorColumn();
OrmTenantDiscriminatorColumn2_3 joinColumn = this.specifiedTenantDiscriminatorColumnContainer.addContextElement(index, xmlJoinColumn);
this.getXmlEntityMappings().getTenantDiscriminatorColumns().add(index, xmlJoinColumn);
return joinColumn;
}
protected XmlTenantDiscriminatorColumn buildXmlTenantDiscriminatorColumn() {
return EclipseLinkOrmFactory.eINSTANCE.createXmlTenantDiscriminatorColumn();
}
public void removeSpecifiedTenantDiscriminatorColumn(OrmTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
this.removeSpecifiedTenantDiscriminatorColumn(this.specifiedTenantDiscriminatorColumnContainer.indexOfContextElement(tenantDiscriminatorColumn));
}
public void removeSpecifiedTenantDiscriminatorColumn(int index) {
this.specifiedTenantDiscriminatorColumnContainer.removeContextElement(index);
this.getXmlEntityMappings().getTenantDiscriminatorColumns().remove(index);
}
public void moveSpecifiedTenantDiscriminatorColumn(int targetIndex, int sourceIndex) {
this.specifiedTenantDiscriminatorColumnContainer.moveContextElement(targetIndex, sourceIndex);
this.getXmlEntityMappings().getTenantDiscriminatorColumns().move(targetIndex, sourceIndex);
}
protected void syncSpecifiedTenantDiscriminatorColumns() {
this.specifiedTenantDiscriminatorColumnContainer.synchronizeWithResourceModel();
}
protected ListIterable<XmlTenantDiscriminatorColumn_2_3> getXmlTenantDiscriminatorColumns() {
if (getXmlEntityMappings() == null) {
return EmptyListIterable.instance();
}
// clone to reduce chance of concurrency problems
return new LiveCloneListIterable<XmlTenantDiscriminatorColumn_2_3>(this.getXmlEntityMappings().getTenantDiscriminatorColumns());
}
/**
* specified tenant discriminator column container
*/
protected class SpecifiedTenantDiscriminatorColumnContainer
extends ContextListContainer<OrmTenantDiscriminatorColumn2_3, XmlTenantDiscriminatorColumn_2_3>
{
@Override
protected String getContextElementsPropertyName() {
return SPECIFIED_TENANT_DISCRIMINATOR_COLUMNS_LIST;
}
@Override
protected OrmTenantDiscriminatorColumn2_3 buildContextElement(XmlTenantDiscriminatorColumn_2_3 resourceElement) {
return EclipseLinkEntityMappingsImpl.this.buildTenantDiscriminatorColumn(resourceElement);
}
@Override
protected ListIterable<XmlTenantDiscriminatorColumn_2_3> getResourceElements() {
return EclipseLinkEntityMappingsImpl.this.getXmlTenantDiscriminatorColumns();
}
@Override
protected XmlTenantDiscriminatorColumn_2_3 getResourceElement(OrmTenantDiscriminatorColumn2_3 contextElement) {
return contextElement.getXmlColumn();
}
}
protected OrmReadOnlyTenantDiscriminatorColumn2_3.Owner buildTenantDiscriminatorColumnOwner() {
return new TenantDiscriminatorColumnOwner();
}
protected SpecifiedTenantDiscriminatorColumnContainer buildSpecifiedTenantDiscriminatorColumnContainer() {
SpecifiedTenantDiscriminatorColumnContainer container = new SpecifiedTenantDiscriminatorColumnContainer();
container.initialize();
return container;
}
protected OrmTenantDiscriminatorColumn2_3 buildTenantDiscriminatorColumn(XmlTenantDiscriminatorColumn_2_3 xmlTenantDiscriminatorColumn) {
return new EclipseLinkOrmTenantDiscriminatorColumn2_3(this, this.tenantDiscriminatorColumnOwner, xmlTenantDiscriminatorColumn);
}
// ********** default tenant discriminator columns **********
public ListIterable<OrmVirtualTenantDiscriminatorColumn2_3> getDefaultTenantDiscriminatorColumns() {
return this.defaultTenantDiscriminatorColumnContainer.getContextElements();
}
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getReadOnlyDefaultTenantDiscriminatorColumns() {
return new SuperListIterableWrapper<ReadOnlyTenantDiscriminatorColumn2_3>(this.getDefaultTenantDiscriminatorColumns());
}
public int getDefaultTenantDiscriminatorColumnsSize() {
return this.defaultTenantDiscriminatorColumnContainer.getContextElementsSize();
}
protected void clearDefaultTenantDiscriminatorColumns() {
this.defaultTenantDiscriminatorColumnContainer.clearContextList();
}
/**
* If there are any specified tenant discriminator columns, then there are no default
* tenant discriminator columns.
* @see #getTenantDiscriminatorColumnsForDefaults()
*/
protected void updateDefaultTenantDiscriminatorColumns() {
this.defaultTenantDiscriminatorColumnContainer.update();
}
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getTenantDiscriminatorColumnsForDefaults() {
if (this.getSpecifiedTenantDiscriminatorColumnsSize() > 0) {
return EmptyListIterable.instance();
}
return getContextDefaultTenantDiscriminatorColumns();
}
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getContextDefaultTenantDiscriminatorColumns() {
return this.getPersistenceUnit().getDefaultTenantDiscriminatorColumns();
}
protected void moveDefaultTenantDiscriminatorColumn(int index, OrmVirtualTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
this.defaultTenantDiscriminatorColumnContainer.moveContextElement(index, tenantDiscriminatorColumn);
}
protected OrmVirtualTenantDiscriminatorColumn2_3 addDefaultTenantDiscriminatorColumn(int index, OrmTenantDiscriminatorColumn2_3 ormTenantDiscriminatorColumn) {
return this.defaultTenantDiscriminatorColumnContainer.addContextElement(index, ormTenantDiscriminatorColumn);
}
protected OrmVirtualTenantDiscriminatorColumn2_3 buildVirtualTenantDiscriminatorColumn(ReadOnlyTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
return new GenericOrmVirtualTenantDiscriminatorColumn2_3(this, this.tenantDiscriminatorColumnOwner, tenantDiscriminatorColumn);
}
protected void removeDefaultTenantDiscriminatorColumn(OrmVirtualTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
this.defaultTenantDiscriminatorColumnContainer.removeContextElement(tenantDiscriminatorColumn);
}
protected DefaultTenantDiscriminatorColumnContainer buildDefaultTenantDiscriminatorColumnContainer() {
return new DefaultTenantDiscriminatorColumnContainer();
}
/**
* default tenant discriminator column container
*/
protected class DefaultTenantDiscriminatorColumnContainer
extends ContextListContainer<OrmVirtualTenantDiscriminatorColumn2_3, ReadOnlyTenantDiscriminatorColumn2_3>
{
@Override
protected String getContextElementsPropertyName() {
return DEFAULT_TENANT_DISCRIMINATOR_COLUMNS_LIST;
}
@Override
protected OrmVirtualTenantDiscriminatorColumn2_3 buildContextElement(ReadOnlyTenantDiscriminatorColumn2_3 resourceElement) {
return EclipseLinkEntityMappingsImpl.this.buildVirtualTenantDiscriminatorColumn(resourceElement);
}
@Override
protected ListIterable<ReadOnlyTenantDiscriminatorColumn2_3> getResourceElements() {
return EclipseLinkEntityMappingsImpl.this.getTenantDiscriminatorColumnsForDefaults();
}
@Override
protected ReadOnlyTenantDiscriminatorColumn2_3 getResourceElement(OrmVirtualTenantDiscriminatorColumn2_3 contextElement) {
return contextElement.getOverriddenColumn();
}
}
// ********** OrmReadOnlyTenantDiscriminatorColumn.Owner implementation **********
protected class TenantDiscriminatorColumnOwner
implements OrmReadOnlyTenantDiscriminatorColumn2_3.Owner
{
public String getDefaultContextPropertyName() {
return ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_CONTEXT_PROPERTY;
}
public boolean getDefaultPrimaryKey() {
return ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_PRIMARY_KEY;
}
public int getDefaultLength() {
return ReadOnlyNamedDiscriminatorColumn.DEFAULT_LENGTH;
}
public DiscriminatorType getDefaultDiscriminatorType() {
return ReadOnlyNamedDiscriminatorColumn.DEFAULT_DISCRIMINATOR_TYPE;
}
/**
* No default table name in the context of entity mappings
*/
public String getDefaultTableName() {
return null;
}
public String getDefaultColumnName(ReadOnlyNamedColumn column) {
return ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_NAME;
}
/**
* No table in the context of entity mappings
*/
public Table resolveDbTable(String tableName) {
return null;
}
public Iterable<String> getCandidateTableNames() {
return EmptyIterable.instance();
}
public boolean tableNameIsInvalid(String tableName) {
return false;
}
/**
* no column validation can be done in the context of the persistence unit defaults
*/
public JptValidator buildColumnValidator(ReadOnlyNamedColumn column, NamedColumnTextRangeResolver textRangeResolver) {
return JptValidator.Null.instance();
}
public TextRange getValidationTextRange() {
return EclipseLinkEntityMappingsImpl.this.getValidationTextRange();
}
}
// ********** misc **********
@Override
public EclipseLinkPersistenceUnit getPersistenceUnit() {
return (EclipseLinkPersistenceUnit) super.getPersistenceUnit();
}
@Override
protected IContentType getContentType() {
return JptJpaEclipseLinkCorePlugin.ECLIPSELINK_ORM_XML_CONTENT_TYPE;
}
// ********** refactoring **********
@SuppressWarnings("unchecked")
@Override
public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) {
return new CompositeIterable<ReplaceEdit>(
super.createRenameTypeEdits(originalType, newName),
this.createConverterRenameTypeEdits(originalType, newName));
}
protected Iterable<ReplaceEdit> createConverterRenameTypeEdits(IType originalType, String newName) {
return this.converterContainer.createRenameTypeEdits(originalType, newName);
}
@SuppressWarnings("unchecked")
@Override
public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) {
return new CompositeIterable<ReplaceEdit>(
super.createMoveTypeEdits(originalType, newPackage),
this.createConverterMoveTypeEdits(originalType, newPackage));
}
protected Iterable<ReplaceEdit> createConverterMoveTypeEdits(IType originalType, IPackageFragment newPackage) {
return this.converterContainer.createMoveTypeEdits(originalType, newPackage);
}
@SuppressWarnings("unchecked")
@Override
public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return new CompositeIterable<ReplaceEdit>(
super.createRenamePackageEdits(originalPackage, newName),
this.createConverterRenamePackageEdits(originalPackage, newName));
}
protected Iterable<ReplaceEdit> createConverterRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return this.converterContainer.createRenamePackageEdits(originalPackage, newName);
}
// ********** validation **********
@Override
public void validate(List<IMessage> messages, IReporter reporter) {
super.validate(messages, reporter);
this.converterContainer.validate(messages, reporter);
}
}