[jbosstools-commits] JBoss Tools SVN: r42781 - in trunk/hibernatetools/plugins: org.jboss.tools.hibernate.jpt.core/src/org/jboss/tools/hibernate/jpt/core/internal/context and 1 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Mon Jul 30 09:10:37 EDT 2012


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 at 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();
+			}
+		}
+	}
+	
+}



More information about the jbosstools-commits mailing list