/******************************************************************************* * Copyright (c) 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.persistence; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jpt.common.core.resource.java.JavaResourcePackage; import org.eclipse.jpt.common.utility.internal.StringTools; import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef; import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; import org.eclipse.jpt.jpa.core.internal.jpa1.context.persistence.GenericClassRef; import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef; import org.eclipse.jpt.jpa.core.validation.JptJpaCoreValidationMessages; import org.eclipse.jst.j2ee.model.internal.validation.ValidationCancelledException; 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.HibernateJptPlugin; import org.jboss.tools.hibernate.jpt.core.internal.context.java.HibernatePackageInfo; import org.jboss.tools.hibernate.jpt.core.internal.context.java.JavaPackageInfo; /** * @author Dmitry Geraskov * */ public class HibernateClassRef extends GenericClassRef implements PackageInfoRef{ /** * When <code><class>test.some.pack</class></code> is used and there is * test.some.pack.package-info.java file it should be included in persistent unit. * This can be <code>null</code> if the name is invalid. */ protected HibernatePackageInfo javaPackageInfo; /** * Construct a <em>specified</em> class ref; i.e. a class ref with * an explicit entry in the <code>persistence.xml</code>. */ public HibernateClassRef(PersistenceUnit parent, XmlJavaClassRef xmlJavaClassRef) { super(parent, xmlJavaClassRef); JavaResourcePackage resourcePackage = this.resolveJavaResourcePackage(); if (resourcePackage != null){ this.javaPackageInfo = this.buildJavaPackageInfo(resourcePackage); } } @Override protected HibernateAbstractJpaFactory getJpaFactory() { return (HibernateAbstractJpaFactory) super.getJpaFactory(); } @Override protected boolean isInPackage(IPackageFragment packageFragment) { // FIXME recheck this method return super.isInPackage(packageFragment); } @Override protected String getPackageName() { // FIXME recheck this method return super.getPackageName(); } // ********** synchronize/update ********** @Override public void synchronizeWithResourceModel(IProgressMonitor monitor) { super.synchronizeWithResourceModel(monitor); if (this.javaPackageInfo != null) { this.javaPackageInfo.synchronizeWithResourceModel(monitor); } } @Override public void update(IProgressMonitor monitor) { super.update(monitor); this.updateJavaPackageInfo(monitor); } // ********** java persistent type ********** public HibernatePackageInfo getJavaPackageInfo() { return this.javaPackageInfo; } protected void setJavaPackageInfo(HibernatePackageInfo javaPackageInfo) { JavaPackageInfo old = this.javaPackageInfo; this.javaPackageInfo = javaPackageInfo; this.firePropertyChanged(JAVA_PACKAGE_INFO_PROPERTY, old, javaPackageInfo); } protected void updateJavaPackageInfo(IProgressMonitor monitor) { JavaResourcePackage resourcePackage = this.resolveJavaResourcePackage(); if (resourcePackage == null) { if (this.javaPackageInfo != null) { // this.javaPackageInfo.dispose(); this.setJavaPackageInfo(null); } } else { if (this.javaPackageInfo == null) { this.setJavaPackageInfo(this.buildJavaPackageInfo(resourcePackage)); } else { if (this.javaPackageInfo.getResourcePackage() == resourcePackage) { this.javaPackageInfo.update(monitor); } else { // this.javaPackageInfo.dispose(); this.setJavaPackageInfo(this.buildJavaPackageInfo(resourcePackage)); } } } } protected String getJavaPackageInfoName() { return getClassName();//the same name should be used! } protected JavaResourcePackage resolveJavaResourcePackage() { String javaPackageInfoName = this.getJavaPackageInfoName(); return (javaPackageInfoName == null) ? null : this.getJpaProject().getJavaResourcePackage(javaPackageInfoName); } protected HibernatePackageInfo buildJavaPackageInfo(JavaResourcePackage jrpt) { return this.getJpaFactory().buildJavaPackageInfo(this, jrpt); } /* (non-Javadoc) * @see org.eclipse.jpt.jpa.core.internal.jpa1.context.persistence.GenericClassRef#validate(java.util.List, org.eclipse.wst.validation.internal.provisional.core.IReporter) */ @Override public void validate(List<IMessage> messages, IReporter reporter) { if (reporter.isCancelled()) { throw new ValidationCancelledException(); } if (StringTools.isBlank(this.className)) { messages.add(buildValidationMessage( JptJpaCoreValidationMessages.PERSISTENCE_UNIT_UNSPECIFIED_CLASS, this.getValidationTextRange())); return; } if (this.getJavaPersistentType() == null && this.javaPackageInfo == null) { messages.add(buildValidationMessage( JptJpaCoreValidationMessages.PERSISTENCE_UNIT_NONEXISTENT_CLASS, new String[] { this.getJavaClassName() }, this.getValidationTextRange())); return; } if (this.getJavaPersistentType() != null){ // 190062 validate Java class only if this is the only reference to it // i.e. the persistence.xml ref is the only ref - none of the mapping // files reference the same class boolean validateJavaPersistentType = true; for (MappingFileRef mappingFileRef : this.getPersistenceUnit().getMappingFileRefsContaining(this.getJavaClassName())) { validateJavaPersistentType = false; messages.add(buildValidationMessage( JptJpaCoreValidationMessages.PERSISTENCE_UNIT_REDUNDANT_CLASS, new String[] { this.getJavaClassName(), mappingFileRef.getFileName() }, this.getValidationTextRange())); } if (validateJavaPersistentType) { this.validateJavaManagedType(messages, reporter); } } else { validatePackageInfo(messages, reporter); } } protected void validatePackageInfo(List<IMessage> messages, IReporter reporter) { try { this.javaPackageInfo.validate(messages, reporter); } catch (Throwable t) { HibernateJptPlugin.logException(t); } } }