/*
* Copyright 2011-2012 Amazon Technologies, 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://aws.amazon.com/apache2.0
*
* This file 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 com.amazonaws.eclipse.elasticbeanstalk;
import java.util.List;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.eclipse.core.AwsToolkitCore;
/**
* Dialog to collect information about a deployment prior to its creation.
*/
public class DeploymentInformationDialog extends MessageDialog {
private final boolean enableDebugging;
private final boolean warnAboutIngress;
private final boolean showVersionTextBox;
private final Environment environment;
private final String launchMode;
private Text debugPortText;
private String debugPort = "";
private String debugInstanceId = "";
private String versionLabel = "";
String getDebugInstanceId() {
return debugInstanceId;
}
String getVersionLabel() {
return versionLabel;
}
String getDebugPort() {
return debugPort;
}
public DeploymentInformationDialog(Shell parentShell, Environment environment, String launchMode, boolean showVersionLabelTextBox, boolean enableDebugging, boolean warnAboutIngress) {
super(parentShell, "Publishing to AWS Elastic Beanstalk", AwsToolkitCore.getDefault().getImageRegistry()
.get(AwsToolkitCore.IMAGE_AWS_ICON), "Configure your environment deployment options",
MessageDialog.NONE, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
this.showVersionTextBox = showVersionLabelTextBox;
this.enableDebugging = enableDebugging;
this.warnAboutIngress = warnAboutIngress;
this.environment = environment;
this.launchMode = launchMode;
this.versionLabel = "v" + System.currentTimeMillis();
}
@Override
protected Control createCustomArea(Composite parent) {
Composite composite = parent;
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
composite.setLayout(layout);
if ( showVersionTextBox )
createVersionTextBox(composite);
if ( enableDebugging )
createDebugPortTextBox(parent);
if ( launchMode.equals(ILaunchManager.DEBUG_MODE) )
createInstanceSelectionCombo(parent);
if ( warnAboutIngress )
createIngressWarning(parent);
createDurationLabel(composite);
composite.pack(true);
return composite;
}
/**
* Creates a combo selection box to choose which EC2 instance to connect to,
* if there's more than one.
*/
private void createInstanceSelectionCombo(Composite parent) {
try {
final List<String> ec2InstanceIds = environment.getEC2InstanceIds();
if ( ec2InstanceIds.size() < 2 ) {
return;
}
debugInstanceId = ec2InstanceIds.get(0);
Label label = new Label(parent, SWT.None);
label.setText("Connect remote debugger to instance: ");
final Combo combo = new Combo(parent, SWT.READ_ONLY);
combo.setItems(ec2InstanceIds.toArray(new String[ec2InstanceIds.size()]));
combo.select(0);
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
debugInstanceId = ec2InstanceIds.get(combo.getSelectionIndex());
}
});
GridDataFactory.fillDefaults().grab(true, false).applyTo(combo);
} catch (AmazonServiceException ignored) {
return;
}
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
validate();
}
private void validate() {
if ( versionLabel.length() == 0 ) {
getButton(0).setEnabled(false);
return;
}
if ( enableDebugging ) {
if ( debugPort.length() == 0 ) {
getButton(0).setEnabled(false);
return;
}
try {
Integer.parseInt(debugPort);
} catch ( NumberFormatException e ) {
getButton(0).setEnabled(false);
}
}
getButton(0).setEnabled(true);
}
private void createVersionTextBox(Composite composite) {
Label versionLabelLabel = new Label(composite, SWT.NONE);
versionLabelLabel.setText("Version Label:");
final Text versionLabelText = new Text(composite, SWT.BORDER);
versionLabelText.setText(versionLabel);
versionLabelText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
versionLabelText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
versionLabel = versionLabelText.getText();
validate();
}
});
}
private void createDebugPortTextBox(Composite parent) {
Label chooseADebugPort = new Label(parent, SWT.READ_ONLY);
chooseADebugPort.setText("Remote debugging port:");
debugPortText = new Text(parent, SWT.BORDER);
debugPortText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
debugPort = debugPortText.getText();
validate();
}
});
}
private void createIngressWarning(Composite parent) {
Label ingressWarning = new Label(parent, SWT.READ_ONLY | SWT.WRAP);
ingressWarning.setText("Please note: to connect the remote debugger, "
+ "the debug port will be opened for TCP ingress " + "on your EC2 security group.");
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).span(2, 1).applyTo(ingressWarning);
}
private void createDurationLabel(Composite composite) {
final Label info = new Label(composite, SWT.READ_ONLY | SWT.WRAP);
info.setText("Launching a new environment may take several minutes. "
+ "To monitor its progress, check the Progress View.");
GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true);
gridData.horizontalSpan = 2;
gridData.widthHint = 300;
info.setLayoutData(gridData);
}
}