blob: f69f857e75fe5df2d708f83837712f1b5e78dcc4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2012 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 org.eclipse.jpt.common.core.utility.TextRange;
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.jpa.core.context.DiscriminatorType;
import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedColumn;
import org.eclipse.jpt.jpa.core.context.ReadOnlyNamedDiscriminatorColumn;
import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitMetadata;
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.jpa1.context.orm.AbstractOrmPersistenceUnitDefaults;
import org.eclipse.jpt.jpa.db.Table;
import org.eclipse.jpt.jpa.eclipselink.core.context.ReadOnlyTenantDiscriminatorColumn2_3;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkPersistenceUnitDefaults;
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.resource.orm.EclipseLinkOrmFactory;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlAccessMethods;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlPersistenceUnitDefaults;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTenantDiscriminatorColumn;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.v2_3.XmlTenantDiscriminatorColumn_2_3;
/**
* EclipseLink <code>orm.xml</code> file
* <br>
* <code>persistence-unit-defaults</code> element
*/
public class OrmEclipseLinkPersistenceUnitDefaults
extends AbstractOrmPersistenceUnitDefaults
implements EclipseLinkPersistenceUnitDefaults
{
protected final ContextListContainer<OrmTenantDiscriminatorColumn2_3, XmlTenantDiscriminatorColumn_2_3> tenantDiscriminatorColumnContainer;
protected final OrmReadOnlyTenantDiscriminatorColumn2_3.Owner tenantDiscriminatorColumnOwner;
protected String specifiedGetMethod;
protected String specifiedSetMethod;
// ********** constructor/initialization **********
public OrmEclipseLinkPersistenceUnitDefaults(OrmPersistenceUnitMetadata parent) {
super(parent);
this.tenantDiscriminatorColumnOwner = this.buildTenantDiscriminatorColumnOwner();
this.tenantDiscriminatorColumnContainer = this.buildTenantDiscriminatorColumnContainer();
this.specifiedGetMethod = this.buildSpecifiedGetMethod();
this.specifiedSetMethod = this.buildSpecifiedSetMethod();
}
@Override
protected XmlPersistenceUnitDefaults buildXmlPersistenceUnitDefaults() {
return EclipseLinkOrmFactory.eINSTANCE.createXmlPersistenceUnitDefaults();
}
@Override
protected XmlPersistenceUnitDefaults getXmlDefaults() {
return (XmlPersistenceUnitDefaults) super.getXmlDefaults();
}
@Override
protected XmlPersistenceUnitDefaults getXmlDefaultsForUpdate() {
return (XmlPersistenceUnitDefaults) super.getXmlDefaultsForUpdate();
}
// ********** synchronize/update **********
@Override
public void synchronizeWithResourceModel() {
super.synchronizeWithResourceModel();
this.syncTenantDiscriminatorColumns();
this.setSpecifiedGetMethod_(this.buildSpecifiedGetMethod());
this.setSpecifiedSetMethod_(this.buildSpecifiedSetMethod());
}
@Override
public void update() {
super.update();
this.updateNodes(this.getTenantDiscriminatorColumns());
}
// ********** tenant discriminator columns **********
public ListIterable<OrmTenantDiscriminatorColumn2_3> getTenantDiscriminatorColumns() {
return this.tenantDiscriminatorColumnContainer.getContextElements();
}
public int getTenantDiscriminatorColumnsSize() {
return this.tenantDiscriminatorColumnContainer.getContextElementsSize();
}
public boolean hasTenantDiscriminatorColumns() {
return this.getTenantDiscriminatorColumnsSize() != 0;
}
public OrmTenantDiscriminatorColumn2_3 getTenantDiscriminatorColumn(int index) {
return this.tenantDiscriminatorColumnContainer.getContextElement(index);
}
public OrmTenantDiscriminatorColumn2_3 addTenantDiscriminatorColumn() {
return this.addTenantDiscriminatorColumn(this.getTenantDiscriminatorColumnsSize());
}
public OrmTenantDiscriminatorColumn2_3 addTenantDiscriminatorColumn(int index) {
XmlTenantDiscriminatorColumn xmlJoinColumn = this.buildXmlTenantDiscriminatorColumn();
OrmTenantDiscriminatorColumn2_3 joinColumn = this.tenantDiscriminatorColumnContainer.addContextElement(index, xmlJoinColumn);
this.getXmlDefaultsForUpdate().getTenantDiscriminatorColumns().add(index, xmlJoinColumn);
return joinColumn;
}
protected XmlTenantDiscriminatorColumn buildXmlTenantDiscriminatorColumn() {
return EclipseLinkOrmFactory.eINSTANCE.createXmlTenantDiscriminatorColumn();
}
public void removeTenantDiscriminatorColumn(OrmTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn) {
this.removeTenantDiscriminatorColumn(this.tenantDiscriminatorColumnContainer.indexOfContextElement(tenantDiscriminatorColumn));
}
public void removeTenantDiscriminatorColumn(int index) {
this.tenantDiscriminatorColumnContainer.removeContextElement(index);
this.getXmlDefaults().getTenantDiscriminatorColumns().remove(index);
}
public void moveTenantDiscriminatorColumn(int targetIndex, int sourceIndex) {
this.tenantDiscriminatorColumnContainer.moveContextElement(targetIndex, sourceIndex);
this.getXmlDefaults().getTenantDiscriminatorColumns().move(targetIndex, sourceIndex);
}
protected void syncTenantDiscriminatorColumns() {
this.tenantDiscriminatorColumnContainer.synchronizeWithResourceModel();
}
protected ListIterable<XmlTenantDiscriminatorColumn_2_3> getXmlTenantDiscriminatorColumns() {
if (getXmlDefaults() == null) {
return EmptyListIterable.instance();
}
// clone to reduce chance of concurrency problems
return new LiveCloneListIterable<XmlTenantDiscriminatorColumn_2_3>(this.getXmlDefaults().getTenantDiscriminatorColumns());
}
/**
* tenant discriminator column container
*/
protected class TenantDiscriminatorColumnContainer
extends ContextListContainer<OrmTenantDiscriminatorColumn2_3, XmlTenantDiscriminatorColumn_2_3>
{
@Override
protected String getContextElementsPropertyName() {
return TENANT_DISCRIMINATOR_COLUMNS_LIST;
}
@Override
protected OrmTenantDiscriminatorColumn2_3 buildContextElement(XmlTenantDiscriminatorColumn_2_3 resourceElement) {
return OrmEclipseLinkPersistenceUnitDefaults.this.buildTenantDiscriminatorColumn(resourceElement);
}
@Override
protected ListIterable<XmlTenantDiscriminatorColumn_2_3> getResourceElements() {
return OrmEclipseLinkPersistenceUnitDefaults.this.getXmlTenantDiscriminatorColumns();
}
@Override
protected XmlTenantDiscriminatorColumn_2_3 getResourceElement(OrmTenantDiscriminatorColumn2_3 contextElement) {
return contextElement.getXmlColumn();
}
}
protected OrmReadOnlyTenantDiscriminatorColumn2_3.Owner buildTenantDiscriminatorColumnOwner() {
return new TenantDiscriminatorColumnOwner();
}
protected OrmTenantDiscriminatorColumn2_3 buildTenantDiscriminatorColumn(XmlTenantDiscriminatorColumn_2_3 xmlTenantDiscriminatorColumn) {
return new EclipseLinkOrmTenantDiscriminatorColumn2_3(this, this.tenantDiscriminatorColumnOwner, xmlTenantDiscriminatorColumn);
}
protected ContextListContainer<OrmTenantDiscriminatorColumn2_3, XmlTenantDiscriminatorColumn_2_3> buildTenantDiscriminatorColumnContainer() {
TenantDiscriminatorColumnContainer container = new TenantDiscriminatorColumnContainer();
container.initialize();
return container;
}
// ********** 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 the persistence unit defaults
*/
public String getDefaultTableName() {
return null;
}
public String getDefaultColumnName(ReadOnlyNamedColumn column) {
return ReadOnlyTenantDiscriminatorColumn2_3.DEFAULT_NAME;
}
/**
* No table in the context of the persistence unit defaults
*/
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 OrmEclipseLinkPersistenceUnitDefaults.this.getValidationTextRange();
}
}
//*************** get method *****************
public String getGetMethod() {
return this.getSpecifiedGetMethod();
}
public String getDefaultGetMethod() {
return null;
}
public String getSpecifiedGetMethod() {
return this.specifiedGetMethod;
}
public void setSpecifiedGetMethod(String getMethod) {
if (this.valuesAreDifferent(this.specifiedGetMethod, getMethod)) {
XmlAccessMethods xmlAccessMethods = this.getXmlAccessMethodsForUpdate();
this.setSpecifiedGetMethod_(getMethod);
xmlAccessMethods.setGetMethod(getMethod);
this.removeXmlAccessMethodsIfUnset();
}
}
protected void setSpecifiedGetMethod_(String getMethod) {
String old = this.specifiedGetMethod;
this.specifiedGetMethod = getMethod;
this.firePropertyChanged(SPECIFIED_GET_METHOD_PROPERTY, old, getMethod);
}
protected String buildSpecifiedGetMethod() {
XmlAccessMethods accessMethods = this.getXmlAccessMethods();
return accessMethods != null ? accessMethods.getGetMethod() : null;
}
//*************** set method *****************
public String getSetMethod() {
return this.getSpecifiedSetMethod();
}
public String getDefaultSetMethod() {
return null;
}
public String getSpecifiedSetMethod() {
return this.specifiedSetMethod;
}
public void setSpecifiedSetMethod(String setMethod) {
if (this.valuesAreDifferent(this.specifiedSetMethod, setMethod)) {
XmlAccessMethods xmlAccessMethods = this.getXmlAccessMethodsForUpdate();
this.setSpecifiedSetMethod_(setMethod);
xmlAccessMethods.setSetMethod(setMethod);
this.removeXmlAccessMethodsIfUnset();
}
}
protected void setSpecifiedSetMethod_(String setMethod) {
String old = this.specifiedSetMethod;
this.specifiedSetMethod = setMethod;
this.firePropertyChanged(SPECIFIED_SET_METHOD_PROPERTY, old, setMethod);
}
protected String buildSpecifiedSetMethod() {
XmlAccessMethods accessMethods = this.getXmlAccessMethods();
return accessMethods != null ? accessMethods.getSetMethod() : null;
}
//*************** XML access methods *****************
protected XmlAccessMethods getXmlAccessMethods() {
XmlPersistenceUnitDefaults xmlDefaults = getXmlDefaults();
return xmlDefaults != null ? getXmlDefaults().getAccessMethods() : null;
}
/**
* Build the XML access methods (and XML defaults and XML metadata if necessary) if it does not exist.
*/
protected XmlAccessMethods getXmlAccessMethodsForUpdate() {
XmlPersistenceUnitDefaults xmlDefaults = this.getXmlDefaultsForUpdate();
XmlAccessMethods xmlAccessMethods = xmlDefaults.getAccessMethods();
return (xmlAccessMethods != null) ? xmlAccessMethods : this.buildXmlAccessMethods();
}
protected XmlAccessMethods buildXmlAccessMethods() {
XmlAccessMethods xmlAccessMethods = this.buildXmlAccessMethods_();
this.getXmlDefaults().setAccessMethods(xmlAccessMethods);
return xmlAccessMethods;
}
protected XmlAccessMethods buildXmlAccessMethods_() {
return EclipseLinkOrmFactory.eINSTANCE.createXmlAccessMethods();
}
/**
* clear the XML access methods (and the XML defaults and XML metadata) if appropriate
*/
protected void removeXmlAccessMethodsIfUnset() {
if (this.getXmlAccessMethods().isUnset()) {
this.getXmlDefaults().setAccessMethods(null);
this.removeXmlDefaultsIfUnset();
}
}
// ********** completion proposals **********
@Override
public Iterable<String> getXmlCompletionProposals(int pos) {
Iterable<String> result = super.getXmlCompletionProposals(pos);
if (result != null) {
return result;
}
for (OrmTenantDiscriminatorColumn2_3 tenantDiscriminatorColumn : this.getTenantDiscriminatorColumns()) {
result = tenantDiscriminatorColumn.getXmlCompletionProposals(pos);
if (result != null) {
return result;
}
}
return null;
}
}