295614 - directly update persistence.xml when generating entities.  Also added the "Update..." option to the persisted state of the wizard.
diff --git a/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF b/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
index 7af207d..fd2313c 100644
--- a/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
+++ b/jpa/plugins/org.eclipse.jpt.gen/META-INF/MANIFEST.MF
@@ -13,6 +13,7 @@
  org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jpt.utility;bundle-version="[1.2.0,2.0.0)",
  org.eclipse.jpt.db;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.jpt.core;bundle-version="[2.2.0,2.4.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jface.text;bundle-version="[3.4.0,4.0.0)",
  org.apache.commons.collections;bundle-version="3.2.0",
diff --git a/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/ORMGenCustomizer.java b/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/ORMGenCustomizer.java
index 6d25a39..cb9ef35 100644
--- a/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/ORMGenCustomizer.java
+++ b/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/ORMGenCustomizer.java
@@ -26,7 +26,6 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jpt.db.Column;
-import org.eclipse.jpt.db.ForeignKey;
 import org.eclipse.jpt.db.Schema;
 import org.eclipse.jpt.db.Table;
 import org.eclipse.jpt.gen.internal.util.DTPUtil;
@@ -95,6 +94,8 @@
 	private Map<String, String> mProps = new java.util.HashMap<String, String>();
 
 	private transient DatabaseAnnotationNameBuilder databaseAnnotationNameBuilder = DatabaseAnnotationNameBuilder.Default.INSTANCE;
+
+	private boolean mUpdatePersistenceXml = true;
 	
 	//-----------------------------------------
 	//---- abstract methods
@@ -572,6 +573,7 @@
 		mTableNames = customizer.mTableNames;
 		mAssociations = customizer.mAssociations;
 		mProps = customizer.mProps;
+		mUpdatePersistenceXml = customizer.mUpdatePersistenceXml;
 		if( mSchema == null )
 			return;
 		
@@ -809,4 +811,10 @@
 	      }
 	   } );
 	}
