393448 - convert our plugin.xml popupMenus and actionsSets to the
command extension point
diff --git a/jaxb/plugins/org.eclipse.jpt.dbws.eclipselink.ui/src/org/eclipse/jpt/dbws/eclipselink/ui/internal/handlers/GenerateDbwsHandler.java b/jaxb/plugins/org.eclipse.jpt.dbws.eclipselink.ui/src/org/eclipse/jpt/dbws/eclipselink/ui/internal/handlers/GenerateDbwsHandler.java
new file mode 100644
index 0000000..a802c69
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.dbws.eclipselink.ui/src/org/eclipse/jpt/dbws/eclipselink/ui/internal/handlers/GenerateDbwsHandler.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.dbws.eclipselink.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.dbws.eclipselink.ui.internal.DbwsGeneratorUi;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ *  GenerateDbwsHandler
+ */
+public class GenerateDbwsHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// There is always only one element in the actual selection.
+		IStructuredSelection selection = (IStructuredSelection)HandlerUtil.getCurrentSelectionChecked(event);
+
+		IFile xmlFile = this.buildXmlFile(selection.getFirstElement());
+		if(xmlFile != null) {
+			DbwsGeneratorUi.generate(xmlFile);
+		}
+		return null;
+	}
+
+	private IFile buildXmlFile(Object selection) {
+		if (selection instanceof IFile) {
+			return (IFile) selection;
+		}
+		return null;
+	}
+
+}
\ No newline at end of file
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/handlers/GenerateClassesHandler.java b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/handlers/GenerateClassesHandler.java
new file mode 100644
index 0000000..47ba447
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.ui/src/org/eclipse/jpt/jaxb/ui/internal/handlers/GenerateClassesHandler.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jaxb.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.jaxb.ui.internal.ClassesGeneratorUi;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ *  GenerateClassesHandler
+ */
+public class GenerateClassesHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// There is always only one element in the actual selection.
+		IStructuredSelection selection = (IStructuredSelection)HandlerUtil.getCurrentSelectionChecked(event);
+		
+		IFile xsdFile = this.buildXsdFile(selection.getFirstElement());
+		if(xsdFile != null) {
+			ClassesGeneratorUi.generate(xsdFile);
+		}
+		return null;
+	}
+
+	private IFile buildXsdFile(Object selection) {
+		if (selection instanceof IFile) {
+			return (IFile) selection;
+		}
+		return null;
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewDynamicEntityHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewDynamicEntityHandler.java
new file mode 100644
index 0000000..ee642c8
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewDynamicEntityHandler.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jpt.jpa.eclipselink.ui.internal.wizards.EclipseLinkDynamicEntityWizard;
+import org.eclipse.jpt.jpa.ui.internal.handlers.NewEntityHandler.OpenJptWizardAction;
+import org.eclipse.ui.INewWizard;
+
+/**
+ *  NewDynamicEntityHandler
+ */
+public class NewDynamicEntityHandler extends AbstractHandler
+{
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+
+			Command command = event.getCommand();
+
+	    	OpenJptWizardAction openJptWizardAction = new OpenDynamicEntityWizardAction(command);
+	    	openJptWizardAction.run();
+
+			return null;
+		}
+
+	// ********** OpenDynamicEntityWizardAction **********
+
+	public static class OpenDynamicEntityWizardAction extends OpenJptWizardAction {
+
+		public OpenDynamicEntityWizardAction(Command command) {
+			super(command);
+		}
+
+		@Override
+		protected INewWizard createWizard() throws CoreException {
+			return new EclipseLinkDynamicEntityWizard(null);
+		}
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewEclipseLinkMappingFileHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewEclipseLinkMappingFileHandler.java
new file mode 100644
index 0000000..defc468
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.ui/src/org/eclipse/jpt/jpa/eclipselink/ui/internal/handlers/NewEclipseLinkMappingFileHandler.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.eclipselink.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jpt.jpa.eclipselink.ui.internal.wizards.EclipseLinkMappingFileWizard;
+import org.eclipse.jpt.jpa.ui.internal.handlers.NewEntityHandler.OpenJptWizardAction;
+import org.eclipse.ui.INewWizard;
+
+/**
+ *  NewEclipseLinkMappingFileHandler
+ */
+public class NewEclipseLinkMappingFileHandler extends AbstractHandler
+{
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+
+			Command command = event.getCommand();
+
+	    	OpenJptWizardAction openJptWizardAction = new OpenEclipseLinkMappingFileWizardAction(command);
+	    	openJptWizardAction.run();
+		    	
+			return null;
+		}
+
+	// ********** OpenEclipseLinkMappingFileWizardAction **********
+
+	public static class OpenEclipseLinkMappingFileWizardAction extends OpenJptWizardAction {
+
+		public OpenEclipseLinkMappingFileWizardAction(Command command) {
+			super(command);
+		}
+
+		@Override
+		protected INewWizard createWizard() throws CoreException {
+			return new EclipseLinkMappingFileWizard(null);
+		}
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateDDLHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateDDLHandler.java
new file mode 100644
index 0000000..b1ddda2
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateDDLHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * See org.eclipse.jpt.jpa.ui/plugin.xml
+ */
+public class GenerateDDLHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		JpaProject jpaProject = null;
+		ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);
+		
+		if(selection instanceof IStructuredSelection) {
+			Object selectedObject = ((IStructuredSelection) selection).getFirstElement();
+			jpaProject = this.adaptSelection(selectedObject);
+		} 
+		if(jpaProject != null) {
+			this.generateDDL(jpaProject, (IStructuredSelection)selection);
+		}	
+		return null;
+	}
+	
+	protected void generateDDL(JpaProject project, IStructuredSelection selection) {
+        this.getJpaPlatformUi(project).generateDDL(project, selection);
+	}
+
+	private JpaProject adaptSelection(Object selectedObject) {
+		return PlatformTools.getAdapter(selectedObject, JpaProject.class);
+	}
+
+	private JpaPlatformUi getJpaPlatformUi(JpaProject project) {
+        return (JpaPlatformUi) project.getJpaPlatform().getAdapter(JpaPlatformUi.class);
+	}
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateEntitiesHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateEntitiesHandler.java
new file mode 100644
index 0000000..8e46c02
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/GenerateEntitiesHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * See org.eclipse.jpt.jpa.ui/plugin.xml
+ */
+public class GenerateEntitiesHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		JpaProject jpaProject = null;
+		ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);
+		
+		if (selection instanceof IStructuredSelection) {
+			Object selectedObject = ((IStructuredSelection) selection).getFirstElement();
+			jpaProject = this.adaptSelection(selectedObject);
+		} 
+		if (jpaProject != null) {
+			this.generateEntities(jpaProject, (IStructuredSelection)selection);
+		}	
+		return null;
+	}
+	
+	protected void generateEntities(JpaProject project, IStructuredSelection selection) {
+        this.getJpaPlatformUi(project).generateEntities(project, selection);
+	}
+
+	private JpaProject adaptSelection(Object selectedObject) {
+		return PlatformTools.getAdapter(selectedObject, JpaProject.class);
+	}
+
+	private JpaPlatformUi getJpaPlatformUi(JpaProject project) {
+        return (JpaPlatformUi) project.getJpaPlatform().getAdapter(JpaPlatformUi.class);
+	}
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/MakePersistentHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/MakePersistentHandler.java
new file mode 100644
index 0000000..5a8fd56
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/MakePersistentHandler.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.JpaMakePersistentWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ *  MakePersistentHandler
+ */
+public class MakePersistentHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);
+		
+		for (Map.Entry<IProject, Set<IType>> entry : this.buildSelectedTypes(selection).entrySet()) {
+			IProject project = entry.getKey();
+			Set<IType> types = entry.getValue();
+			JpaProject jpaProject = (JpaProject) project.getAdapter(JpaProject.class);
+			if (jpaProject != null) {
+				//open the wizard once for each selected project
+				JpaMakePersistentWizard wizard = new JpaMakePersistentWizard(jpaProject, types);
+				WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
+				dialog.create();
+				dialog.open();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Return a map containing lists of types, keyed by project.
+	 * <p>
+	 * The action is contributed for:<ul>
+	 * <li>{@link IType}
+	 * <li>{@link ICompilationUnit}
+	 * <li>{@link IPackageFragment}
+	 * <li>{@link IPackageFragmentRoot} that is a source folder
+	 * </ul>
+	 */
+	private Map<IProject, Set<IType>> buildSelectedTypes(ISelection currentSelection) {
+		if ( ! (currentSelection instanceof StructuredSelection)) {
+			return Collections.emptyMap();
+		}
+		HashMap<IProject, Set<IType>> types = new HashMap<IProject, Set<IType>>();
+		for (Object sel : ((StructuredSelection) currentSelection).toList()) {
+			switch (((IJavaElement) sel).getElementType()) {
+				case IJavaElement.PACKAGE_FRAGMENT_ROOT :
+					this.addSelectedTypes((IPackageFragmentRoot) sel, types);
+					break;
+				case IJavaElement.PACKAGE_FRAGMENT :
+					this.addSelectedTypes((IPackageFragment) sel, types);
+					break;
+				case IJavaElement.COMPILATION_UNIT :
+					this.addSelectedTypes((ICompilationUnit) sel, types);
+					break;
+				case IJavaElement.TYPE :
+					this.addSelectedType((IType) sel, types);
+					break;
+				default :
+					break;
+			}
+		}
+		return types;
+	}
+	
+	private void addSelectedTypes(IPackageFragmentRoot packageFragmentRoot, Map<IProject, Set<IType>> types) {
+		for (IJavaElement pkgFragment : this.getPackageFragments(packageFragmentRoot)) {
+			this.addSelectedTypes((IPackageFragment) pkgFragment, types);
+		}
+	}
+	
+	private void addSelectedTypes(IPackageFragment packageFragment, Map<IProject, Set<IType>> types) {
+		for (ICompilationUnit compUnit : this.getCompilationUnits(packageFragment)) {
+			this.addSelectedTypes(compUnit, types);
+		}
+	}
+	
+	private void addSelectedTypes(ICompilationUnit compilationUnit, Map<IProject, Set<IType>> types) {
+		IType primaryType = compilationUnit.findPrimaryType();
+		if (primaryType != null) {
+			this.addSelectedType(primaryType, types);
+		}
+	}
+
+	private void addSelectedType(IType primaryType, Map<IProject, Set<IType>> typesMap) {
+		IProject project = primaryType.getJavaProject().getProject();
+		Set<IType> types = typesMap.get(project);
+		if (types == null) {
+			types = new HashSet<IType>();
+			typesMap.put(project, types);
+		}
+		types.add(primaryType);
+	}
+
+	private ICompilationUnit[] getCompilationUnits(IPackageFragment packageFragment) {
+		try {
+			return packageFragment.getCompilationUnits();
+		}
+		catch (JavaModelException e) {
+			JptJpaUiPlugin.instance().logError(e);
+		}
+		return new ICompilationUnit[0];
+	}
+	
+	private IJavaElement[] getPackageFragments(IPackageFragmentRoot packageFragmentRoot) {
+		try {
+			return packageFragmentRoot.getChildren();
+		}
+		catch (JavaModelException e) {
+			JptJpaUiPlugin.instance().logError(e);
+		}
+		return new IJavaElement[0];
+	}
+	
+	private Shell getCurrentShell() {
+	    return Display.getCurrent().getActiveShell();
+	}
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewEntityHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewEntityHandler.java
new file mode 100644
index 0000000..5e5b030
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewEntityHandler.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.ui.actions.AbstractOpenWizardAction;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
+import org.eclipse.jpt.jpa.ui.internal.wizards.entity.EntityWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ *  NewEntityHandler
+ */
+public class NewEntityHandler extends AbstractHandler
+{
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+
+		Command command = event.getCommand();
+
+    	OpenJptWizardAction openJptWizardAction = new OpenJptWizardAction(command);
+    	openJptWizardAction.run();
+
+	    return null;
+	}
+
+	// ********** OpenJptWizardAction **********
+	
+	public static class OpenJptWizardAction extends AbstractOpenWizardAction {
+
+		private final Command command; 
+
+		public OpenJptWizardAction(Command command) {
+			this.command = command;
+
+			String commandName = null;
+			try {
+				commandName = this.command.getName();
+			}
+			catch (NotDefinedException e1) {
+				commandName = "";
+			}
+			this.setText(commandName);  
+			this.setDescription(commandName);
+			this.setToolTipText(commandName);
+		}
+		
+		@Override
+		public void run() {
+			Shell shell = this.getShell();
+			try {
+				INewWizard wizard = createWizard();
+				wizard.init(PlatformUI.getWorkbench(), this.getSelection());
+				
+				WizardDialog dialog = new WizardDialog(shell, wizard);
+				PixelConverter converter = new PixelConverter(JFaceResources.getDialogFont());
+				dialog.setMinimumPageSize(converter.convertWidthInCharsToPixels(70), converter.convertHeightInCharsToPixels(20));
+				dialog.create();
+				int res = dialog.open();
+				
+				this.notifyResult(res == Window.OK);
+			} 
+			catch (CoreException e) {
+				JptJpaUiPlugin.instance().logError(e);
+			}
+		}
+
+		@Override
+		protected INewWizard createWizard() throws CoreException {
+			return new EntityWizard(null);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewMappingFileHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewMappingFileHandler.java
new file mode 100644
index 0000000..b751f09
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/NewMappingFileHandler.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jpt.jpa.ui.internal.handlers.NewEntityHandler.OpenJptWizardAction;
+import org.eclipse.jpt.jpa.ui.internal.wizards.orm.MappingFileWizard;
+import org.eclipse.ui.INewWizard;
+
+/**
+ *  NewMappingFileHandler
+ */
+public class NewMappingFileHandler extends AbstractHandler
+{
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+
+		Command command = event.getCommand();
+
+    	OpenJptWizardAction openJptWizardAction = new OpenJpaMappingFileWizardAction(command);
+    	openJptWizardAction.run();
+
+    	return null;
+		}
+
+	// ********** OpenJpaMappingFileWizardAction **********
+
+	public static class OpenJpaMappingFileWizardAction extends OpenJptWizardAction {
+
+		public OpenJpaMappingFileWizardAction(Command command) {
+			super(command);
+		}
+
+		@Override
+		protected INewWizard createWizard() throws CoreException {
+			return new MappingFileWizard(null);
+		}
+	}
+}
\ No newline at end of file
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/SynchronizeClassesHandler.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/SynchronizeClassesHandler.java
new file mode 100644
index 0000000..87118f0
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/handlers/SynchronizeClassesHandler.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Oracle. All rights reserved.
+ * This program and the accompanying materials are 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.
+ * 
+ * Contributors:
+ *     Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.jpa.ui.internal.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jpt.common.core.resource.xml.JptXmlResource;
+import org.eclipse.jpt.common.ui.internal.utility.SynchronousUiCommandExecutor;
+import org.eclipse.jpt.common.utility.command.Command;
+import org.eclipse.jpt.common.utility.internal.ObjectTools;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JpaProjectManager;
+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.ui.internal.JptUiMessages;
+import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ *  SynchronizeClassesHandler
+ */
+public class SynchronizeClassesHandler extends AbstractHandler
+{
+	private IFile persistenceXmlFile;
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		// There is always only one element in the actual selection.
+		IStructuredSelection selection = (IStructuredSelection)HandlerUtil.getCurrentSelectionChecked(event);
+		this.persistenceXmlFile = this.buildPersistenceXmlFile(selection.getFirstElement());
+
+		try {
+			IRunnableWithProgress runnable = new SyncRunnable(this.persistenceXmlFile);
+			this.buildProgressMonitorDialog().run(true, true, runnable);  // true => fork; true => cancellable
+		} catch (InvocationTargetException ex) {
+			JptJpaUiPlugin.instance().logError(ex);
+		} catch (InterruptedException ex) {
+			Thread.currentThread().interrupt();
+			JptJpaUiPlugin.instance().logError(ex);
+		}
+		return null;
+	}
+
+	private IFile buildPersistenceXmlFile(Object selection) {
+		if (selection instanceof IFile) {
+			return (IFile) selection;
+		}
+		if (selection instanceof PersistenceXml) {
+			return (IFile) ((PersistenceXml) selection).getResource();
+		}
+		return null;
+	}
+
+	private ProgressMonitorDialog buildProgressMonitorDialog() {
+		return new ProgressMonitorDialog(null);
+	}
+
+
+	// ********** sync runnable **********
+
+	/**
+	 * This is dispatched to the progress monitor dialog.
+	 */
+	/* CU private */ static class SyncRunnable
+		implements IRunnableWithProgress
+	{
+		private IFile persistenceXmlFile;
+
+		SyncRunnable(IFile persistenceXmlFile) {
+			super();
+			this.persistenceXmlFile = persistenceXmlFile;
+		}
+
+		public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+			try {
+				this.run_(monitor);
+			} catch (CoreException ex) {
+				throw new InvocationTargetException(ex);
+			}
+		}
+
+		private void run_(IProgressMonitor monitor) throws CoreException {
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			// lock the entire project, since we might modify the metamodel classes
+			ISchedulingRule rule = workspace.getRuleFactory().modifyRule(this.persistenceXmlFile.getProject());
+			workspace.run(
+				new SyncWorkspaceRunnable(this.persistenceXmlFile),
+				rule,
+				IWorkspace.AVOID_UPDATE,
+				monitor
+			);
+		}
+	}
+
+
+	// ********** sync workspace runnable **********
+
+	/**
+	 * This is dispatched to the Eclipse workspace.
+	 */
+	/* CU private */ static class SyncWorkspaceRunnable
+		implements IWorkspaceRunnable
+	{
+		private IFile persistenceXmlFile;
+
+		SyncWorkspaceRunnable(IFile persistenceXmlFile) {
+			super();
+			this.persistenceXmlFile = persistenceXmlFile;
+		}
+
+		public void run(IProgressMonitor monitor) throws CoreException {
+			if (monitor.isCanceled()) {
+				return;
+			}
+			SubMonitor sm = SubMonitor.convert(monitor, JptUiMessages.SynchronizingClasses_TaskName, 20);
+
+			JpaProject jpaProject = this.getJpaProject();
+			if (jpaProject == null) {
+				return;
+			}
+
+			JptXmlResource resource = jpaProject.getPersistenceXmlResource();
+			if (resource == null) {
+				// the resource can be null if the persistence.xml file has an invalid content type
+				return;
+			}
+
+			if (sm.isCanceled()) {
+				return;
+			}
+			sm.worked(1);
+			
+			PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml();
+			if (persistenceXml == null) {
+				return;  // unlikely...
+			}
+
+			Persistence persistence = persistenceXml.getRoot();
+			if (persistence == null) {
+				return;  // unlikely...
+			}
+
+			PersistenceUnit persistenceUnit = (persistence.getPersistenceUnitsSize() == 0) ?
+					persistence.addPersistenceUnit() :
+					persistence.getPersistenceUnit(0);
+			if (sm.isCanceled()) {
+				return;
+			}
+			sm.worked(1);
+
+			Command syncCommand = new SyncCommand(persistenceUnit, sm.newChild(17));
+			try {
+				this.getJpaProjectManager().execute(syncCommand, SynchronousUiCommandExecutor.instance());
+			} catch (InterruptedException ex) {
+				Thread.currentThread().interrupt();  // skip save?
+				throw new RuntimeException(ex);
+			}
+
+			resource.save();
+			sm.worked(1);
+		}
+
+		private JpaProjectManager getJpaProjectManager() {
+			return (JpaProjectManager) this.getWorkspace().getAdapter(JpaProjectManager.class);
+		}
+	
+		private IProject getProject() {
+			return this.persistenceXmlFile.getProject();
+		}
+
+		private JpaProject getJpaProject() {
+			return (JpaProject) this.getProject().getAdapter(JpaProject.class);
+		}
+
+		private IWorkspace getWorkspace() {
+			return this.persistenceXmlFile.getWorkspace();
+		}
+	}
+
+
+	// ********** sync command **********
+
+	/**
+	 * This is dispatched to the JPA project manager.
+	 */
+	/* CU private */ static class SyncCommand
+		implements Command
+	{
+		private final PersistenceUnit persistenceUnit;
+		private final IProgressMonitor monitor;
+
+		SyncCommand(PersistenceUnit persistenceUnit, IProgressMonitor monitor) {
+			super();
+			this.persistenceUnit = persistenceUnit;
+			this.monitor = monitor;
+		}
+
+		public void execute() {
+			this.persistenceUnit.synchronizeClasses(this.monitor);
+		}
+
+		@Override
+		public String toString() {
+			return ObjectTools.toString(this, this.persistenceUnit);
+		}
+	}
+}
\ No newline at end of file