blob: d94a597fd630c4b7c3df1ebeb016a73e7c3188f8 [file] [log] [blame]
/*******************************************************************************
* 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.wizards;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaElement;
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.core.context.JpaContextNode;
import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
import org.eclipse.jpt.jpa.eclipselink.ui.JptJpaEclipseLinkUiPlugin;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.EclipseLinkUiMessages;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.entity.data.model.DynamicEntityDataModelProvider;
import org.eclipse.jpt.jpa.ui.JptJpaUiPlugin;
import org.eclipse.jpt.jpa.ui.internal.JptUiIcons;
import org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.IEntityDataModelProperties;
import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
public class EclipseLinkDynamicEntityWizard extends DataModelWizard implements INewWizard{
private String initialProjectName;
private DynamicEntityClassWizardPage page1;
private DynamicEntityFieldsWizardPage page2;
public EclipseLinkDynamicEntityWizard(IDataModel model) {
super(model);
setWindowTitle(EclipseLinkUiMessages.EclipseLinkDynamicEntityWizard_title);
setDefaultPageImageDescriptor(JptJpaUiPlugin.getImageDescriptor(JptUiIcons.ENTITY_WIZ_BANNER));
}
/**
* Empty constructor
*/
public EclipseLinkDynamicEntityWizard(){
this(null);
}
/* Adds the two pages of the new dynamic entity wizard
* @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#doAddPages()
*/
@Override
protected void doAddPages() {
page1 = new DynamicEntityClassWizardPage(getDataModel(), "pageOne");
page1.setProjectName(this.initialProjectName);
addPage(page1);
page2 = new DynamicEntityFieldsWizardPage(getDataModel(), "pageTwo");
addPage(page2);
}
/*
* Wizard cannot be finished on the first page
* Wizard can be finished on the second page since it's reasonable
* for users to create a dynamic entity without any field(s) and then
* add virtual attributes manually or through JPA structure view
*/
@Override
public boolean canFinish() {
return this.getContainer().getCurrentPage() == page1 ? false : page2.getErrorMessage() == null;
}
/* Return the default data model provider (DynamicEntityDataModelProvider in our case)
* @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#getDefaultProvider()
*/
@Override
protected IDataModelProvider getDefaultProvider() {
return new DynamicEntityDataModelProvider();
}
/*
* Override the parent method in order to open the generated dynamic entity in Java editor
* @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard#postPerformFinish()
*/
@Override
protected void postPerformFinish() throws InvocationTargetException {
try {
IProject project = (IProject) this.getDataModel().getProperty(INewJavaClassDataModelProperties.PROJECT);
JpaProject jpaProject = (JpaProject)(project).getAdapter(JpaProject.class);
String xmlRuntimePath = this.getDataModel().getStringProperty(IEntityDataModelProperties.XML_NAME).trim();
JpaXmlResource xmlResource = jpaProject.getMappingFileXmlResource(new Path(xmlRuntimePath));
openEditor(xmlResource);
} catch (Exception cantOpen) {
JptJpaEclipseLinkUiPlugin.log(cantOpen);
}
}
/*
* Open the EclipseLink mapping file where the dynamic entity is created
*/
protected void openEditor(final JpaXmlResource xmlResource) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IFile file = xmlResource.getFile();
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
IDE.openEditor(page, file, true);
} catch (PartInitException e) {
e.printStackTrace();
}
}
});
}
public void init(IWorkbench workbench, IStructuredSelection iSelection) {
this.initialProjectName = getProjectName(iSelection);
this.getDataModel();
}
protected IProject extractProject(IStructuredSelection iSelection) {
Object selectedObj = iSelection.getFirstElement();
if (selectedObj == null) {
return null;
}
IResource resource = PlatformTools.getAdapter(selectedObj, IResource.class);
if (resource != null) {
return resource.getProject();
}
IJavaElement javaElement = PlatformTools.getAdapter(selectedObj, IJavaElement.class);
if (javaElement != null) {
return javaElement.getJavaProject().getProject();
}
JpaContextNode node = PlatformTools.getAdapter(selectedObj, JpaContextNode.class);
if (node != null) {
return node.getJpaProject().getProject();
}
return null;
}
protected String getProjectName(IStructuredSelection iSelection) {
IProject iProject = this.extractProject(iSelection);
return iProject == null?
EclipseLinkUiMessages.DynamicEntityClassWizardPage_emptyString :
iProject.getName();
}
}