blob: b8ca74c4265d3bf09483dbe1ffdce73c3471674a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 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;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.core.JptCorePlugin;
import org.eclipse.jpt.jaxb.core.internal.ClassesGenerator;
import org.eclipse.jpt.jaxb.ui.internal.wizards.ClassesGeneratorWizard;
import org.eclipse.jpt.utility.internal.StringTools;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* ClassesGeneratorUi
*/
public class ClassesGeneratorUi {
private final JpaProject project;
private final String xmlSchemaName;
// ********** static methods **********
public static void generate(IFile xsdFile) {
JpaProject jpaProject = JptCorePlugin.getJpaProject(xsdFile.getProject());
if (jpaProject == null) {
return;
}
IPath xmlSchema = xsdFile.getProjectRelativePath();
new ClassesGeneratorUi(jpaProject, xmlSchema.toOSString()).generate();
}
// ********** constructors **********
private ClassesGeneratorUi(JpaProject project, String xmlSchemaName) {
super();
if (project == null || StringTools.stringIsEmpty(xmlSchemaName)) {
throw new NullPointerException();
}
this.project = project;
this.xmlSchemaName = xmlSchemaName;
}
// ********** generate **********
/**
* prompt the user with a wizard
*/
protected void generate() {
ClassesGeneratorWizard wizard = new ClassesGeneratorWizard(this.project, this.xmlSchemaName);
WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
dialog.create();
int returnCode = dialog.open();
if (returnCode != Window.OK) {
return;
}
String outputDir = wizard.getDestinationFolder();
String targetPackage = wizard.getTargetPackage();
String catalog = wizard.getCatalog();
boolean useMoxy = wizard.getUseMoxy();
String[] bindingsFileNames = wizard.getBindingsFileNames();
this.run(outputDir, targetPackage, catalog, useMoxy, bindingsFileNames);
}
// ********** internal methods **********
private void run(
String outputDir,
String targetPackage,
String catalog,
boolean useMoxyGenerator,
String[] bindingsFileNames) {
IWorkspaceRunnable runnable = this.buildGenerateEntitiesRunnable(
this.project,
this.xmlSchemaName,
outputDir,
targetPackage,
catalog,
useMoxyGenerator,
bindingsFileNames);
try {
ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
}
catch (CoreException ex) {
throw new RuntimeException(ex);
}
}
private IWorkspaceRunnable buildGenerateEntitiesRunnable(
JpaProject project,
String xmlSchemaName,
String outputDir,
String targetPackage,
String catalog,
boolean useMoxyGenerator,
String[] bindingsFileNames) {
return new GenerateEntitiesRunnable(project, xmlSchemaName, outputDir, targetPackage, catalog, useMoxyGenerator, bindingsFileNames);
}
private Shell getCurrentShell() {
return Display.getCurrent().getActiveShell();
}
// ********** Runnable Class **********
private static class GenerateEntitiesRunnable implements IWorkspaceRunnable {
private final JpaProject project;
private final String xmlSchemaName;
private final String outputDir;
private final String targetPackage;
private final String catalog;
private final boolean useMoxyGenerator;
private final String[] bindingsFileNames;
// ********** constructors **********
public GenerateEntitiesRunnable(
JpaProject project,
String xmlSchemaName,
String outputDir,
String targetPackage,
String catalog,
boolean useMoxyGenerator,
String[] bindingsFileNames) {
super();
this.project = project;
this.xmlSchemaName = xmlSchemaName;
this.outputDir = outputDir;
this.targetPackage = targetPackage;
this.catalog = catalog;
this.useMoxyGenerator = useMoxyGenerator;
this.bindingsFileNames = bindingsFileNames;
}
public void run(IProgressMonitor monitor) {
try {
this.entitiesGeneratorGenerate(this.project,
this.xmlSchemaName,
this.outputDir,
this.targetPackage,
this.catalog,
this.useMoxyGenerator,
this.bindingsFileNames,
monitor);
}
catch (OperationCanceledException e) {
return;
// fall through and tell monitor we are done
}
catch (RuntimeException re) {
String msg = re.getMessage();
String message = (msg == null) ? re.toString() : msg;
this.logError(message);
throw new RuntimeException(re);
}
}
private void entitiesGeneratorGenerate(JpaProject project,
String xmlSchemaName,
String outputDir,
String targetPackage,
String catalog,
boolean useMoxyGenerator,
String[] bindingsFileNames,
IProgressMonitor monitor) {
ClassesGenerator.generate(project,
xmlSchemaName,
outputDir,
targetPackage,
catalog,
useMoxyGenerator,
bindingsFileNames,
monitor);
return;
}
private void logError(String message) {
this.displayError(message);
}
private void displayError(String message) {
MessageDialog.openError(
this.getShell(),
JptJaxbUiMessages.ClassesGeneratorWizard_errorDialogTitle,
message
);
}
private Shell getShell() {
Display display = Display.getCurrent();
Shell shell = (display == null) ? null : display.getActiveShell();
if (shell == null && display != null) {
Shell[] shells = display.getShells();
if (shells.length > 0)
shell = shells[0];
}
return shell;
}
}
}