/*
* 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.teiidimporter.ui.wizard;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.PrintWriter;
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.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.ddl.importer.ui.DdlImportDifferencesPage;
import org.teiid.designer.teiidimporter.ui.Messages;
import org.teiid.designer.teiidimporter.ui.UiConstants;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.util.WidgetUtil;
import org.teiid.designer.ui.common.util.WizardUtil;
import org.teiid.designer.ui.common.wizard.AbstractWizardPage;
/**
* Page allows user to fetch/view the DDL and export it (if desired)
*
* @since 8.1
*/
public class ShowDDLPage extends AbstractWizardPage implements UiConstants {
private final String EMPTY = StringConstants.EMPTY_STRING;
private final int GROUP_HEIGHT_190 = 190;
private Text ddlContentsBox;
private Button exportDDLToFileSystemButton;
private Button exportDDLToWorkspaceButton;
private Button setAllTablesReadonlyCB;
private TeiidImportManager importManager;
/**
* ShowDDlPage constructor
* @param importManager the ImportManager
* @since 8.1
*/
public ShowDDLPage(TeiidImportManager importManager) {
super(ShowDDLPage.class.getSimpleName(), Messages.ShowDDLPage_title);
this.importManager = importManager;
}
@Override
public void createControl(Composite parent) {
// Create page
final Composite mainPanel = new Composite(parent, SWT.NONE);
mainPanel.setLayout(new GridLayout(1, false));
mainPanel.setLayoutData(new GridData());
mainPanel.setSize(mainPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
setControl(mainPanel);
// Create button panel
createButtonPanel(mainPanel);
// Create DDL dispplay group
createDDLDisplayGroup(mainPanel);
// Create Updatable override checkbox
createSetUpdatableCheckbox(mainPanel);
setPageComplete(false);
}
/*
* Create the Group containing the DDL Contents (not editable)
*/
private void createDDLDisplayGroup( Composite parent ) {
Group theGroup = WidgetFactory.createGroup(parent, Messages.ShowDDLPage_DDLContentsGroup, SWT.NONE, 1, 1);
GridData groupGD = new GridData(GridData.FILL_BOTH);
groupGD.heightHint = GROUP_HEIGHT_190;
groupGD.widthHint = 400;
theGroup.setLayoutData(groupGD);
ddlContentsBox = WidgetFactory.createTextBox(theGroup);
ddlContentsBox.setEditable(false);
ddlContentsBox.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
}
/**
* Set the DDL display contents
* @param ddlText the DDL to display
*/
public void setDDL(String ddlText) {
ddlContentsBox.setText(ddlText);
}
/**
* Get the DDL display contents
* @return the DDL display contents
*/
public String getDDL() {
return ddlContentsBox.getText();
}
/*
* Create the VDB Deploy button
*/
private void createButtonPanel(Composite parent) {
Composite buttonPanel = new Composite(parent,SWT.NONE);
buttonPanel.setLayout(new GridLayout(2, false));
buttonPanel.setLayoutData(new GridData());
exportDDLToFileSystemButton = new Button(buttonPanel, SWT.PUSH);
exportDDLToFileSystemButton.setText(Messages.ShowDDLPage_exportDDLToFileSystemButton);
exportDDLToFileSystemButton.setToolTipText(Messages.ShowDDLPage_exportDDLToFileSystemButtonTooltip);
exportDDLToFileSystemButton.setLayoutData(new GridData());
exportDDLToFileSystemButton.setEnabled(false);
exportDDLToFileSystemButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleExportDDLToFileSystem();
}
});
exportDDLToWorkspaceButton = new Button(buttonPanel, SWT.PUSH);
exportDDLToWorkspaceButton.setText(Messages.ShowDDLPage_exportDDLToWorkspaceButton);
exportDDLToWorkspaceButton.setToolTipText(Messages.ShowDDLPage_exportDDLToWorkspaceButtonTooltip);
exportDDLToWorkspaceButton.setLayoutData(new GridData());
exportDDLToWorkspaceButton.setEnabled(false);
exportDDLToWorkspaceButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleExportDDLToWorkspace();
}
});
}
/*
* Create the Updatable override checkbox
*/
private void createSetUpdatableCheckbox(Composite parent) {
// CheckBox for Table updatable override
setAllTablesReadonlyCB = WidgetFactory.createCheckBox(parent, Messages.ShowDDLPage_updatableCheckBox_Label, SWT.NONE, 1);
setAllTablesReadonlyCB.setToolTipText(Messages.ShowDDLPage_updatableCheckBox_Tooltip);
setAllTablesReadonlyCB.setSelection(false);
// Toggling the checkbox toggles the updatable override value
setAllTablesReadonlyCB.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean setReadonly = setAllTablesReadonlyCB.getSelection();
if(setReadonly) {
importManager.setDdlImportOptionTableUpdatableOverride(!setReadonly); // if checkbox true, the override value is false (updatable=false)
} else {
importManager.removeDdlImportOptionTableUpdatableOverride();
}
}
});
}
/**
* Export the current string content of the DDL display to a user-selected file on file system
*/
public void handleExportDDLToFileSystem() {
FileDialog dlg = new FileDialog(getShell(), SWT.SAVE);
dlg.setFilterExtensions(new String[] {"*.*"}); //$NON-NLS-1$
dlg.setText(Messages.ShowDDLPage_exportDDLDialogTitle);
dlg.setFileName(Messages.ShowDDLPage_exportDDLDialogDefaultFileName);
String fileStr = dlg.open();
// Export to the file
exportDDLToFile(fileStr);
}
/**
* Export the current string content of the DDL display to a user-selected location in their workspace
*/
private void handleExportDDLToWorkspace() {
// Show dialog for copying the DataSource
ExportDDLToWorkspaceDialog dialog = new ExportDDLToWorkspaceDialog(getShell());
dialog.open();
// If Dialog was OKd, create the DataSource
if (dialog.getReturnCode() == Window.OK) {
IContainer targetContainer = dialog.getTargetContainer();
String fileName = dialog.getFileName();
createDDLFile(targetContainer,fileName);
}
}
private void createDDLFile(final IContainer targetContainer, final String ddlFileName) {
// Create the DDL File
final IRunnableWithProgress op = new IRunnableWithProgress() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
@SuppressWarnings("unchecked")
public void run( final IProgressMonitor monitor ) throws InvocationTargetException {
try {
final IFile ddlFileToCreate = targetContainer.getFile(new Path(ddlFileName));
String ddl = getDDL();
InputStream istream = new ByteArrayInputStream(ddl.getBytes());
ddlFileToCreate.create(istream, false, monitor);
targetContainer.refreshLocal(IResource.DEPTH_INFINITE, monitor);
} catch (final Exception err) {
throw new InvocationTargetException(err);
} finally {
monitor.done();
}
}
};
try {
new ProgressMonitorDialog(getShell()).run(false, true, op);
} catch (Throwable err) {
if (err instanceof InvocationTargetException) {
err = ((InvocationTargetException)err).getTargetException();
}
ModelerCore.Util.log(IStatus.ERROR, err, err.getMessage());
WidgetUtil.showError(Messages.ShowDDLPage_exportDDLDialogExportToWorkspaceErrorMsg);
}
}
/**
* Export the current DDL to the supplied file
* @param fileStr
*/
private void exportDDLToFile(String fileStr) {
// If there is no file extension, add .sql
if (fileStr != null && fileStr.indexOf('.') == -1) {
fileStr = fileStr + "." + Messages.ShowDDLPage_exportDDLDialogDefaultFileExt; //$NON-NLS-1$
}
if (fileStr != null) {
FileWriter fw = null;
BufferedWriter out = null;
PrintWriter pw = null;
try {
fw = new FileWriter(fileStr);
out = new BufferedWriter(fw);
pw = new PrintWriter(out);
String ddl = getDDL();
pw.write(ddl);
} catch (Exception e) {
UTIL.log(IStatus.ERROR, e, Messages.ShowDDLPage_exportDDLDialogExportErrorMsg);
} finally {
pw.close();
try {
out.close();
} catch (java.io.IOException e) {
}
try {
fw.close();
} catch (java.io.IOException e) {
}
}
}
}
/*
* Set the enabled state of the buttons
*/
private void setButtonStates() {
boolean enableExportButton = importManager.isVdbDeployed();
this.exportDDLToFileSystemButton.setEnabled(enableExportButton);
this.exportDDLToWorkspaceButton.setEnabled(enableExportButton);
}
@Override
public void setVisible( boolean visible ) {
if (visible) {
// When this page is show, ensure that differences page is set incomplete.
IWizard wizard = getWizard();
IWizardPage differencesPage = wizard.getPage("DdlImportDifferencesPage"); //$NON-NLS-1$
if(differencesPage instanceof DdlImportDifferencesPage) {
((DdlImportDifferencesPage)differencesPage).setPageComplete(false);
}
if(importManager.isVdbDeployed() && importManager.shouldRedeploy()) {
importManager.undeployDynamicVdb();
importManager.deleteDdlTempFile();
importManager.setRedeploy(false);
}
if(importManager.isVdbDeployed() ) {
String ddl = importManager.getDdl();
if(ddl==null) ddl=EMPTY;
this.ddlContentsBox.setText(ddl);
} else {
IStatus deployStatus = importManager.deployDynamicVdb();
if(deployStatus == null) {
ddlContentsBox.setText(Messages.ShowDDLPage_vdbDeploymentErrorMsg);
} else if(!deployStatus.isOK()) {
StringBuffer sb = new StringBuffer(deployStatus.getMessage());
// Show 'check server log' message, unless deployment was cancelled.
if(deployStatus.getSeverity()!=IStatus.CANCEL) {
sb.append("\n\n"+ Messages.ShowDDLPage_vdbDeploymentCheckServerLogMsg); //$NON-NLS-1$
}
ddlContentsBox.setText(sb.toString());
} else {
String ddl = importManager.getDdl();
// Consider null DDL an error..
if(ddl==null) ddl=Messages.TeiidImportManager_getDdlErrorMsg;
ddlContentsBox.setText(ddl);
ddlContentsBox.setTopIndex(0);
}
}
setButtonStates();
validatePage();
getControl().setVisible(visible);
} else {
super.setVisible(visible);
}
}
/*
* Validate the page
*/
private boolean validatePage() {
// VDB deployment validation
if(!this.importManager.isVdbDeployed()) {
String errorMsg;
IStatus deployStatus = importManager.getVdbDeploymentStatus();
if(deployStatus!=null) {
errorMsg = deployStatus.getMessage();
} else {
errorMsg = Messages.ShowDDLPage_vdbDeploymentErrorMsg;
}
// Cannot proceed if VDB is not deployed
setThisPageComplete(errorMsg, ERROR);
return false;
}
String ddlStr = getDDL();
if(ddlStr==null || ddlStr.trim().equals(Messages.TeiidImportManager_getDdlErrorMsg)) {
setThisPageComplete(Messages.TeiidImportManager_getDdlErrorMsg,WARNING);
return false;
}
setThisPageComplete(EMPTY, NONE);
return true;
}
private void setThisPageComplete(String message, int severity) {
WizardUtil.setPageComplete(this, message, severity);
}
}