/*******************************************************************************
* Copyright (c) 2009-2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.jpt.core.internal.context.java;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.common.utility.internal.iterable.FilteringIterable;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.internal.iterable.TransformationIterable;
import org.eclipse.jpt.common.utility.internal.predicate.PredicateTools;
import org.eclipse.jpt.common.utility.transformer.Transformer;
import org.eclipse.jpt.jpa.core.context.BaseJoinColumn;
import org.eclipse.jpt.jpa.core.context.Entity;
import org.eclipse.jpt.jpa.core.context.NamedColumn;
import org.eclipse.jpt.jpa.core.context.Table;
import org.eclipse.jpt.jpa.core.context.TypeMapping;
import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
import org.eclipse.jpt.jpa.core.internal.context.java.AbstractJavaEntity;
import org.eclipse.jpt.jpa.core.internal.jpa2.context.java.NullJavaCacheable2_0;
import org.eclipse.jpt.jpa.core.jpa2.context.Cacheable2_0;
import org.eclipse.jpt.jpa.core.jpa2.context.CacheableReference2_0;
import org.eclipse.jpt.jpa.core.jpa2.context.persistence.PersistenceUnit2_0;
import org.eclipse.jpt.jpa.core.resource.java.EntityAnnotation;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.jboss.tools.hibernate.jpt.core.internal.HibernateAbstractJpaFactory;
import org.jboss.tools.hibernate.jpt.core.internal.HibernateJpaProject;
import org.jboss.tools.hibernate.jpt.core.internal.HibernateJptPlugin;
import org.jboss.tools.hibernate.jpt.core.internal.context.HibernateTable;
import org.jboss.tools.hibernate.jpt.core.internal.context.Messages;
import org.jboss.tools.hibernate.jpt.core.internal.resource.java.DiscriminatorFormulaAnnotation;
import org.jboss.tools.hibernate.jpt.core.internal.validation.HibernateJpaValidationMessage;
import org.jboss.tools.hibernate.runtime.spi.INamingStrategy;
/**
* @author Dmitry Geraskov
*
*/
@SuppressWarnings("restriction")
public class HibernateJavaEntityImpl extends AbstractJavaEntity
implements HibernateJavaEntity {
protected final HibernateJavaTypeDefContainer typeDefContainer;
protected JavaDiscriminatorFormula discriminatorFormula;
protected final Cacheable2_0 cacheable;
public HibernateJavaEntityImpl(JavaPersistentType parent, EntityAnnotation mappingAnnotation) {
super(parent, mappingAnnotation);
this.discriminatorFormula = this.buildDiscriminatorFormula();
this.typeDefContainer = getJpaFactory().buildJavaTypeDefContainer(parent, this.getJavaResourceType());
this.cacheable = this.buildJavaCachable();
}
protected Cacheable2_0 buildJavaCachable() {
return this.isJpa2_0Compatible() ?
this.getJpaFactory2_0().buildJavaCacheable(this) :
new NullJavaCacheable2_0(this);
}
@Override
public void synchronizeWithResourceModel(IProgressMonitor monitor) {
super.synchronizeWithResourceModel(monitor);
this.cacheable.synchronizeWithResourceModel(monitor);
this.typeDefContainer.synchronizeWithResourceModel(monitor);
this.syncDiscriminatorFormula(monitor);
}
@Override
public void update(IProgressMonitor monitor) {
super.update(monitor);
this.cacheable.update(monitor);
this.typeDefContainer.update(monitor);
if (discriminatorFormula != null){
this.discriminatorFormula.update(monitor);
}
}
@Override
protected HibernateAbstractJpaFactory getJpaFactory() {
return (HibernateAbstractJpaFactory) this.getJpaPlatform().getJpaFactory();
}
@Override
public HibernateJpaProject getJpaProject() {
return (HibernateJpaProject) super.getJpaProject();
}
@Override
public HibernateJavaTypeDefContainer getTypeDefContainer() {
return this.typeDefContainer;
}
@Override
public HibernateJavaTable getTable() {
return (HibernateJavaTable) super.getTable();
}
// ********************* DiscriminatorFormula **************
@Override
public JavaDiscriminatorFormula getDiscriminatorFormula() {
return this.discriminatorFormula;
}
@Override
public JavaDiscriminatorFormula addDiscriminatorFormula() {
if (getDiscriminatorFormula() != null) {
throw new IllegalStateException("discriminatorFormula already exists"); //$NON-NLS-1$
}
DiscriminatorFormulaAnnotation annotation = this.buildDiscriminatorFormulaAnnotation();
JavaDiscriminatorFormula discriminatorFormula = buildDiscriminatorFormula(annotation);
this.setDiscriminatorFormula(discriminatorFormula);
return discriminatorFormula;
}
protected DiscriminatorFormulaAnnotation buildDiscriminatorFormulaAnnotation() {
return (DiscriminatorFormulaAnnotation) this.getJavaResourceType().addAnnotation(DiscriminatorFormulaAnnotation.ANNOTATION_NAME);
}
@Override
public void removeDiscriminatorFormula() {
if (getDiscriminatorFormula() == null) {
throw new IllegalStateException("discriminatorFormula does not exist, cannot be removed"); //$NON-NLS-1$
}
this.getJavaResourceType().removeAnnotation(DiscriminatorFormulaAnnotation.ANNOTATION_NAME);
this.setDiscriminatorFormula(null);
}
protected JavaDiscriminatorFormula buildDiscriminatorFormula() {
DiscriminatorFormulaAnnotation annotation = this.getDiscriminatorFormulaAnnotation();
return (annotation == null) ? null : this.buildDiscriminatorFormula(annotation);
}
public DiscriminatorFormulaAnnotation getDiscriminatorFormulaAnnotation() {
return (DiscriminatorFormulaAnnotation) this.getJavaResourceType().getAnnotation(DiscriminatorFormulaAnnotation.ANNOTATION_NAME);
}
protected JavaDiscriminatorFormula buildDiscriminatorFormula(DiscriminatorFormulaAnnotation annotation) {
return getJpaFactory().buildJavaDiscriminatorFormula(this, annotation);
}
protected void syncDiscriminatorFormula(IProgressMonitor monitor) {
DiscriminatorFormulaAnnotation annotation = getDiscriminatorFormulaAnnotation();
if (annotation == null) {
if (getDiscriminatorFormula() != null) {
setDiscriminatorFormula(null);
}
}
else {
if ((getDiscriminatorFormula() != null)
&& (getDiscriminatorFormula().getDiscriminatorFormulaAnnotation() == annotation)) {
this.discriminatorFormula.synchronizeWithResourceModel(monitor);
} else {
this.setDiscriminatorFormula(this.buildDiscriminatorFormula(annotation));
}
}
}
protected void setDiscriminatorFormula(JavaDiscriminatorFormula newDiscriminatorFormula) {
JavaDiscriminatorFormula oldDiscriminatorFormula = this.discriminatorFormula;
this.discriminatorFormula = newDiscriminatorFormula;
firePropertyChanged(DISCRIMINATOR_FORMULA_PROPERTY, oldDiscriminatorFormula, newDiscriminatorFormula);
}
@Override
public HibernateGenericGeneratorContainer getGeneratorContainer() {
return (HibernateGenericGeneratorContainer)super.getGeneratorContainer();
}
// ************************* validation ***********************
@Override
public void validate(List<IMessage> messages, IReporter reporter) {
super.validate(messages, reporter);
getTypeDefContainer().validate(messages, reporter);
}
@Override
protected PrimaryKeyJoinColumnParentAdapter buildPrimaryKeyJoinColumnParentAdapter() {
return new HibernatePrimaryKeyJoinColumnOwner();
}
// ********** pk join column owner **********
//not sure need this any more
class HibernatePrimaryKeyJoinColumnOwner extends PrimaryKeyJoinColumnParentAdapter
{
@Override
public TextRange getValidationTextRange() {
return HibernateJavaEntityImpl.this.getValidationTextRange();
}
@Override
public String getDefaultTableName() {
return HibernateJavaEntityImpl.this.getPrimaryTableName();
}
public org.eclipse.jpt.jpa.db.Table getDbTable(String tableName) {
return HibernateJavaEntityImpl.this.resolveDbTable(tableName);
}
@Override
public org.eclipse.jpt.jpa.db.Table getReferencedColumnDbTable() {
Entity parentEntity = HibernateJavaEntityImpl.this.getParentEntity();
return (parentEntity == null) ? null : parentEntity.getPrimaryDbTable();
}
@Override
public int getJoinColumnsSize() {
return HibernateJavaEntityImpl.this.getPrimaryKeyJoinColumnsSize();
}
public boolean isVirtual(BaseJoinColumn joinColumn) {
return HibernateJavaEntityImpl.this.defaultPrimaryKeyJoinColumn == joinColumn;
}
@Override
public String getDefaultColumnName(NamedColumn column) {
if (getJoinColumnsSize() != 1) {
return null;
}
Entity parentEntity = HibernateJavaEntityImpl.this.getParentEntity();
if (parentEntity != null) {
HibernateJpaProject hibernateJpaProject = HibernateJavaEntityImpl.this.getJpaProject();
INamingStrategy ns = hibernateJpaProject.getNamingStrategy();
if (hibernateJpaProject.isNamingStrategyEnabled() && ns != null) {
try {
String name = ns.joinKeyColumnName(parentEntity.getPrimaryKeyColumnName(),
parentEntity.getPrimaryTableName());
if (parentEntity.getPrimaryDbTable() != null){
return parentEntity.getPrimaryDbTable().getDatabase().convertNameToIdentifier(name);
}
return name ;
} catch (Exception e) {
IMessage m =HibernateJpaValidationMessage.buildMessage(IMessage.HIGH_SEVERITY,
Messages.NAMING_STRATEGY_EXCEPTION, column);
HibernateJptPlugin.logException(m.getText(), e);
}
}
return parentEntity.getPrimaryKeyColumnName();
} else {
return getPrimaryKeyColumnName();
}
}
}
protected boolean tableNameIsValid(String tableName) {
return this.tableIsUndefined || IterableTools.contains(this.getAllAssociatedDBTableNames(), tableName);
}
public Iterable<String> getAllAssociatedDBTableNames() {
return this.convertToDBNames(this.getAllAssociatedTables());
}
/**
* strip out <code>null</code> names
*/
protected Iterable<String> convertToDBNames(Iterable<Table> tables) {
return new FilteringIterable<String>(this.convertToDBNames_(tables), PredicateTools.isNotNull()); }
/**
* Convert Table to it's DB name.
*/
protected Iterable<String> convertToDBNames_(Iterable<Table> tables) {
return new TransformationIterable<Table, String>(
tables,
new Transformer<Table, String>() {
@Override
public String transform(Table t) {
if (t instanceof HibernateTable) {
return ((HibernateTable)t).getDBTableName();
} else {
return t.getName();//What is this???
}
}
}
);
}
@Override
public String getPrimaryTableName() {
return this.getTable().getDBTableName();
}
// ********** cacheable **********
@Override
public Cacheable2_0 getCacheable() {
return this.cacheable;
}
protected Cacheable2_0 buildCacheable() {
return this.isJpa2_0Compatible() ?
this.getJpaFactory2_0().buildJavaCacheable(this) :
new NullJavaCacheable2_0(this);
}
@Override
public boolean calculateDefaultCacheable() {
Cacheable2_0 parentCacheable = this.getParentCacheable();
return (parentCacheable != null) ?
parentCacheable.isCacheable() :
((PersistenceUnit2_0) this.getPersistenceUnit()).calculateDefaultCacheable();
}
protected Cacheable2_0 getParentCacheable() {
CacheableReference2_0 parentEntity = (CacheableReference2_0) this.getParentEntity();
return (parentEntity == null) ? null : parentEntity.getCacheable();
}
// @Override
// public Iterable<String> getJavaCompletionProposals(int pos,
// Filter<String> filter) {
// Iterable<String> result = super.getJavaCompletionProposals(pos, filter);
// if (result != null) {
// return result;
// }
// result = this.getTypeDefContainer().getJavaCompletionProposals(pos, filter);
// if (result != null) {
// return result;
// }
// return null;
// }
// ********** JavaDiscriminatorColumn.Owner implementation **********
protected class DiscriminatorFormulaOwner
implements JavaDiscriminatorFormula.Owner
{
@Override
public TypeMapping getTypeMapping() {
return HibernateJavaEntityImpl.this;
}
@Override
public String getDefaultTableName() {
return HibernateJavaEntityImpl.this.getPrimaryTableName();
}
@Override
public org.eclipse.jpt.jpa.db.Table resolveDbTable(String tableName) {
return HibernateJavaEntityImpl.this.resolveDbTable(tableName);
}
}
}