### Eclipse Workspace Patch 1.0 #P org.jboss.tools.hibernate.jpt.core Index: src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java =================================================================== --- src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java (revision 0) +++ src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java (revision 0) @@ -0,0 +1,170 @@ +/******************************************************************************* + * Copyright (c) 2012 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; + +import java.util.List; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceRuleFactory; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jpt.common.utility.internal.CollectionTools; +import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable; +import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable; +import org.eclipse.jpt.jpa.core.JpaProject; +import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef; +import org.eclipse.jpt.jpa.core.context.persistence.Persistence; +import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; +import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml; +import org.eclipse.jpt.jpa.core.internal.JptCoreMessages; +import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory; +import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef; +import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistence; +import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistenceUnit; +import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource; + +/** + * @author Dmitry Geraskov (geraskov@gmail.com) + * + */ +public class AddGeneratedClassesJob extends WorkspaceJob { + + private JpaProject jpaProject; + + private List javaFilesToAdd; + + public AddGeneratedClassesJob(JpaProject jpaProject, List javaFilesToAdd) { + super(JptCoreMessages.SYNCHRONIZE_CLASSES_JOB); + IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory(); + setRule(ruleFactory.modifyRule(jpaProject.getProject())); + this.jpaProject = jpaProject; + this.javaFilesToAdd = javaFilesToAdd; + } + + @Override + public IStatus runInWorkspace(IProgressMonitor monitor) { + if (monitor.isCanceled()) { + return Status.CANCEL_STATUS; + } + final SubMonitor sm = SubMonitor.convert(monitor, JptCoreMessages.SYNCHRONIZING_CLASSES_TASK, 20); + final JpaXmlResource resource = jpaProject.getPersistenceXmlResource(); + if (resource == null) { + //the resource would only be null if the persistence.xml file had an invalid content type + return Status.OK_STATUS; + } + if (sm.isCanceled()) { + return Status.CANCEL_STATUS; + } + sm.worked(1); + + resource.modify(new Runnable() { + public void run() { + XmlPersistence persistence = (XmlPersistence) resource.getRootObject(); + XmlPersistenceUnit persistenceUnit; + + if (persistence.getPersistenceUnits().size() > 0) { + persistenceUnit = persistence.getPersistenceUnits().get(0); + } + else { + persistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit(); + persistenceUnit.setName(jpaProject.getName()); + persistence.getPersistenceUnits().add(persistenceUnit); + } + sm.worked(1); + + + //for (XmlJavaClassRef xmlJavaClassRef : classes) { + + //} + sm.worked(1); + + addNewClassRefs(sm.newChild(17), jpaProject, persistenceUnit); + } + }); + return Status.OK_STATUS; + } + + protected void addNewClassRefs(IProgressMonitor monitor, JpaProject jpaProject, XmlPersistenceUnit persistenceUnit) { + Iterable mappedClassNames = getMappedNewClassNames(jpaProject, '$'); + final SubMonitor sm = SubMonitor.convert(monitor, CollectionTools.size(mappedClassNames)); + + for (String fullyQualifiedTypeName : mappedClassNames) { + if ( ! mappingFileContains(jpaProject, fullyQualifiedTypeName)) { + XmlJavaClassRef classRef = PersistenceFactory.eINSTANCE.createXmlJavaClassRef(); + classRef.setJavaClass(fullyQualifiedTypeName); + persistenceUnit.getClasses().add(classRef); + } + sm.worked(1); + } + } + + protected Iterable getMappedNewClassNames(final JpaProject jpaProject, final char enclosingTypeSeparator) { + return new TransformationIterable( + new FilteringIterable( + new TransformationIterable( + jpaProject.getMappedJavaSourceClassNames()) { + @Override + protected IType transform(String fullyQualifiedName) { + return AddGeneratedClassesJob.this.findType(jpaProject, fullyQualifiedName); + } + }){ + @Override + protected boolean accept(IType o) { + for (IResource res : javaFilesToAdd) { + if (res.equals(o.getResource())){ + return true; + } + } + return false; + } + }) { + @Override + protected String transform(IType jdtType) { + return jdtType.getFullyQualifiedName(enclosingTypeSeparator); + } + }; + } + + protected IType findType(JpaProject jpaProject, String typeName) { + try { + return jpaProject.getJavaProject().findType(typeName); + } catch (JavaModelException ex) { + return null; // ignore exception? + } + } + + boolean mappingFileContains(JpaProject jpaProject, String fullyQualifiedTypeName) { + PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml(); + if (persistenceXml == null) { + return false; + } + Persistence persistence = persistenceXml.getPersistence(); + if (persistence == null) { + return false; + } + if (persistence.persistenceUnitsSize() == 0) { + return false; + } + PersistenceUnit persistenceUnit = persistence.persistenceUnits().next(); + for (MappingFileRef mappingFileRef : CollectionTools.iterable(persistenceUnit.mappingFileRefs())) { + if (mappingFileRef.getPersistentType(fullyQualifiedTypeName) != null) { + return true; + } + } + return false; + } +} \ No newline at end of file Index: META-INF/MANIFEST.MF =================================================================== --- META-INF/MANIFEST.MF (revision 41199) +++ META-INF/MANIFEST.MF (working copy) @@ -22,7 +22,9 @@ org.eclipse.jst.j2ee;bundle-version="1.1.500", org.eclipse.persistence.jpa.jpql;bundle-version="1.0.0", org.eclipse.jst.j2ee.core;bundle-version="1.2.100", - org.hibernate.eclipse.libs;bundle-version="3.4.0" + org.hibernate.eclipse.libs;bundle-version="3.4.0", + org.eclipse.wst.common.emf;bundle-version="1.2.100", + org.eclipse.emf.ecore.xmi;bundle-version="2.7.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-Vendor: %Bundle-Vendor.0 Export-Package: org.jboss.tools.hibernate.jpt.core.internal, #P org.jboss.tools.hibernate.jpt.ui Index: src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java =================================================================== --- src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java (revision 41199) +++ src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java (working copy) @@ -10,15 +10,29 @@ ******************************************************************************/ package org.jboss.tools.hibernate.jpt.ui.wizard; +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jpt.jpa.ui.internal.JptUiMessages; import org.hibernate.console.KnownConfigurations; import org.hibernate.eclipse.launch.HibernateLaunchConstants; import org.jboss.tools.hibernate.jpt.core.internal.HibernateJpaProject; +import org.jboss.tools.hibernate.jpt.core.internal.context.AddGeneratedClassesJob; import org.jboss.tools.hibernate.jpt.ui.HibernateJptUIPlugin; import org.jboss.tools.hibernate.jpt.ui.internal.platform.HibernateJpaPlatformUi; @@ -33,7 +47,6 @@ private GenerateEntitiesWizardPage initPage; - public GenerateEntitiesWizard( HibernateJpaProject jpaProject, IStructuredSelection selection) { super(); this.jpaProject = jpaProject; @@ -71,7 +84,18 @@ wc.setAttribute(HibernateLaunchConstants.ATTR_EXPORTERS + '.' + HibernateJpaPlatformUi.exporter_id + ".extension_id", //$NON-NLS-1$ HibernateLaunchConstants.ATTR_PREFIX + "hbm2java"); //$NON-NLS-1$ try { + NewJavaFilesListener rcl = new NewJavaFilesListener(jpaProject.getJavaProject());; + if (!jpaProject.discoversAnnotatedClasses()){ + ResourcesPlugin.getWorkspace().addResourceChangeListener(rcl); + } wc.launch(ILaunchManager.RUN_MODE, null); + if (!jpaProject.discoversAnnotatedClasses()){ + ResourcesPlugin.getWorkspace().removeResourceChangeListener(rcl); + if (rcl.generatedJavaFiles.size() > 0){ + AddGeneratedClassesJob job = new AddGeneratedClassesJob(jpaProject, rcl.generatedJavaFiles); + job.schedule(); + } + } } catch (CoreException e) { HibernateJptUIPlugin.logException(e); } finally{ @@ -84,3 +108,71 @@ } } + +class NewJavaFilesListener implements IResourceChangeListener { + + List generatedJavaFiles = new LinkedList(); + private List sourceRoots = new LinkedList(); + + /** + * @param projectName + */ + public NewJavaFilesListener(IJavaProject project) { + try { + IPackageFragmentRoot[] allPackageFragmentRoots = project.getAllPackageFragmentRoots(); + for (int j = 0; j < allPackageFragmentRoots.length; j++) { + if (!allPackageFragmentRoots[j].isArchive()){ + sourceRoots.add(allPackageFragmentRoots[j]); + } + } + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + + @Override + public void resourceChanged(IResourceChangeEvent event) { + IResourceDelta delta = event.getDelta(); + try { + delta.accept(new IResourceDeltaVisitor() { + + @Override + public boolean visit(IResourceDelta delta) throws CoreException { + IResource resource = delta.getResource(); + int type = resource.getType(); + //we also have to consider projects we dependent on here!!! + if (type == IResource.ROOT + || type == IResource.PROJECT + || type == IResource.FOLDER) + return true; + + if (resource instanceof IFile && delta.getKind() == IResourceDelta.ADDED) { + // see if this is it + IFile candidate = (IFile) resource; + if (isJavaSourceFile(candidate)) { + generatedJavaFiles.add(candidate); + } + } + return false; + } + + private boolean isJavaSourceFile(IResource candidate) { + if (candidate.getName().endsWith(".java")){ //$NON-NLS-1$ + while (candidate.getParent() != null){ + for (IPackageFragmentRoot root : sourceRoots) { + if (root.getResource().equals(candidate.getParent())){ + return true; + } + } + candidate = candidate.getParent(); + } + } + return false; + } + }); + } catch (CoreException e) { + e.printStackTrace(); + } + } + +}