/******************************************************************************* * 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.Iterator; import org.eclipse.jpt.jpa.core.context.Entity; import org.eclipse.jpt.jpa.core.context.JoinColumn; import org.eclipse.jpt.jpa.core.context.PersistentAttribute; import org.eclipse.jpt.jpa.core.internal.jpa1.context.java.GenericJavaJoinColumn; import org.eclipse.jpt.jpa.core.resource.java.CompleteJoinColumnAnnotation; import org.eclipse.jpt.jpa.db.Column; import org.eclipse.jpt.jpa.db.Table; import org.eclipse.wst.validation.internal.provisional.core.IMessage; 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.Messages; import org.jboss.tools.hibernate.jpt.core.internal.context.NamingStrategyMappingTools; import org.jboss.tools.hibernate.jpt.core.internal.validation.HibernateJpaValidationMessage; import org.jboss.tools.hibernate.runtime.spi.INamingStrategy; /** * @author Dmitry Geraskov * */ public class HibernateJavaJoinColumnImpl extends GenericJavaJoinColumn implements HibernateJavaJoinColumn { public HibernateJavaJoinColumnImpl(JoinColumn.ParentAdapter parentAdapter, CompleteJoinColumnAnnotation joinColumnAnnotation) { super(parentAdapter, joinColumnAnnotation); } @Override public HibernateJpaProject getJpaProject() { return (HibernateJpaProject) super.getJpaProject(); } @Override protected String buildDefaultName() { return NamingStrategyMappingTools.buildJoinColumnDefaultName(this, this.parentAdapter); } @Override public PersistentAttribute getReferencedPersistentAttribute() { if (this.parentAdapter.getJoinColumnsSize() != 1) { return null; } Entity targetEntity = this.parentAdapter.getRelationshipTarget(); if (targetEntity == null) { return null; } PersistentAttribute pAttr = null; Iterator<PersistentAttribute> attributes = targetEntity.getPersistentType().getAllAttributes().iterator(); for (Iterator<PersistentAttribute> stream = attributes; stream.hasNext();) { PersistentAttribute attribute = stream.next(); String name = attribute.getPrimaryKeyColumnName(); if (name != null) { if (pAttr == null){ pAttr = attribute; } else { return null; } } } return pAttr; } @Override public Column getDbColumn() { Table table = this.getDbTable(); return (table == null) ? null : table.getColumnForIdentifier(this.getDBColumnName()); } @Override public String getDBColumnName() { return getSpecifiedDBColumnName() != null ? getSpecifiedDBColumnName() : getDefaultDBColumnName(); } @Override public String getDefaultDBColumnName() { return getDefaultName(); } @Override public String getSpecifiedDBColumnName() { if (getSpecifiedName() == null) return null; INamingStrategy ns = getJpaProject().getNamingStrategy(); if (getJpaProject().isNamingStrategyEnabled() && ns != null){ try { return ns.columnName(getSpecifiedName()); } catch (Exception e) { IMessage m = HibernateJpaValidationMessage.buildMessage(IMessage.HIGH_SEVERITY, Messages.NAMING_STRATEGY_EXCEPTION, this); HibernateJptPlugin.logException(m.getText(), e); } } return this.getSpecifiedName(); } @Override public Column getReferencedDbColumn() { Table table = this.getReferencedColumnDbTable(); return (table == null) ? null : table.getColumnForIdentifier(this.getReferencedDBColumnName()); } @Override public String getReferencedDBColumnName() { return getReferencedSpecifiedDBColumnName() != null ? getReferencedSpecifiedDBColumnName() : getReferencedDefaultDBColumnName(); } @Override public String getReferencedDefaultDBColumnName() { return this.defaultReferencedColumnName; } @Override public String getReferencedSpecifiedDBColumnName() { if (this.specifiedReferencedColumnName == null) return null; INamingStrategy ns = getJpaProject().getNamingStrategy(); if (getJpaProject().isNamingStrategyEnabled() && ns != null){ try { return ns.columnName(this.specifiedReferencedColumnName); } catch (Exception e) { IMessage m = HibernateJpaValidationMessage.buildMessage(IMessage.HIGH_SEVERITY, Messages.NAMING_STRATEGY_EXCEPTION, this); HibernateJptPlugin.logException(m.getText(), e); } } return this.specifiedReferencedColumnName; } /*protected void validateJoinColumnName(List<IMessage> messages, CompilationUnit astRoot) { if ( ! this.isResolved() && getDbTable() != null) { if (getDBColumnName() != null) { messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.HIGH_SEVERITY, JpaValidationMessages.JOIN_COLUMN_UNRESOLVED_NAME, new String[] {this.getDBColumnName()}, this, this.getNameTextRange(astRoot) ) ); } else if (getOwner().joinColumnsSize() > 1) { messages.add(this.buildUnspecifiedReferencedColumnNameMultipleJoinColumnsMessage(astRoot)); } //If the name is null and there is only one join-column, one of these validation messages will apply // 1. target entity does not have a primary key // 2. target entity is not specified // 3. target entity is not an entity } } protected void validateReferencedColumnName(List<IMessage> messages, CompilationUnit astRoot) { if ( ! this.isReferencedColumnResolved() && getReferencedColumnDbTable() != null) { if (getReferencedDBColumnName() != null) { messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.HIGH_SEVERITY, JpaValidationMessages.JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME, new String[] {this.getReferencedDBColumnName(), this.getDBColumnName()}, this, this.getReferencedColumnNameTextRange(astRoot) ) ); } else if (getOwner().joinColumnsSize() > 1) { messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.HIGH_SEVERITY, JpaValidationMessages.JOIN_COLUMN_REFERENCED_COLUMN_UNRESOLVED_NAME_MULTIPLE_JOIN_COLUMNS, this, this.getNameTextRange(astRoot) ) ); } //If the referenced column name is null and there is only one join-column, one of these validation messages will apply // 1. target entity does not have a primary key // 2. target entity is not specified // 3. target entity is not an entity } }*/ }