/*******************************************************************************
*
* Pentaho Big Data
*
* Copyright (C) 2002-2012 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.di.trans.steps.cassandrasstableoutput;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
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.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDialogInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.ui.core.widget.TextVar;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
/**
* Dialog class for the SSTableOutput step
*
* @author Rob Turner (robert{[at]}robertturner{[dot]}com{[dot]}au)
* @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
*/
public class SSTableOutputDialog extends BaseStepDialog implements
StepDialogInterface {
private static final Class<?> PKG = SSTableOutputMeta.class;
private final SSTableOutputMeta m_currentMeta;
private final SSTableOutputMeta m_originalMeta;
/** various UI bits and pieces for the dialog */
private Label m_stepnameLabel;
private Text m_stepnameText;
private Label m_yamlLab;
private Button m_yamlBut;
private TextVar m_yamlText;
private Label m_directoryLab;
private Button m_directoryBut;
private TextVar m_directoryText;
private Label m_keyspaceLab;
private TextVar m_keyspaceText;
private Label m_columnFamilyLab;
private TextVar m_columnFamilyText;
private Label m_keyFieldLab;
private CCombo m_keyFieldCombo;
private Label m_bufferSizeLab;
private TextVar m_bufferSizeText;
private Button m_getFieldsBut;
public SSTableOutputDialog(Shell parent, Object in, TransMeta tr, String name) {
super(parent, (BaseStepMeta) in, tr, name);
m_currentMeta = (SSTableOutputMeta) in;
m_originalMeta = (SSTableOutputMeta) m_currentMeta.clone();
}
public String open() {
Shell parent = getParent();
Display display = parent.getDisplay();
shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN | SWT.MAX);
props.setLook(shell);
setShellImage(shell, m_currentMeta);
// used to listen to a text field (m_wStepname)
final ModifyListener lsMod = new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_currentMeta.setChanged();
}
};
changed = m_currentMeta.hasChanged();
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout(formLayout);
shell.setText(BaseMessages
.getString(PKG, "SSTableOutputDialog.Shell.Title"));
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
// Stepname line
m_stepnameLabel = new Label(shell, SWT.RIGHT);
m_stepnameLabel.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.StepName.Label"));
props.setLook(m_stepnameLabel);
FormData fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.right = new FormAttachment(middle, -margin);
fd.top = new FormAttachment(0, margin);
m_stepnameLabel.setLayoutData(fd);
m_stepnameText = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
m_stepnameText.setText(stepname);
props.setLook(m_stepnameText);
m_stepnameText.addModifyListener(lsMod);
// format the text field
fd = new FormData();
fd.left = new FormAttachment(middle, 0);
fd.top = new FormAttachment(0, margin);
fd.right = new FormAttachment(100, 0);
m_stepnameText.setLayoutData(fd);
// yaml file line
m_yamlLab = new Label(shell, SWT.RIGHT);
props.setLook(m_yamlLab);
m_yamlLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.YAML.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_stepnameText, margin);
fd.right = new FormAttachment(middle, -margin);
m_yamlLab.setLayoutData(fd);
m_yamlBut = new Button(shell, SWT.PUSH | SWT.CENTER);
props.setLook(m_yamlBut);
m_yamlBut.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.YAML.Button"));
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_stepnameText, margin);
m_yamlBut.setLayoutData(fd);
m_yamlBut.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
String[] extensions = null;
String[] filterNames = null;
extensions = new String[2];
filterNames = new String[2];
extensions[0] = "*.yaml";
filterNames[0] = BaseMessages.getString(PKG,
"SSTableOutputDialog.FileType.YAML");
extensions[1] = "*";
filterNames[1] = BaseMessages
.getString(PKG, "System.FileType.AllFiles");
dialog.setFilterExtensions(extensions);
if (dialog.open() != null) {
m_yamlText.setText(dialog.getFilterPath()
+ System.getProperty("file.separator") + dialog.getFileName());
}
}
});
m_yamlText = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT
| SWT.BORDER);
props.setLook(m_yamlText);
m_yamlText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_yamlText.setToolTipText(transMeta.environmentSubstitute(m_yamlText
.getText()));
}
});
m_yamlText.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(m_yamlBut, 0);
fd.top = new FormAttachment(m_stepnameText, margin);
fd.left = new FormAttachment(middle, 0);
m_yamlText.setLayoutData(fd);
// directory line
m_directoryLab = new Label(shell, SWT.RIGHT);
props.setLook(m_directoryLab);
m_directoryLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.Directory.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_yamlText, margin);
fd.right = new FormAttachment(middle, -margin);
m_directoryLab.setLayoutData(fd);
m_directoryBut = new Button(shell, SWT.PUSH | SWT.CENTER);
props.setLook(m_directoryBut);
m_directoryBut.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.Directory.Button"));
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_yamlText, margin);
m_directoryBut.setLayoutData(fd);
m_directoryBut.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(shell, SWT.OPEN);
String[] extensions = null;
String[] filterNames = null;
extensions = new String[1];
filterNames = new String[1];
extensions[0] = "*";
filterNames[0] = BaseMessages
.getString(PKG, "System.FileType.AllFiles");
dialog.setFilterExtensions(extensions);
if (dialog.open() != null) {
m_directoryText.setText(dialog.getFilterPath()
+ System.getProperty("file.separator") + dialog.getFileName());
}
}
});
m_directoryText = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT
| SWT.BORDER);
props.setLook(m_directoryText);
m_directoryText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_directoryText.setToolTipText(transMeta
.environmentSubstitute(m_directoryText.getText()));
}
});
m_directoryText.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(m_directoryBut, 0);
fd.top = new FormAttachment(m_yamlText, margin);
fd.left = new FormAttachment(middle, 0);
m_directoryText.setLayoutData(fd);
// keyspace line
m_keyspaceLab = new Label(shell, SWT.RIGHT);
props.setLook(m_keyspaceLab);
m_keyspaceLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.Keyspace.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_directoryText, margin);
fd.right = new FormAttachment(middle, -margin);
m_keyspaceLab.setLayoutData(fd);
m_keyspaceText = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT
| SWT.BORDER);
props.setLook(m_keyspaceText);
m_keyspaceText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_keyspaceText.setToolTipText(transMeta
.environmentSubstitute(m_keyspaceText.getText()));
}
});
m_keyspaceText.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_directoryText, margin);
fd.left = new FormAttachment(middle, 0);
m_keyspaceText.setLayoutData(fd);
// column family line
m_columnFamilyLab = new Label(shell, SWT.RIGHT);
props.setLook(m_columnFamilyLab);
m_columnFamilyLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.ColumnFamily.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_keyspaceText, margin);
fd.right = new FormAttachment(middle, -margin);
m_columnFamilyLab.setLayoutData(fd);
m_columnFamilyText = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT
| SWT.BORDER);
props.setLook(m_columnFamilyText);
m_columnFamilyText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_columnFamilyText.setToolTipText(transMeta
.environmentSubstitute(m_columnFamilyText.getText()));
}
});
m_columnFamilyText.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_keyspaceText, margin);
fd.left = new FormAttachment(middle, 0);
m_columnFamilyText.setLayoutData(fd);
// key field line
m_keyFieldLab = new Label(shell, SWT.RIGHT);
props.setLook(m_keyFieldLab);
m_keyFieldLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.KeyField.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_columnFamilyText, margin);
fd.right = new FormAttachment(middle, -margin);
m_keyFieldLab.setLayoutData(fd);
m_getFieldsBut = new Button(shell, SWT.PUSH | SWT.CENTER);
props.setLook(m_getFieldsBut);
m_getFieldsBut.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.GetFields.Button"));
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_columnFamilyText, 0);
m_getFieldsBut.setLayoutData(fd);
m_getFieldsBut.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setupFieldsCombo();
}
});
m_keyFieldCombo = new CCombo(shell, SWT.BORDER);
m_keyFieldCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_keyFieldCombo.setToolTipText(transMeta
.environmentSubstitute(m_keyFieldCombo.getText()));
}
});
m_keyFieldCombo.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(m_getFieldsBut, -margin);
fd.top = new FormAttachment(m_columnFamilyText, margin);
fd.left = new FormAttachment(middle, 0);
m_keyFieldCombo.setLayoutData(fd);
// buffer size
m_bufferSizeLab = new Label(shell, SWT.RIGHT);
props.setLook(m_bufferSizeLab);
m_bufferSizeLab.setText(BaseMessages.getString(PKG,
"SSTableOutputDialog.BufferSize.Label"));
fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.top = new FormAttachment(m_keyFieldCombo, margin);
fd.right = new FormAttachment(middle, -margin);
m_bufferSizeLab.setLayoutData(fd);
m_bufferSizeText = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT
| SWT.BORDER);
props.setLook(m_bufferSizeText);
m_bufferSizeText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
m_bufferSizeText.setToolTipText(transMeta
.environmentSubstitute(m_bufferSizeText.getText()));
}
});
m_bufferSizeText.addModifyListener(lsMod);
fd = new FormData();
fd.right = new FormAttachment(100, 0);
fd.top = new FormAttachment(m_keyFieldCombo, margin);
fd.left = new FormAttachment(middle, 0);
m_bufferSizeText.setLayoutData(fd);
// Buttons inherited from BaseStepDialog
wOK = new Button(shell, SWT.PUSH);
wOK.setText(BaseMessages.getString(PKG, "System.Button.OK"));
wCancel = new Button(shell, SWT.PUSH);
wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));
setButtonPositions(new Button[] { wOK, wCancel }, margin, m_bufferSizeText);
// Add listeners
lsCancel = new Listener() {
public void handleEvent(Event e) {
cancel();
}
};
lsOK = new Listener() {
public void handleEvent(Event e) {
ok();
}
};
wCancel.addListener(SWT.Selection, lsCancel);
wOK.addListener(SWT.Selection, lsOK);
lsDef = new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
ok();
}
};
m_stepnameText.addSelectionListener(lsDef);
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener(new ShellAdapter() {
@Override
public void shellClosed(ShellEvent e) {
cancel();
}
});
setSize();
getData();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return stepname;
}
protected void setupFieldsCombo() {
// try and set up from incoming fields from previous step
StepMeta stepMeta = transMeta.findStep(stepname);
if (stepMeta != null) {
try {
RowMetaInterface row = transMeta.getPrevStepFields(stepMeta);
if (row.size() == 0) {
MessageDialog.openError(shell, BaseMessages.getString(PKG,
"SSTableOutputData.Message.NoIncomingFields.Title"), BaseMessages
.getString(PKG, "SSTableOutputData.Message.NoIncomingFields"));
return;
}
m_keyFieldCombo.removeAll();
for (int i = 0; i < row.size(); i++) {
ValueMetaInterface vm = row.getValueMeta(i);
m_keyFieldCombo.add(vm.getName());
}
} catch (KettleException ex) {
MessageDialog.openError(shell, BaseMessages.getString(PKG,
"SSTableOutputData.Message.NoIncomingFields.Title"), BaseMessages
.getString(PKG, "SSTableOutputData.Message.NoIncomingFields"));
}
}
}
protected void ok() {
if (Const.isEmpty(m_stepnameText.getText())) {
return;
}
stepname = m_stepnameText.getText();
m_currentMeta.setYamlPath(m_yamlText.getText());
m_currentMeta.setDirectory(m_directoryText.getText());
m_currentMeta.setCassandraKeyspace(m_keyspaceText.getText());
m_currentMeta.setColumnFamilyName(m_columnFamilyText.getText());
m_currentMeta.setKeyField(m_keyFieldCombo.getText());
m_currentMeta.setBufferSize(m_bufferSizeText.getText());
if (!m_originalMeta.equals(m_currentMeta)) {
m_currentMeta.setChanged();
changed = m_currentMeta.hasChanged();
}
dispose();
}
protected void cancel() {
stepname = null;
m_currentMeta.setChanged(changed);
dispose();
}
protected void getData() {
if (!Const.isEmpty(m_currentMeta.getYamlPath())) {
m_yamlText.setText(m_currentMeta.getYamlPath());
}
if (!Const.isEmpty(m_currentMeta.getDirectory())) {
m_directoryText.setText(m_currentMeta.getDirectory());
}
if (!Const.isEmpty(m_currentMeta.getCassandraKeyspace())) {
m_keyspaceText.setText(m_currentMeta.getCassandraKeyspace());
}
if (!Const.isEmpty(m_currentMeta.getColumnFamilyName())) {
m_columnFamilyText.setText(m_currentMeta.getColumnFamilyName());
}
if (!Const.isEmpty(m_currentMeta.getKeyField())) {
m_keyFieldCombo.setText(m_currentMeta.getKeyField());
}
if (!Const.isEmpty(m_currentMeta.getBufferSize())) {
m_bufferSizeText.setText(m_currentMeta.getBufferSize());
}
}
}