package org.teiid.designer.transformation.ui.teiidddl;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
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.IDialogSettings;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
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.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Combo;
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.FileUtils;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.transformation.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;
public class ExportTeiidShowDdlPage 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 TeiidDdlExporter exporter;
/**
* ExportTeiidShowDdlPage constructor
* @param importManager the ImportManager
* @since 8.1
*/
public ExportTeiidShowDdlPage(TeiidDdlExporter exporter) {
super(ExportTeiidShowDdlPage.class.getSimpleName(), "Teiid DDL");
this.exporter = exporter;
}
@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);
setPageComplete(false);
}
/*
* Create the Group containing the DDL Contents (not editable)
*/
private void createDDLDisplayGroup( Composite parent ) {
Group theGroup = WidgetFactory.createGroup(parent, "DDL Contents", SWT.NONE, 1, 1); //$NON-NLS-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);
}
/**
* 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(Util.getString("ExportTeiidShowDdlPage_exportDDLToFileSystemButton")); //$NON-NLS-1$
exportDDLToFileSystemButton.setToolTipText(Util.getString("ExportTeiidShowDdlPage_exportDDLToFileSystemButtonTooltip")); //$NON-NLS-1$
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(Util.getString("ExportTeiidShowDdlPage_exportDDLToWorkspaceButton")); //$NON-NLS-1$
exportDDLToWorkspaceButton.setToolTipText(Util.getString("ExportTeiidShowDdlPage_exportDDLToWorkspaceButtonTooltip")); //$NON-NLS-1$
exportDDLToWorkspaceButton.setLayoutData(new GridData());
exportDDLToWorkspaceButton.setEnabled(false);
exportDDLToWorkspaceButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleExportDDLToWorkspace();
}
});
}
/**
* 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(Util.getString("ExportTeiidShowDdlPage_exportDDLDialogTitle"));
dlg.setFileName(Util.getString("ExportTeiidShowDdlPage_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(Util.getString("ExportTeiidShowDdlPage_exportDDLDialogExportToWorkspaceErrorMsg")); //$NON-NLS-1$
}
}
/**
* 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 + "." + Util.getString("ExportTeiidShowDdlPage_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, Util.getString("ExportTeiidShowDdlPage_exportDDLDialogExportErrorMsg")); //$NON-NLS-1$
} 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 = true;
this.exportDDLToFileSystemButton.setEnabled(enableExportButton);
this.exportDDLToWorkspaceButton.setEnabled(enableExportButton);
}
@Override
public void setVisible( boolean visible ) {
if (visible) {
String ddlString = exporter.generateDdl();
if( ddlString != null ) {
ddlContentsBox.setText(ddlString);
ddlContentsBox.setTopIndex(0);
}
setButtonStates();
validatePage();
getControl().setVisible(visible);
} else {
super.setVisible(visible);
}
}
/*
* Validate the page
*/
private boolean validatePage() {
setThisPageComplete(EMPTY, NONE);
return true;
}
private void setThisPageComplete(String message, int severity) {
WizardUtil.setPageComplete(this, message, severity);
}
}