/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* 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 hydrograph.ui.propertywindow.runconfig;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.equinox.security.storage.ISecurePreferences;
import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
import org.eclipse.equinox.security.storage.StorageException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.slf4j.Logger;
import hydrograph.ui.common.swt.customwidget.HydroGroup;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.communication.messages.Message;
import hydrograph.ui.communication.messages.MessageType;
import hydrograph.ui.communication.utilities.SCPUtility;
import hydrograph.ui.logging.factory.LogFactory;
import hydrograph.ui.propertywindow.messages.Messages;
/**
*
* Run configuration dialog allows user to change run configurations before
* running the job.
*
* @author bitwise
*
*/
public class RunConfigDialog extends Dialog {
private static final String TRUE = "true";
private static final Logger logger = LogFactory.INSTANCE.getLogger(RunConfigDialog.class);
private Text txtBasePath;
private Text txtEdgeNode;
private Text txtUserName;
private Text txtPassword;
private Text txtKeyFile;
private Text txtRunUtility;
private Text txtProjectPath;
private Button browseButton;
private Button radioPassword;
private Button radioKeyFile;
private Button chkbtnSavePassword;
private HydroGroup runModeGroup;
private HydroGroup serverDetailsGroup;
private HydroGroup remotePathConfigGroup;
private Composite groupHolderComposite;
private Composite remoteRunDetailsHolder;
private Button viewDataCheckBox;
private Button btnLocalMode;
private Button btnRemoteMode;
private Properties buildProps;
private final String LOCAL_MODE = "local";
private final String REMOTE_MODE = "remote";
private final String HOST = "host";
private final String USER_NAME = "userName";
private final String KEY_FILE = "KeyFile";
private final String RUN_UTILITY = "runUtility";
private final String REMOTE_DIRECTORY = "remoteDirectory";
private final String BASE_PATH = "basePath";
private final String VIEW_DATA_CHECK = "viewDataCheck";
private final String USE_PASSWORD_AUTHENTICATION = "usePasswordAuthentication";
public static final String SELECTION_BUTTON_KEY = "REMOTE_BUTTON_KEY";
private static final String SECURE_STORAGE_HYDROGRAPH_CREDENTIALS_RUNCONFIG_DIALOG_NODE = "Run Dialog";
private String KeyFile;
private String password;
private String userId;
private String edgeNodeText;
private String basePath;
private boolean remoteMode;
private String host;
private String username;
private boolean isDebug;
private boolean runGraph;
private boolean usePassword;
EmptyTextListener textPasswordListener;
EmptyTextListener keyFileListener;
private static String LOCAL_HOST = "localhost";
private Composite container;
private Button okButton;
/**
* Create the dialog.
*
* @param parentShell
*/
public RunConfigDialog(Shell parentShell) {
super(parentShell);
setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE | SWT.APPLICATION_MODAL);
this.runGraph = false;
buildProps = new Properties();
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
container.getShell().setText(Messages.RUN_CONFIGURATION_SETTINGS);
groupHolderComposite = new Composite(container, SWT.BORDER);
groupHolderComposite.setLayout(new GridLayout(1, false));
groupHolderComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
runModeGroup = new HydroGroup(groupHolderComposite, SWT.NONE);
runModeGroup.setHydroGroupText("Run Mode");
runModeGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
runModeGroup.getHydroGroupClientArea().setLayout(new GridLayout(1, false));
Composite composite_3 = new Composite(runModeGroup.getHydroGroupClientArea(), SWT.NONE);
composite_3.setLayout(new GridLayout(1, false));
composite_3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Composite composite_1 = new Composite(composite_3, SWT.NONE);
composite_1.setLayout(new GridLayout(2, false));
composite_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Composite composite_4 = new Composite(composite_1, SWT.NONE);
composite_4.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
composite_4.setLayout(new GridLayout(2, false));
btnLocalMode = new Button(composite_4, SWT.RADIO);
btnLocalMode.setText(Messages.LOCAL_MODE);
btnLocalMode.addSelectionListener(runModeSelectionListener);
btnRemoteMode = new Button(composite_4, SWT.RADIO);
btnRemoteMode.setText(Messages.REMOTE_MODE);
btnRemoteMode.addSelectionListener(runModeSelectionListener);
Composite composite_5 = new Composite(composite_1, SWT.NONE);
composite_5.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
composite_5.setLayout(new GridLayout(1, false));
viewDataCheckBox = new Button(composite_5, SWT.CHECK);
viewDataCheckBox.setText(Messages.VIEW_DATA);
viewDataCheckBox.addSelectionListener(viewDataSelectionListener);
Composite composite_2 = new Composite(composite_3, SWT.NONE);
GridLayout gl_composite_2 = new GridLayout(2, false);
gl_composite_2.horizontalSpacing = 15;
composite_2.setLayout(gl_composite_2);
composite_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblDebugFileLocation = new Label(composite_2, SWT.NONE);
lblDebugFileLocation.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblDebugFileLocation.setText(Messages.BASE_PATH);
txtBasePath = new Text(composite_2, SWT.BORDER);
txtBasePath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtBasePath.setEnabled(false);
txtBasePath.setData(SELECTION_BUTTON_KEY, viewDataCheckBox);
EmptyTextListener basePathListener = new EmptyTextListener(Messages.BASE_PATH);
txtBasePath.addModifyListener(basePathListener);
remoteRunDetailsHolder = new Composite(groupHolderComposite, SWT.NONE);
GridLayout gl_composite = new GridLayout(1, false);
gl_composite.verticalSpacing = 0;
gl_composite.marginWidth = 0;
gl_composite.marginHeight = 0;
gl_composite.horizontalSpacing = 0;
remoteRunDetailsHolder.setLayout(gl_composite);
remoteRunDetailsHolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
serverDetailsGroup = new HydroGroup(remoteRunDetailsHolder, SWT.NONE);
serverDetailsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
serverDetailsGroup.setHydroGroupText("Server Details");
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.horizontalSpacing = 15;
serverDetailsGroup.getHydroGroupClientArea().setLayout(gridLayout);
new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
Composite radioComposite = new Composite(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
radioComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
radioComposite.setLayout(new GridLayout(2, false));
radioPassword = new Button(radioComposite, SWT.RADIO);
radioPassword.setText(Messages.LABEL_PWD);
radioPassword.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
radioPassword.addSelectionListener(radioPasswordSelectionListener);
radioKeyFile = new Button(radioComposite, SWT.RADIO);
radioKeyFile.setText(Messages.KEY_FILE);
radioKeyFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
radioKeyFile.addSelectionListener(radioKeyFileSelectionListener);
Label lblEdgeNode = new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
lblEdgeNode.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblEdgeNode.setText(Messages.EDGE_NODE);
txtEdgeNode = new Text(serverDetailsGroup.getHydroGroupClientArea(), SWT.BORDER);
txtEdgeNode.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtEdgeNode.setData(SELECTION_BUTTON_KEY, btnRemoteMode);
EmptyTextListener textEdgeNodeListener = new EmptyTextListener(Messages.EDGE_NODE);
txtEdgeNode.addModifyListener(textEdgeNodeListener);
addFocusListener(txtEdgeNode);
Label lblUser = new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
lblUser.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblUser.setText(Messages.USER);
txtUserName = new Text(serverDetailsGroup.getHydroGroupClientArea(), SWT.BORDER);
txtUserName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtUserName.setData(SELECTION_BUTTON_KEY, btnRemoteMode);
EmptyTextListener textUserListener = new EmptyTextListener(Messages.HOST);
txtUserName.addModifyListener(textUserListener);
addFocusListener(txtUserName);
Label lblPassword = new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
lblPassword.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblPassword.setText(Messages.LABEL_PWD);
txtPassword = new Text(serverDetailsGroup.getHydroGroupClientArea(), SWT.PASSWORD | SWT.BORDER);
txtPassword.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtPassword.setData(SELECTION_BUTTON_KEY, btnRemoteMode);
new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
chkbtnSavePassword = new Button(serverDetailsGroup.getHydroGroupClientArea(), SWT.CHECK);
chkbtnSavePassword.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
chkbtnSavePassword.setText(Messages.SAVE_PASSWORD);
textPasswordListener = new EmptyTextListener(Messages.LABEL_PWD);
txtPassword.addModifyListener(textPasswordListener);
Label lblKeyFile = new Label(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
lblKeyFile.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblKeyFile.setText(Messages.KEY_FILE);
Composite keyFileComposite = new Composite(serverDetailsGroup.getHydroGroupClientArea(), SWT.NONE);
keyFileComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1));
keyFileComposite.setLayout(new GridLayout(2, false));
txtKeyFile = new Text(keyFileComposite, SWT.BORDER);
txtKeyFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
txtKeyFile.setData(SELECTION_BUTTON_KEY, btnRemoteMode);
browseButton = new Button(keyFileComposite, SWT.NONE);
browseButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
browseButton.setText("...");
browseButton.addSelectionListener(browseListener);
radioPassword.setSelection(true);
keyFileListener = new EmptyTextListener(Messages.KEY_FILE);
txtKeyFile.addModifyListener(keyFileListener);
remotePathConfigGroup = new HydroGroup(remoteRunDetailsHolder, SWT.NONE);
remotePathConfigGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
remotePathConfigGroup.setHydroGroupText("Remote Path Configurations");
GridLayout gridLayout_1 = new GridLayout(2, false);
gridLayout_1.horizontalSpacing = 15;
remotePathConfigGroup.getHydroGroupClientArea().setLayout(gridLayout_1);
Label lblRunUtility = new Label(remotePathConfigGroup.getHydroGroupClientArea(), SWT.NONE);
lblRunUtility.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblRunUtility.setText(Messages.RUN_UTILITY);
txtRunUtility = new Text(remotePathConfigGroup.getHydroGroupClientArea(), SWT.BORDER);
txtRunUtility.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
EmptyTextListener runUtilityListener = new EmptyTextListener(Messages.RUN_UTILITY);
txtRunUtility.addModifyListener(runUtilityListener);
Label lblProjectPath = new Label(remotePathConfigGroup.getHydroGroupClientArea(), SWT.NONE);
lblProjectPath.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblProjectPath.setText(Messages.PROJECT_PATH);
txtProjectPath = new Text(remotePathConfigGroup.getHydroGroupClientArea(), SWT.BORDER);
txtProjectPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
EmptyTextListener projectPathListener = new EmptyTextListener(Messages.PROJECT_PATH);
txtProjectPath.addModifyListener(projectPathListener);
serverDetailsGroup.setVisible(false);
remotePathConfigGroup.setVisible(false);
Monitor primary = parent.getMonitor();
Rectangle bounds = primary.getBounds();
Rectangle rect = parent.getShell().getBounds();
int y = bounds.y + (bounds.height - rect.height) / 2;
parent.getShell().setLocation((bounds.width/2 - rect.width/4), y);
return container;
}
private void addFocusListener(Text txtBox) {
txtBox.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
populatePasswordField();
}
@Override
public void focusGained(FocusEvent e) {
// DO Nothing
}
});
}
private ISecurePreferences getHydrographSecureStorageRootNode(){
ISecurePreferences preferences = SecurePreferencesFactory.getDefault();
ISecurePreferences hydrographSecureStorageRootNode = preferences.node(Constants.SECURE_STORAGE_HYDROGRAPH_CREDENTIALS_ROOT_NODE);
return hydrographSecureStorageRootNode;
}
private ISecurePreferences getHydrographSecureStorageRunDialogNode(ISecurePreferences hydrographSecureStorageRootNode){
ISecurePreferences hydrographSecureStorageRunDialogNode = hydrographSecureStorageRootNode.node(SECURE_STORAGE_HYDROGRAPH_CREDENTIALS_RUNCONFIG_DIALOG_NODE);
return hydrographSecureStorageRunDialogNode;
}
private ISecurePreferences getSecureStorageHostNode(String hostname,boolean createHostNode){
ISecurePreferences hydrographSecureStorageRootNode = getHydrographSecureStorageRootNode();
ISecurePreferences hydrographSecureStorageRunDialogNode=getHydrographSecureStorageRunDialogNode(hydrographSecureStorageRootNode);
if(hydrographSecureStorageRunDialogNode.nodeExists(hostname) || createHostNode){
ISecurePreferences hydrographSecureStorageRunDialogHostNode = hydrographSecureStorageRunDialogNode.node(hostname);
return hydrographSecureStorageRunDialogHostNode;
}else{
return null;
}
}
private void populatePasswordField() {
ISecurePreferences hydrographSecureStorageRunDialogHostNode = getSecureStorageHostNode(txtEdgeNode.getText().toLowerCase(),false);
try {
if(hydrographSecureStorageRunDialogHostNode!=null){
String password=hydrographSecureStorageRunDialogHostNode.get(txtUserName.getText(), "");
txtPassword.setText(password);
if(!StringUtils.isBlank(password)){
chkbtnSavePassword.setSelection(true);
}else{
chkbtnSavePassword.setSelection(false);
}
}else{
txtPassword.setText("");
}
} catch (StorageException storageException) {
logger.debug("Unable to fetch password from eclipse secure storage " , storageException);;
}
}
/**
* Create contents of the button bar.
*
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
applyServerDetailsCrossTextEmptyValidationListener(txtEdgeNode);
applyServerDetailsCrossTextEmptyValidationListener(txtPassword);
applyServerDetailsCrossTextEmptyValidationListener(txtUserName);
applyServerDetailsCrossTextEmptyValidationListener(txtBasePath);
applyServerDetailsCrossTextEmptyValidationListener(txtKeyFile);
applyServerDetailsCrossTextEmptyValidationListener(txtRunUtility);
applyServerDetailsCrossTextEmptyValidationListener(txtProjectPath);
loadBuildProperties();
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(499, 483);
}
SelectionListener runModeSelectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
Button button = ((Button) event.widget);
if (button.getText().equals(Messages.REMOTE_MODE)) {
showRemoteRunDetailsHolderComposite();
} else {
hideRemoteRunDetailsHolderComposite();
}
}
};
SelectionListener browseListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
FileDialog fd = new FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN);
fd.setText(Messages.OPEN_BUTTON_LABEL);
fd.setFilterPath(Messages.C_DRIVE_LOCATION);
String[] filterExt = {Messages.PPK_EXT,Messages.PEM_EXT};
fd.setFilterExtensions(filterExt);
txtKeyFile.setText(fd.open());
}
};
SelectionListener radioPasswordSelectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
txtPassword.setEnabled(true);
chkbtnSavePassword.setEnabled(true);
txtKeyFile.setEnabled(false);
browseButton.setEnabled(false);
keyFileListener.getErrorDecoration().hide();
if(StringUtils.isBlank(txtPassword.getText())){
textPasswordListener.getErrorDecoration().show();
}
toggleOkButton();
}
};
SelectionListener radioKeyFileSelectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
txtKeyFile.setEnabled(true);
browseButton.setEnabled(true);
txtPassword.setEnabled(false);
chkbtnSavePassword.setEnabled(false);
textPasswordListener.getErrorDecoration().hide();
if(StringUtils.isBlank(txtKeyFile.getText())){
keyFileListener.getErrorDecoration().show();
}
toggleOkButton();
}
};
private void showRemoteRunDetailsHolderComposite() {
Point shellSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
getShell().setSize(shellSize);
txtEdgeNode.setText(txtEdgeNode.getText());
txtUserName.setText(txtUserName.getText());
txtPassword.setText(txtPassword.getText());
txtKeyFile.setText(txtKeyFile.getText());
serverDetailsGroup.setVisible(true);
remotePathConfigGroup.setVisible(true);
}
private void hideRemoteRunDetailsHolderComposite() {
Point remoteRunDetailsHolderSize = remoteRunDetailsHolder.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Point shellSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
Point newShellSize = new Point(shellSize.x, shellSize.y - remoteRunDetailsHolderSize.y);
getShell().setSize(newShellSize);
txtEdgeNode.setText(txtEdgeNode.getText());
txtUserName.setText(txtUserName.getText());
txtPassword.setText(txtPassword.getText());
txtKeyFile.setText(txtKeyFile.getText());
serverDetailsGroup.setVisible(false);
remotePathConfigGroup.setVisible(false);
}
SelectionListener viewDataSelectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
Button button = ((Button) event.widget);
txtBasePath.setEnabled(button.getSelection());
txtBasePath.setText(txtBasePath.getText());
}
};
private void loadBuildProperties() {
String buildPropFilePath = buildPropFilePath();
IPath bldPropPath = new Path(buildPropFilePath);
IFile iFile = ResourcesPlugin.getWorkspace().getRoot().getFile(bldPropPath);
try {
InputStream reader = iFile.getContents();
buildProps.load(reader);
} catch (CoreException | IOException e) {
MessageDialog.openError(Display.getDefault().getActiveShell(), "Error",
"Exception occurred while loading build properties from file -\n" + e.getMessage());
}
Enumeration<?> propertyNames = buildProps.propertyNames();
populateTextBoxes(propertyNames);
}
private String buildPropFilePath() {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IFileEditorInput input = (IFileEditorInput) page.getActiveEditor().getEditorInput();
IFile file = input.getFile();
IProject activeProject = file.getProject();
String activeProjectName = activeProject.getName();
return "/" + activeProjectName + "/build.properties";
}
private void populateTextBoxes(Enumeration propertyNames) {
if (StringUtils.equals(buildProps.getProperty(LOCAL_MODE), TRUE)) {
btnLocalMode.setSelection(true);
btnRemoteMode.setSelection(false);
hideRemoteRunDetailsHolderComposite();
} else {
btnRemoteMode.setSelection(true);
btnLocalMode.setSelection(false);
showRemoteRunDetailsHolderComposite();
}
txtEdgeNode.setText(getBuildProperty(HOST));
txtUserName.setText(getBuildProperty(USER_NAME));
txtKeyFile.setText(getBuildProperty(KEY_FILE));
txtRunUtility.setText(getBuildProperty(RUN_UTILITY));
txtProjectPath.setText(getBuildProperty(REMOTE_DIRECTORY));
txtBasePath.setText(getBuildProperty(BASE_PATH));
if (StringUtils.equals(buildProps.getProperty(VIEW_DATA_CHECK), TRUE)) {
viewDataCheckBox.setSelection(true);
txtBasePath.setEnabled(true);
}
if(StringUtils.equals(buildProps.getProperty(USE_PASSWORD_AUTHENTICATION), TRUE)){
togglePasswordAndKeyFile(true);
keyFileListener.getErrorDecoration().hide();
if(StringUtils.isBlank(txtKeyFile.getText())){
textPasswordListener.getErrorDecoration().show();
}
}
else{
togglePasswordAndKeyFile(false);
textPasswordListener.getErrorDecoration().hide();
if(StringUtils.isBlank(txtKeyFile.getText())){
keyFileListener.getErrorDecoration().show();
}
}
populatePasswordField();
}
private void togglePasswordAndKeyFile(Boolean state){
radioPassword.setSelection(state);
txtPassword.setEnabled(state);
chkbtnSavePassword.setEnabled(state);
radioKeyFile.setSelection(!state);
txtKeyFile.setEnabled(!state);
browseButton.setEnabled(!state);
}
private String getBuildProperty(String key) {
if (buildProps.getProperty(VIEW_DATA_CHECK) == null) {
return "";
} else {
String value = buildProps.getProperty(key);
return StringUtils.isNotBlank(value) ? value : "";
}
}
/**
*
* Returns cluster password
*
* @return cluster password
*/
public String getClusterPassword() {
return this.password;
}
/**
*
* Returns user id
*
* @return user id
*/
public String getUserId() {
return this.userId;
}
/**
*
* Returns Host name / IP
*
* @return Host name / IP
*/
public String getEdgeNodeIp() {
return this.edgeNodeText;
}
/**
*
* Returns base path on remote server. The base path is directory path on
* remote server which contains temporary debug files
*
* @return
*/
public String getBasePath() {
return this.basePath;
}
/**
*
* Get host name
*
* @return
*/
public String getHost() {
if (remoteMode) {
return this.host;
} else {
return LOCAL_HOST;
}
}
/**
*
* Return user name
*
* @return
*/
public String getUsername() {
return this.username;
}
/**
*
* Returns true if job is running on remote mode
*
* @return
*/
public boolean isRemoteMode() {
return remoteMode;
}
/**
*
* Returns true if job is running in debug mode
*
* @return
*/
public boolean isDebug() {
return isDebug;
}
public String getKeyFile() {
return KeyFile;
}
public boolean getIsUsePassword(){
return usePassword;
}
@Override
protected void okPressed() {
saveRunConfigurations();
if(validateCredentials() && runGraph){
super.okPressed();
}
}
private boolean validateCredentials() {
if (remoteMode) {
return validateHostUsernameAndPassword();
}else{
return true;
}
}
private boolean validateHostUsernameAndPassword() {
if (isUsernamePasswordOrHostEmpty()) {
return false;
} else {
if(radioPassword.getSelection()){
return connectAndValidateUserNamePasswordAndHost();
}
else{
return true;
}
}
}
private boolean connectAndValidateUserNamePasswordAndHost() {
Message message = SCPUtility.INSTANCE.validateCredentials(host, username, password);
if (message.getMessageType() != MessageType.SUCCESS) {
MessageDialog.openError(Display.getDefault().getActiveShell(), Messages.CREDENTIAL_VALIDATION_MESSAGEBOX_TITLE,
message.getMessage());
return false;
}else{
return true;
}
}
private boolean isUsernamePasswordOrHostEmpty() {
Notification notification = new Notification();
if (remoteMode) {
if (StringUtils.isEmpty(txtEdgeNode.getText())){
notification.addError(Messages.EMPTY_HOST_FIELD_MESSAGE);
}
if (StringUtils.isEmpty(txtUserName.getText())){
notification.addError(Messages.EMPTY_USERNAME_FIELD_MESSAGE);
}
if(radioPassword.getSelection() && StringUtils.isEmpty(txtPassword.getText())){
notification.addError(Messages.EMPTY_PASSWORD_FIELD_MESSAGE);
}
}
if(notification.hasErrors()){
MessageDialog.openError(Display.getDefault().getActiveShell(), Messages.EMPTY_FIELDS_MESSAGE_BOX_TITLE,
notification.errorMessage());
return true;
}else{
return false;
}
}
private void saveRunConfigurations() {
remoteMode = btnRemoteMode.getSelection();
IFile iFile;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
buildProps.put(LOCAL_MODE, String.valueOf(btnLocalMode.getSelection()));
buildProps.put(REMOTE_MODE, String.valueOf(btnRemoteMode.getSelection()));
buildProps.put(HOST, txtEdgeNode.getText());
buildProps.put(USER_NAME, txtUserName.getText());
buildProps.put(KEY_FILE, txtKeyFile.getText());
buildProps.put(RUN_UTILITY, txtRunUtility.getText());
buildProps.put(REMOTE_DIRECTORY, txtProjectPath.getText());
buildProps.put(BASE_PATH, txtBasePath.getText());
buildProps.put(VIEW_DATA_CHECK, String.valueOf(viewDataCheckBox.getSelection()));
buildProps.put(USE_PASSWORD_AUTHENTICATION, String.valueOf(radioPassword.getSelection()));
buildProps.store(out, null);
String buildPropFilePath = buildPropFilePath();
IPath bldPropPath = new Path(buildPropFilePath);
iFile = ResourcesPlugin.getWorkspace().getRoot().getFile(bldPropPath);
iFile.setContents(new ByteArrayInputStream(out.toByteArray()), true, false, null);
} catch (IOException | CoreException e) {
MessageDialog.openError(Display.getDefault().getActiveShell(), "Error",
"Exception occurred while saving run configuration file -\n" + e.getMessage());
}
this.userId = txtUserName.getText();
this.password = txtPassword.getText();
this.KeyFile = txtKeyFile.getText();
this.username = txtUserName.getText();
this.host = txtEdgeNode.getText();
this.basePath = txtBasePath.getText();
this.isDebug = viewDataCheckBox.getSelection();
this.usePassword = radioPassword.getSelection();
savePassword();
try {
checkBuildProperties(btnRemoteMode.getSelection());
this.runGraph = true;
} catch (IllegalArgumentException e) {
MessageDialog.openError(Display.getCurrent().getActiveShell(), "Error", e.getMessage());
this.runGraph = false;
}
setPreferences();
}
private void savePassword() {
if (StringUtils.isNotBlank(password) && chkbtnSavePassword.getSelection()
&& StringUtils.isNotBlank(txtEdgeNode.getText()) && StringUtils.isNotBlank(txtUserName.getText())) {
savePasswordToSecureStorage(password);
}else{
savePasswordToSecureStorage("");
}
}
private void savePasswordToSecureStorage(String password) {
ISecurePreferences hydrographSecureStorageRunDialogHostNode = getSecureStorageHostNode(
txtEdgeNode.getText().toLowerCase(), true);
try {
hydrographSecureStorageRunDialogHostNode.put(txtUserName.getText(), password, true);
} catch (StorageException storageException) {
logger.debug("Failed to save the password in secure storage", storageException);
}
}
private void setPreferences() {
if (StringUtils.isBlank(PlatformUI.getPreferenceStore().getString(Constants.HOST))){
PlatformUI.getPreferenceStore().setValue(Constants.HOST, this.host);
}
}
@Override
protected void cancelPressed() {
runGraph = false;
super.cancelPressed();
}
private void checkBuildProperties(boolean remote) {
Notification notification = validate(remote);
if (notification.hasErrors()) {
throw new IllegalArgumentException(notification.errorMessage());
}
}
private Notification validate(boolean remote) {
Notification note = new Notification();
if (isDebug && StringUtils.isEmpty(txtBasePath.getText())){
note.addError(Messages.EMPTY_BASE_PATH_FIELD_MESSAGE);
}
IPath path = new Path(txtBasePath.getText());
if (isDebug && !path.isAbsolute()) {
note.addError(Messages.BASE_PATH_FIELD_VALIDATION_MESSAGE);
}
return note;
}
public boolean proceedToRunGraph() {
return runGraph;
}
private void applyServerDetailsCrossTextEmptyValidationListener(Text text) {
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
toggleOkButton();
}
});
}
private void toggleOkButton() {
if (okButton == null) {
return;
}
if (btnRemoteMode.getSelection()) {
if(radioPassword.getSelection()){
if ( checkAllForBlank() || StringUtils.isEmpty(txtPassword.getText())) {
okButton.setEnabled(false);
} else {
okButton.setEnabled(true);
}
}
else {
if (checkAllForBlank() || StringUtils.isEmpty(txtKeyFile.getText())) {
okButton.setEnabled(false);
} else {
okButton.setEnabled(true);
}
}
} else {
okButton.setEnabled(true);
}
if(viewDataCheckBox.getSelection()){
if (StringUtils.isEmpty(txtBasePath.getText())) {
okButton.setEnabled(false);
}
}
}
private boolean checkAllForBlank() {
return StringUtils.isEmpty(txtEdgeNode.getText()) || StringUtils.isEmpty(txtUserName.getText()) ||
StringUtils.isEmpty(txtRunUtility.getText()) || StringUtils.isEmpty(txtProjectPath.getText());
}
}