Author: dgeraskov
Date: 2012-07-30 09:10:37 -0400 (Mon, 30 Jul 2012)
New Revision: 42781
Added:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java
Modified:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/META-INF/MANIFEST.MF
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.java
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.properties
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.ui/src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java
Log:
https://issues.jboss.org/browse/JBIDE-11883
Add newly generated entities to persistence.xml
Modified:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/META-INF/MANIFEST.MF
===================================================================
---
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/META-INF/MANIFEST.MF 2012-07-30
12:47:18 UTC (rev 42780)
+++
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/META-INF/MANIFEST.MF 2012-07-30
13:10:37 UTC (rev 42781)
@@ -23,7 +23,9 @@
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.eclipse.datatools.connectivity;bundle-version="1.2.5"
+ org.eclipse.datatools.connectivity;bundle-version="1.2.5",
+ org.eclipse.wst.common.emf;bundle-version="1.2.100",
+ org.eclipse.emf.ecore.xmi;bundle-version="2.8.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Vendor: %Bundle-Vendor.0
Export-Package: org.jboss.tools.hibernate.jpt.core.internal,
Added:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java
===================================================================
---
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java
(rev 0)
+++
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/AddGeneratedClassesJob.java 2012-07-30
13:10:37 UTC (rev 42781)
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * 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.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(a)gmail.com)
+ *
+ */
+public class AddGeneratedClassesJob extends WorkspaceJob {
+
+ private JpaProject jpaProject;
+
+ private List<IResource> javaFilesToAdd;
+
+ public AddGeneratedClassesJob(JpaProject jpaProject, List<IResource>
javaFilesToAdd) {
+ super(Messages.SYNC_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, Messages.SYNC_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);
+
+ 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);
+
+ IStatus status = addNewClassRefs(sm.newChild(17), jpaProject, persistenceUnit);
+
+ resource.save();
+ return status;
+ }
+
+ protected IStatus addNewClassRefs(IProgressMonitor monitor, JpaProject jpaProject,
XmlPersistenceUnit persistenceUnit) {
+ Iterable<String> 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);
+ }
+ if (sm.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ sm.worked(1);
+ }
+ return Status.OK_STATUS;
+ }
+
+ protected Iterable<String> getMappedNewClassNames(final JpaProject jpaProject,
final char enclosingTypeSeparator) {
+ return new TransformationIterable<IType, String>(
+ new FilteringIterable<IType>(
+ new TransformationIterable<String, IType>(
+ 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.getPersistenceUnitsSize() == 0) {
+ return false;
+ }
+ PersistenceUnit persistenceUnit = persistence.getPersistenceUnit(0);
+ for (MappingFileRef mappingFileRef : persistenceUnit.getMappingFileRefs()) {
+ if (mappingFileRef.getPersistentType(fullyQualifiedTypeName) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
Modified:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.java
===================================================================
---
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.java 2012-07-30
12:47:18 UTC (rev 42780)
+++
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.java 2012-07-30
13:10:37 UTC (rev 42781)
@@ -45,5 +45,9 @@
public static final String NAME_CANT_BE_EMPTY =
"NAME_CANT_BE_EMPTY";//$NON-NLS-1$
public static final String TYPE_DEF_DUPLICATE_NAME=
"TYPE_DEF_DUPLICATE_NAME";//$NON-NLS-1$
+
+ public static final String SYNC_CLASSES_JOB =
"SYNC_CLASSES_JOB";//$NON-NLS-1$
+
+ public static final String SYNC_CLASSES_TASK =
"SYNC_CLASSES_TASK";//$NON-NLS-1$
}
Modified:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.properties
===================================================================
---
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.properties 2012-07-30
12:47:18 UTC (rev 42780)
+++
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context/Messages.properties 2012-07-30
13:10:37 UTC (rev 42781)
@@ -12,4 +12,6 @@
INCONSISTENT_TYPE_HIERARCHY = Type hierarchy of the type \"{0}\" is
inconsistent
TYPE_CLASS_NOT_FOUND = Type class \"{0}\" could not be found.
NAME_CANT_BE_EMPTY = Name could not be empty.
-TYPE_DEF_DUPLICATE_NAME=Duplicate type definition named \"{0}\" defined in this
persistence unit
\ No newline at end of file
+TYPE_DEF_DUPLICATE_NAME=Duplicate type definition named \"{0}\" defined in this
persistence unit
+SYNC_CLASSES_JOB = Synchronizing generated classes
+SYNC_CLASSES_TASK = Synchronizing generated classes...
\ No newline at end of file
Modified:
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.ui/src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java
===================================================================
---
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.ui/src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java 2012-07-30
12:47:18 UTC (rev 42780)
+++
trunk/hibernatetools/plugins/org.jboss.tools.hibernate.jpt.ui/src/org/jboss/tools/hibernate/jpt/ui/wizard/GenerateEntitiesWizard.java 2012-07-30
13:10:37 UTC (rev 42781)
@@ -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,73 @@
}
}
+
+class NewJavaFilesListener implements IResourceChangeListener {
+
+ List<IResource> generatedJavaFiles = new LinkedList<IResource>();
+ private List<IPackageFragmentRoot> sourceRoots = new
LinkedList<IPackageFragmentRoot>();
+
+ /**
+ * @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();
+ if (delta != null){
+ 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();
+ }
+ }
+ }
+
+}