+	public boolean shouldUpdatePersistenceXml() {
+		return mUpdatePersistenceXml;
+	}
+	public void setShouldUpdatePersistenceXml(boolean updatePersistenceXml) {
+		this.mUpdatePersistenceXml = updatePersistenceXml;
+	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/PackageGenerator2.java b/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/PackageGenerator2.java
index 3bad3d6..894eda9 100644
--- a/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/PackageGenerator2.java
+++ b/jpa/plugins/org.eclipse.jpt.gen/src/org/eclipse/jpt/gen/internal/PackageGenerator2.java
@@ -39,6 +39,11 @@
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jpt.core.JpaProject;
+import org.eclipse.jpt.core.context.persistence.ClassRef;
+import org.eclipse.jpt.core.context.persistence.Persistence;
+import org.eclipse.jpt.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.core.resource.xml.JpaXmlResource;
 import org.eclipse.jpt.gen.internal.util.CompilationUnitModifier;
 import org.eclipse.jpt.gen.internal.util.FileUtil;
 import org.eclipse.jpt.gen.internal.util.UrlUtil;
@@ -51,8 +56,8 @@
 public class PackageGenerator2 { 
 
 	private static final String LOGGER_NAME = "org.eclipse.jpt.entities.gen.log"; //$NON-NLS-1$
-	private IJavaProject javaProject;
-	private ORMGenCustomizer customizer ; 
+	private JpaProject jpaProject;
+	private ORMGenCustomizer customizer;
 	private static OverwriteConfirmer overwriteConfirmer = null;
 
 	static public void setOverwriteConfirmer(OverwriteConfirmer confirmer){
@@ -64,13 +69,13 @@
 	 * @param copyJdbcDrive
 	 * @throws Exception 
 	 */
-	static public void generate(IJavaProject jpaProject, ORMGenCustomizer customizer, IProgressMonitor monitor ) throws CoreException {
+	static public void generate(JpaProject jpaProject, ORMGenCustomizer customizer, IProgressMonitor monitor ) throws CoreException {
 		PackageGenerator2 generator = new PackageGenerator2();
 		generator.setProject(jpaProject);
 		generator.setCustomizer(customizer);
 		
 		try {
-			generator.doGenerate(  monitor);
+			generator.doGenerate(monitor);
 		} catch (Exception e) {
 			throw new CoreException(new Status(IStatus.ERROR, JptGenPlugin.PLUGIN_ID, JptGenMessages.Error_Generating_Entities, e));
 		}
@@ -84,19 +89,19 @@
 		this.customizer = customizer2;
 	}
 	
-	private void setProject(IJavaProject proj ){
-		this.javaProject = proj;
+	private void setProject(JpaProject proj ){
+		this.jpaProject = proj;
 	}
 	
-	protected void doGenerate(  IProgressMonitor monitor ) throws Exception {
+	protected void doGenerate(IProgressMonitor monitor ) throws Exception {
 		generateInternal( monitor );
 	}
 
-	protected void generateInternal( IProgressMonitor progress) throws Exception {
+	protected void generateInternal(IProgressMonitor progress) throws Exception {
 		File templDir = prepareTemplatesFolder();
 
 		List<String> genClasses = new java.util.ArrayList<String>();
-		List<String> tableNames = customizer.getGenTableNames();
+		List<String> tableNames = this.customizer.getGenTableNames();
 
 		/* .java per table, persistence.xml, refresh package folder */
 		String taskName = NLS.bind(JptGenMessages.EntityGenerator_taskName, "Total "+ tableNames.size() + 2);//$NON-NLS-1$
@@ -121,8 +126,47 @@
 				genClasses.add(table.getQualifiedCompositeKeyClassName());
 			}
 		}
+		
+		//update persistence.xml
+		if (this.customizer.shouldUpdatePersistenceXml()) {
+			updatePersistenceXml(genClasses);
+		}
 		progress.done();
 	}
+	private void updatePersistenceXml(List<String> genClasses) {
+		JpaXmlResource resource = jpaProject.getPersistenceXmlResource();
+		if (resource == null) {
+			//the resource would only be null if the persistence.xml file had an invalid content type,
+			//do not attempt to update
+			return;
+		}
+
+		Persistence persistence = jpaProject.getRootContextNode().getPersistenceXml().getPersistence();	
+		if (persistence == null) {
+			//invalid content, do not attempt to update
+			return;
+		}
+		
+		PersistenceUnit persistenceUnit;
+		//create a persistence unit if one doesn't already exist
+		if (persistence.persistenceUnitsSize()== 0){
+			persistenceUnit = persistence.addPersistenceUnit();
+			persistenceUnit.setName(jpaProject.getName());
+		}
+		else {
+			//we only support one persistence unit - take the first one
+			persistenceUnit = persistence.persistenceUnits().next();
+		}
+		
+		for (Iterator<String> stream = genClasses.iterator(); stream.hasNext();){
+			String className = stream.next();
+			if (!persistenceUnit.mappingFileRefsContaining(className).hasNext()
+					&& !persistenceUnit.specifiesPersistentType(className)){
+				ClassRef classRef = persistenceUnit.addSpecifiedClassRef();
+				classRef.setClassName(className);
+			}
+		}
+	}
 
 	private File prepareTemplatesFolder() throws IOException, Exception,
 			CoreException {
@@ -240,7 +284,7 @@
 		/*use CompilationUnitModifier instead of calling WideEnv.getEnv().setFileContent 
 		 * so that if the unit is up to date if it is used before file change 
 		 * notifications are delivered (see EJB3ImportSchemaWizard.updateExistingDomainClass for example)*/
-		IJavaProject project = javaProject.getJavaProject();
+		IJavaProject project = jpaProject.getJavaProject();
 		CompilationUnitModifier modifier = new CompilationUnitModifier(project, className);
 		modifier.setJavaSource(fileContent);
 		modifier.save();
@@ -251,7 +295,7 @@
 	}
 	
 	public IFolder getJavaPackageFolder(ORMGenTable table, IProgressMonitor monitor) throws CoreException {
-		IPackageFragmentRoot root = getDefaultJavaSrouceLocation ( javaProject , table.getSourceFolder()) ;
+		IPackageFragmentRoot root = getDefaultJavaSrouceLocation ( getJavaProject() , table.getSourceFolder()) ;
 		String packageName = table.getPackage();
 		if( packageName==null ) packageName ="";
 		IPackageFragment packageFragment = root.getPackageFragment(packageName);
@@ -261,6 +305,10 @@
 		return (IFolder)packageFragment.getResource();
 	}
 	
+	private IJavaProject getJavaProject(){
+		return this.jpaProject.getJavaProject();
+	}
+	
 	private IPackageFragmentRoot getDefaultJavaSrouceLocation(IJavaProject jproject, String sourceFolder){
 		IPackageFragmentRoot defaultSrcPath = null;
 		if (jproject != null) {
diff --git a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_entity_gen.properties b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_entity_gen.properties
index 8d053c2..9fd1fa8 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_entity_gen.properties
+++ b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_entity_gen.properties
@@ -35,7 +35,7 @@
 
 GenerateEntitiesWizard_tableSelectPage_selectTable=Select Tables
 GenerateEntitiesWizard_tableSelectPage_chooseEntityTable=Select tables to generate entities from.
-GenerateEntitiesWizard_tableSelectPage_synchronizeClasses=Synchronize classes listed in persistence.xml
+GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml=Update class list in persistence.xml
 GenerateEntitiesWizard_tableSelectPage_tables=&Tables:
 GenerateEntitiesWizard_tableSelectPage_tableColumn=Table
 GenerateEntitiesWizard_tableSelectPage_Restore_Defaults=Restore Defaults
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java
index 1123503..db7cf08 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/GenerateEntitiesFromSchemaWizard.java
@@ -13,7 +13,6 @@
 import java.io.File;
 import java.io.IOException;
 
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceRuleFactory;
@@ -37,8 +36,6 @@
 import org.eclipse.jpt.core.JpaPlatform;
 import org.eclipse.jpt.core.JpaProject;
 import org.eclipse.jpt.core.JptCorePlugin;
-import org.eclipse.jpt.core.context.persistence.PersistenceXml;
-import org.eclipse.jpt.core.internal.synch.SynchronizeClassesJob;
 import org.eclipse.jpt.db.Column;
 import org.eclipse.jpt.db.ConnectionProfile;
 import org.eclipse.jpt.db.ForeignKey;
@@ -51,7 +48,6 @@
 import org.eclipse.jpt.ui.JptUiPlugin;
 import org.eclipse.jpt.ui.internal.JptUiIcons;
 import org.eclipse.jpt.ui.internal.JptUiMessages;
-import org.eclipse.jpt.utility.internal.CollectionTools;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
@@ -81,8 +77,6 @@
 
 	private ORMGenCustomizer customizer = null;	
 
-	private boolean synchronizePersistenceXml;
-
 	private PromptJPAProjectWizardPage projectPage;	
 
 	private TablesSelectorWizardPage tablesSelectorPage;
@@ -201,36 +195,17 @@
 	public boolean performFinish() {
 		if( this.jpaProject == null )
 			return true;
-		
 		try {
 			this.customizer.setDatabaseAnnotationNameBuilder( buildDatabaseAnnotationNameBuilder() );
 			this.customizer.save();
 		} catch (IOException e) {
 			JptUiPlugin.log(e);
 		}
-		
-		this.synchronizePersistenceXml = this.tablesSelectorPage.synchronizePersistenceXml();
-
 		if(shouldShowOverwriteWarning())
 			PackageGenerator2.setOverwriteConfirmer( new OverwriteConfirmer());
-
-		WorkspaceJob genEntitiesJob = new GenerateEntitiesJob( this.jpaProject,  getCustomizer() );
 		
-		WorkspaceJob synchClassesJob = null;
-		if (synchronizePersistenceXml()) {
-			// we currently only support *one* persistence.xml file per project
-			PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml();
-			if (persistenceXml != null) {
-				// TODO casting to IFile - just trying to get rid of all compiler errors for now
-				synchClassesJob = new SynchronizeClassesJob((IFile) persistenceXml.getResource());
-			}
-		}
-		
+		WorkspaceJob genEntitiesJob = new GenerateEntitiesJob( this.jpaProject, getCustomizer());
 		genEntitiesJob.schedule();
-		if (synchClassesJob != null) {
-			synchClassesJob.schedule();
-		}		
-		
 		return true;
 	}
 	
@@ -250,7 +225,7 @@
 		@Override
 		public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
 			try{
-				PackageGenerator2.generate(jpaProject.getJavaProject(),this.customizer, monitor);
+				PackageGenerator2.generate(jpaProject,this.customizer, monitor);
 			}catch(OperationCanceledException e){
 				//user canceled generation
 			}
@@ -520,10 +495,6 @@
 		return getJpaProject().getDefaultDbSchema() ;
 	}
 
-	public boolean synchronizePersistenceXml() {
-		return this.synchronizePersistenceXml;
-	}
-
 	public void init(IWorkbench workbench, IStructuredSelection selection) {
 		
 		Object sel = selection.getFirstElement();
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/JptUiEntityGenMessages.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/JptUiEntityGenMessages.java
index b5c1c33..a064959 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/JptUiEntityGenMessages.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/JptUiEntityGenMessages.java
@@ -28,7 +28,7 @@
 	public static String GenerateEntitiesWizard_selectJPAProject_msg;
 	public static String GenerateEntitiesWizard_tableSelectPage_selectTable;
 	public static String GenerateEntitiesWizard_tableSelectPage_chooseEntityTable;
-	public static String GenerateEntitiesWizard_tableSelectPage_synchronizeClasses;
+	public static String GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml;
 	public static String GenerateEntitiesWizard_tableSelectPage_tables;
 	public static String GenerateEntitiesWizard_tableSelectPage_tableColumn;
 	//Database connection group
diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/TablesSelectorWizardPage.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/TablesSelectorWizardPage.java
index 4b5fb95..5191f12 100644
--- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/TablesSelectorWizardPage.java
+++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/wizards/gen/TablesSelectorWizardPage.java
@@ -73,10 +73,11 @@
 	private JpaProject jpaProject;
 	private Schema schema = null;
 	private ORMGenCustomizer customizer = null;
-	private boolean synchronizePersistenceXml = true;
+	private boolean updatePersistenceXml = true;
 
 	private DatabaseGroup databaseGroup;
 	private CheckboxTableViewer tableTable;
+	private Button updatePersistenceXmlCheckBox;
 	
 	TablesSelectorWizardPage(JpaProject jpaProject ) {
 		super("TablesSelectorWizardPage"); //$NON-NLS-1$
@@ -135,18 +136,18 @@
 		//Filler column
 		new Label( composite, SWT.NONE);
 		
-		final Button synchronizeClassesCheckBox = new Button(composite, SWT.CHECK);
-		synchronizeClassesCheckBox.setText(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_synchronizeClasses );
-		synchronizeClassesCheckBox.setSelection(true);
-		synchronizeClassesCheckBox.addSelectionListener(new SelectionListener() {
+		this.updatePersistenceXmlCheckBox = new Button(composite, SWT.CHECK);
+		this.updatePersistenceXmlCheckBox.setText(JptUiEntityGenMessages.GenerateEntitiesWizard_tableSelectPage_updatePersistenceXml );
+		this.updatePersistenceXmlCheckBox.setSelection(shouldUpdatePersistenceXml());
+		this.updatePersistenceXmlCheckBox.addSelectionListener(new SelectionListener() {
 			public void widgetDefaultSelected(SelectionEvent e) {}
 
 			public void widgetSelected(SelectionEvent e) {
-				setSynchronizePersistenceXml(synchronizeClassesCheckBox.getSelection());
+				setShouldUpdatePersistenceXml(updatePersistenceXmlCheckBox.getSelection());
 			}
 
 		});
-		fillColumns( synchronizeClassesCheckBox, 2);
+		fillColumns( this.updatePersistenceXmlCheckBox, 2);
 
 
 		//Filler column
@@ -161,8 +162,8 @@
 					if( customizer.getFile().exists() ){
 						customizer.getFile().delete();
 					}
-					updateTablesSelector( databaseGroup.getSelectedSchema() );
 					deselectAllTables();
+					restoreUpdatePersistenceXmlDefault();
 				}
 			}
 
@@ -171,13 +172,17 @@
 		gridData.horizontalAlignment = SWT.END;
 		restoreBtn.setLayoutData(gridData);
 		
-		
+		this.updateSelectionState(databaseGroup.getSelectedSchema());
 		this.getHelpSystem().setHelp(this.tableTable.getControl(), JpaHelpContextIds.DIALOG_GENERATE_ENTITIES_TABLES);
-
 		this.setControl(composite);
 
 		this.setPageComplete(true);
 	}
+	
+	private void restoreUpdatePersistenceXmlDefault(){
+		updatePersistenceXmlCheckBox.setSelection(true);
+		setShouldUpdatePersistenceXml(true);
+	}
 
 	@Override
 	public void dispose() {
@@ -215,7 +220,7 @@
 					// store the *identifier* in the JPA project, since it gets put in Java annotations
 					jpaProject.setUserOverrideDefaultSchema(schema.getIdentifier());
 					setSchema( schema );
-					updateTablesSelector(schema);
+					updateSelectionState(schema);
 				}
 				doStatusUpdate();
 			}
@@ -225,12 +230,13 @@
 		return dbGroup;
 	}
 
-	boolean synchronizePersistenceXml() {
-		return this.synchronizePersistenceXml;
+	private boolean shouldUpdatePersistenceXml() {
+		return this.updatePersistenceXml;
 	}
 
-	private void setSynchronizePersistenceXml(boolean synchronizePersistenceXml){
-		this.synchronizePersistenceXml = synchronizePersistenceXml;
+	private void setShouldUpdatePersistenceXml(boolean updatePersistenceXml){
+		this.updatePersistenceXml = updatePersistenceXml;
+		doStatusUpdate();
 	}
 
 	private void selectAllTables(){
@@ -299,7 +305,6 @@
 			}
 		});
 
-		updateTablesSelector( databaseGroup.getSelectedSchema() );
 		createButtonComposite(parent);
 		initTablesSelectionControl(possibleTables());		
 	}
@@ -414,6 +419,7 @@
 						}
 						customizer.setSchema(schema);
 						customizer.setTableNames(tableNames);
+						customizer.setShouldUpdatePersistenceXml(updatePersistenceXml);
 						monitor.done();
 				    }
 				});
@@ -471,7 +477,7 @@
 
 	}
 
-	private void updateTablesSelector(final Schema schema) {
+	private void updateSelectionState(final Schema schema) {
 		if(schema ==null)
 			return;
 		this.jpaProject.setUserOverrideDefaultSchema( schema.getIdentifier());
@@ -482,7 +488,7 @@
 		GenerateEntitiesFromSchemaWizard wizard = (GenerateEntitiesFromSchemaWizard) getWizard();
 		customizer = wizard.createORMGenCustomizer( schema );
 
-		if( tableTable!=null && customizer != null  ){
+		if( this.tableTable!=null && this.updatePersistenceXmlCheckBox!=null && customizer != null  ){
 			restoreWizardState();
 		}
         doStatusUpdate();
@@ -491,6 +497,7 @@
 
 	private boolean restoreWizardState(){
 		boolean pageComplete = false;
+		this.updatePersistenceXmlCheckBox.setSelection(this.customizer.shouldUpdatePersistenceXml());
 		List<String> preSelectedTableNames = this.customizer.getTableNames();
 		if(preSelectedTableNames!=null && preSelectedTableNames.size()>0) {
 			Set<String> set = new HashSet<String>();