blob: ad58c279a6ab7d3972ec34f74ed14ad154eafb8b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.dbws.eclipselink.ui.internal;
import java.io.File;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.common.core.gen.JptGenerator;
import org.eclipse.jpt.common.core.internal.utility.ProjectTools;
import org.eclipse.jpt.common.ui.gen.AbstractJptGenerateJob;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.common.utility.predicate.Predicate;
import org.eclipse.jpt.dbws.eclipselink.core.internal.gen.DbwsGenerator;
import org.eclipse.jpt.dbws.eclipselink.ui.JptDbwsEclipseLinkUiMessages;
import org.eclipse.jpt.dbws.eclipselink.ui.internal.plugin.JptDbwsEclipseLinkUiPlugin;
import org.eclipse.jpt.dbws.eclipselink.ui.internal.wizards.gen.DbwsGeneratorWizard;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.tools.dbws.DBWSBuilderModel;
import org.eclipse.persistence.tools.dbws.DBWSBuilderModelProject;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
/**
* DbwsGeneratorUi
*/
public class DbwsGeneratorUi
{
private final IJavaProject javaProject;
private final String builderXmlFile;
private static final String WEB_FACET_ID = "jst.web"; //$NON-NLS-1$
private static final String DRIVER_PROPERTY = "driver"; //$NON-NLS-1$
private static final String DBWS_BUILDER_CLASS_NAME = "org.eclipse.persistence.tools.dbws.DBWSBuilder"; //$NON-NLS-1$
public static final Predicate<IProject> PROJECT_HAS_WEB_FACET = new ProjectTools.HasNature(WEB_FACET_ID);
// ********** static methods **********
public static void generate(IFile xmlFile) {
IProject project = xmlFile.getProject();
if( ! ProjectTools.hasFacet(project, WEB_FACET_ID)) {
throw new RuntimeException(JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__NOT_WEB_DYNAMIC_PROJECT);
}
IPath xmlPath = xmlFile.getProjectRelativePath();
new DbwsGeneratorUi(project, xmlPath.toOSString()).generate();
}
public static IPath getWebContentPath(IProject project){
IVirtualComponent component = ComponentCore.createComponent(project);
IPath modulePath = component.getRootFolder().getProjectRelativePath();
return modulePath;
}
public static boolean displayDBWSNotOnClasspathWarning(Shell shell) {
String msg = JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__DBWS_NOT_ON_CLASSPATH_MESSAGE;
return MessageDialog.openQuestion(
shell,
JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__RUNNING_DBWS_WARNING_TITLE,
msg);
}
public static boolean displayOverridingWebContentWarning(Shell shell) {
String msg = JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__RUNNING_DBWS_WARNING_MESSAGE;
return MessageDialog.openQuestion(
shell,
JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__RUNNING_DBWS_WARNING_TITLE,
msg);
}
// ********** constructors **********
private DbwsGeneratorUi(IProject webProject, String builderXmlFile) {
super();
if(webProject == null || StringTools.isBlank(builderXmlFile)) {
throw new NullPointerException();
}
this.javaProject = this.findJavaProject(webProject);
if(this.javaProject == null) {
throw new RuntimeException(JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__NOT_JAVA_PROJECT);
}
this.builderXmlFile = builderXmlFile;
}
// ********** generate **********
/**
* prompt the user with a wizard
*/
protected void generate() {
if( ! this.dbwsIsOnClasspath()) {
if( ! displayDBWSNotOnClasspathWarning(this.getCurrentShell())) {
return;
}
}
if(this.classIsOnProjectsClasspath(
this.getDriverNameFrom(this.builderXmlFile))) {
if(displayOverridingWebContentWarning(this.getCurrentShell())) {
this.scheduleGenerateDbwsJob();
}
return;
}
this.openWizardDialog();
return;
}
// ********** internal methods **********
private void openWizardDialog() {
DbwsGeneratorWizard wizard = new DbwsGeneratorWizard(this.javaProject, this.builderXmlFile);
wizard.setWindowTitle(JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_WIZARD__TITLE);
WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
dialog.create();
int returnCode = dialog.open();
if(returnCode != Window.OK) {
return;
}
}
private String getDriverNameFrom(String builderXmlFile) {
try {
DBWSBuilderModel model = this.buildBuilderModel(builderXmlFile);
Map<String, String> properties = model.getProperties();
return properties.get(DRIVER_PROPERTY);
}
catch(Exception e) {
return null;
}
}
private DBWSBuilderModel buildBuilderModel(String builderFileName) {
String projectDirName = this.javaProject.getProject().getLocation().toOSString();
File builderFile = this.getBuilderFile(projectDirName + File.separator + builderFileName);
return this.unmarshal(builderFile);
}
private DBWSBuilderModel unmarshal(File builderFile) {
if((builderFile == null) || ( ! builderFile.exists())) {
return null;
}
XMLContext context = new XMLContext(new DBWSBuilderModelProject());
XMLUnmarshaller unmarshaller = context.createUnmarshaller();
DBWSBuilderModel model = (DBWSBuilderModel)unmarshaller.unmarshal(builderFile);
if(model == null || model.properties.size() == 0) {
return null;
}
return model;
}
private File getBuilderFile(String builderFileName) {
File builderFile = new File(builderFileName);
if( ! (builderFile.exists() && builderFile.isFile())) {
return null;
}
return builderFile;
}
/**
* Test if the given class is on the project's classpath.
*/
private boolean classIsOnProjectsClasspath(String driverName) {
try {
if(StringTools.isBlank(driverName)) {
return false;
}
IType genClass = this.javaProject.findType(driverName);
return (genClass != null);
}
catch (JavaModelException e) {
throw new RuntimeException(e);
}
}
/**
* Test if the DBWS builder is on the project's classpath.
*/
private boolean dbwsIsOnClasspath() {
try {
IType genClass = this.javaProject.findType(DBWS_BUILDER_CLASS_NAME);
return (genClass != null);
}
catch (JavaModelException e) {
throw new RuntimeException(e);
}
}
private IJavaProject findJavaProject(IProject project) {
IJavaElement javaElement = this.findJavaElement(project);
return (javaElement == null) ? null : javaElement.getJavaProject();
}
private IJavaElement findJavaElement(IResource resource) {
return (IJavaElement) resource.getAdapter(IJavaElement.class);
}
private Shell getCurrentShell() {
return Display.getCurrent().getActiveShell();
}
private void scheduleGenerateDbwsJob() {
String stageDirName = this.javaProject.getProject().getLocation().toOSString();
WorkspaceJob generateJob = new GenerateDbwsJob(
this.javaProject,
this.builderXmlFile,
stageDirName,
null // driverJarList
);
generateJob.schedule();
}
// ********** generate DBWS job **********
public static class GenerateDbwsJob extends AbstractJptGenerateJob {
private final String builderFileName;
private final String stageDirName;
private final String driverJarList;
public GenerateDbwsJob(IJavaProject javaProject, String builderFileName, String stageDirName, String driverJarList) {
super(JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_WIZARD__GENERATING_DBWS, javaProject);
this.builderFileName = builderFileName;
this.stageDirName = stageDirName;
this.driverJarList = driverJarList;
}
// ********** overwrite AbstractJptGenerateJob **********
@Override
protected JptGenerator buildGenerator() {
return new DbwsGenerator(this.getJavaProject(), this.builderFileName, this.stageDirName, this.driverJarList);
}
@Override
protected void postGenerate() {
this.refreshProject();
}
@Override
protected String getJobName() {
return JptDbwsEclipseLinkUiMessages.DBWS_GENERATOR_UI__GENERATING_DBWS;
}
@Override
protected void jptPluginLogException(Exception exception) {
JptDbwsEclipseLinkUiPlugin.instance().logError(exception);
}
}
}