/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.transformation.ui.wizards.jdg;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.progress.IProgressConstants;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.metamodels.relational.Table;
import org.teiid.designer.tools.textimport.ui.wizards.AbstractObjectProcessor;
import org.teiid.designer.transformation.materialization.MaterializedModelManager;
import org.teiid.designer.transformation.reverseeng.ReverseEngConstants;
import org.teiid.designer.transformation.reverseeng.ReverseEngineerFactory;
import org.teiid.designer.transformation.reverseeng.api.Options;
import org.teiid.designer.transformation.reverseeng.api.Options.Parms;
import org.teiid.designer.transformation.ui.UiPlugin;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.common.InternalUiConstants;
import org.teiid.designer.ui.common.util.UiUtil;
import org.teiid.designer.ui.common.util.WidgetUtil;
import org.teiid.designer.ui.common.wizard.AbstractWizard;
import org.teiid.designer.ui.editors.ModelEditorManager;
public class MaterializationWizard extends AbstractWizard
implements INewWizard, InternalUiConstants.Widgets, CoreStringUtil.Constants, UiConstants, ReverseEngConstants {
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(MaterializationWizard.class);
private static final String TITLE = UiPlugin.getDefault().getString(I18N_PREFIX, "title"); //$NON-NLS-1$
IStructuredSelection initialSelection;
private MaterializedModelManager manager;
private MaterializationWizardPage_1 page_1;
private MaterializationWizardPage_2 page_2;
// private PojoWizardPage_3 page_3;
Mode mode;
/**
* @since 4.0
*/
public MaterializationWizard(Mode mode) {
super(UiPlugin.getDefault(), TITLE, null);
this.mode = mode;
}
/**
* @see org.eclipse.jface.wizard.IWizard#performFinish()
* @since 4.0
*/
@Override
public boolean finish() {
final IRunnableWithProgress op = new IRunnableWithProgress() {
@Override
public void run(final IProgressMonitor monitor) throws InvocationTargetException {
try {
runAsJob();
} catch (final Exception err) {
throw new InvocationTargetException(err);
} finally {
monitor.done();
}
}
};
try {
new ProgressMonitorDialog(getShell()).run(false, true, op);
return true;
} catch (Throwable err) {
if (err instanceof InvocationTargetException) {
err = ((InvocationTargetException) err).getTargetException();
}
Util.log(err);
WidgetUtil.showError(UiPlugin.getDefault().getString(I18N_PREFIX, "errorCreatingMaterializedViews")); //$NON-NLS-1$
return false;
}
}
/**
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
* org.eclipse.jface.viewers.IStructuredSelection)
* @since 4.0
*/
@Override
public void init(final IWorkbench workbench, final IStructuredSelection selection) {
initialSelection = new StructuredSelection(selection.toArray());
this.manager = new MaterializedModelManager((EObject)initialSelection.toList().get(0), this.mode);
if( this.mode == Mode.MATERIALIZE) {
this.page_1 = new MaterializationWizardPage_1(this.manager);
addPage(page_1);
this.page_2 = new MaterializationWizardPage_2(this.manager);
addPage(page_2);
} else {
this.page_2 = new MaterializationWizardPage_2(this.manager);
addPage(page_2);
}
//
// this.page_3 = new PojoWizardPage_3(this.manager);
// addPage(page_3);
}
/**
* @see org.eclipse.jface.wizard.IWizard#canFinish()
* @since 4.0
*/
@Override
public boolean canFinish() {
// defect 16154 -- Finish can be enabled even if errors on page.
// check the page's isComplete status (in super) -- just follow its
// advice.
return super.canFinish();
}
Composite createEmptyPageControl(final Composite parent) {
return new Composite(parent, SWT.NONE);
}
private boolean runAsJob() {
final String message = UiPlugin.getDefault().getString(I18N_PREFIX, "progressMonitorTitle"); //$NON-NLS-1$
final Job job = new Job(message) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
monitor.beginTask(message, 1);
if (!monitor.isCanceled()) {
execute(monitor);
}
monitor.done();
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return new Status(IStatus.OK, UiConstants.PLUGIN_ID, IStatus.OK, AbstractObjectProcessor.FINISHED,
null);
} catch (Exception e) {
UiConstants.Util.log(e);
return new Status(IStatus.ERROR, UiConstants.PLUGIN_ID, IStatus.ERROR,
UiPlugin.getDefault().getString(I18N_PREFIX, "errorCreatingMaterializedViews"), e); //$NON-NLS-1$
} finally {
}
}
};
job.setSystem(false);
job.setUser(true);
job.setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE);
// start as soon as possible
job.schedule();
return true;
}
private boolean execute(IProgressMonitor monitor) {
boolean requiredStart = ModelerCore.startTxn(false, false, "Generate JDG Materialized Module", this); //$NON-NLS-1$
boolean succeeded = false;
try {
if( !manager.isPojoMode() ) {
manager.execute();
// need to save view model if open in editor.
IEditorPart editor = UiUtil.getEditorForFile((IFile)manager.getMaterializedViewModel().getUnderlyingResource(), false);
if( editor != null && editor.isDirty() ) {
editor.doSave(new NullProgressMonitor());
}
}
if( this.manager.doCreatePojo() ) {
processPojo();
}
succeeded = true;
} catch (Exception ex) {
UiConstants.Util.log(IStatus.ERROR, ex,
UiPlugin.getDefault().getString(I18N_PREFIX, "errorCreatingMaterializedViews")); //$NON-NLS-1$
} finally {
// if we started the txn, commit it.
if (requiredStart) {
if (succeeded && !monitor.isCanceled()) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
if (succeeded) {
ModelEditorManager.activate(this.manager.getMaterializedViewModel(), true);
IContainer projectLocation = this.manager.getPojoWorkspaceFolder();
if( projectLocation != null ) {
try {
projectLocation.refreshLocal(IResource.DEPTH_INFINITE, monitor);
} catch (CoreException e) {
UiConstants.Util.log(e);
}
}
}
return succeeded;
}
private void processPojo() {
try {
Options newOptions = new Options();
IContainer projectLocation = this.manager.getPojoWorkspaceFolder();
newOptions.setProperty(Parms.BUILD_LOCATION,
projectLocation.getLocation().toOSString() + MaterializedModelManager.DEFAULT_JDG_MODULE_FOLDER);
newOptions.setProperty(Options.Parms.MODULE_ZIP_FILE, manager.getModuleZipFileName());
newOptions.setProperty(Parms.POJO_PACKAGE_NAME, manager.getPojoPackageName());
String pojoJarName = this.manager.getPojoClassName() + ".jar"; //
newOptions.setProperty(Parms.POJO_JAR_FILE, pojoJarName);
newOptions.setProperty(Parms.POJO_CLASS_NAME, this.manager.getPojoClassName());
String annotationType = manager.getAnnotationType();
if( annotationType.equalsIgnoreCase(MaterializedModelManager.PROTOBUF) ){
newOptions.setAnnotationType(Options.Annotation_Type.Protobuf);
}
// TODO: enable HIBERNATE
// else if( annotationType.equalsIgnoreCase(MaterializedModelManager.HIBERNATE) ){
// newOptions.setAnnotationType(Options.Annotation_Type.Hibernate);
// }
if( this.manager.doGenerateModule() ) {
newOptions.setProperty(Options.Parms.GENERATE_MODULE, Boolean.TRUE.toString());
}
ReverseEngineerFactory.perform((Table)manager.getVirtualTable(), newOptions);
} catch (Exception e) {
UiConstants.Util.log(e);
}
}
}